Mehrere Verzeichnisse unter CMake

Lesezeit: 3 Minuten

Benutzeravatar von Aaron Yodaiken
Aaron Yodaiken

Ich verwende derzeit rekursive Make- und Autotools und möchte für ein Projekt, das in etwa so aussieht, zu CMake migrieren:

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)

Wie soll ich vorgehen?

Benutzeravatar von DLRdave
DLRdave

Wenn es nie eine Quelle oberhalb des lx/src-Verzeichnisses gibt, besteht keine Notwendigkeit für die lx/CMakeLists.txt Datei. Wenn ja, sollte es ungefähr so ​​​​aussehen:

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

…wo die Unterverzeichnisse in der Reihenfolge der Bibliotheksabhängigkeiten hinzugefügt werden. Bibliotheken, die von nichts anderem abhängen, sollten zuerst hinzugefügt werden, und dann Bibliotheken, die von diesen abhängen, und so weiter.

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

Dann in einer Eingabeaufforderung:

mkdir lx/bin
cd lx/bin

cmake ..
  # or "cmake ../src" if the top level
  # CMakeLists.txt is in lx/src

make

Standardmäßig landet die ausführbare lx-Datei im Verzeichnis „lx/bin/src“ mit genau diesem Layout. Sie können steuern, in welchem ​​Verzeichnis es landet, indem Sie die Zieleigenschaft RUNTIME_OUTPUT_DIRECTORY und den Befehl set_property verwenden.

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

Verweisen Sie auf target_link_libraries-Bibliotheken entweder über den CMake-Zielnamen, wenn die Bibliothek als CMake-Ziel über add_library erstellt wurde, oder andernfalls über den vollständigen Pfad zur Bibliotheksdatei.

Siehe auch die Ausgabe von “cmake –help-command target_link_libraries” oder eines anderen cmake-Befehls und die vollständige Online-Dokumentation für cmake-Befehle, die Sie hier finden:

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

  • Vielen Dank – aber wie funktioniert der „transitive“ Abruf der „js“- und „util“-Abhängigkeiten?

    – Aaron Yodaiken

    15. Juni 2011 um 16:58 Uhr

  • Das ist eine Funktion von CMake – es verfolgt target_link_libraries-Befehle durch den gesamten Baum, um das Abhängigkeitsdiagramm in internen Datenstrukturen zu erstellen, und verwendet dies, um korrekte Link-Befehlszeilen zu generieren.

    – DLRdave

    16. Juni 2011 um 10:43 Uhr

  • Da ich zu faul bin, Dateien aufzulisten, fand ich FILE(GLOB_RECURSE sourceVar ./ ​​*.cpp *.c *.h) sehr nützlich. Sie können auch GLOB verwenden, das nicht in Sub-Sub-Ordner rekursiv ist. Ansonsten danke DLRdave, dass er mir auch den Einstieg in CMake ermöglicht hat.

    – Budric

    4. November 2011 um 15:39 Uhr

Die Steinberg VST3-Bibliothek verfügt über eine wiederverwendbare Methode, die Unterverzeichnisse rekursiv durchläuft und sie hinzufügt, wenn sie eine CMakeLists.txt-Datei enthalten:

# add every sub directory of the current source dir if it contains a CMakeLists.txt
function(smtg_add_subdirectories)
    file(GLOB subDirectories RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *)
    foreach(dir ${subDirectories})
        if(IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/${dir}")
            if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${dir}/CMakeLists.txt")
                add_subdirectory(${dir})
            endif()
        endif()
    endforeach(dir)
endfunction()

https://github.com/steinbergmedia/vst3_cmake/blob/master/modules/SMTG_AddSubDirectories.cmake

1408940cookie-checkMehrere Verzeichnisse unter CMake

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy