不幸的是有点复杂,但你可以使用add_custom_target http://www.cmake.org/cmake/help/v2.8.10/cmake.html#command%3aadd_custom_target通过以下方式在脚本处理模式下调用 CMake-P http://www.cmake.org/cmake/help/v2.8.10/cmake.html#opt%3a-Pfile.
你需要使用add_custom_target
在这里,因为它会always执行,即使一切都是最新的。
做出此决定后,我们需要让自定义目标执行命令,该命令将检查后处理脚本文件的新版本(我们称其为“my_script”并假设它位于您的根目录中),如果它发生更改,则会导致您的依赖的目标已经过时。
这将包括:
- 将“my_script”的先前副本与源树中的当前“my_script”进行比较。如果当前的“my_script”不同,或者副本不存在(即这是 CMake 的第一次运行),那么...
- 将“my_script”从源代码树复制到构建树,然后...
- 触摸依赖目标的源文件,使其过期。
CMake 脚本中所需的所有命令都可以使用以下命令来实现execute_process http://www.cmake.org/cmake/help/v2.8.10/cmake.html#command%3aexecute_process调用cmake -E http://www.cmake.org/cmake/help/v2.8.10/cmake.html#opt%3a-E.
因此,CMake 脚本(称为“copy_script.cmake”)将类似于:
execute_process(COMMAND ${CMAKE_COMMAND} -E compare_files
${OriginalScript} ${CopiedScript} RESULT_VARIABLE Result)
if(Result)
execute_process(COMMAND ${CMAKE_COMMAND} -E copy
${OriginalScript} ${CopiedScript})
execute_process(COMMAND ${CMAKE_COMMAND} -E touch_nocreate ${FileToTouch})
endif()
CMake 脚本需要通过以下方式传入所需的变量-D http://www.cmake.org/cmake/help/v2.8.10/cmake.html#opt%3a-Dvar%3atypevalue args before呼叫-P
,因此调用 CMakeLists.txt 的内容将类似于:
set(FileToTouch ${CMAKE_SOURCE_DIR}/src/main.cpp)
add_custom_target(CopyScript ALL ${CMAKE_COMMAND}
-DOriginalScript=${CMAKE_SOURCE_DIR}/my_script
-DCopiedScript=${CMAKE_BINARY_DIR}/my_script
-DFileToTouch=${FileToTouch}
-P ${CMAKE_SOURCE_DIR}/copy_script.cmake)
add_executable(MyExe ${FileToTouch})
这将导致可执行文件的完全重建,因为它认为源文件已被修改。如果您只需要强制重新链接,可能有更好的方法来实现此目的。