Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使CMake重新配置依赖于自定义文件?_Cmake_Code Generation - Fatal编程技术网

如何使CMake重新配置依赖于自定义文件?

如何使CMake重新配置依赖于自定义文件?,cmake,code-generation,Cmake,Code Generation,我在CMake下有一个项目,其中包含一些用python生成器从XML文件生成的文件。我无法在CMakeLists.txt中指定此生成器生成的所有文件,因此我使用文件全局绑定 问题是,当我更新XML文件或生成器源(位于同一存储库中)时,我希望重新配置生成系统,以便在重建代码时考虑更改的文件(例如,通过make) 是否可以使CMake像对待CMakeLists.txt文件一样对待某些文件,并在这些文件更改时使其重新生成生成系统?是的,您应该能够通过(ab)使用configure\u file()来做

我在CMake下有一个项目,其中包含一些用python生成器从XML文件生成的文件。我无法在CMakeLists.txt中指定此生成器生成的所有文件,因此我使用文件全局绑定

问题是,当我更新XML文件或生成器源(位于同一存储库中)时,我希望重新配置生成系统,以便在重建代码时考虑更改的文件(例如,通过make)


是否可以使CMake像对待CMakeLists.txt文件一样对待某些文件,并在这些文件更改时使其重新生成生成系统?

是的,您应该能够通过(ab)使用
configure\u file()
来做到这一点。配置文件会使源成为CMake运行的依赖项,因此其中的任何更改都会导致重新配置。就这样:

configure_file(MyInputFile.xml DummyOutput.xml)

是的,您应该能够通过(ab)使用
configure\u file()
来实现这一点。配置文件会使源成为CMake运行的依赖项,因此其中的任何更改都会导致重新配置。就这样:

configure_file(MyInputFile.xml DummyOutput.xml)

它不需要任何解决方法。标准方法是使用属性:

set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS <filename>)
set\u属性(目录附加属性CMAKE\u CONFIGURE\u取决于)

它不需要任何解决方法。标准方法是使用属性:

set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS <filename>)
set\u属性(目录附加属性CMAKE\u CONFIGURE\u取决于)

因为已经有一段时间了,我将补充@roolebo的答案

实际上,有一个更好的命令可以添加对文件的依赖项:
set\u directory\u属性(属性CMAKE\u CONFIGURE\u取决于)


可能令人困惑的是,此命令将属性添加到当前目录。好吧,这并不重要,因为您可以设置驻留在当前目录范围之外的文件的完整路径,例如:
。/../config.json

,因为我将在@roolebo的答案中添加一段时间

实际上,有一个更好的命令可以添加对文件的依赖项:
set\u directory\u属性(属性CMAKE\u CONFIGURE\u取决于)


可能令人困惑的是,此命令将属性添加到当前目录。当然,这并不重要,因为您可以设置位于当前目录范围之外的文件的完整路径,例如:
。/../config.json

它确实重新配置了项目,但还有另一个问题。我正在使用add_custom_命令和add_custom_target来触发文件的重新生成,但是这些目标是在与重新配置不同的时刻完成的。您认为有没有可能在构建这些目标之后立即运行重新配置,然后CMake可以检测到更改?我99%确信这是不可能的,我想我将被迫使用execute_命令而不是add_custom_命令,但如果你知道答案,我会特别感激。@Netrix你把时间搞混了。
add_custom_target
add_custom_command
的命令在构建时执行(即运行
make
)。这与CMake配置时间(当CMake运行时)无关。一旦构建时间开始(即自定义命令正在运行),CMake就不再出现在图片中——它的运行已经完成了。我想是这样的。所以我想唯一的解决方案是在配置时使用execute_进程生成所有文件,然后将这些文件归档(GLOB)并添加到目标。我说的对吗?它确实重新配置了项目,但还有另一个问题。我正在使用add_custom_命令和add_custom_target来触发文件的重新生成,但是这些目标是在与重新配置不同的时刻完成的。您认为有没有可能在构建这些目标之后立即运行重新配置,然后CMake可以检测到更改?我99%确信这是不可能的,我想我将被迫使用execute_命令而不是add_custom_命令,但如果你知道答案,我会特别感激。@Netrix你把时间搞混了。
add_custom_target
add_custom_command
的命令在构建时执行(即运行
make
)。这与CMake配置时间(当CMake运行时)无关。一旦构建时间开始(即自定义命令正在运行),CMake就不再出现在图片中——它的运行已经完成了。我想是这样的。所以我想唯一的解决方案是在配置时使用execute_进程生成所有文件,然后将这些文件归档(GLOB)并添加到目标。我说的对吗?您可以在文件名中使用*.xml来选择所有xml文件吗?@lnunn不确定您可以使用file(GLOB)来获取文件列表,然后附加该列表。但是,非常不鼓励这样做,因为每次添加新文件时,您都会被迫调用CMake。您可以在文件名中使用*.xml来选择所有xml文件吗?@lnunn不确定您可以使用file(GLOB)获取文件列表,然后附加该列表。但是,这是非常不鼓励的,因为每次添加新文件时,您都将被迫调用CMake。