CMake partage des chemins d’includes
Quand un projet commence à se diviser en beaucoup de répertoires, que certains d’entre eux sont des bibliothèques réutilisées par d’autre cibles, il devient très difficile de maintenir les chemins d’includes. J’ai demandé sur le canal IRC le moyen le plus usuel de le faire et là on m’a conseillé une fonction assez récente nommée target_include_directories. Comment fonctionne-t-elle ? Il suffit de spécifier à une cible, des chemins d’includes requis. Ces chemins seront utilisés pour cette cible mais aussi pour toutes les autres cibles qui dépendront de celle ci. Voyons voir ça avec un exemple très simple.
J’ai deux répertoires :
- libcommon (une bibliothèque partagée dont je souhaite utiliser les includes ailleurs)
- plugin (un plugin qui a besoin de libcommon et de ses includes
Voici l’architecture du projet de test
test/
-- CMakeLists.txt
-- libcommon/
-- CMakeLists.txt
-- file.c
-- file.h
-- plugin/
-- CMakeLists.txt
-- main.c (a besoin de file.h)
Et voici le code CMake.
test/CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
add_subdirectory(libcommon)
add_subdirectory(plugin)
libcommon/CMakeLists.txt
add_library(common SHARED file.c)
target_include_directories(common PUBLIC . "foo" "bar" "baz")
plugin/CMakeLists.txt
add_executable(main main.c)
target_link_libraries(main common)
Et voilà, en compilant la cible plugin, tous les chemins d’includes de la libcommon sont également ajoutées. Absolument parfait.