Instalarea țintelor¶

install(TARGETS targets... ] ] ] )

Formularul TARGETS specifică regulile de instalare a țintelor din aproiect. Există mai multe tipuri de artefacte țintă de ieșire care pot fi instalate:

ARCHIVE

Artifactele țintă de acest tip includ:

  • Biblioteci statice (cu excepția celor de pe macOS când sunt marcate ca FRAMEWORK, vezi mai jos);

  • Biblioteci de import DLL (pe toate sistemele bazate pe Windows, inclusiv Cygwin; acestea au extensia.lib, spre deosebire de bibliotecile .dll care merg la RUNTIME);

  • Pe AIX, fișierul de import al linkerului creat pentru executabilele cuENABLE_EXPORTS activat.

LIBRARY

Artifactele țintă de acest tip includ:

  • Biblioteci partajate, cu excepția

    • DLL-urilor (acestea merg la RUNTIME, a se vedea mai jos),

    • pe macOS atunci când sunt marcate ca FRAMEWORK (a se vedea mai jos).

RUNTIME

Artifactele țintă de acest tip includ:

  • Executables(cu excepția pe macOS când sunt marcate ca MACOSX_BUNDLE, vezi BUNDLE mai jos);

  • DLL-uri (pe toate sistemele bazate pe Windows, inclusiv Cygwin; rețineți că bibliotecile de import care le însoțesc sunt de tipul ARCHIVE).

OBJECTS

Noi în versiunea 3.9.

Filele obiect asociate bibliotecilor obiect.

FRAMEWORK

Atât bibliotecile statice cât și cele partajate marcate cu proprietatea FRAMEWORK sunt tratate ca ținte FRAMEWORK pe macOS.

BUNDLE

Executabilele marcate cu proprietatea MACOSX_BUNDLE sunt tratate ca ținteBUNDLE pe macOS.

PUBLIC_HEADER

Toate fișierele PUBLIC_HEADER asociate cu o bibliotecă sunt instalate în destinația specificată de argumentul PUBLIC_HEADER pe platformele non-Apple. Regulile definite de acest argument sunt ignorate pentru FRAMEWORKbiblioteci pe platformele Apple, deoarece fișierele asociate sunt instalate în locațiile corespunzătoare din interiorul dosarului framework. VeziPUBLIC_HEADER pentru detalii.

PRIVATE_HEADER

Similar cu PUBLIC_HEADER, dar pentru fișierele PRIVATE_HEADER. VeziPRIVATE_HEADER pentru detalii.

RESOURCE

Similar cu PUBLIC_HEADER și PRIVATE_HEADER, dar pentru fișiereleRESOURCE. A se vedea RESOURCE pentru detalii.

Pentru fiecare dintre aceste argumente date, argumentele care le urmează se aplică numai la ținta sau tipul de fișier specificat în argument. Dacă nu se dă niciunul, proprietățile de instalare se aplică tuturor tipurilor de țintă. Dacă este dat doar unul, atuncise vor instala doar țintele de acel tip (care poate fi folosit pentru a instala doar o DLL sau doar o bibliotecă de import.)

Pentru executabile obișnuite, biblioteci statice și biblioteci partajate, argumentulDESTINATION nu este necesar. Pentru aceste tipuri de destinație, atunci cândDESTINATION este omis, o destinație implicită va fi preluată din variabila corespunzătoare din GNUInstallDirs sau setată la o valoare implicită încorporată dacă această variabilă nu este definită. Același lucru este valabil și pentru antetele publice și private asociate cu țintele instalate prin intermediul proprietăților țintăPUBLIC_HEADER și PRIVATE_HEADER.O destinație trebuie întotdeauna furnizată pentru bibliotecile de module, pachetele Apple șiframeworks. O destinație poate fi omisă pentru bibliotecile de interfețe și de obiecte,dar acestea sunt tratate diferit (a se vedea discuția despre acest subiect spre sfârșitul acestei secțiuni).

Tabelul următor prezintă tipurile de destinație cu variabilele asociate și valorile implicite predefinite care se aplică atunci când nu este furnizată o destinație:

