首页 > 其他分享 >add_custom_command用法

add_custom_command用法

时间:2023-05-13 16:35:31浏览次数:40  
标签:CMAKE custom cpp add command test

环境:

  Linux平台:CentOS Linux relase 7.2.1511、GCC_4.8.5-4、cmake version 2.8.11

开始:

一、add_custom_command

  将自定义构建规则添加到生成的构建系统,有两种用法。

    1.1)第一种用法:将自定义命令添加到目标,如库或可执行文件

add_custom_command(TARGET target
    PRE_BUILD | PRE_LINK | POST_BUILD
    COMMAND command1 [ARGS] [args1...]
    [COMMAND command2 [ARGS] [args2...] ...]
    [WORKING_DIRECTORY dir]
    [COMMENT comment] [VERBATIM])

  当目标target构建时,会在你指定的阶段PRE_BUILD | PRE_LINK | POST_BUILD执行命令。

  例如下面的命令,当目标my_project构建完成后,执行命令将my_project生成的文件拷贝到tmp目录

add_custom_command(TARGET my_project POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_FILE:my_project> ./tmp)

    1.2)第二种用法:添加自定义命令以生成输出

add_custom_command(OUTPUT output1 [output2 ...]
    COMMAND command1 [ARGS] [args1...]
    [COMMAND command2 [ARGS] [args2...] ...]
    [MAIN_DEPENDENCY depend]
    [DEPENDS [depends...]]
    [IMPLICIT_DEPENDS <lang1> depend1 ...]
    [WORKING_DIRECTORY dir]
    [COMMENT comment] [VERBATIM] [APPEND])

  当指定的output1被其他目标依赖时,可能会执行命令;我们假设依赖output1的目标为test,下面具体分析:

  1)如果执行的命令并没有输出文件,则目标test生成时,改命令每次都会执行。

  2)如果执行的命令输出文件,但是output1文件不存在,则目标test生成时,该命令会执行。

  3)如果执行的命令输出文件,且output1文件存在,但是该命令的依赖(通过DEPENDS指定)被修改了,则目标test生成时,该命令会执行。

二、demo示例

  2.1)静态库libtest_1.a

  test_1.cpp

#include <stdio.h>
__attribute__((visibility("default"))) void test_1()
{
    printf("test_1\n");
}

  2.2)动态库libtest_2.so

  test_2.cpp

#include <stdio.h>
__attribute__((visibility("default"))) void test_2()
{
    printf("test_2\n");
}

  2.3)可执行程序test_3

  test_3.cpp

int main()
{
    return 0;
}

  2.4)CMakeLists.txt

project(demo)
cmake_minimum_required(VERSION 2.6)

set(PRJ_VER "0.0.0")
set(ROOT ${PROJECT_SOURCE_DIR})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${ROOT}/bin)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${ROOT}/lib)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${ROOT}/lib)
set(CMAKE_VERBOSE_MAKEFILE ON)

#####include_directories#####
include_directories(${ROOT})
#####link_directories#####
link_directories(${ROOT}/lib)

#CMAKE_CXX_FLAGS
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --std=c++11")
message("CMAKE_CXX_FLAGS = " ${CMAKE_CXX_FLAGS})

add_library(test_1 STATIC ${ROOT}/test_1.cpp)
set_target_properties(test_1 PROPERTIES COMPILE_FLAGS "-fPIC")

add_library(test_2 SHARED ${ROOT}/test_2.cpp)
target_link_libraries(test_2 LINK_PRIVATE test_1)

add_custom_command(TARGET test_1 POST_BUILD COMMENT "test_1 POST_BUILD")

add_custom_command(OUTPUT ${CMAKE_BINARY_DIR}/test.cpp
    COMMAND echo -e \"int test() { return 0\; }\" > ${CMAKE_BINARY_DIR}/test.cpp
    DEPENDS test_1
    COMMENT "build test.cpp")

add_executable(test_3 test_3.cpp ${CMAKE_BINARY_DIR}/test.cpp)
add_custom_target(test_4 ALL DEPENDS ${CMAKE_BINARY_DIR}/test.cpp)

  2.4.1)add_custom_command第一种用法

  运行make test_1当目标test_1构建完成后,执行命令输出"test_1 POST_BUILD"

  add_custom_command(TARGET test_1 POST_BUILD COMMENT "test_1 POST_BUILD")

  

  2.4.2)add_custom_command第二种用法

  添加一个自定义输出文件

  add_custom_command(OUTPUT ${CMAKE_BINARY_DIR}/test.cpp
      COMMAND echo -e \"int test() { return 0\; }\" > ${CMAKE_BINARY_DIR}/test.cpp
      DEPENDS test_1
      COMMENT "build test.cpp")
  

  添加依赖,有两种依赖方式

  add_executable(test_3 test_3.cpp ${CMAKE_BINARY_DIR}/test.cpp)
  add_custom_target(test_4 ALL DEPENDS ${CMAKE_BINARY_DIR}/test.cpp)

  运行make test_3make test_4

  如果“${CMAKE_BINARY_DIR}/test.cpp”文件不存在,执行命令生成文件test.cpp。

  如果“${CMAKE_BINARY_DIR}/test.cpp”文件存在,但是依赖目标test_1变动,执行命令重新生成文件test.cpp。

  

