使用cmake有条件地生成源输入文件

Max*_*Max 2 c++ gcc makefile cmake precompiled-headers

我正在使用cmake和C++项目.我想在GCC中使用预编译头文件.

我想运行cmake一次,然后在运行时make,我希望这些操作发生:

  1. 在整个源代码树上运行我的自定义工具(python脚本).它在一些子目录中生成precompiled.h头文件.它的目的是扫描*.h和*.cpp用于#include并将它们移动到常见的precompiled.h文件.
  2. g++ -c precompiled.h -o precompiled.h.gch仅当precompiled.h文件在步骤1之后发生更改时,才生成GCC的预编译头文件().
  3. 构建过时的目标(在第2步之后,因为我想使用.gch文件)

我设法添加依赖项,所以每当我构建任何目标时,我的python脚本的目标都会被执行(这很难看,因为现在每个目标都必须依赖于单个global_init目标).此外,我可以修改我的python脚本,因此它不会在没有必要时修改precompiled.h.

但我不知道接下来该做什么.有没有办法告诉cmake它应该运行我的自定义脚本,并确定是否必须创建precompiled.h.gch?现在它始终构建(此文件包含许多#include,因此需要一些时间).基本上:

  1. 执行python脚本 - > precompiled.h可能会更新
  2. 检查precompiled.h时间戳,如果它更新 - > build precompiled.h.gch
  3. 标准编译步骤

我在许多地方看过,但是cmake(和make)计算依赖关系的方式似乎太弱而无法完成这项任务.

在这个问题中: 懒惰的c ++ 编译总是在执行lazycpp之后发生.在我的情况下,这不是最佳的.

sak*_*kra 7

以下CMake命令可以作为项目的起点:

add_custom_target(scanner COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/scanner.py"
    COMMENT "Scanning include files ..."
    WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}")
Run Code Online (Sandbox Code Playgroud)

此命令包含第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)
Run Code Online (Sandbox Code Playgroud)

这些命令包括步骤2.预编译的头与它依赖于一个自定义命令生成precompiled.h隐式地对其他头precompiled.h包括. precompiled.h.gchCMAKE_CURRENT_BINARY_DIR目录中生成.由于预编译的头文件生成需要precompiled.h由python脚本更新,因此我们在目标上添加目标级别依赖项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)
Run Code Online (Sandbox Code Playgroud)

这些命令添加了生成可执行文件的标准编译步骤main.预编译头包含在gcc -include开关的默认头中.在CMAKE_CURRENT_BINARY_DIR其中包含precompiled.h.gch加入作为包括目录.precompiled.h.gch当包含precompiled.h时,gcc 将从那里获取(请参阅使用预编译标头).

最后,目标依赖性generate_precompiled确保在必要时更新预编译头.