cmake整理:在编译时拷贝文件之add_custom_comand和add_custom。。。

更新时间:2023-07-20 11:12:42 阅读: 评论:0

cmake整理:在编译时拷贝⽂件之add_custom_comand和
add_custom。。。
第⼀种通⽤形式:
add_custom_command: 增加客制化的构建规则到⽣成的构建系统中。对于add_custom_command,有两种使⽤形式。第⼀种形式是增加⼀个客制命令⽤来产⽣⼀个输出。
教师工作内容add_custom_command(OUTPUT output1 [output2 ...]
COMMAND command1[ARGS] []
[COMMAND command2 [ARGS] [] ...]
[MAIN_DEPENDENCYdepend]
[]]
[IMPLICIT_DEPENDS<lang1> depend1 ...]
[WORKING_DIRECTORYdir]
[COMMENT comment] [VERBATIM] [APPEND])
不要同时在多个相互独⽴的⽬标中执⾏上述命令产⽣相同的⽂件,主要是为了防⽌冲突产⽣。如果有多条命令,它们将会按顺序执⾏。ARGS是为了向后兼容,使⽤过程中可以忽略。MAIN_DEPENDENCY完全是可选的,它主要是针对Visual Studio给出的⼀个建议。在Makefile中,它会产⽣⼀个这样的新⽬标:
OUTPUT: MAIN_DEPENDENCY DEPENDS
COMMAND
第⼆种形式是为某个⽬标如库或可执⾏程序添加⼀个客制命令。这对于要在构建⼀个⽬标之前或之后执⾏⼀些操作⾮常有⽤。该命令本⾝会成为⽬标的⼀部分,仅在⽬标本⾝被构建时才会执⾏。如果该⽬标已经构建,命令将不会执⾏。
第⼆种:标记为在什么时候执⾏命令:编译前,编译后,链接前
add_custom_command(TARGET target
PRE_BUILD | PRE_LINK| POST_BUILD
COMMAND command1[ARGS] []
[COMMAND command2[ARGS] [] ...]
[WORKING_DIRECTORYdir]
[COMMENT comment][VERBATIM])
命令执⾏的时机由如下参数决定:炸多春鱼
PRE_BUILD - 命令将会在其他依赖项执⾏前执⾏
PRE_LINK - 命令将会在其他依赖项执⾏完后执⾏
POST_BUILD - 命令将会在⽬标构建完后执⾏。
其中,PRE_BUILD只被Visual Studio 7及之后的版本⽀持,其他所有的构建⽂件产⽣器将视PRE_BUILD为PRE_LINK。如果指定了WORKING_DIRECTORY,那么命令将会在指定的⽬录下执⾏。如果是相对路径,那么该路径将被解释为与当前源码⽬录对应的构建⽬录相对的路径。 如果设置了COMMENT,那么在编译时,命令执⾏前会将COMMENT的内容当做信息输出。如果指定了APPE
ND ,那么COMMAND 和 DEPENDS 选项的值将会被追加到第⼀个指定的输出对应的客制命令中。⽬前,如果指定了APPEND选项,那么COMMENT, WORKING_DIRECTORY, 和 MAIN_DEPENDENCY选项将会忽略。但是将来可能会使⽤。如果指定了VERBATIM选项,那么,所有传递到命令的参数将会被适当地转义,这样命令接受到的参数将不会改变。建议使⽤VERBATIM选项,如果客制命令的输出不是创建⼀个存储在磁盘上的⽂件,需要使⽤命令SET_SOURCE_FILES_PROPERTIES把它标记为SYMBOLIC。
IMPLICIT_DEPENDS选项请求扫描⼀个输⼊⽂件的隐含依赖项。特定的语⾔会指明对应编程语⾔,它会使⽤相应的依赖项扫描器。⽬前仅⽀持C和CXX语⾔依赖项扫描器。⽬前IMPLICIT_DEPENDS 选项仅被Makefile产⽣器⽀持,其它构建⽂件的产⽣器将会忽略该选项。
如果COMMAND指定了⼀个可执⾏的⽬标(由ADD_EXECUTABLE创建),那么它会⾃动地被在构建时创建的可执⾏⽂件路径替换。另外,也会添加⼀个⽬标级的依赖,使得可执⾏⽬标总会在使⽤了该客制命令的任何⽬标之前构建。然⽽,它不会增加⼀个⽂件级的依赖,这种依赖会使得只要该可执⾏程序被重新编译,该客制命令也会重新运⾏。
DEPENDS选项指定了该命令所依赖的⽂件。如果任何依赖项是同⼀⽬录中其他另⼀个客制命令 )。那么CMake 会⾃动地将其引⼊到执⾏该客制命令的⽬标中来。如果没有
家长感谢老师的话简短
指定DEPENDS,那么只要OUTPUT不见了,该命令就会运⾏。如果该命令并没有实际去创建OUTPUT,那么该规则总是执⾏。如果DEPENDS指定了任何⼀个⽬标 (由ADD_* 系列命令创建) ,那么就会创建⼀个⽬标级的依赖以确保该⽬标⽐任何使⽤该客制命令的⽬标要先构建。另外,如果该⽬标是⼀个可执⾏⽂件或是⼀个库,那么就会创建⼀个⽂件级的依赖,这样会使得只要该⽬标重新编译,该客制命令就会重新运⾏。
重要:使⽤target标记为总是过期,这样每次编译时都会执⾏上⾯规定的command
add_custom_target: 增加⼀个没有输出的⽬标,使得它总是被构建。  add_custom_target(Name [ALL] [command1 []]
[COMMAND command2 [] ...]
[DEPENDS depend depend depend ... ]
[WORKING_DIRECTORY dir]
[COMMENT comment] [VERBATIM]
蒸红薯叶[SOURCES src1 []])
戴宗的绰号增加⼀个指定名字的⽬标,并执⾏指定的命令。该⽬标没有输出⽂件,总是被认为是过期的,即使是在试图⽤⽬标的名字创建⼀个⽂件。使⽤ADD_CUSTOM_COMMAND命令来创建⼀个具有依赖项的⽂件。默认情况下,没有任何⽬标会依赖该客制⽬标。使⽤
ADD_DEPENDENCIES 来添加依赖项或成为别的⽬标的依赖项。如果指定了ALL选项,那就表明该⽬标会被添加到默认的构建⽬标,使得它每次都被运⾏。(该命令的名称不能命名为 ALL). 命令和参数都是可选的,如果没有指定,将会创建⼀个空⽬标。如果设置了WORKING_DIRECTORY ,那么该命令将会在指定的⽬录中运⾏。如果它是个相对路径,那它会被解析为相对于当前源码⽬录对应的构建⽬录。如果设置了 COMMENT,在构建的时候,该值会被当成信息在执⾏该命令之前显⽰。DEPENDS参数可以是⽂件和同⼀⽬录中的其他客制命令的输出。
如果指定了VERBATIM, 所有传递给命令的参数将会被适当地转义。建议使⽤该选项。
SOURCES选项指定了包含进该客制⽬标的额外的源⽂件。即使这些源⽂件没有构建规则,但是它们会被增加到IDE的⼯程⽂件中以⽅便编辑。
例⼦:
t(TEST_FILE "")
add_custom_command(OUTPUT  ${TEST_FILE}
COMMAND echo " "
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_LIST_FILE} ${TEST_FILE}
COMMENT  "This is a test"
)
add_custom_target(Test1 ALL DEPENDS ${TEST_FILE})
add_custom_command(TARGET Test1
PRE_BUILD
COMMAND echo "executing a fake command"
COMMENT "This command will be executed before building target Test1"
有过之而无不及)
结果:
[100%] This is a test
狼狈的近义词
This command will be executed before building target Test1
executing a fake command
[100%] Built target Test1
(这是 make 时候进⾏执⾏)
t(COPYITEM test_res)
add_custom_command(OUTPUT  COPY_RES
COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_SOURCE_DIR}/${COPYITEM} ${EXECUTABLE_OUTPUT_PATH}/${COPYITEM}
)
add_custom_target(CopyTask ALL DEPENDS COPY_RES)
另外⼀种⽤法:直接执⾏命令:
execute_process(COMMAND ${CMAKE_COMMAND} -E chdir ${CMAKE_CURRENT_SOURCE_DIR} $ENV{PROTOC} --cpp_out=. proto/Echo.proto conti/beagent/msg_catalog.proto
        COMMAND ${CMAKE_COMMAND} -E chdir ${CMAKE_CURRENT_SOURCE_DIR} $ENV{PROTOC} --cpp_out=. proto/Echo.proto conti/beagent/connmgr/topic_parameterize.proto
        COMMAND ${CMAKE_COMMAND} -E chdir ${CMAKE_CURRENT_SOURCE_DIR} $ENV{PROTOC} --cpp_out=. proto/Echo.proto conti/beagent/connmgr/subscribe.proto
        COMMAND ${CMAKE_COMMAND} -E chdir ${CMAKE_CURRENT_SOURCE_DIR} $ENV{PROTOC} --cpp_out=. proto/Echo.proto conti/beagent/connmgr/rvice_connection_manager.proto
        COMMAND ${CMAKE_COMMAND} -E chdir ${CMAKE_CURRENT_SOURCE_DIR} $ENV{PROTOC} --cpp_out=. proto/Echo.proto conti/beagent/connmgr/out_data.proto
        COMMAND ${CMAKE_COMMAND} -E chdir ${CMAKE_CURRENT_SOURCE_DIR} $ENV{PROTOC} --cpp_out=. proto/Echo.proto conti/beagent/connmgr/in_data.proto
        COMMAND ${CMAKE_COMMAND} -E chdir ${CMAKE_CURRENT_SOURCE_DIR} $ENV{PROTOC} --cpp_out=. proto/Echo.proto conti/beagent/connmgr/app_status.proto
        COMMAND ${CMAKE_COMMAND} -E chdir ${CMAKE_CURRENT_SOURCE_DIR} $ENV{PROTOC} --cpp_out=. proto/Echo.proto conti/beagent/connmgr/adverti.proto
        COMMAND ${CMAKE_COMMAND} -E chdir ${CMAKE_CURRENT_SOURCE_DIR} $ENV{PROTOC} --cpp_out=. proto/mqtt_diag_message.proto
里中女        COMMAND ${CMAKE_COMMAND} -E chdir ${CMAKE_CURRENT_SOURCE_DIR} $ENV{PROTOC} --cpp_out=. proto/carriers.proto
        )
(这是 cmake 时候进⾏执⾏)

本文发布于:2023-07-20 11:12:42,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/1106755.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:命令   客制   指定
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图