我在C++项目中使用cmake。我想在GCC中使用预编译的 header 。
我想一次运行cmake
,然后在运行make
时,希望此操作发生:
g++ -c precompiled.h -o precompiled.h.gch
)。我设法添加了依赖关系,因此无论何时构建任何目标,都将执行python脚本的目标(这很丑陋,因为现在每个目标都必须依赖于一个global_init目标)。我也可以修改python脚本,因此在不需要时不会修改precompiled.h。
但是我不知道下一步该怎么做。有什么办法告诉cmake它应该运行我的自定义脚本,然后确定是否必须创建precompiled.h.gch吗?现在,它始终是构建文件(此文件包含许多#include的文件,因此需要一些时间)。基本上:
我看过很多地方,但是cmake(和make)计算依赖关系的方法似乎太弱而无法完成此任务。
在这个问题上:
lazy c++
始终在执行lazycpp之后进行编译。就我而言,这不是最佳选择。
最佳答案
以下CMake命令可以作为您项目的起点:
add_custom_target(scanner COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/scanner.py"
COMMENT "Scanning include files ..."
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}")
此命令涵盖第1步。它调用您的python脚本,该脚本可能会更新
precompiled.h
中的现有CMAKE_CURRENT_SOURCE_DIR
文件。add_custom_command(OUTPUT precompiled.h.gch
COMMAND ${CMAKE_CXX_COMPILER} ${CMAKE_CXX_FLAGS}
-c "${CMAKE_CURRENT_SOURCE_DIR}/precompiled.h" -o precompiled.h.gch
DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/precompiled.h"
IMPLICIT_DEPENDS CXX "${CMAKE_CURRENT_SOURCE_DIR}/precompiled.h")
add_custom_target(generate_precompiled DEPENDS
"${CMAKE_CURRENT_BINARY_DIR}/precompiled.h.gch")
add_dependencies(generate_precompiled scanner)
这些命令涵盖了第2步。预编译头是使用定制命令生成的,该命令取决于
precompiled.h
和precompiled.h
包含的其他头上的implicitly。precompiled.h.gch
在CMAKE_CURRENT_BINARY_DIR
目录中生成。由于预编译头的生成需要python脚本更新
precompiled.h
,因此我们在目标scanner
上添加了目标级别的依赖项。include_directories(BEFORE ${CMAKE_CURRENT_BINARY_DIR})
add_executable(main main.cpp)
set_target_properties(main PROPERTIES COMPILE_FLAGS "-include precompiled.h -H")
add_dependencies(main generate_precompiled)
这些命令添加了标准的编译步骤,这些步骤生成可执行的
main
。预编译的 header 作为gcc的-include
开关的默认 header 包括在内。包含CMAKE_CURRENT_BINARY_DIR
的precompiled.h.gch
被添加为包含目录。当包含precompiled.h时,gcc将从那里获取precompiled.h.gch
(请参阅Using Precompiled Headers)。最后,对
generate_precompiled
的目标依赖关系可确保在必要时更新预编译的 header 。关于c++ - 使用cmake有条件地生成源输入文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6649939/