webentwicklung-frage-antwort-db.com.de

Wie verwende ich alle * .c Dateien in einem Verzeichnis mit dem Cmake Build System

Ich möchte alle .c-Dateien in einem Verzeichnis finden und sie allen SRC-Dateien hinzufügen, um sie in cmake zu kompilieren. Wie kann ich das in CMakeList.txt machen?.

für reguläre Makefiles kann ich erstellen 

SPECIFIED_SRC_FILE  = $(foreach d,$(SPECIFIED_SRC_DIRS),$(wildcard $(addprefix $(d)/*,*.c)))

aber ich konnte nicht bekommen, wie man so etwas in CMakeList.txt macht.

46
user256537

Versuche dies:

AUX_SOURCE_DIRECTORY

Finden Sie alle Quelldateien in einem Verzeichnis. 

AUX_SOURCE_DIRECTORY(dir VARIABLE) 

Sammelt die Namen aller Quelldateien im angegebenen Verzeichnis und speichert die Liste in der bereitgestellten Variablen. Dieser Befehl ist vorgesehen Wird von Projekten verwendet, die explizite Vorlageninstanziierung verwenden. Vorlageninstanziierungsdateien können in "Vorlagen" gespeichert werden Unterverzeichnis und automatisch mit diesem Befehl gesammelt, um .__ zu vermeiden. Manuelle Auflistung aller Instantiierungen. 

Es ist verlockend, diesen Befehl zu verwenden, um zu vermeiden, dass die Liste der Quelle .__ geschrieben wird. Dateien für eine Bibliothek oder ein ausführbares Ziel. Während dies zu funktionieren scheint, Es gibt keine Möglichkeit für CMake, ein Build-System zu erstellen, das weiß, wann eine Neue Quelldatei wurde hinzugefügt. Normalerweise das generierte Buildsystem weiß, wann CMake erneut ausgeführt werden muss, da die Datei CMakeLists.txt .__ ist. geändert, um eine neue Quelle hinzuzufügen. Wenn die Quelle gerade zum .__ hinzugefügt wird. Verzeichnis ohne diese Datei zu ändern, müsste man manuell Führen Sie CMake erneut aus, um ein Build-System zu erstellen, das die neue Datei enthält.

42
whitequark

Wie wäre es mit dem guten alten Globbing?

FILE(GLOB MyCSources *.c)
ADD_EXECUTABLE(MyExecutable ${MyCSources})
50
Dat Chu

GLOB_RECURSE rekursives Beispiel

Im Grunde geht der * auch in Unterverzeichnisse:

cmake_minimum_required(VERSION 3.0)
file(GLOB_RECURSE SOURCES RELATIVE ${CMAKE_SOURCE_DIR} "src/*.c")
add_executable(main ${SOURCES})

Und dann könnten unsere Quellen beispielsweise wie folgt lokalisiert werden:

src/main.c
src/d/a.c
src/d/a.h

Und main.c verwendet #include "d/a.h" und a.c verwendet #include "a.h".

Die Verwendung von GLOB_RECURSE auf der obersten Ebene von CMake (d. H. "*.c" anstelle von "src/*.c") ist wahrscheinlich eine schlechte Idee, da er .c-Dateien aufnehmen kann, die von CMake selbst generiert wurden und unter build/ abgelegt sind.

Laufbares Beispiel auf GitHub .

Ja, du hast zwei Möglichkeiten. Nehmen wir an, die Ordnerstruktur ähnelt dieser. 

├── autopilot
            │   ├── _AutoPilot.cpp
            │   ├── _AutoPilot.h
            │   └── action
            │       ├── ActionBase.cpp
            │       ├── ActionBase.h
            │       ├── APcopter
            │       │   ├── APcopter_avoid.cpp
            │       │   ├── APcopter_avoid.h

Wenn Sie AUX_SOURCE_DIRECTORY verwenden möchten, müssen Sie jedes der Unterverzeichnisse CMakeLists.txt hinzufügen. Dann müssen Sie alle Unterverzeichnisse einbinden und verknüpfen. Dies ist eine ziemlich schwierige Aufgabe. So kannst du dir GLOB und die Arbeit sehr leicht erledigen. So wird es gemacht.

  file(GLOB autopilot_sources ./*.cpp ./*/*.cpp ./*/*/*.cpp ./*/*/*/*.cpp ./*.c ./*/*.c ./*/*/*.c ./*/*/*/*.c)
  SET( autopilot ${autopilot_sources})  

Wenn Sie eine Bibliothek mit dem obigen Quellcode erstellen möchten, geben Sie diesen Befehl ein: 

  ADD_LIBRARY ( autopilot  ${autopilot})
  TARGET_LINK_LIBRARIES ( autopilot)  

Wenn Sie eine ausführbare Datei mit dem obigen Quellcode erstellen möchten, geben Sie diesen Befehl ein: 

 ADD_EXECUTABLE(autopilot ${autopilot})
1
GPrathap

Sie können AUX_SOURCE_DIRECTORY als @whitequark verwenden, aber es funktioniert nicht wirklich wie erwartet, da CMake nicht feststellen kann, wann neue Dateien hinzugefügt werden (was bei der Verwendung eines Platzhalters der ganze Punkt ist).

0
JesperE