2016-11-23 64 views
0

我想將子目錄中的輸出文件添加到構建目標。 我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 

sub/*.txt建設卻沒有生成。

我應該如何構建所有構建命令?

更新(2017年2月4日)

我解決了這個問題:使用add_custom_command對於每一個目標,然後宣佈add_custom_target依賴的add_custom_command所有目標。

set(TARGET_FILES "") 
file(GLOB SRC_FILES "src/*.txt") 
foreach(SRC_FILE ${SRC_FILES}) 
    string(REGEX REPLACE "^.*/(.*).txt$" "\\1-foo.txt" TARGET_FILE ${SRC_FILE}) 
    add_custom_command(
    OUTPUT ${PROJECT_SOURCE_DIR}/sub/${TARGET_FILE} 
    COMMAND ${CMAKE_COMMAND} ARGS -E make_directory ${PROJECT_SOURCE_DIR}/sub 
    COMMAND ${PROJECT_SOURCE_DIR}/process.sh ARGS ${SRC_FILE} 
    MAIN_DEPENDENCY ${PROJECT_SOURCE_DIR}/process.sh) 
    list(APPEND TARGET_FILES "${PROJECT_SOURCE_DIR}/sub/${TARGET_FILE}") 
endforeach() 
add_custom_target(foo_txt ALL DEPENDS ${TARGET_FILES}) 
+0

我解決了這個問題: 「(SRC/* .TXT」 ''' 集(TARGET_FILES 「)GLOB SRC_FILES) 文件」 的foreach(SRC_FILE $ {SRC_FILES }) – furushchev

回答

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} 
) 
+0

謝謝你的答案!如果'output.txt'已經存在,或者'process.sh'上沒有更新,和'add_executable'的行爲相同,我想跳過執行'process.sh'。你的解決方案可能嗎? – furushchev

+0

@furushchev當然。 'process.sh'從你的源代碼目錄運行並輸出到源代碼目錄中?或者'process.sh'怎麼知道把output.txt放在哪裏? – Florian

+0

@furushchev爲「在process.sh'上觸發重建改變」部分添加了'MAIN_DEPENDENCY'。是的,任何不存在的輸出也會觸發重建。 Btw輸出也被添加到'clean'目標。 – Florian

相關問題