CMake在构建之前运行自定义命令?
我想在每次构建之前运行一个二进制文件的示例源,每个add_executable
一次:
#include <stdio.h>
int main(int argc, char *argv[]) {
for(int i=0; i<argc; ++i)
printf("argv[%d] = %sn", i, argv[i]);
fclose(fopen("foo.hh", "a"));
}
的CMakeLists.txt
cmake_minimum_required(VERSION 3.5)
project(foo_proj)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14")
set(SOURCE_FILES main.cpp)
# ---- this line changes ----
add_executable(foo_proj ${SOURCE_FILES})
尝试:
add_custom_target(create_foo_hh COMMAND /tmp/bin/create_foo_hh)
add_dependencies(${SOURCE_FILES} create_foo_hh)
错误:无法将目标级依赖项添加到不存在的目标“main.cpp”。 add_dependencies适用于由add_executable,add_library或add_custom_target命令创建的顶级逻辑目标。 如果要添加文件级依赖关系,请参阅add_custom_target和add_custom_command命令的DEPENDS选项。
execute_process(COMMAND /tmp/bin/create_foo_hh main.cpp)
没有错误,但没有创建foo.hh。
我如何自动运行这个命令?
在配置时调用execute_process()
。
你可以使用add_custom_command()
:
add_custom_command(
OUTPUT foo.hh
COMMAND /tmp/bin/create_foo_h main.cpp
DEPENDS ${SOURCE_FILES} /tmp/bin/create_foo_hh main.cpp
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
)
include_directories(${CMAKE_CURRENT_BINARY_DIR})
add_executable(foo_proj ${SOURCE_FILES} foo.hh)
这样一来, foo.hh
是依赖foo_proj
:和建设时,您的命令将被调用foo_proj
。 它依赖于${SOURCE_FILES}
和/tmp/bin/create_foo_hh main.cpp
以便在其中一个文件发生更改时再次生成它。
关于路径, add_custom_command()
被配置为在当前构建目录中运行以在那里生成文件,并且使用include_directories()
将构建目录添加到包含目录。
您可能不希望自定义目标依赖于源文件(因为它们本身不是目标,因此也不会“运行”),但是在您使用它们创建的目标上:
target_add_dependencies(foo_proj create_foo_hh)
链接地址: http://www.djcxy.com/p/31883.html
上一篇: CMake run custom command before build?
下一篇: cmake