web-dev-qa-db-fra.com

Plusieurs répertoires sous CMake

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?

38
Aaron Yodaiken

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

76
DLRdave