cmake整理:在编译时拷贝文件之add_custom_comand 和 add_custom_target
第一种通用形式:
add_custom_command: 增加客制化的构建规则到生成的构建系统中。对于add_custom_command,有两种使用形式。第一种形式是增加一个客制命令用来产生一个输出。
add_custom_command(OUTPUT output1 [output2 ...]
COMMAND command1[ARGS] [args1...]
[COMMAND command2 [ARGS] [args2...] ...]
[MAIN_DEPENDENCYdepend]
[DEPENDS[depends...]]
[IMPLICIT_DEPENDS<lang1> depend1 ...]
[WORKING_DIRECTORYdir]
[COMMENT comment] [VERBATIM] [APPEND])
不要同时在多个相互独立的目标中执行上述命令产生相同的文件,主要是为了防止冲突产生。如果有多条命令,它们将会按顺序执行。ARGS是为了向后兼容,使用过程中可以忽略。MAIN_DEPENDENCY完全是可选的,它主要是针对Visual Studio给出的一个建议。在Makefile中,它会产生一个这样的新目标:
OUTPUT: MAIN_DEPENDENCY DEPENDS
COMMAND
第二种:标记为在什么时候执行命令:编译前,编译后,链接前
PRE_BUILD - 命令将会在其他依赖项执行前执行
PRE_LINK - 命令将会在其他依赖项执行完后执行
POST_BUILD - 命令将会在目标构建完后执行。
重要:使用target标记为总是过期,这样每次编译时都会执行上面规定的command
如果指定了VERBATIM, 所有传递给命令的参数将会被适当地转义。建议使用该选项。
SOURCES选项指定了包含进该客制目标的额外的源文件。即使这些源文件没有构建规则,但是它们会被增加到IDE的工程文件中以方便编辑。
例子:
set(TEST_FILE "log.txt")
add_custom_command(OUTPUT ${TEST_FILE}
COMMAND echo "Generating log.txt file..."
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
Generating log.txt file...
This command will be executed before building target Test1
executing a fake command
[100%] Built target Test1
(这是 make 时候进行执行)
set(COPYITEM test_res)add_custom_command(OUTPUT COPY_RESCOMMAND ${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.protoCOMMAND ${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/service_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/advertise.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 时候进行执行)
cmake整理:在编译时拷贝文件之add_custom_comand 和 add_custom_target相关推荐
- linux-gcc 编译时头文件和库文件搜索路径
linux-gcc 编译时头文件和库文件搜索路径 一.头文件 gcc 在编译时寻找所需要的头文件 : ※搜寻会从-I开始 ※然后找gcc的环境变量 C_INCLUDE_PATH,CP ...
- C语言编译时无法打开文件,2812c语言编译时头文件无法打开
引用:louiewong 写道: 全部错误显示如下: ------------------------------ pmsm.pjt - Debug ----------------------- ...
- 安装包制作工具 SetupFactory使用4:安装时写入注册表和拷贝文件到指定目录
环境: window10 SetupFactory9.1 一.安装时写入注册表 首先,我们需要准备好注册表项(我们可以直接在注册表编辑器中编辑好,然后导出),如下: 导出后的文件如下(testpubl ...
- cmake编译多个文件夹_cmake多目录构建(二)
前言 上一篇文章从如何构建只有一个源文件扩展到多个源文件,多个目录的构建语法,以及如何进行外部构建(out-of-source).这里回忆一下,每次构建都会生成一个CMakeFiles文件夹,当执行m ...
- cmake编译时支持gdb调试
一般在调用./configure时,可以通过设置CXXFLAGS或者CFLAGS使程序可以支持调试,就是可以用GDB查看程序运行的信息,但在cmake编译时,在cmake过程和后面的make及make ...
- CMAKE编译时如何自动下载第三方库并解压、安装到指定目录
GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 导语 在日常开发过程中难免会使用到第三方库或者需要将部分库分离另外存储,如果将库与代码放在一起难免会造成工程庞大,此时就可 ...
- Linux编译时如何减小so库文件的大小
Linux编译时如何减小so库文件的大小 今天问了我这个问题,我就顺便记录一下.客户问为什么libc.so文件再编译前和编译后的size不一样啊,staging 和 compile 两个dir下的 l ...
- Git下载代码到Windows再拷贝到Linux下编译时要关闭换行符自动转换
Git下载代码到Windows再拷贝到Linux下编译时要关闭换行符自动转换 一.各操作系统下文件换行符 二.TortoiseGit下载Github代码关闭文件换行符 三.示例说明 1.开启换行符自动 ...
- 使用CMake编译时出现动态链接库错误no version information available的解决方案
出现问题 在使用cmake编译时出现如下错误: /usr/local/bin/cmake: /home/0123/anaconda2/lib/libssl.so.1.0.0: no version i ...
最新文章
- Matlab编程与数据类型 -- 分支条件选择语句if/end
- Java更新XML的四种常用方法简介
- 使用FIT2CLOUD在青云QingCloud快速部署和管理Kubernetes集群
- CSS知识总结(五)
- 激光雷达与毫米波雷达对比
- mysql志新计划,在使用Perl DBI迭代结果集时更新MySQL表是否安全?
- HappyLeetcode37:Add Binary
- slf4j mysql_能显示sql语句,没有报错,但是MySQL里没有表?还有,slf4j是必须的吗?...
- 模糊综合评价模型 ——确定隶属度
- Auto CAD绘制基准符号的方法
- 3文聚焦:RNA m6A甲基化修饰在不同农作物中的研究进展(马铃薯+水稻+玉米+小麦)|易基因
- android7.1索尼,Xperia 1
- 降噪蓝牙耳机评测排行榜最新,综合表现好的降噪蓝牙耳机分享
- 2023最新苹果CMS10仿电影先生网站自适应源码/UI简约大气极速加载
- 计算机音乐简单教学反思,《音乐小屋》教学反思
- 微信公众号(服务号)申请时候需要补充的资料
- 2008R2虚拟机重启后进入系统恢复界面
- 磨金石教育摄影技能干货分享|中国风摄影大师——郎静山
- Apifox 学习笔记 - 前置操作
- VS2017应用在XP系统上运行
热门文章
- linux入门学习1之FastQC
- 【图像去噪】基于matlab高斯+均值+中值+双边滤波图像去噪【含Matlab源码 1872期】
- HUB, 交换机,路由器,区别
- 视频全屏非全屏切换,状态栏动态显示隐藏兼容性解决
- 同你分享1个完整的聚类分析案例
- java微信群自动回复_社群运营,你该如何选择一款好用的微信群管理工具?
- web前端网页制作课作业:用DIV+CSS技术设计的静态网站【四大名著】中国传统文化主题题材设计
- 密码学常用网站与解密脚本
- 微风:AI新手入门学习教程
- 达州市中学高考2021成绩查询,2020达州高考成绩揭晓,恭喜恭喜!另附成绩统计表...