使用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