Wie kopiere ich das Verzeichnis vom Quellbaum in den Binärbaum?

Lesezeit: 5 Minuten

Benutzeravatar von Jiang Bian
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.

Benutzeravatar von Chty
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

Benutzeravatar von Chin Huang
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

Benutzeravatar von juzzlin
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 $ funktioniert

    – 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)

Benutzeravatar von Jiang Bian
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

Benutzeravatar von prokher
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

Benutzeravatar von legends2k
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()

1417500cookie-checkWie kopiere ich das Verzeichnis vom Quellbaum in den Binärbaum?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy