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 noteComme Fedora qui nécessite une installtion dans un dossier lib64 au lieu de lib.
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 noteAttention, cette fonctionnalité est essentielle pour obtenir des binaires performants, mais dans le cas d'une couverture de tests, il est primordial d'avoir un retour clair pour chaque ligne du projet.. 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 noteCela permettra aux tests d'avoir des inclusions simples. :
1
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/src)
Incluons la compilation des sources :
1
add_subdirectory(src)
Enfin nous activons les tests unitaires si besoin noteIl est primordial d'inclure CTest dans le CMakeLists.txt principal du projet. Sinon, les tests ne seront pas utilisés. :
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.