Document Lyx

1 Exemplu de utilizare a CMake

Următorul exemplu demonstrează mai multe aspecte-cheie ale CMake. Înainte de a executa acest exemplu, asigurați-vă că CMake este instalat pe PC (consultați instrucțiunile).







Există trei cataloage. Directorul de nivel superior are două subdirectoare numite ./Demo și ./Bello. În directorul ./Hello, biblioteca va merge. În directorul ./Demo, se execută fișierul executabil care este conectat la bibliotecă. În total, sunt create trei fișiere CMakeList.txt: câte unul pentru fiecare director.

Document Lyx

În primul rând, directorul de nivel superior conține următorul fișier CMakeLists.txt.

# Numele proiectului este "HELLO". Fișierele CMakeLists din acest proiect se pot referi la

# pe directorul rădăcină al surselor acestui proiect numit $ și

# la directorul rădăcină cu fișierele compilate ale acestui proiect după nume

# Conectați fișierul executabil la biblioteca Hello.

target_link_libraries (salut HelloDemo)

Document Lyx

Atunci când se execută CMake în directorul de nivel superior, acesta analizează CMakeLists.txt și apoi scufundă în subdirectoarele listate. Variabile, căi de căutare pentru fișiere antet, căi de căutare bibliotecă etc. sunt moștenite. În funcție de sistemul de operare, creați: pentru sistemele Unix makefiles sau pentru fișierele MSVC ale proiectelor / spațiilor de lucru ale proiectelor. Fișierele create pot fi apoi utilizate în modul obișnuit de compilare a codului.

2 Lecție practică despre CMake

Mai jos este un tutorial pas cu pas care acoperă problemele comune ale sistemului de construcție care ajută la rezolvarea CMake. Multe dintre aceste subiecte sunt prezentate în Mastering CMake ca întrebări individuale, dar poate fi foarte util pentru a vedea cum toți aceștia lucrează împreună în proba de proiect. Acest tutorial poate fi găsit în directorul Teste / Tutorial al arborelui sursă CMake. Fiecare pas are un subdirector propriu care conține o copie completă a lecției pentru acest pas.

2.1 Punct de pornire (Pasul 1)

Cel mai simplu proiect este construit din fișierele de cod sursă executabil. Pentru proiectele simple, cele două linii din fișierul CMakeLists sunt toate necesare. Acesta va fi punctul de plecare pentru lecția noastră. Fișierul CMakeLists arată astfel:

cmake_minimum_required (VERSIUNEA 2.6)

Rețineți că acest exemplu utilizează litere mici pentru comenzi din fișierul CMakeLists. CMake suportă comenzi, tastate de caractere în cazul superior, inferior și mixt. Codul sursă pentru tutorial.cxx va calcula rădăcina pătrată a numărului și prima opțiune, este foarte simplu:

// Un program simplu care calculează rădăcina pătrată a unui număr

int principal (int argc, char * argv [])

Principalele modificări sunt includerea fișierului antet TutorialConfig.h și imprimarea numărului versiunii ca parte a informațiilor de utilizare.

2.2 Adăugarea unei Biblioteci (Pasul 2)

Acum vom adăuga o bibliotecă în proiectul nostru. Această bibliotecă va conține implementarea noastră de determinare a valorii rădăcinii pătrate. Fișierul executabil va putea apoi să folosească această bibliotecă în locul funcției standard furnizate de compilator. Pentru acest tutorial, vom plasa biblioteca într-un subdirector numit MathFunctions. Acest director va conține un fișier CMakeLists care are o linie în el:

Fișierul sursă Mysqrt.cxx are o funcție numită mysqrt, care oferă aceeași funcționalitate a funcției sqtr a compilatorului. Pentru a folosi noua bibliotecă, adăugăm add_subdirectory la fișierul CMakeLists de nivel superior, ceea ce va asigura că biblioteca este construită. De asemenea, adăugăm un alt director pentru a include fișierul antet MathFunctions / mysqrt.h astfel încât sistemul de construcție să poată găsi prototipul implementării noastre a funcției. Ultima modificare este adăugarea unei noi biblioteci în executabil. Ultimele câteva linii ale fișierului CMakeLists de nivel superior arată acum:

# adăugați executabilul

add_executable (Tutorial tutorial.cxx)

target_link_libraries (Tutorial MathFunctions)

