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

Schreibe einen Kommentar