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ät RUNTIME: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 FRAMEWORKominaisuudella merkittyjä staattisia ja jaettuja kirjastoja käsitellään FRAMEWORKkohteina 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 FRAMEWORKkirjastojen 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

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

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>.soon ”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 Developmentkomponentin, 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_ONLYvaihtoehto 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_SKIPasentaa 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.

Vastaa

Sähköpostiosoitettasi ei julkaista.