Kohteiden asentaminen¶
install(TARGETS targets... ] ] ] )
Lomake TARGETS
määrittelee säännöt kohteiden asentamiselle projektista. On olemassa useita erilaisia kohteen Output-artefakteja, jotka voidaan asentaa:
ARCHIVE
Tällaisia kohde-artefakteja ovat esimerkiksi:
-
Staattiset kirjastot(paitsi macOS:ssä, kun ne on merkitty
FRAMEWORK
:ksi, ks. alla); -
DLL-tuontikirjastot(kaikissa Windows-pohjaisissa järjestelmissä, mukaan lukien Cygwin; niillä on pääte
.lib
, toisin kuin.dll
-kirjastoilla, jotka menevätRUNTIME
:ksi); -
AIX:ssä linkkereiden tuomat tiedosto, joka on luotu suoritettavien ohjelmien kohdalla, joissa on
ENABLE_EXPORTS
käytössä.
LIBRARY
Tällaisia kohde-artefakteja ovat:
-
Jakokirjastot, lukuun ottamatta
-
DLL:iä (nämä menevät osoitteeseen
RUNTIME
, ks. alla), -
MacOS:ssä, kun ne on merkitty
FRAMEWORK
:ksi (ks. alla).
-
RUNTIME
Tällaisia kohde-artefakteja ovat:
-
suoritettavat tiedostot (paitsi macOS:ssä, kun ne on merkitty
MACOSX_BUNDLE
:ksi, ks.BUNDLE
jäljempänä); -
DLL:t (kaikissa Windows-pohjaisissa järjestelmissä, mukaan luettuna Cygwin; huomaa, että näiden mukana tulevat tuontikirjastot ovat tyypiltään
ARCHIVE
).
OBJECTS
Uutta versiossa 3.9.
Objektikirjastoihin liittyvät objektitiedostot.
FRAMEWORK
Myös FRAMEWORK
ominaisuudella merkittyjä staattisia ja jaettuja kirjastoja käsitellään FRAMEWORK
kohteina macOS:ssä.
BUNDLE
Ominaisuudella MACOSX_BUNDLE
merkittyjä suoritettavia tiedostoja käsitellään BUNDLE
-kohteina macOS:ssä.
PUBLIC_HEADER
Kirjastoon liittyvät PUBLIC_HEADER
-tiedostot asennetaan PUBLIC_HEADER
-argumentilla määritettyyn kohteeseen muilla kuin Apple-alustoilla. Tämän argumentin määrittelemät säännöt jätetään huomiotta FRAMEWORK
kirjastojen osalta Apple-alustoilla, koska niihin liittyvät tiedostot asennetaan asianmukaisiin paikkoihin framework-kansion sisällä. Katso lisätietoja kohdasta PUBLIC_HEADER
.
PRIVATE_HEADER
Samankaltainen kuin PUBLIC_HEADER
, mutta PRIVATE_HEADER
-tiedostoille. Katso lisätietoja kohdastaPRIVATE_HEADER
.
RESOURCE
Samankaltainen kuin PUBLIC_HEADER
ja PRIVATE_HEADER
, mutta RESOURCE
-tiedostoille. Katso lisätietoja kohdasta RESOURCE
.
Jokaista näistä annetuista argumenteista seuraavat argumentit koskevat vain argumentissa määritettyä kohdetta tai tiedostotyyppiä. Jos mitään ei anneta, asennusominaisuudet koskevat kaikkia kohdetyyppejä. Jos annetaan vain yksi, asennetaan vain kyseisen tyypin kohteet (jolloin voidaan asentaa vain DLL tai vain tuontikirjasto).
Tavanomaisten suoritettavien tiedostojen, staattisten kirjastojen ja jaettujen kirjastojen osaltaDESTINATION
-argumenttia ei tarvita. Näille kohdetyypeille, kunDESTINATION
jätetään pois, oletuskohde otetaan GNUInstallDirs
:n sopivasta muuttujasta tai asetetaan sisäänrakennettuun oletusarvoon, jos kyseistä muuttujaa ei ole määritelty. Sama pätee asennettuihin kohteisiin asennettuihin kohteisiin liittyvien julkisten ja yksityisten otsakkeiden kohdalla PUBLIC_HEADER
– ja PRIVATE_HEADER
-kohdeominaisuuksien kautta.Moduulikirjastoille, Apple-paketeille ja kehyksille on aina annettava kohde. Kohde voidaan jättää ilmoittamatta rajapinta- ja objektikirjastoille, mutta niitä käsitellään eri tavalla (katso tätä aihetta koskeva keskustelu tämän luvun lopussa).
Seuraavassa taulukossa esitetään kohdetyypit ja niihin liittyvät muuttujat ja sisäänrakennetut oletusarvot, joita sovelletaan, kun kohdetta ei anneta:
Kohdetyyppi |
GNUInstallDirs Muuttuja |
Built-In Default |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Projektit, jotka haluavat noudattaa yleistä käytäntöä, jonka mukaan otsikot asennetaan projektiin-spesifiseen alihakemistoon, niiden on annettava määränpää eikä tyydyttävä edellä mainittuun.
Jotta paketit olisivat yhteensopivia jakelun tiedostojärjestelmän asettelukäytäntöjen kanssa, josprojektien on määriteltävä DESTINATION
, on suositeltavaa käyttää apath-muuttujaa, joka alkaa asianmukaisella GNUInstallDirs
-muuttujalla.Näin pakettien ylläpitäjät voivat hallita asennuksen määränpäätä asettamalla asianmukaiset välimuistimuuttujat. Seuraavassa esimerkissä staattinen kirjasto asennetaan GNUInstallDirs
:n antamaan oletuskohteeseen, mutta sen otsikot asennetaan projektikohtaiseen alihakemistoon, joka noudattaa edellä mainittua suositusta:
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)
Yllä lueteltujen yleisten vaihtoehtojen lisäksi kukin kohde voi hyväksyä seuraavat lisäargumentit:
NAMELINK_COMPONENT
Uusi versio 3.12.
Joillakin alustoilla versioidulla jaetulla kirjastolla on symbolinen linkki, kuten:
lib<name>.so -> lib<name>.so.1
jossa lib<name>.so.1
on kirjaston soname ja lib<name>.so
on ”nimilinkki”, jonka avulla linkittäjät voivat löytää kirjaston, kun sille annetaan-l<name>
. Vaihtoehto NAMELINK_COMPONENT
on samanlainen kuin vaihtoehtoCOMPONENT
, mutta se muuttaa sharedlibraryn namelinkin asennuskomponenttia, jos sellainen luodaan. Jos sitä ei määritetä, oletusarvo on COMPONENT
. Tämän parametrin käyttäminenLIBRARY
-lohkon ulkopuolella on virhe.
Harkitse seuraavaa esimerkkiä:
install(TARGETS mylib LIBRARY COMPONENT Libraries NAMELINK_COMPONENT Development PUBLIC_HEADER COMPONENT Development )
Tässä skenaariossa, jos valitset asennettavaksi vain Development
komponentin, sekä otsikot että nimilinkki asennetaan ilman kirjastoa. (Jos et asenna myös Libraries
-komponenttia, kirjastolinkki on roikkuva symlinkki, ja kirjastoon viittaavissa projekteissa esiintyy rakennusvirheitä.) Jos asennat vain Libraries
-komponentin,vain kirjasto asennetaan ilman otsikoita ja nimilinkkiä.
Tätä vaihtoehtoa käytetään tyypillisesti paketinhallinnoissa, joissa on erilliset ajalliset ja kehityspaketit. Esimerkiksi Debian-järjestelmissä kirjaston odotetaan olevan runtime-paketissa ja otsikoiden ja nimilinkin odotetaan olevan kehityspaketissa.
Katso VERSION
– ja SOVERSION
-kohdeominaisuuksista lisätietoja versioitujen jaettujen kirjastojen luomisesta.
NAMELINK_ONLY
Tämä vaihtoehto saa aikaan sen, että vain nimilinkki asennetaan, kun kirjastokohde asennetaan. Alustoilla, joilla versioiduissa jaetuissa kirjastoissa ei ole nimilinkkejä tai kun kirjastoa ei ole versioitu, NAMELINK_ONLY
vaihtoehto ei asenna mitään. On virhe käyttää tätä parametriaLIBRARY
-lohkon ulkopuolella.
Kun NAMELINK_ONLY
annetaan, joko NAMELINK_COMPONENT
tai COMPONENT
voidaan käyttää määrittelemään nimilinkin asennuskomponentti, mutta COMPONENT
on yleensä suositeltavampi.
NAMELINK_SKIP
Samankaltainen kuin NAMELINK_ONLY
, mutta sillä on päinvastainen vaikutus: se saa aikaan muidenkin kirjastotiedostojen kuin nimilinkin asentamisen kirjastokohteen asennuksen yhteydessä. Jos ei anneta NAMELINK_ONLY
tai NAMELINK_SKIP
,molemmat osat asennetaan. Alustoilla, joilla versioiduilla jaetuilla kirjastoillaei ole symlinkkejä tai kun kirjastoa ei ole versioitu, NAMELINK_SKIP
asentaa kirjaston. On virhe käyttää tätä parametriaLIBRARY
-lohkon ulkopuolella.
Jos NAMELINK_SKIP
on annettu, NAMELINK_COMPONENT
ei vaikuta. Ei suositella NAMELINK_SKIP
:n käyttöä yhdessäNAMELINK_COMPONENT
:n kanssa.
Komento install(TARGETS) voi hyväksyä myös seuraavat optiot ylätasolla:
EXPORT
Tämä optio yhdistää asennetut kohdetiedostot vientiin nimeltä<export-name>
. Sen on oltava ennen kohdeasetuksia. Jos haluat itse asiassa asentaa itse vientitiedoston, kutsu install(EXPORT), joka on dokumentoitu alla.Katso dokumentaatio EXPORT_NAME
target-ominaisuudesta muuttaaksesi viedyn kohteen nimeä.
INCLUDES DESTINATION
Tämä optio määrittää luettelon hakemistoista, jotka lisätään<targets>
:nINTERFACE_INCLUDE_DIRECTORIES
target-ominaisuuteen, kun se viedään install(EXPORT)-komennolla. Jos määritetään relatiivinen polku, sitä käsitellään suhteellisena suhteessa$<INSTALL_PREFIX>
.
Yksi tai useampi ominaisuusryhmä voidaan määritellä yhdellä kutsulla tämän komennon TARGETS
-muodossa. Kohde voidaan asentaa useampaan kuin yhteen eri paikkaan. Tarkastellaan hypoteettisia kohteita myExe
,mySharedLib
ja myStaticLib
. Koodi:
install(TARGETS myExe mySharedLib myStaticLib RUNTIME DESTINATION bin LIBRARY DESTINATION lib ARCHIVE DESTINATION lib/static)install(TARGETS mySharedLib DESTINATION /some/full/path)
asentaa myExe
kohteeseen <prefix>/bin
ja myStaticLib
kohteeseen <prefix>/lib/static
. Muilla kuin DLL-alustoilla mySharedLib
asennetaan <prefix>/lib
:aan ja /some/full/path
:aan. DLL-alustoilla mySharedLib
DLL asennetaan osoitteisiin <prefix>/bin
ja /some/full/path
ja sen tuontikirjasto asennetaan osoitteisiin <prefix>/lib/static
ja /some/full/path
.
Liitännäiskirjastot voidaan luetella asennettavien kohteiden joukossa.Ne eivät asenna artefakteja, mutta ne sisällytetään niihin liittyvään EXPORT
:een.Jos kohdekirjastot on lueteltu, mutta niille ei ole annettu määränpäätäIiroobjektitiedostoille, ne viedään liitännäiskirjastoina.Tämä riittää täyttämään transitiiviset käyttövaatimukset muille kohteille, jotka linkittävät objektikirjastoihin toteutuksessaan.
Asennettaessa kohdetta, jonka EXCLUDE_FROM_ALL
kohde-ominaisuus on TRUE
, käyttäytyminen on määrittelemätöntä.
Uutta versiossa 3.3: DESTINATION
-argumenttina annettu asennuskohde voi käyttää ”generaattorilausekkeita” syntaksilla $<...>
. Katso käytettävissä olevat lausekkeet cmake-generator-expressions(7)
-käsikirjasta.
Uusi versiossa 3.13: install(TARGETS) voi asentaa kohteita, jotka on luotu muihin hakemistoihin. Kun käytetään tällaisia hakemistojen välisiä asennussääntöjä,make install
:n (tai vastaavan) suorittaminen alihakemistosta ei takaa, että muiden hakemistojen kohteet ovat ajan tasalla. Voit käyttäätarget_link_libraries()
tai add_dependencies()
varmistaaksesi, että tällaiset hakemiston ulkopuoliset kohteet rakennetaan ennen alihakemistokohtaisten asennussääntöjen suorittamista.