
selles põnevas loos räägiti CMake süsteemide koostamise generaatori raames pealkirjade teegi korraldamisest.
Seekord lisame sellele kompileeritava teegi ning räägime ka moodulite omavahelistest ühendustest.
Nagu varemgi, võivad need, kes ei suuda oodata, otse minna ja kõike ise käes katsuda.
Sisu
Esimene asi, mida meie kõrge eesmärgi saavutamiseks teha, on arendatav tarkvara jagamine universaalseteks isoleeritud blokideks, mis on kasutaja vaatenurgast ühtsed.
Esimeses osas kirjeldati sellist tavalist plokki – projekti pealkirjade teegiga. Nüüd lisame meie projektile kompileeritava teegi.
Selleks viime funktsiooni myfunc eraldi .cpp-faili:
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
~ vaata 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
+
+namespace mylib
+{
+ bool myfunc (mystruct)
+ {
+ return true;
+ }
+}Seejärel määratleme kompileeritava teegi (myfeature), mis koosneb eelmisel sammul saadud .cpp-failist. Uuel teegil on arusaadavalt vaja juba olemasolevaid pealkirju, ja selle tagamiseks tuleb see siduda olemasoleva sihiga mylib. Sidumine nende vahel on avalik, mis tähendab, et kõik, millele siht on ühendatud, myfeaturesaab automaatselt sihiga seotud ka mylib ().
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)
+###################################################################################################
+##
+## Kompileeritav raamatukogu
+##
+###################################################################################################
+
+add_library(myfeature src/mylib/myfeature.cpp)
+target_link_libraries(myfeature PUBLIC mylib)
+
+add_library(Mylib::myfeature ALIAS myfeature)
+Edasi liikudes teeme nii, et uus raamatukogu installitakse ka süsteemi:
@@ -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)Tuleb tähele panna, et sihtmärgi myfeature, nagu ka mylib oli registreeritud alias eelseisvale Mylib::. Sama on üles kirjutatud mõlema sihtmärgi jaoks nende eksportimisel süsteemi installimiseks. See annab võimaluse ühtlaseks töötamiseks sihtmärkidega igasuguste .
Pärast seda jäi veel siduda moodulitestidega uus raamatukogu (funktsioon myfunc viidi pealkirjast välja, nii et nüüd tuleb linkida):
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
)Pealkirjad (Mylib::mylib) ei pea nüüd eraldi importima, sest nagu juba öeldud, on need automaatselt koos raamatukoguga ühendatud (Mylib::myfeature).
Ja lisame paar nüanssi, et tagada kaetud mõõdud uue raamatukogu arvestamisel:
@@ -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
)Võib lisada rohkem raamatukogusid, täitevfaile jne. Oluline on, kuidas nad on omavahel ühendatud projekti raames. Oluline on ainult see, millised eesmärgid on meie mooduli liides, see tähendab, mis on väljas.
Nüüd on meil standardmudelid ja me saame neid hallata: luua neist mis tahes keerukusega struktuure, paigaldades need süsteemi või omavahel sidudes ühtse kogumissüsteemi raames.
Paigaldamine süsteemi
Üks mudeli kasutamise võimalusi on meie mudeli paigaldamine süsteemi.
cmake --build tee/koostamis/kaust --target installPärast seda saab seda kasutada mis tahes teises projektis käsureaga .
find_package(Mylib 1.0 REQUIRED)Alamoodulina ühendamine
Teine võimalus on ühendada oma projekti kaust teise projekti alamoodulina, kasutades käsku .
Kasutamine
Sidumise viise on erinevaid, kuid tulemus on sama. Nii ühes kui teises juhul on projektis, mis kasutab meie mudelit, saadaval sihid Mylib::myfeature ja Mylib::mylib, mida saab kasutada näiteks nii:
add_executable(some_executable some.cpp sources.cpp)
target_link_libraries(some_executable PRIVATE Mylib::myfeature)Konkreetsemalt peab meie puhul raamatukogu Mylib::myfeature olema ühendatud siis, kui on vajalik linkida raamatukoguga libmyfeature. Kui piisab pealkirjadest, siis tuleks kasutada raamatukogu Mylib::mylib.
CMake'i sihid võivad olla petlikud, näiteks mõeldud ainult mõne omaduse, sõltuvuste jms edastamiseks. Sellegipoolest toimub nendega töötamine ühtselt.
Just seda oli vaja saavutada.
Allikas: habr.com
