将子文件夹中的文件添加到目标

时间:2016-11-23 16:26:16

标签: cmake

我想将子目录中的输出文件添加到构建目标中。 我在f_exp中写道如下:

CMakeLists.txt

并执行:

file(GLOB srcfiles "src/*.txt")
add_custom_target(subtask ALL)
set(dest_dir ${PROJECT_SOURCE_DIR}/sub/)
foreach(srcfile ${srcfiles})
  string(REGEX REPLACE "^.*/(.*).txt$" filename ${srcfile})
  add_custom_command(OUTPUT ${dest_dir}/${filename}.txt
    COMMAND ${CMAKE_COMMAND} ARGS -E make_directory ${dest_dir}
    COMMAND ${PROJECT_SOURCE_DIR}/process.sh ARGS ${srcfile}
    MAIN_DEPENDENCY ${PROJECT_SOURCE_DIR}/process.sh)
    add_dependencies(subtask ${dest_dir}/${filename}.txt)
endforeach(srcfile)

但是在构建之后不会创建mkdir build && cmake .. && make

如何在构建时构建所有命令?

更新(2017/2/4)

我解决了这个问题:对每个目标使用sub/*.txt,然后声明add_custom_command取决于add_custom_target的所有目标。

add_custom_command

1 个答案:

答案 0 :(得分:1)

有点不清楚你想要达到的目标,但仅仅从看它我会说它应该是:

set(dest_dir ${PROJECT_SOURCE_DIR}/sub)
add_custom_target(
    subtask ALL
    COMMAND ${CMAKE_COMMAND} -E make_directory ${dest_dir}
    COMMAND ${PROJECT_SOURCE_DIR}/process.sh
)

只有当output.txt是其他内容的输入时,才需要自定义命令:

set(dest_dir ${PROJECT_SOURCE_DIR}/sub)
add_custom_command(
    OUTPUT ${dest_dir}/output.txt
    COMMAND ${CMAKE_COMMAND} -E make_directory ${dest_dir}
    COMMAND ${PROJECT_SOURCE_DIR}/process.sh
    MAIN_DEPENDENCY ${PROJECT_SOURCE_DIR}/process.sh
)
add_custom_target(
    subtask ALL 
    DEPENDS ${dest_dir}/output.txt 
)

请注意,这些命令的默认工作目录是CMAKE_CURRENT_BINARY_DIR

编辑:我认为您的代码中的问题是使用add_dependencies()来处理文件级别的依赖项。但add_dependencies()只能用于声明目标依赖项。

编辑:使用foreach(),您可以收集依赖关系,也可以将APPEND收集到虚拟输出。第一个看起来像这样:

file(GLOB srcfiles "src/*.txt")
set(dest_dir "${PROJECT_SOURCE_DIR}/sub")
file(MAKE_DIRECTORY "${dest_dir}")
foreach(srcfile ${srcfiles})
    get_filename_component(filename "${srcfile}" NAME_WE)
    add_custom_command(
        OUTPUT "${dest_dir}/${filename}.txt"
        COMMAND ${PROJECT_SOURCE_DIR}/process.sh ${srcfile}
        MAIN_DEPENDENCY "${srcfile}"
        DEPENDS "${PROJECT_SOURCE_DIR}/process.sh"
        WORKING_DIRECTORY "${dest_dir}"
    )
    list(APPEND subtask_deps "${dest_dir}/${filename}.txt")
endforeach(srcfile)
add_custom_target(
    subtask ALL
    DEPENDS ${subtask_deps}
)