CMake partage des chemins d'includes

January 2014 · 1 minute(s) de lecture

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 :

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.