.

Tip țintă

GNUInstallDirs Variabila

Built-.In Default

RUNTIME

${CMAKE_INSTALL_BINDIR}

bin

LIBRARY

${CMAKE_INSTALL_LIBDIR}

lib

ARCHIVE

${CMAKE_INSTALL_LIBDIR}

lib

PRIVATE_HEADER

${CMAKE_INSTALL_INCLUDEDIR}

include

PUBLIC_HEADER

${CMAKE_INSTALL_INCLUDEDIR}

include

Proiectele care doresc să urmeze practica obișnuită de instalare a antetului în aproiect-.subdirectorul specific va trebui să furnizeze o destinație în loc să se bazeze doar pe cele de mai sus.

Pentru ca pachetele să fie conforme cu politicile de dispunere a sistemelor de fișiere ale distribuțiilor, în cazul în careproiectele trebuie să specifice un DESTINATION, se recomandă ca acestea să utilizeze o cale de acces care să înceapă cu variabila corespunzătoare GNUInstallDirs.Acest lucru permite responsabililor de pachete să controleze destinația de instalare prin setarea variabilelor cache corespunzătoare. Următorul exemplu arată o bibliotecă statică care se instalează la destinația implicită furnizată deGNUInstallDirs, dar cu anteturile sale instalate într-un subdirectoriu specific proiectului care urmează recomandarea de mai sus:

add_library(mylib STATIC ...)set_target_properties(mylib PROPERTIES PUBLIC_HEADER mylib.h)include(GNUInstallDirs)install(TARGETS mylib PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/myproj)

În plus față de opțiunile comune enumerate mai sus, fiecare țintă poate accepta următoarele argumente suplimentare:

NAMELINK_COMPONENT

Noi în versiunea 3.12.

Pe unele platforme, o bibliotecă partajată cu versiune are o legătură simbolică, cum ar fi:

lib<name>.so -> lib<name>.so.1

unde lib<name>.so.1 este numele de fiu al bibliotecii, iar lib<name>.soeste un „namelink” care permite linkerilor să găsească biblioteca atunci când i se dă-l<name>. Opțiunea NAMELINK_COMPONENT este similară cu opțiuneaCOMPONENT, dar modifică componenta de instalare a unui „namelink” de bibliotecă partajată, dacă este generat unul. Dacă nu este specificată, valoarea implicită este COMPONENT. Este o eroare să folosiți acest parametru în afara unui blocLIBRARY.

Considerați următorul exemplu:

install(TARGETS mylib LIBRARY COMPONENT Libraries NAMELINK_COMPONENT Development PUBLIC_HEADER COMPONENT Development )

În acest scenariu, dacă alegeți să instalați doar componenta Development, atât antetele cât și namelink-ul vor fi instalate fără librărie. (Dacă nu instalați și componenta Libraries, atunciamelink va fi un symlink suspendat, iar proiectele care se leagă de bibliotecă vor avea erori de compilare). Dacă instalați numai componenta Libraries,va fi instalată numai biblioteca, fără anteturi și fără namelink.

Această opțiune este folosită de obicei pentru managerii de pachete care au separat pachetele de timp de funcționare și de dezvoltare. De exemplu, pe sistemele Debian, se așteaptă ca biblioteca să se afle în pachetul de execuție, iar antetele șinamelink să se afle în pachetul de dezvoltare.

Vezi proprietățile țintă VERSION și SOVERSION pentru detalii privind crearea de biblioteci partajate cu versiune.

NAMELINK_ONLY

Această opțiune determină instalarea numai a namelink-ului atunci când se instalează o bibliotecățintă. Pe platformele în care bibliotecile partajate cu versiune nu au namelinks sau când o bibliotecă nu are versiune, opțiunea NAMELINK_ONLY nu instalează nimic. Este o eroare să se utilizeze acest parametru în afara unui blocLIBRARY.

Când se dă NAMELINK_ONLY, se poate utiliza fie NAMELINK_COMPONENT, fieCOMPONENT pentru a specifica componenta de instalare a aceluiamelink, dar COMPONENT ar trebui, în general, să fie preferată.

