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 laRUNTIME
); -
Pe AIX, fișierul de import al linkerului creat pentru executabilele cu
ENABLE_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
, veziBUNDLE
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 FRAMEWORK
biblioteci 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 |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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>.so
este 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.
.