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.
Verwenden Sie in CMake 2.8 den file(COPY ...)
Befehl.
Bei älteren CMake-Versionen kopiert dieses Makro Dateien von einem Verzeichnis in ein anderes. Wenn Sie keine Variablen in den kopierten Dateien ersetzen möchten, ändern Sie das @ONLY
Argument configure_file (z. B. in 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)
Seit Version 2.8 hat der Befehl file ein Kopierargument:
Beachten Sie, dass:
quelle
Der
configure
Befehl kopiert nur Dateien, wenn er ausgeführtcmake
wird. Eine andere Option besteht darin, ein neues Ziel zu erstellen und die Option custom_command zu verwenden. Hier ist eine, die ich verwende (wenn Sie sie mehrmals ausführen, müssen Sie dieadd_custom_target
Leitung ändern , 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)
quelle
copy_directory
Befehl liegt.Wie noch niemand
cmake -E copy_directory
als benutzerdefiniertes Ziel erwähnt hat, habe ich Folgendes verwendet:quelle
DEPENDS ${MY_TARGET}
kann dies parallel zum Kompilierungsprozess ausgeführt werden. Beachten Sie, dass Dateien bei jedermake
Ausführung kopiert werden , sodass bei sehr großen Ordnern möglicherweise Einschränkungen auftreten.Expected a command name, got unquoted argument with text "/runtime-files-dir".
dafür :(Verwenden Sie execute_process und rufen Sie cmake -E auf. Wenn Sie eine tiefe Kopie wünschen, können Sie den
copy_directory
Befehl verwenden. Noch besser ist, dass Siesymlink
mit dem Befehl create_symlink eine erstellen können (sofern Ihre Plattform dies unterstützt). Letzteres kann folgendermaßen erreicht werden:Von: http://www.cmake.org/pipermail/cmake/2009-March/028299.html
quelle
Danken! Dies ist ein sehr hilfreicher Rat, um eine Reihe von add_custom_target und add_custom_command zu verwenden. Ich habe die folgende Funktion geschrieben, die ich überall in meinen Projekten verwenden kann. Gibt auch die Installationsregel an. Ich benutze es hauptsächlich, um Schnittstellen-Header-Dateien zu exportieren.
# # 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 Verwendung sieht folgendermaßen aus:
cm_export_file("API/someHeader0.hpp" "include/API/") cm_export_file("API/someHeader1.hpp" "include/API/")
quelle
Basierend auf der Antwort von Seth Johnson habe ich das zur Vereinfachung geschrieben.
# Always define the target add_custom_target(copy_resources ALL COMMENT "Copying resources…") # Copy single files macro(add_files_to_environment files) add_custom_command(TARGET copy_resources POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy ${ARGV} ${CMAKE_CURRENT_BINARY_DIR}) endmacro() # Copy full directories macro(add_directory_to_environment distant local_name) file(GLOB_RECURSE DistantFiles RELATIVE ${distant} ${distant}/*) foreach(Filename ${DistantFiles}) set(SRC "${distant}/${Filename}") set(DST "${CURRENT_BUILD_DIR}/${local_name}/${Filename}") add_custom_command(TARGET copy_resources POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy ${SRC} ${DST}) message(STATUS "file ${Filename}") endforeach(Filename) endmacro()
EDIT: Das funktioniert nicht wirklich wie erwartet. Dieser funktioniert einwandfrei.
# Copy single files macro(resource_files files) foreach(file ${files}) message(STATUS "Copying resource ${file}") file(COPY ${file} DESTINATION ${Work_Directory}) endforeach() endmacro() # Copy full 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()
quelle