Kopieren des Verzeichnisses vom Quellbaum in den Binärbaum. Zum Beispiel: So kopieren Sie www in den Ordner bin.
work
├─bin
└─src
├─doing
│ └─www
├─include
└─lib
Vielen Dank.
Jiang Bian
Kopieren des Verzeichnisses vom Quellbaum in den Binärbaum. Zum Beispiel: So kopieren Sie www in den Ordner bin.
work
├─bin
└─src
├─doing
│ └─www
├─include
└─lib
Vielen Dank.
Chty
Seit Version 2.8 ist die file
Befehl hat a COPY
Unterbefehl:
file(COPY yourDir DESTINATION yourDestination)
Beachten Sie, dass:
Relative Eingabepfade werden in Bezug auf das aktuelle Quellverzeichnis ausgewertet, und ein relatives Ziel wird in Bezug auf das aktuelle Erstellungsverzeichnis ausgewertet
Das sieht vielversprechend aus. Können Sie erklären, wie Sie dies auslösen, oder läuft es jedes Mal?
– Zeichnete Noakes
30. Oktober 2014 um 15:42 Uhr
Es funktioniert nur, wenn der Befehl cmake ausgeführt wird, nicht während der eigentlichen Erstellungszeit
– Kevin
29. August 2018 um 7:20 Uhr
Was ist, wenn ich überprüfen möchte, ob das Verzeichnis bereits im Ziel vorhanden ist?
– Ahmed Hussein
23. Dezember 2018 um 15:35 Uhr
Chin Huang
Verwenden Sie mit CMake 2.8 oder höher die file(COPY ...)
Befehl.
Bei CMake-Versionen unter 2.8 kopiert das folgende Makro Dateien von einem Verzeichnis in ein anderes. Wenn Sie keine Variablen in den kopierten Dateien ersetzen möchten, ändern Sie die Datei configure_file @ONLY
Argument (zum Beispiel zu COPYONLY
).
# Copy files from source directory to destination directory, substituting any
# variables. Create destination directory if it does not exist.
macro(configure_files srcDir destDir)
message(STATUS "Configuring directory ${destDir}")
make_directory(${destDir})
file(GLOB templateFiles RELATIVE ${srcDir} "${srcDir}/*")
foreach(templateFile ${templateFiles})
set(srcTemplatePath ${srcDir}/${templateFile})
if(NOT IS_DIRECTORY ${srcTemplatePath})
message(STATUS "Configuring file ${templateFile}")
configure_file(
${srcTemplatePath}
${destDir}/${templateFile}
@ONLY)
endif(NOT IS_DIRECTORY ${srcTemplatePath})
endforeach(templateFile)
endmacro(configure_files)
Es ist einfach, Dateien oder Verzeichnisse zu kopieren, wenn Sie den cmake -E-Modus verwenden. Danke vielmals
– Jiang Bian
31. März 2009 um 2:07 Uhr
Bearbeitet, weil dies die akzeptierte Antwort und die andere Antwort mit der Datei ist (COPY-Befehl ist sauberer.
– Chin Huang
13. Januar 2012 um 17:12 Uhr
Ja, aber können Sie file(COPY…) als benutzerdefinierten Befehl ausführen, der vom Ziel abhängt?
– juzzline
9. Dezember 2014 um 10:42 Uhr
file(GLOB_RECURSE ..) für Unterverzeichnisse
– Gringo
10. April 2019 um 8:22 Uhr
Juzzlin
Wie niemand erwähnt hat cmake -E copy_directory
Als benutzerdefiniertes Ziel habe ich Folgendes verwendet:
add_custom_target(copy-runtime-files ALL
COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_SOURCE_DIR}/runtime-files-dir ${CMAKE_BINARY_DIR}/runtime-files-dir
DEPENDS ${MY_TARGET})
Kurz und gut, super. Wenn Sie fallen DEPENDS ${MY_TARGET}
dies kann parallel zum Kompilierungsprozess ablaufen. Denken Sie daran, dass Dateien jedes Mal kopiert werden make
läuft, daher kann es bei sehr großen Ordnern zu Einschränkungen kommen.
– Simon Warta
19. Februar 2015 um 15:11 Uhr
Ich bekomme Expected a command name, got unquoted argument with text "/runtime-files-dir".
dafür 🙁
– Benutzer4063815
24. Januar 2016 um 11:59 Uhr
Dies ist die bevorzugte Lösung für mich, da sie mit der Verwendung von $
– Kapitän Gulasch
19. Juni 2019 um 8:31 Uhr
Das configure
Der Befehl kopiert Dateien nur dann, wenn cmake
es läuft. Eine andere Möglichkeit besteht darin, ein neues Ziel zu erstellen und die Option custom_command zu verwenden. Hier ist eine, die ich verwende (wenn Sie sie mehr als einmal ausführen, müssen Sie die add_custom_target
Leitung, um sie für jeden Anruf eindeutig zu machen).
macro(copy_files GLOBPAT DESTINATION)
file(GLOB COPY_FILES
RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
${GLOBPAT})
add_custom_target(copy ALL
COMMENT "Copying files: ${GLOBPAT}")
foreach(FILENAME ${COPY_FILES})
set(SRC "${CMAKE_CURRENT_SOURCE_DIR}/${FILENAME}")
set(DST "${DESTINATION}/${FILENAME}")
add_custom_command(
TARGET copy
COMMAND ${CMAKE_COMMAND} -E copy ${SRC} ${DST}
)
endforeach(FILENAME)
endmacro(copy_files)
Jiang Bian
Verwenden Sie execute_process und rufen Sie cmake -E auf. Wenn Sie eine tiefe Kopie wünschen, können Sie die verwenden copy_directory
Befehl. Noch besser könnten Sie eine erstellen symlink
(sofern Ihre Plattform dies unterstützt) mit dem Befehl create_symlink. Letzteres kann wie folgt erreicht werden:
execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink ${CMAKE_SOURCE_DIR}/path/to/www
${CMAKE_BINARY_DIR}/path/to/www)
Aus: http://www.cmake.org/pipermail/cmake/2009-March/028299.html
Das einzige Problem dabei ist, dass das Konzept von Out-of-Source-Builds durchbrochen wird, wenn temporäre Dateien im Verzeichnis erstellt werden.
– Jason Mock
29. September 2011 um 18:09 Uhr
prokher
Dank! Das ist ein wirklich hilfreicher Rat, um eine Reihe von add_custom_target und add_custom_command zu verwenden. Ich habe die folgende Funktion geschrieben, um sie überall in meinen Projekten zu verwenden. Es gibt auch die Installationsregel an. Ich verwende es hauptsächlich zum Exportieren von Schnittstellen-Header-Dateien.
#
# export file: copy it to the build tree on every build invocation and add rule for installation
#
function (cm_export_file FILE DEST)
if (NOT TARGET export-files)
add_custom_target(export-files ALL COMMENT "Exporting files into build tree")
endif (NOT TARGET export-files)
get_filename_component(FILENAME "${FILE}" NAME)
add_custom_command(TARGET export-files COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_CURRENT_SOURCE_DIR}/${FILE}" "${CMAKE_CURRENT_BINARY_DIR}/${DEST}/${FILENAME}")
install(FILES "${FILE}" DESTINATION "${DEST}")
endfunction (cm_export_file)
Die Nutzung sieht so aus:
cm_export_file("API/someHeader0.hpp" "include/API/")
cm_export_file("API/someHeader1.hpp" "include/API/")
Das einzige Problem dabei ist, dass das Konzept von Out-of-Source-Builds durchbrochen wird, wenn temporäre Dateien im Verzeichnis erstellt werden.
– Jason Mock
29. September 2011 um 18:09 Uhr
Legenden2k
Basierend auf der Antwort von Seth Johnson; schrieb für mehr Komfort:
# Copy files
macro(resource_files files)
foreach(file ${files})
message(STATUS "Copying resource ${file}")
file(COPY ${file} DESTINATION ${Work_Directory})
endforeach()
endmacro()
# Copy directories
macro(resource_dirs dirs)
foreach(dir ${dirs})
# Replace / at the end of the path (copy dir content VS copy dir)
string(REGEX REPLACE "/+$" "" dirclean "${dir}")
message(STATUS "Copying resource ${dirclean}")
file(COPY ${dirclean} DESTINATION ${Work_Directory})
endforeach()
endmacro()