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


71

Kopieren des Verzeichnisses vom Quellbaum in den Binärbaum. Zum Beispiel: So kopieren Sie www in den Ordner bin.

Vielen Dank.

Antworten:


43

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 @ONLYArgument 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)

Im cmake-E-Modus ist es einfach, Dateien oder Verzeichnisse zu kopieren. Vielen Dank
— Jiang Bian

Bearbeitet, weil dies die akzeptierte Antwort und die andere Antwort mit der Datei ist (COPY-Befehl ist sauberer.
— Chin Huang

4
Ja, aber können Sie die Datei (COPY ...) als benutzerdefinierten Befehl ausführen, der vom Ziel abhängt?
— Juzzlin

2
Datei (GLOB_RECURSE ..) für Unterverzeichnisse
— Gringo

130

Seit Version 2.8 hat der Befehl file ein Kopierargument:

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


4
Das sieht vielversprechend aus. Können Sie erklären, wie Sie dies auslösen, oder wird es jedes Mal ausgeführt?
— Drew Noakes

5
Es funktioniert nur, wenn der Befehl cmake ausgeführt wird, nicht während der tatsächlichen Erstellungszeit
— Kevin

Was ist, wenn ich überprüfen möchte, ob das Verzeichnis bereits im Ziel vorhanden ist?
— Ahmed Hussein

27

Der configureBefehl kopiert nur Dateien, wenn er ausgeführt cmakewird. 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 die add_custom_targetLeitung ändern , um sie für jeden Anruf eindeutig zu machen).


Ich habe Ihre (erstaunliche) Antwort angepasst, um ein modulareres Skript zu erhalten. Siehe meine Antwort!
— Salamandar

Beachten Sie, dass diese Antwort (jetzt zehn Jahre alt !!) vor den Generatorausdrücken in CMake sowie vor dem copy_directoryBefehl liegt.
— Seth Johnson

25

Wie noch niemand cmake -E copy_directoryals benutzerdefiniertes Ziel erwähnt hat, habe ich Folgendes verwendet:


Kurz und einfach, großartig. Wenn Sie dies löschen, DEPENDS ${MY_TARGET}kann dies parallel zum Kompilierungsprozess ausgeführt werden. Beachten Sie, dass Dateien bei jeder makeAusführung kopiert werden , sodass bei sehr großen Ordnern möglicherweise Einschränkungen auftreten.
— Simon Warta

Ich bekomme Expected a command name, got unquoted argument with text "/runtime-files-dir".dafür :(

Dies ist die bevorzugte Lösung für mich, da es mit der Verwendung von $ <CONFIG>
— Amazonasmann

15

Verwenden Sie execute_process und rufen Sie cmake -E auf. Wenn Sie eine tiefe Kopie wünschen, können Sie den copy_directoryBefehl verwenden. Noch besser ist, dass Sie symlinkmit 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


3
Das einzige Problem dabei ist, dass das Konzept von Out-of-Source-Builds verletzt wird, wenn temporäre Dateien im Verzeichnis erstellt werden.
— Jason Mock

2

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.

Die Verwendung sieht folgendermaßen aus:


Das sieht interessant aus. Kann es ganze Verzeichnisse kopieren?
— Drew Noakes

1

Basierend auf der Antwort von Seth Johnson habe ich das zur Vereinfachung geschrieben.

EDIT: Das funktioniert nicht wirklich wie erwartet. Dieser funktioniert einwandfrei.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.