使用ADD_CUSTOM_COMMAND
触发您的发电机。它允许您定义输入和输出相关性,并且只有在输出比输入更老时才会运行。
ADD_CUSTOM_COMMAND(OUTPUT generatedfile1 generatedfile2
COMMAND python generateSources.py xmlfile1 xmlfile2
DEPENDS xmlfile1 xmlfile2 generateSources.py
COMMENT "Generating source code from XML")
确保生成的文件不超过一个独立的目标使用可以并行编译或可能(会)让您的生成过程中的冲突。为了确保这一点,下面应该做的伎俩:
ADD_CUSTOM_TARGET(RunGenerator DEPENDS generatedfile1 generatedfile2
COMMENT "Checking if re-generation is required")
然后让你的其他目标依赖于这一个:
ADD_DEPENDENCY(MyTarget RunGenerator)
注:的RunGenerator
目标将始终被视为失日期,并因此始终运行。但是,由于在这种情况下它什么都没做(除了打印评论和检查依赖关系),那并不重要。如果需要,自定义命令将处理再生。评论后
更新:
如果你不知道该文件的名称,你可以使用
ADD_CUSTOM_COMMAND(OUTPUT generated.timestamp
COMMAND python generateSources.py xmlfile1 xmlfile2
COMMAND ${CMAKE_COMMAND} -E touch generated.timestamp
DEPENDS xmlfile1 xmlfile2 generateSources.py
COMMENT "Generating source code from XML")
然而:使用GLOB需要你明确地运行CMake的更新您的文件列表。 将此集成到自定义命令中可能会让您的构建过程变得糟糕(如果多个项目正在并行构建并且一个项目将重新启动CMake配置)。 IIRC,当你知道python脚本或者XML文件改变时,你可以手动运行CMake,但是你的问题是当其他任何事情需要重新运行CMake时触及这些文件。
如果python脚本运行时间不长,可以让它运行每个CMake运行(就像你现在做的那样),但要确保没有改动的文件没有被触及,你可以尝试下面的(未经测试的):
# generated sources files into a temporary directory (adjust your current execute_process)
EXECUTE_PROCESS(COMMAND python ../generateSources.py ../xmlfile1 ../xmlfile2
WORKING_DIRECTORY tmp)
# get the filenames
FILE(GLOB GENERATED_TEMP_FILES tmp/*)
# copy to the "expected" directory, but only if content CHANGED
FOREACH(F ${GENERATED_TEMP_FILES})
GET_FILENAME_COMPONENT("${F}" FN NAME)
CONFIGURE_FILE("${F}" "./generated/${FN}" COPY_ONLY)
ENDFOREACH()
# use your current globbing command
FILE(GLOB GENERATED_SOURCES ./generated/*)
'导致我生成的代码被recompiled'那么可能是你需要提高你的发电机? '发电机代码本身改变''configure_file可以做到这一点:http://stackoverflow.com/a/26076132/2288008 – 2014-10-05 18:26:52
@ruslo:只是为了检查我是否理解你的权利......我将让代码生成器吐出它以CMAKE可以读取的格式生成的文件列表? (一个SET(foo1 foo2)列表)... – 2014-10-05 23:17:11
@ruslo:另一件事。我知道生成的文件在哪里结束,并将它们包括在最终的可执行文件中,目前是使用文件(GLOB)完成的。我可以继续这么做吗? – 2014-10-05 23:21:19