J'utilise actuellement un make récursif et des outils automatiques et je cherche à migrer vers CMake pour un projet qui ressemble à ceci:
lx/ (project root)
src/
lx.c (contains main method)
conf.c
util/
str.c
str.h
etc.c
etc.h
server/
server.c
server.h
request.c
request.h
js/
js.c
js.h
interp.c
interp.h
bin/
lx (executable)
Comment dois-je procéder?
S'il n'y a jamais de source supérieure au répertoire lx/src, le fichier lx/CMakeLists.txt n'est pas nécessaire. Si c'est le cas, cela devrait ressembler à ceci:
cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
project(lx)
add_subdirectory(src)
add_subdirectory(dir1)
add_subdirectory(dir2)
# And possibly other commands dealing with things
# directly in the "lx" directory
... où les sous-répertoires sont ajoutés dans l'ordre de dépendance des bibliothèques. Les bibliothèques qui ne dépendent de rien d'autre doivent être ajoutées en premier, puis les bibliothèques qui en dépendent, et ainsi de suite.
lx/src/CMakeLists.txt
cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
project(lx_exe)
add_subdirectory(util)
add_subdirectory(js)
add_subdirectory(server)
set(lx_source_files conf.c lx.c)
add_executable(lx ${lx_source_files})
target_link_libraries(lx server)
# also transitively gets the "js" and "util" dependencies
lx/src/util/CMakeLists.txt
set(util_source_files
etc.c
etc.h
str.c
str.h
)
add_library(util ${util_source_files})
lx/src/js/CMakeLists.txt
set(js_source_files
interp.c
interp.h
js.c
js.h
)
add_library(js ${js_source_files})
target_link_libraries(js util)
lx/src/server/CMakeLists.txt
set(server_source_files
request.c
request.h
server.c
server.h
)
add_library(server ${server_source_files})
target_link_libraries(server js)
# also transitively gets the "util" dependency
Ensuite, dans une invite de commande:
mkdir lx/bin
cd lx/bin
cmake ..
# or "cmake ../src" if the top level
# CMakeLists.txt is in lx/src
make
Par défaut, l'exécutable lx se retrouvera dans le répertoire "lx/bin/src" en utilisant cette disposition exacte. Vous pouvez contrôler dans quel répertoire il se termine en utilisant la propriété cible RUNTIME_OUTPUT_DIRECTORY et la commande set_property.
http://www.cmake.org/cmake/help/cmake-2-8-docs.html#prop_tgt:RUNTIME_OUTPUT_DIRECTORY
http://www.cmake.org/cmake/help/cmake-2-8-docs.html#command:set_property
Référez-vous aux bibliothèques target_link_libraries soit par nom de cible CMake, si la lib est construite comme cible CMake via add_library, soit par chemin complet vers le fichier de bibliothèque sinon.
Voir aussi, la sortie de "cmake --help-command target_link_libraries", ou toute autre commande cmake, et la documentation en ligne complète pour les commandes cmake trouvées ici:
http://www.cmake.org/cmake/help/cmake-2-8-docs.html#section_Commands
http://www.cmake.org/cmake/help/cmake-2-8-docs.html#command:target_link_libraries