CMake:GCC 预处理器 IMACROS 文件更改不会触发重建
CMake: GCC preprocessor IMACROS file change does not trigger rebuild
我正在使用 GCC 的 -imacros
选项来设置项目的所有预处理器定义(选项)。
在 imacros
之前,我一直在使用带有预处理器定义名称的原始文件,并在 CMAKE 中使用正则表达式我正在创建 -D
的列表以放入 CMAKE_C_FLAGS
.
这工作正常但在文本编辑器中很难看。因此,为了增强这一点,我已更改为 -imacros
.
CMAKE_C_FLAGS
将包含 -imacros
"path to configuration header"
这工作正常,但如果我更改配置中的某些配置项 header CMAKE 不会重新编译文件(看不到更改)。在旧版本中 - 如您所料 - 如果某些 -D
被更改,所有文件都将被重新编译。
有什么帮助吗?
一个简单的方法
您可以使用 OBJECT_DEPENDS
源文件 属性。但是需要为所有源文件设置类似:
set_source_files_properties(
${sources}
PROPERTIES
OBJECT_DEPENDS "path to configuration header"
)
项目中所有源文件的备选方案
CMake 官方建议将所有定义放在一个 header 文件中,该文件包含在所有源文件中。 header 可以例如使用 configure_file()
.
从模板生成
但是为了遵循您使用 -imacros
编译器标志的思路,这里有两种替代方法可以在 "path to configuration header" 文件更改时触发所有源文件的重建:
您可以将 OBJECT_DEPENDS
的范围扩展到当前目录中的所有目标及其源文件 define_property(... INHERITED ...)
:
If the INHERITED
option then the get_property()
command will chain up to the next higher scope when the requested property is not set in the scope given to the command. DIRECTORY
scope chains to GLOBAL
. TARGET
, SOURCE
, and TEST
chain to 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"
)
如果我理解正确,如果您的 "configuration header" should/would 更改,您无论如何都必须 re-run CMake。然后你可以简单地在你的 "configuration header" 之外添加一个定义来跟踪 header ,比如:
file(TIMESTAMP "path to configuration header" _timestamp)
add_definitions(-DIMACROS_TIMESTAMP=${_timestamp})
现在,每当您的 header 获得新的时间戳时,所有目标的定义都会发生变化,并且您的构建系统将重建所有源文件。
我正在使用 GCC 的 -imacros
选项来设置项目的所有预处理器定义(选项)。
在 imacros
之前,我一直在使用带有预处理器定义名称的原始文件,并在 CMAKE 中使用正则表达式我正在创建 -D
的列表以放入 CMAKE_C_FLAGS
.
这工作正常但在文本编辑器中很难看。因此,为了增强这一点,我已更改为 -imacros
.
CMAKE_C_FLAGS
将包含 -imacros
"path to configuration header"
这工作正常,但如果我更改配置中的某些配置项 header CMAKE 不会重新编译文件(看不到更改)。在旧版本中 - 如您所料 - 如果某些 -D
被更改,所有文件都将被重新编译。
有什么帮助吗?
一个简单的方法
您可以使用 OBJECT_DEPENDS
源文件 属性。但是需要为所有源文件设置类似:
set_source_files_properties(
${sources}
PROPERTIES
OBJECT_DEPENDS "path to configuration header"
)
项目中所有源文件的备选方案
CMake 官方建议将所有定义放在一个 header 文件中,该文件包含在所有源文件中。 header 可以例如使用 configure_file()
.
但是为了遵循您使用 -imacros
编译器标志的思路,这里有两种替代方法可以在 "path to configuration header" 文件更改时触发所有源文件的重建:
您可以将
OBJECT_DEPENDS
的范围扩展到当前目录中的所有目标及其源文件define_property(... INHERITED ...)
:If the
INHERITED
option then theget_property()
command will chain up to the next higher scope when the requested property is not set in the scope given to the command.DIRECTORY
scope chains toGLOBAL
.TARGET
,SOURCE
, andTEST
chain toDIRECTORY
.所以在你的情况下这转化为:
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" )
如果我理解正确,如果您的 "configuration header" should/would 更改,您无论如何都必须 re-run CMake。然后你可以简单地在你的 "configuration header" 之外添加一个定义来跟踪 header ,比如:
file(TIMESTAMP "path to configuration header" _timestamp) add_definitions(-DIMACROS_TIMESTAMP=${_timestamp})
现在,每当您的 header 获得新的时间戳时,所有目标的定义都会发生变化,并且您的构建系统将重建所有源文件。