C++ a CMake - bratia navždy, časť II

C++ a CMake - bratia navždy, časť II

V predchádzajúcej časti Tento zábavný príbeh hovoril o organizovaní knižnice hlavičiek v generátore zostavovacieho systému CMake.

Tentokrát k nej pridáme skompilovanú knižnicu a povieme si aj o prepájaní modulov medzi sebou.

Tak ako predtým, tí netrpezliví môžu okamžite prejdite na aktualizované úložisko a dotýkať sa všetkého vlastnými rukami.


Obsah

  1. Rozdeliť
  2. dobyť

Rozdeliť

Prvá vec, ktorú musíme urobiť, aby sme dosiahli náš vznešený cieľ, je rozdeliť softvér, ktorý vyvíjame, do univerzálnych, izolovaných blokov, ktoré sú jednotné z pohľadu používateľa.

V prvej časti bol popísaný taký štandardný blok - projekt s knižnicou hlavičiek. Teraz do nášho projektu pridáme skompilovanú knižnicu.

Aby sme to dosiahli, vyberme implementáciu funkcie myfunc v samostatnom .cpp-súbor:

diff --git a/include/mylib/myfeature.hpp b/include/mylib/myfeature.hpp
index 43db388..ba62b4f 100644
--- a/include/mylib/myfeature.hpp
+++ b/include/mylib/myfeature.hpp
@@ -46,8 +46,5 @@ namespace mylib

         ~  see mystruct
      */
-    inline bool myfunc (mystruct)
-    {
-        return true;
-    }
+    bool myfunc (mystruct);
 }
diff --git a/src/mylib/myfeature.cpp b/src/mylib/myfeature.cpp
new file mode 100644
index 0000000..abb5004
--- /dev/null
+++ b/src/mylib/myfeature.cpp
@@ -0,0 +1,9 @@
+#include <mylib/myfeature.hpp>
+
+namespace mylib
+{
+    bool myfunc (mystruct)
+    {
+        return true;
+    }
+}

Potom definujeme knižnicu, ktorá sa má skompilovať (myfeature), ktorý bude pozostávať z toho, čo bolo získané v predchádzajúcom kroku .cpp- súbor. Nová knižnica samozrejme vyžaduje existujúce hlavičky, a aby to mohla poskytnúť, môže a mala by byť prepojená s existujúcim účelom mylib. Spojenie medzi nimi je navyše verejné, čo znamená, že všetko, s čím bude spojený cieľ myfeature, automaticky prijme zaťaženie a cieľ mylib (viac o metódach pletenia).

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 108045c..0de77b8 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -64,6 +64,17 @@ target_compile_features(mylib INTERFACE cxx_std_17)

 add_library(Mylib::mylib ALIAS mylib)

+###################################################################################################
+##
+##      Компилируемая библиотека
+##
+###################################################################################################
+
+add_library(myfeature src/mylib/myfeature.cpp)
+target_link_libraries(myfeature PUBLIC mylib)
+
+add_library(Mylib::myfeature ALIAS myfeature)
+

Ďalej sa ubezpečíme, že nová knižnica je nainštalovaná aj v systéme:

@@ -72,7 +83,7 @@ add_library(Mylib::mylib ALIAS mylib)

 install(DIRECTORY include/mylib DESTINATION include)

-install(TARGETS mylib EXPORT MylibConfig)
+install(TARGETS mylib myfeature EXPORT MylibConfig)
 install(EXPORT MylibConfig NAMESPACE Mylib:: DESTINATION share/Mylib/cmake)

 include(CMakePackageConfigHelpers)

Treba poznamenať, že za účelom myfeature, ako pre mylib bol vytvorený alias s predponou Mylib::. To isté sa zapisuje pre oba účely pri ich exporte na inštaláciu do systému. To umožňuje jednotne pracovať s cieľmi pre ľubovoľné záväzná schéma.

Potom už zostáva len prepojiť testy jednotiek s novou knižnicou (funkcia myfunc vyňaté z názvu, takže teraz musíte prepojiť):

diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
index 5620be4..bc1266c 100644
--- a/test/CMakeLists.txt
+++ b/test/CMakeLists.txt
@@ -4,7 +4,7 @@ add_executable(mylib-unit-tests test_main.cpp)
 target_sources(mylib-unit-tests PRIVATE mylib/myfeature.cpp)
 target_link_libraries(mylib-unit-tests
     PRIVATE
-        Mylib::mylib
+        Mylib::myfeature
         doctest::doctest
 )

nadpisy (Mylib::mylib) teraz sa už nemusíte pripájať samostatne, pretože, ako už bolo spomenuté, sú automaticky spojené spolu s knižnicou (Mylib::myfeature).

A pridajme pár nuancií, aby sme zabezpečili merania pokrytia s prihliadnutím na novoprijatú knižnicu:

@@ -15,11 +15,16 @@ if(MYLIB_COVERAGE AND GCOVR_EXECUTABLE)
     target_compile_options(mylib-unit-tests PRIVATE --coverage)
     target_link_libraries(mylib-unit-tests PRIVATE gcov)

+    target_compile_options(myfeature PRIVATE --coverage)
+    target_link_libraries(myfeature PRIVATE gcov)
+
     add_custom_target(coverage
         COMMAND
             ${GCOVR_EXECUTABLE}
-                --root=${PROJECT_SOURCE_DIR}/include/
-                --object-directory=${CMAKE_CURRENT_BINARY_DIR}
+                --root=${PROJECT_SOURCE_DIR}/
+                --filter=${PROJECT_SOURCE_DIR}/include
+                --filter=${PROJECT_SOURCE_DIR}/src
+                --object-directory=${PROJECT_BINARY_DIR}
         DEPENDS
             check
     )

Môžete pridať ďalšie knižnice, spustiteľné súbory atď. Nezáleží na tom, ako presne sú navzájom prepojené v rámci projektu. Dôležité je len to, ktoré ciele sú rozhraním nášho modulu, teda vyčnievajú.

dobyť

Teraz máme štandardné blokové moduly a môžeme im dominovať: poskladať ich do štruktúry akejkoľvek zložitosti, nainštalovať ich do systému alebo ich prepojiť v rámci jedného montážneho systému.

Inštalácia do systému

Jednou z možností využitia modulu je inštalácia nášho modulu do systému.

cmake --build путь/к/сборочной/директории --target install

Potom sa pomocou príkazu pripojí k akémukoľvek inému projektu find_package.

find_package(Mylib 1.0 REQUIRED)

Pripojenie ako submodul

Ďalšou možnosťou je prepojiť zložku s naším projektom s iným projektom ako submodul pomocou príkazu add_subdirectory.

Použitie

Spôsoby viazania sú rôzne, ale výsledok je rovnaký. V oboch prípadoch budú ciele dostupné v projekte pomocou nášho modulu Mylib::myfeature и Mylib::mylib, ktorý sa dá použiť napríklad takto:

add_executable(some_executable some.cpp sources.cpp)
target_link_libraries(some_executable PRIVATE Mylib::myfeature)

Konkrétne v našom prípade knižnica Mylib::myfeature je potrebné pripojiť, keď je potrebné prepojenie s knižnicou libmyfeature. Ak je dostatok hlavičiek, potom sa oplatí použiť knižnicu Mylib::mylib.

Ciele CMake môžu byť zložité, napríklad určené len na preposielanie niektorých vlastností, závislostí atď. Zároveň sa práca s nimi vyskytuje rovnakým spôsobom.

To sme potrebovali získať.

Zdroj: hab.com

Pridať komentár