参考资料

  CMake 2.8.8 Documentation https://cmake.org/cmake/help/v2.8.8/cmake.html

  https://zhuanlan.zhihu.com/p/397394950?utm_id=0

标签:CMAKE,custom,cpp,add,command,test
From: https://www.cnblogs.com/dongc/p/17397469.html

相关文章

  • cli add option
    https://stackoverflow.com/questions/44284275/passing-compiler-options-in-cmake-command-lineCommandlineoptionslikeCMAKE_C_FLAGSandCMAKE_CXX_FLAGSalwaysappendandneveroverwrite.-DCMAKE_C_FLAGS-DCMAKE_CXX_FLAGS="-Wno-dev-Wl,-rpath=/home/a......
  • DedeCMS 提示信息!把数据保存到数据库附加表 `dede_addonarticle` 时出错,请把相关信息
    DedeCMS提示信息!把数据保存到数据库附加表`dede_addonarticle`时出错,请把相关信息提交给DedeCms官方。Duplicateentry'7'forkey'PRIMARY'错误原因是Duplicateentry'7'forkey'PRIMARY'解决方案:进入后台,“系统”-“系统设置”-“SQL命令行工具”运行SQL命令行:alter......
  • docker 容器中 ip addr 出现 bash: ip: commandnot found
    一、服务器中输入命令#启动tomcat容器别名tomcat1dockerrun-d-P--nametomcat1tomcat#进行tomcat1容器dockerexec-ittomcat1/bin/bash二、输入ipaddripaddrbash:ip:commandnotfound三、解决办法安装工具iproute2#我的服务器是centos的yumi......
  • Nginx中add_header和proxy_set_header的区别
    一、proxy_set_header和add_header的区别 proxy_set_header是nginx设置请求头给上游服务器,add_header是nginx设置响应头信息给浏览器。1.1proxy_set_header 语法格式: proxy_set_headerfieldvalue; value值可以是包含文本、变量或者它们的组合。......
  • paddlepaddle docker 安装实践
    系统:linuxcentosdocker-v#Dockerversion23.0.3,build...参考链接:https://www.paddlepaddle.org.cn/documentation/docs/zh/install/docker/linux-docker.htmldockerhub:https://hub.docker.com/r/paddlepaddle/paddle/tags/拉取镜像:dockerpullpaddlepaddle/paddl......
  • Added non-passive event listener to a scroll-blocking 'mousewheel' event. Consid
    这个警告意味着在事件监听器中,添加了一个阻止页面滚动的`mousewheel`事件,但是该事件监听器并没有标记为被动事件监听器(passiveeventlistener)。这可能会导致页面滚动变得不流畅,特别是在移动设备上。为了解决这个问题,您需要将事件监听器标记为被动事件监听器。具体实现方法如下......
  • 【MIPS汇编】ADDI,ADDIU,ADD,ADDU的区别、有符号无符号的谬误
    介绍ADDI、ADDIU:加立即数,区别在于是否检测溢出。Format:ADDIrt,rs,immediatert=rs+immediateToaddaconstanttoa32-bitinteger.Ifoverflowoccurs,thentrap.Format:ADDIUrt,rs,immediatert=rs+immediateToaddaconstanttoa32-bitinteg......
  • CUDA已经安装但nvcc -V显示command not found(Ubuntu20.04LTS系统)
    背景介绍安装了NVIDIA驱动程序,同时也安装了CUDA,但使用nvcc-V命令提示不存在,如下所示:1Command'nvcc'notfound,butcanbeinstalledwith:2sudoaptinstallnvidia-cuda-toolkit知识补充:为什么要使用nvcc命令?使用nvcc-V命令可以查看CUDA的版本,如下所示为正常的输入......
  • linux npm 全局安装 command not found
    前言在linux使用npm全局安装一个模块时,会提示命令找不到。例如:npminstall@quasar/cli-g后$quasar-vquasar:commandnotfound原因是npm的环境变量没有添加设置,导致无法正常使用该命令。解决方法将npm加入环境变量中,打印npm安装位置npmprefix-glinux......
  • 解决CentOS 7出现docker-compose: command not found
    解决CentOS7出现docker-compose:commandnotfound1.安装docker-compose既然使用了docker-compose那自然得安装了在GitHub上拉取过慢,建议在国内源DaoCloud中拉取:curl-Lhttps://get.daocloud.io/docker/compose/releases/download/1.29.2/docker-compose-`uname-s`-`unam......