我正在为GCC使用-imacros
选项,以便为项目设置所有预处理器定义(选项)。
在imacros
之前我一直在使用原始文件,预处理器在CMAKE中定义名称和正则表达式,我创建了-D
的列表以放入CMAKE_C_FLAGS
。
这在文本编辑器中看起来很好但很难看。因此,为了加强这一点,我已更改为-imacros
。
CMAKE_C_FLAGS
将包含-imacros
“配置标头的路径”
这样可以正常工作,但是如果我在配置头中更改了一些配置项,则CMAKE不会重新编译该文件(看不到更改)。在旧版本中 - 如您所料 - 如果更改了某些-D
,则会重新编译所有文件。
任何帮助?
答案 0 :(得分:1)
您可以使用OBJECT_DEPENDS
源文件属性。但是需要为所有源文件设置,例如:
set_source_files_properties(
${sources}
PROPERTIES
OBJECT_DEPENDS "path to configuration header"
)
官方CMake建议将所有定义放在所有源文件包含的头文件中。标题可以是例如使用configure_file()
从模板生成。
但是要使用-imacros
编译器标志来遵循您的思路,如果“配置标头的路径”文件发生更改,以下是触发重建所有源文件的两种替代方法:
您可以使用define_property(... INHERITED ...)
将OBJECT_DEPENDS
的范围扩展到当前目录中的所有目标及其源文件:
如果
INHERITED
选项,则get_property()
命令将在命令的作用域中未设置请求的属性时链接到下一个更高的作用域。DIRECTORY
范围链到GLOBAL
。TARGET
,SOURCE
和TEST
链到DIRECTORY
。
因此,在您的情况下,这转换为:
define_property(
SOURCE
PROPERTY OBJECT_DEPENDS
INHERITED
BRIEF_DOCS "brief-doc"
FULL_DOCS "full-doc"
)
set_directory_properties(
PROPERTIES
OBJECT_DEPENDS "path to configuration header"
)
如果我理解正确的话,如果你的“配置标题”应该/会改变,你无论如何都要重新运行CMake。然后,您只需在“配置标题”之外添加一个定义,即使用以下内容跟踪标题:
file(TIMESTAMP "path to configuration header" _timestamp)
add_definitions(-DIMACROS_TIMESTAMP=${_timestamp})
现在,每当您的标头获得新的时间戳时,所有目标的定义都在变化,您的构建系统将重建所有源文件。