2.1.1 : Le CMakeLists.txt principal du projet
Le
CMakeLists.txt principal de notre projet doit prendre en compte toutes les fonctionnalités dont nous aurons besoin :
Nous commençons par spécifier le nom du projet et la version minimale de
CMake dont nous auron besoin :
1
2
|
project(TestGitlabCI)
cmake_minimum_required(VERSION 3.0)
|
Définissons le nom du projet :
1
|
set(PROGRAM_NAME "TestGitlabCI" CACHE STRING "name of the current project" FORCE)
|
Puis sa version :
1
|
set(PROGRAM_VERSION "0.1.0" CACHE STRING "version of the current project" FORCE)
|
Une petite description :
1
2
|
set(PROGRAM_DESCRIPTION_NO_QUOTE "My amazing project description" CACHE STRING "description of the current project" FORCE)
set(PROGRAM_DESCRIPTION "${PROGRAM_DESCRIPTION_NO_QUOTE}"" CACHE STRING "description with double quotes of the current project" FORCE)
|
Il est aussi important de définir le nom du dossier dans lequel installer les bibliothèques, car il peut changer suivant les OS
1
|
set(LIBRARY_DIRECTORY "lib" CACHE STRING "define the library directory (especially for Fedora with the wtf lib64)" FORCE)
|
Un mode qui permet d'activer ou non la commande qui génerera la documentation :
1
|
set(DOC_MODE no CACHE BOOL "Doc mode")
|
Un mode qui permet de désactiver la compilation des tests unitaires. Car ils représentent la majeure partie des programmes d'un projet. Il est donc important de donner le choix à l'utilisateur de les compiler ou non :
1
2
|
set(SELF_TESTS_MODE yes CACHE BOOL "Self test mode")
message(STATUS "SELF_TESTS_MODE = ${SELF_TESTS_MODE}")
|
Nous devons aussi adapter la compilation de notre projet en fonction du mode de compilation (
normal,
coverage) :
1
2
3
4
5
6
7
8
|
if(CMAKE_BUILD_TYPE STREQUAL "Coverage")
message(STATUS "Build for tests COVERAGE")
set(CTEST_COVERAGE_COMMAND "gcov")
set(SELF_TESTS_MODE yes)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --std=c++11 -Wall -Werror -g -O0 -fprofile-arcs -ftest-coverage")
else()
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --std=c++11 -Wall -Werror -g -O2")
endif()
|
Globalement, nous utilisons les symboles de débogage tout le temps et nous compilons en
-O0 pour que
g++ ne nous supprime pas le ligne de code .
Testons si nous devons activer la génération de la documentation :
1
2
3
|
if(DOC_MODE)
add_subdirectory(doc)
endif()
|
Ajoutons le dossier
src dans la liste des includes :
1
|
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/src)
|
Incluons la compilation des sources :
Enfin nous activons les tests unitaires si besoin :
1
2
3
4
|
if(SELF_TESTS_MODE)
include(CTest)
add_subdirectory(TESTS)
endif(SELF_TESTS_MODE)
|
Le fichier
CMakeLists.txt complet :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
project(TestGitlabCI)
cmake_minimum_required(VERSION 3.0)
set(PROGRAM_NAME "TestGitlabCI" CACHE STRING "name of the current project" FORCE)
set(PROGRAM_VERSION "0.1.0" CACHE STRING "version of the current project" FORCE)
set(PROGRAM_DESCRIPTION_NO_QUOTE "My amazing project description" CACHE STRING "description of the current project" FORCE)
set(PROGRAM_DESCRIPTION "${PROGRAM_DESCRIPTION_NO_QUOTE}"" CACHE STRING "description with double quotes of the current project" FORCE)
set(LIBRARY_DIRECTORY "lib" CACHE STRING "define the library directory (especially for Fedora with the wtf lib64)" FORCE)
set(DOC_MODE no CACHE BOOL "Doc mode")
set(SELF_TESTS_MODE yes CACHE BOOL "Self test mode")
message(STATUS "SELF_TESTS_MODE = ${SELF_TESTS_MODE}")
if(CMAKE_BUILD_TYPE STREQUAL "Coverage")
message(STATUS "Build for tests COVERAGE")
set(CTEST_COVERAGE_COMMAND "gcov")
set(SELF_TESTS_MODE yes)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --std=c++11 -Wall -Werror -g -O0 -fprofile-arcs -ftest-coverage")
else()
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --std=c++11 -Wall -Werror -g -O2")
endif()
if(DOC_MODE)
add_subdirectory(doc)
endif()
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/src)
add_subdirectory(src)
if(SELF_TESTS_MODE)
include(CTest)
add_subdirectory(TESTS)
endif(SELF_TESTS_MODE)
|
Vous pouvez le télécharger
ici.