Introducere în cmake, savepearlharbor

CMake este un utilitar cross-platform pentru construirea automată a unui program din codul sursă. În acest caz, CMake în sine nu se ocupă de asamblare, ci este un front-end. Diferitele variante ale mărcii și Ninja pot servi drept back-end`a. CMake vă permite de asemenea să creați proiecte pentru CodeBlocks, Eclipse, KDevelop3, MS VC ++ și Xcode. Este demn de remarcat faptul că majoritatea proiectelor nu sunt native, dar toate cu același back-end.







Pentru a asambla proiectul folosind CMake, trebuie să plasați fișierul CMakeLists.txt, care stochează regulile și să construiască ținte, în sursa arborelui sursă și să facă câțiva pași simpli.
Să ne uităm la exemple.

Exemplul 1. Bună ziua, lumea:

În primul rând, scriem cea mai simplă helopower:

și un dosar pentru asamblare:

Creați un director gol pentru fișierele temporare și mergeți acolo.

$ mkdir tmp
fshp @ panica-desktop:

$ cd tmp /
fshp @ panica-desktop:

Acum rulați comanda cmake, trecând-o ca parametru pe calea către dosarul sursă:

/ cmake / example_1 /
...
- Fișierele de construire au fost scrise la: / home / fshp / tmp
fshp @ panica-desktop:

/ tmp $ ls
CMakeCache.txt CMakeFiles cmake_install.cmake Makefile
fshp @ panica-desktop:

Vedem că în dosar au apărut câteva fișiere temporare, care sunt necesare pentru asamblarea proiectului.
Acum puteți rula direct direct:

/ tmp $ make
Scanarea dependențelor principalelor țintă
[100%] Construirea obiectului CXX CMakeFiles / main.dir / main.cpp.o
Legarea executabilului CXX principal
[100%] Obiectiv construit principal
fshp @ panica-desktop:

/ tmp $ ./main
Bună ziua, lume!
fshp @ panica-desktop:

Deci, programul nostru sa adunat.
Dosarul tmp poate fi curățat / șters fără riscul de rupere a sursei. În cazul în care CMakeLists.txt a fost modificat, apelul de apel va începe automat cmake. Dacă sursele au fost mutate, trebuie să ștergeți directorul temporar și să rulați manual.

Exemplul 2. Bibliotecile:

Variabilele pot stoca liste de valori separate prin spații / file / cratime:

Ambele opțiuni sunt corecte
Pentru a obține valoarea unei variabile și a utiliza structura:

Deci, această versiune a proiectului nostru include o bibliotecă statică, colectată din surse. Dacă înlocuiți "STATIC" cu "SHARED", atunci biblioteca este dinamică. Dacă tipul bibliotecii nu este specificat, în mod implicit va fi colectat ca static.
La conectare, toate bibliotecile necesare sunt specificate:

Ca și în cazul compilației manuale, numele bibliotecilor sunt specificate fără prefixul standard "lib".







Exemplul 3. Subproiecte:

Subproiectele sunt foarte convenabile dacă programul tău este împărțit în mai multe biblioteci sau proiectul este alcătuit din mai multe programe.
Fiecare subproiect este în esență un proiect cu drepturi depline și poate fi folosit independent.
Acum avem "foo" în subdirector și există și un subproiect CMakeLists.txt.

Nu este nimic nou în fișierul subproiect pentru tine. Dar în fișierul principal există comenzi noi:

main.cpp nu am schimbat și foo.h a fost mutat. Comanda spune compilatorului unde să caute fișierele antet. Poate fi numit de mai multe ori. Ascunsorii vor fi căutați în toate directoarele specificate.

Specificați un director cu un subproiect, care va fi compilat ca un stand-alone.

Exemplul 4. Căutarea bibliotecii:

CMake are mijloace destul de avansate de căutare a bibliotecilor instalate, deși acestea nu sunt integrate, ci implementate ca module separate. Există destul de puține module în livrarea standard, dar unele proiecte (de exemplu, Ogre) furnizează propriile lor.
Modulele debian sunt situate în /usr/share/cmake-2.8/Modules/ (versiunea dvs. poate diferi).

Cred că sensul ar trebui să fie clar. Primul și al doilea bloc sunt căutarea bibliotecii. Dacă nu există pe sistem, se afișează un mesaj de eroare și se termină modulul. Al treilea bloc este similar, doar că nu caută întregul pachet de biblioteci, ci doar componenta necesară. Fiecare astfel de căutare automată determină după executarea a cel puțin 3 variabile:
SDL_FOUND, LIBXML2_FOUND, Boost_FOUND - un semn al prezenței bibliotecii;
SDL_LIBRARY, LIBXML2_LIBRARIES, Boost_LIBRARIES - nume de bibliotecă pentru conectare;
SDL_INCLUDE_DIR, LIBXML2_INCLUDE_DIR, Boost_INCLUDE_DIRS - căi către fișierele antet.
Dacă primele sunt mai mult sau mai puțin clare, atunci al doilea și al treilea mi-au adus multe probleme - jumătate au nume în singular, jumătate în plural. Dar sa dovedit că este ușor de urmărit. În fiecare modul, există comentarii la început, variabilele definite sunt descrise acolo. Uită-te, de exemplu, /usr/share/cmake-2.8/Modules/FindLibXml2.cmake

Exemplul 5. Biblioteci statice externe și fișiere obiect:

Externe se datorează non-sistem, furnizate în formă binară.
Fișierele obiect în CMake se află alături de codul sursă - includeți doar obiectul în lista de fișiere de compilat.
Cu bibliotecile mai strânse. După cum știți, o bibliotecă statică nu este altceva decât ar-arhivă, în interiorul căreia există obiecte obișnuite, care nu au legătură între ele. Probabil că ați ghicit deja cum am procedat mai întâi. Da, tocmai am gonit biblioteca. Dar apoi modul a fost mai elegant:

Cuvântul "IMPORTAT" indică faptul că biblioteca este preluată din exterior.
În CMake, fiecare obiectiv are parametri, set_property le permite să se schimbe.
Această bibliotecă este legată după cum urmează:

generatoare:

Așa cum sa spus la început, CMake poate genera multe tipuri diferite de proiecte.
Dacă cmake-ul rulează fără parametri, generatoarele disponibile vor fi descrise la sfârșit. Utilizați aceasta:

/ cmake / example_3 / -G «KDevelop3 - fișiere Makefiles Unix»

concluzie:

Ce mi-a plăcut CMake personal:

  • un proiect - un dosar. Nu este nevoie să stocați o mulțime de script-uri de configurare, build-uri și alte junk;
  • Viteza de lucru în comparație cu autotools;
  • simplă și ușor de înțeles;
  • este front-end pentru mai multe IDE-uri;
  • afișarea progresului este destul de convenabilă;
  • ieșire de culoare - în gri de viață de zi cu zi o vopsea puțin nu va face rău;

Pentru textul Sublime, există un plugin care adaugă evidențierea sintaxei CMake, se numește CMake.
exemple







Articole similare

Trimiteți-le prietenilor: