CMake - 复制/合并具有依赖关系的文件进行更改检查

时间:2015-05-29 08:28:15

标签: cmake

我有一个包含一个可执行文件的大项目,一些插件和带有一些生成的JSON的Web界面。

因此,在编译可执行文件和.so插件后,我正在执行以下操作:

  1. 将所有.js文件合并为一个大
  2. 编译“生成器”(一组宏和printfs来描述C ++代码中的一些结构)
  3. 运行生成器并生成JSON文件(包含 sed jshon )处理
  4. 在安装阶段,将所有这些文件和其他一些文件复制到目标目录(如果不存在则应创建)。
  5. 我不知道,如何使用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})
    

    这是怎么做到的?非常感谢您的回答!

1 个答案:

答案 0 :(得分: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)首先,制作一个文件列表(使用globbing或手工编写文件列表)。

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 /...)