我有一个包含一个可执行文件的大项目,一些插件和带有一些生成的JSON的Web界面。
因此,在编译可执行文件和.so插件后,我正在执行以下操作:
但我不知道,如何使用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 :(得分: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 /...)