2015-05-29 60 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/...)