NAMELINK_SKIP

Similar cu NAMELINK_ONLY, dar are efectul opus: determină instalarea altor fișiere de bibliotecă în afară de namelink atunci când se instalează o bibliotecă-țintă. Atunci când nu sunt date nici NAMELINK_ONLY, nici NAMELINK_SKIP, ambele porțiuni sunt instalate. Pe platformele în care bibliotecile partajate cu versiune nu au legături simbolice sau când o bibliotecă nu are versiune, NAMELINK_SKIP instalează biblioteca. Este o eroare utilizarea acestui parametru în afara unui blocLIBRARY.

Dacă se specifică NAMELINK_SKIP, NAMELINK_COMPONENT nu are nici un efect. Nu se recomandă utilizarea NAMELINK_SKIP împreună cuNAMELINK_COMPONENT.

Comanda install(TARGETS) poate accepta, de asemenea, următoarele opțiuni la nivel superior:

EXPORT

Această opțiune asociază fișierele țintă instalate cu un export numit<export-name>. Ea trebuie să apară înaintea oricărei opțiuni de țintă. Pentru a instala efectiv fișierul de export propriu-zis, apelați install(EXPORT), documentat mai jos.Consultați documentația proprietății țintă EXPORT_NAME pentru a schimba numele țintei exportate.

INCLUDES DESTINATION

Această opțiune specifică o listă de directoare care vor fi adăugate la proprietatea țintăINTERFACE_INCLUDE_DIRECTORIES a lui<targets> atunci când este exportată de comanda install(EXPORT). Dacă este specificată o cale relativă, aceasta este tratată ca fiind relativă la$<INSTALL_PREFIX>.

Se pot specifica unul sau mai multe grupuri de proprietăți într-un singur apel la forma TARGETS a acestei comenzi. O țintă poate fi instalată de mai multe ori în locații diferite. Luați în considerare țintele ipotetice myExe,mySharedLib și myStaticLib. Codul:

install(TARGETS myExe mySharedLib myStaticLib RUNTIME DESTINATION bin LIBRARY DESTINATION lib ARCHIVE DESTINATION lib/static)install(TARGETS mySharedLib DESTINATION /some/full/path)

va instala myExe în <prefix>/bin și myStaticLib în<prefix>/lib/static. Pe platformele non-DLL, mySharedLib va fiinstalat la <prefix>/lib și /some/full/path. Pe platformele DLL, DLL-ul mySharedLib va fi instalat în <prefix>/bin și/some/full/path, iar biblioteca sa de import va fi instalată în<prefix>/lib/static și /some/full/path.

Bibliotecile de interfață pot fi listate printre țintele de instalat.Acestea nu instalează niciun artefact, dar vor fi incluse într-un EXPORT asociat.Dacă bibliotecile de obiecte sunt listate, dar nu li se dă o destinație pentru fișierele de obiecte, acestea vor fi exportate ca biblioteci de interfață.Acest lucru este suficient pentru a satisface cerințele de utilizare tranzitivă ale altor ținte care se leagă de bibliotecile de obiecte în implementarea lor.

Instalarea unei ținte cu proprietatea țintă EXCLUDE_FROM_ALL setată la TRUE are un comportament nedefinit.

Noi în versiunea 3.3: O destinație de instalare dată ca argument DESTINATION poate utiliza „expresii generatoare” cu sintaxa $<...>. Consultați manualulcmake-generator-expressions(7) pentru expresiile disponibile.

Noi în versiunea 3.13: install(TARGETS) poate instala ținte care au fost create înalte directoare. Atunci când se utilizează astfel de reguli de instalare între directoare, rulareamake install (sau similar) dintr-un subdirector nu va garanta că țintele din alte directoare sunt actualizate. Puteți utilizatarget_link_libraries() sau add_dependencies()pentru a vă asigura că astfel de ținte din afara directoarelor sunt construite înainte de a fi rulate regulile de instalare specifice fiecărei subdirecții.

.

Lasă un răspuns

Adresa ta de email nu va fi publicată.