Să considerăm acum crearea opțiunii bibliotecii MathFunctions. În această lecție, într-adevăr nu există niciun motiv pentru a face acest lucru, dar într-o mare bibliotecă sau biblioteci care se bazează pe codul terților, ați putea dori acest lucru. Primul pas este să adăugați opțiunea de fișier CMAMELists de nivel superior.

# ar trebui să folosim propriile noastre funcții de matematică?

(USE_MYMATH "Utilizați tutorialul cu condiția implementării matematicelor" ON)

Opțiunea va fi afișată în GUI CMake și va avea valoarea implicită ON, astfel încât utilizatorul să o poată schimba după dorință. Această setare va fi salvată în memoria cache, astfel încât utilizatorul nu trebuie să schimbe setările de fiecare dată când CMake inițiază acest proiect. Următoarea modificare vă va permite să vă angajați opțional la biblioteca MathFunctions. Pentru a face acest lucru, schimbăm sfârșitul fișierului CMakeLists de nivel superior pentru ca acesta să arate astfel:







# adăugați biblioteca MathFunctions?

set (EXTRA_LIBS $ MathFunctions)

# adăugați executabilul

add_executable (Tutorial tutorial.cxx)

Variabila USE_MYMATH este utilizată pentru a determina dacă biblioteca MathFunctions trebuie compilată și folosită. Rețineți utilizarea variabilei (EXTRA_LIBS în acest caz), este folosită aici pentru a compila orice biblioteci suplimentare care vor fi ulterior legate în fișierul executabil. Această abordare generală este utilizată pentru a susține proiecte mari cu un număr mare de componente suplimentare. Modificările corespunzătoare din codul sursă sunt destul de simple:

// Un program simplu care calculează rădăcina pătrată a unui număr

int principal (int argc, char * argv [])

fprintf (stdout, "% s Versiune ... \ n", argv [0], Tutorial_VERSION_MAJOR, Tutorial_VERSION_MINOR);

fprintf (stdout, "Utilizare:% s număr \ n", argv [0]);

input dubluValue = atof (argv [1]);

ieșire dublăValue = mysqrt (inputValue);

output dubluValue = sqrt (inputValue);

fprintf (stdout, "Rădăcina pătrată a% g este% g \ n", inputValue, outputValue);

În codul sursă, folosim și USE_MYMATH. Acest lucru este asigurat atunci când trimiteți date de la CMake la codul sursă prin intermediul fișierului de configurare TutorialConfig.h.in prin adăugarea următoarei linii:

2.3 Instalarea și testarea (Pasul 3)

Pentru următorul pas, vom adăuga reguli de instalare și suport de testare pentru proiectul nostru. Regulile de instalare sunt destul de simple. Pentru a instala biblioteca și fișierul antet pentru biblioteca MathFunctions, trebuie să adăugați următoarele două linii în fișierul MathFunctions: 'CMakeLists:

install (TARGETS MathFunctions bin DESTINATION)

install (FILES MathFunctions.h DESTINATION includ)

Pentru aplicație, trebuie să adăugați următoarele linii de cod la fișierul CMakeLists de nivel superior pentru a instala executabilul și a configura fișierul antet:

# adăugați obiectivele de instalare

instalați (TARGETS Tutorial DESINATION bin)

# adăugați biblioteca principală

add_library (MathFunctions mysqrt.cxx $ / Table.h)

Mai întâi, adăugăm un fișier executabil pentru MakeTable, este adăugat ca orice alt fișier executabil. În al doilea rând, adăugăm o comandă personalizată care determină modul de a produce Table.h executând MakeTable pentru execuție. În al treilea rând, trebuie să lăsăm CMake să știe că mysqrt.cxx depinde de fișierul Table.h generat. Aceasta se face prin adăugarea fișierului Table.h generat în lista de surse pentru biblioteca MathFunctions. De asemenea, trebuie să adăugăm directorul binar actual în lista directoarelor incluse, astfel încât fișierul Table.h poate fi găsit și inclus de mysqrt.cxx.

Dacă executați proiectul de construit, acesta va construi mai întâi fișierul executabil MakeTable. Apoi va rula MakeTable pentru a genera fișierul Table.h. În cele din urmă, compilează fișierul mysqrt.cxx, care include Table.h pentru a genera biblioteca MathFunctions.

În acest moment, fișierul CMakeLists de nivel superior va arăta astfel:

cmake_minimum_required (VERSIUNEA 2.6)

set (Tutorial_VERSION_MAJOR 1)

set (Tutorial_VERSION_MINOR 0)

