2015-05-29 44 views
0

我有一個可執行文件,一些插件和一些生成的JSON的Web界面的大項目。CMake - 複製/合併具有依賴關係的文件更改檢查

因此,在我編寫的可執行文件和.so的插件,我做以下操作:

  1. 合併所有.js文件成一個大
  2. 編譯「發電機」(設置宏和printfs輸出來形容在C++代碼中的一些結構)
  3. 運行發電機和生成JSON文件(與一些的sedjshon)處理
  4. 在安裝階段,以及複製所有的這一點,所以我其他文件到目標目錄(如果不存在,應該創建它)。

但是我不知道,如何使用CMake來進行正確的依賴關係和日期時間檢查。其實,第一步是用:

FILE(GLOB WEB_INPUT_JS *.js) 
FILE(WRITE scripts.js.tmp "") 
FOREACH(SCRIPTFILE ${WEB_INPUT_JS}) 
    FILE(READ ${SCRIPTFILE} CONTENTS) 
    FILE(APPEND scripts.js.tmp "${CONTENTS}") 
ENDFOREACH() 
CONFIGURE_FILE(scripts.js.tmp ${WEB_BUILD_PATH}/scripts.js COPYONLY) 

但是這不會在makefile中創建依賴關係。我想重新運行這段「代碼」,其中一些${WEB_INPUT_JS}文件已被更改或${WEB_BUILD_PATH}/scripts.js已被刪除。

第三步是用一系列的

add_custom_command(TARGET gen_somedata POST_BUILD COMMAND gen_somedata | sed ${JSON_SED} | jshon > ${JSON_BUILD_PATH}/somedata.json) 
install (FILES ${JSON_BUILD_PATH}/somedata.json ......nextfiles.... DESTINATION ${JSON_OUTPUT_PATH}) 

取得如何做到這一點?非常感謝您的答案!

回答

0

所以我終於發現,如何做到這一點。

合併文件非常棘手。

首先,需要進行合併的cmake「腳本」(稍後我會解釋一些行)。我將它命名爲「concat.cmake」:當合並腳本用於如下

FUNCTION(CONCAT_FILES OUTPUT FILELIST) 
    FILE(WRITE ${OUTPUT} "") 
    FOREACH(SCRIPTFILE ${FILELIST}) 
     FILE(READ ${SCRIPTFILE} CONTENTS) 
     FILE(APPEND ${OUTPUT} "${CONTENTS}") 
    ENDFOREACH() 
ENDFUNCTION(CONCAT_FILES) 

STRING(REPLACE "," ";" FILELIST ${FILELIST}) 
CONCAT_FILES(${OUTPUT} "${FILELIST}") 

然後,(不入的CMakeLists.txt):

1)首先,請一個文件列表(使用通配符或通過手寫文件列表)。

FILE(GLOB INPUT_FILES_LIST *.js) # get list of JS files 

2)的唯一方式,如何通過一個cmake的列表,以其他的cmake腳本創建的文件列表由逗號分隔,然後使逗號分隔的列表到外部腳本。我做這個方式如下:

SET(FILELIST "") 
FOREACH(ITEM ${INPUT_FILES_LIST}) 
    SET(FILELIST "${FILELIST},${ITEM}") # append list item by ',' 
ENDFOREACH() 
STRING(SUBSTRING ${JSFILES} 1 -1 JSFILES) # remove first ',' 

3)現在不是問題調用腳本合併..

add_custom_command(OUTPUT some_output_file.ext 
    COMMAND ${CMAKE_COMMAND} -DFILELIST=${FILELIST} -DOUTPUT=some_output_frile.ext -P ${CMAKE_CURRENT_SOURCE_DIR}/concat.cmake 
    DEPENDS ${INPUT_FILES_LIST} VERBATIM) 

的先例代碼會被正確跟蹤輸入文件和輸出文件的變化將產生當丟失或輸入更改時。安裝非常容易,因爲安裝(文件「output.ext」DESTINATION/usr/share/...)