CMake: create_symlink vs ln
Ich habe ein makro, um links zu erstellen E. g.
makeLink($BUILD_ROOT/lib somewhere/somelibrary.so makelinks)
Der Zweck dieser ist es so, dass eine abgeschlossene bauen beinhaltet eine Verzeichnisstruktur Analog zu einem Entwickler-installation mit bin, gehören & lib Verzeichnisse mit links zu den eigentlichen Produkten.
Aber der Zweck ist nicht relevant für meine Frage, die über create_symlink und nicht eine meta-Frage, ob die links verwendet werden sollte für diese oder andere Zwecke.
Das makro kann auf vielerlei Weise implementiert werden, einschließlich:
macro(makeLink src dest target)
add_custom_command(TARGET ${target} PRE_BUILD
COMMAND ln -sf ${src} {dest} DEPENDS ${dest} COMMENT "mklink ${src} -> ${dest}")
endmacro()
oder:
macro(makeLink src dest target)
add_custom_command(TARGET ${target} PRE_BUILD
COMMAND ${CMAKE_COMMAND} -E create_symlink ${src} ${dest} DEPENDS ${dest} COMMENT "mklink ${src} -> ${dest}")
endmacro()
Jetzt verstehe ich den Punkt der create_symlink ist tragbar sein, im Falle dass die Plattform versteht nicht links. Allerdings scheint es funktional unvollständig sind. Es gibt verschiedene Anwendungsfälle mit ln
- einen link erstellen, ob die Quelle vorhanden ist oder noch nicht
- erstellen Sie einen link nur, wenn die Quelle vorhanden ist
- überschreiben Sie eine vorhandene Verknüpfung oder nicht
Soweit ich sehen kann, die cmake-Dokumentation unter-spezifiziert das Verhalten (eigentlich: erstellen Sie den link, wenn das Ziel nicht vorhanden ist und die Quelle vorhanden ist. Fehlschlagen, wenn die Quelle nicht vorhanden ist)
https://cmake.org/cmake/help/v3.2/manual/cmake.1.html
Scheint dies möglicherweise zu verwirren viele Nutzer, die meinen, es sollte zum arbeiten gemäß einem und nur einem der möglichen Anwendungsfälle. E. g.
https://cmake.org/Bug/view.php?id=14928
https://cmake.org/Bug/print_bug_page.php?bug_id=4418
Gegeben, warum sollte jemand jemals verwenden create_symlink?
Wäre das nicht der sinnvollste Kurs zu integrieren, Unterstützung für alle gängigen Anwendungsfälle (im wesentlichen durch die Implementierung eines Systems portable wrapper für ln)?
Gibt es eine semi-Norm .cmake-Datei irgendwo???
Ist auch cmake wirklich einen rekursiven Aufruf Gabel selbst wenn Sie cmake -E oder hat der parser erkennt es als einen besonderen Fall. Ich vermute letzteres, da scheint sehr schnell (zugegeben, die Erstellung von links auf diese Weise würde immer noch scheinen schnell) aber wenn das so ist, warum die unnötig verbose syntax?
Hinweis: ich bin nicht die Bibliotheken als Teil konfigurieren. links Bibliotheken werden erstellt, um support zwei Dinge:
- verknüpfen von Programmen, die Verwendung der Bibliotheken in anderen sub-Projekte
- Ausführung von tests, die Verwendung der Bibliotheken
Die Bibliotheken sind eigentlich nicht gebaut, die während des 'configure' - Phase. Die links müssen nur zur Verfügung stehen, nur in der Zeit. Dies ist Teil einer migration von einem configure/make-basiertes build-system cmake/ninja. Seine eine große Projekt, in dem eine schrittweise roll-out von cmake besser ist als ein big bang. Es passiert einfach so, dass im bestehenden system die links unter konfigurieren der Zeit (obwohl nicht verwendet, bis die build-Zeit).
InformationsquelleAutor Bruce Adams | 2016-01-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
In der Regel
create_symlink
ist nur in der build-Verzeichnis einen link zu Sachen, vor allem im source-Verzeichnis. Gegeben, und die erforderliche Plattformunabhängigkeit, alles ist in Ordnung.Wenn du mehr brauchst dann
create_symlink
bietet, gibt es eine hohe Wahrscheinlichkeit, Sie werden mit CMake in einer Weise, die es ist nicht beabsichtigt, oder CMake ist nicht das richtige Werkzeug für Ihre Aufgabe.Was CMake bietet, zusammengefaßt, indem Sie mit "erstellen Sie den link, wenn das Ziel nicht vorhanden ist und die Quelle vorhanden ist. Fehlschlagen, wenn die Quelle nicht vorhanden ist" ist alles, was Sie brauchen. Sie wissen, welche Datei erstellt, so erstellen Sie einen link, und nicht zu wissen, ob dieser link bereits existiert, oder ob die Quelle vorhanden ist sollte das nie passieren. Warum überschreiben Sie einen link, wenn Sie gerade erst erstellt?
In deinem Fall
add_custom_command
ist nur das richtige Werkzeug. Ersetzen Sie einfachPRE_BUILD
durchPOST_BUILD
.Gebäude, Bibliotheken sollten nicht Teil konfigurieren. Wenn Sie angewiesen auf Bibliotheken, erstellen Sie eine sub_project. Diese enthalten, können Sie bekommen, was Sie wollen. Zu mir, dein Ansatz sieht nicht den CMake-Weg.
Kommentar gelöscht, da nicht genug Platz
Für tests kann man einfach target_link_libraries. Ich verstehe nicht, warum Sie hack um dieses feature. Oder schreiben Sie eine kleine makro fügt alle notwendigen Bibliotheken, so dass Sie nicht haben, um es zu tun für jeden test.
Dieser thread ist ein ablenken von meiner eigentlichen Frage. Meine Frage ist zu verstehen, die Motive, die hinter der minimalistischen Funktionalität create_symlink und nicht zu re-Faktor, meinem eigentlichen build-system als auch, dass diese Aufgabe bereits in der hand. Ich habe aktualisiert die wichtigste Frage, um zu versuchen und zu reflektieren, dies besser.
InformationsquelleAutor usr1234567