Are acest sistem atât funcții log cât și exp?

check_function_exists (log HAVE_LOG)

check_function_exists (exp HAVE_EXP)

# ar trebui să folosim propriile noastre funcții de matematică

(USE_MYMATH "Utilizați tutorialul cu condiția implementării matematicelor" ON)

# configurați un fișier antet pentru a trece unele dintre setările CMake

# la codul sursă

# adăugați arborele binar în calea de căutare pentru includerea fișierelor

# astfel încât să găsim TutorialConfig.h

# adăugați biblioteca MathFunctions?

set (EXTRA_LIBS $ MathFunctions)

# adăugați executabilul

add_executable (Tutorial tutorial.cxx)

# adăugați obiectivele de instalare

instalați (TARGETS Tutorial DESINATION bin)

# se execută aplicația

add_test (TutorialRuns Tutorial 25)

# funcționează mesajul de utilizare?

add_test (TutorialUsage Tutorial)

#defineți o macrocomandă pentru a simplifica testele inserate

macro (rezultatul do_test arg)

add_test (TutorialComp $ Tutorial $)

# faceți o grămadă de teste bazate pe rezultate

do_test (4 "4 este 2")

do_test (9 "9 este 3")

do_test (5 "5 este 2.236")

do_test (7 "7 este 2.645")

do_test (25 "25 este 5")

do_test (-25 "-25 este 0")

do_test (0.0001 "0.0001 este 0.01")

fișierul TutorialConfig.h.in arată astfel:

// opțiunile și setările configurate pentru Tutorial

#define Tutorial_VERSION_MAJOR @ Tutorial_VERSION_MAJOR @

#define Tutorial_VERSION_MINOR @ Tutorial_VERSION_MINOR @

instala (TARGETS MathFunctions bin DESTINATION)

install (FILES MathFunctions.h DESTINATION includ)

2.6 Build and Installer (Pasul 6)

Să presupunem, de asemenea, că dorim să extindem proiectul la alte persoane astfel încât să le poată folosi. Vrem să furnizăm codul sursă și codul compilat pentru diferite platforme. Acest lucru este puțin diferit de ceea ce am făcut mai devreme în secțiunea Instalare și testare (Pasul 3) 2.3. unde am efectuat instalarea fișierelor binare pe care le-am construit din codul sursă. În acest exemplu, vom construi pachete de instalare care suportă pachetul de instalare binar și funcțiile de gestionare conținute în Cygwin, Debian, RPM și așa mai departe. Pentru a realiza acest lucru, vom folosi CPack, care creează o platformă de instalatori specifici, așa cum este descris în capitolul Ambalare cu CPack. În special, trebuie să adăugăm câteva linii în partea de jos a fișierului CMakeLists.txt de nivel superior.

# construiți un pachet de instalare bazat pe CPack

set (CPACK_RESOURCE_FILE_LICENSE "$ / License.txt")

Asta e tot ce este pentru asta. Începem prin activarea InstallRequiredSystemLibraries. Acest modul va include toate bibliotecile dinamice solicitate de proiect pentru platforma curentă. Apoi am stabilit câteva variabile CPack, unde am salvat informațiile despre licență și versiune pentru acest proiect. Informațiile despre versiuni utilizează variabilele pe care le-am definit mai devreme în această lecție. În cele din urmă, permitem modulul CPack, care va utiliza aceste variabile și alte proprietăți ale sistemului la care ați configurat programul de instalare.

Următorul pas este să creezi proiectul în ordinea normală și apoi să începi CPack pe el. Pentru a crea o distribuție binară, trebuie să:

cpack-CPackConfig.cmake

Pentru a crea o distribuție, trebuie să introduceți

cpack-CPackSourceConfig.cmake

2.7 Adăugarea suportului pentru panoul de control (Pasul 7)

Adăugarea de suport pentru prezentarea rezultatelor noastre de testare pe tabloul de bord este suficient de simplă. Am identificat deja un număr de teste pentru proiectul nostru în pașii anteriori ai acestei lecții. Trebuie doar să executați aceste teste și să le trimiteți pe tabloul de bord. Pentru a activa suportul pentru panouri, vom include modulul CTest de nivel superior în fișierul nostru CMakeLists.

# permite panoul de script

De asemenea, creăm un fișier CTestConfig.cmake în care puteți specifica numele acestui proiect pentru tabloul de bord.

set (CTEST_PROJECT_NAME "Tutorial")







Articole similare

Trimiteți-le prietenilor: