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.

Jiang Bian
quelle

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)
Chin Huang
quelle
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

Chty
quelle
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).

Seth Johnson
quelle
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:

juzzlin
quelle
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

Jiang Bian
quelle
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:

prokher
quelle
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.

Salamandar
quelle