2016-11-23 4 views
0

Ich möchte Ausgabedateien im Unterverzeichnis zu einem Build-Ziel hinzufügen. Ich schrieb in CMakeLists.txt wie unten:Dateien in Unterordnern zum Ziel hinzufügen

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) 

und ausgeführt:

mkdir build && cmake .. && make 

Aber sub/*.txt sind nicht nach dem Bauprozess erstellt.

Wie sollte ich tun, um alle Befehle auf Build zu bauen?

aktualisiert (2017/2/4)

ich das Problem gelöst: für jedes Ziel add_custom_command verwenden und dann add_custom_target deklariert, die auf alle Zielen von add_custom_command abhängt.

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

ich das Problem gelöst: "(. Src/* .txt" '' ' Satz (TARGET_FILES ") GLOB SRC_FILES) Datei" foreach (SRC_FILE $ {SRC_FILES }) – furushchev

Antwort

1

Es ist ein wenig unklar, was Sie erreichen wollen, sondern nur an mich von der Suche würde ich sagen, es sein sollte:

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 
) 

Nur wenn die output.txt einen Eingang für etwas anderes, Sie benötigen einen benutzerdefinierten Befehl:

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 
) 

Beachten Sie, dass die Standardeinstellung für diese Befehle Arbeitsverzeichnis ist CMAKE_CURRENT_BINARY_DIR.

Edit: Ich denke, das Problem in Ihrem Code ist die Verwendung von add_dependencies() für Dateiebene Abhängigkeiten. Aber add_dependencies() kann nur verwendet werden, um Zielabhängigkeiten zu deklarieren.

Edit: Mit einem foreach() Sie entweder den Abhängigkeiten sammeln können oder APPEND sie mit einer Blindleistung. Die erste sieht wie folgt aus:

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

Vielen Dank für die Antwort! Ich würde gerne die Ausführung von 'process.sh' überspringen, wenn' output.txt' bereits existiert oder es kein Update auf 'process.sh' gibt, genauso wie das Verhalten von' add_executable'. Ist das in Ihrer Lösung möglich? – furushchev

+0

@furushchev Sicher. Wird 'process.sh' von Ihrem Quellverzeichnis ausgeführt und in das Quellverzeichnis ausgegeben? Oder woher weiß "process.sh", wo er "output.txt" ablegen soll? – Florian

+0

@furushchev "MAIN_DEPENDENCY" für den Abschnitt "trigger a rebuild on' process.sh' changes "hinzugefügt. Und ja, jede nicht existierende Ausgabe wird auch eine Neuerstellung auslösen. Btw-Ausgänge werden ebenfalls zum "sauberen" Ziel hinzugefügt. – Florian

Verwandte Themen