Forum: PC-Programmierung Verständnisfrage CMake


von Christian (Gast)


Lesenswert?

Hallo,

ich habe mich in der letzten Zeit etwas mit CMake beschäftigt. Die 
ersten kleinen Projekte liefen auch ohne größere Hürden. Nun bin ich in 
einem Projekt, bei dem ich mehrere Compilerflags einstellen muss. Diese 
habe ich denn per Set() oder auch mit add_definitions() eingefügt und 
konnte dann gesehen, dass die Flags beim Compilieren verwendet wurden. 
Nun habe ich sie aber nicht im generierten Makefile gefunden, genau wie 
die Angabe des Compilers, diese steht ja in der CMakeCache.txt.
Das heisst nun, dass ich das generierte Makefile nur bei mir auf dem 
Rechner nutzen kann, bzw auf einem Rechner wo die Pfade identisch sind?!

Gruß Christian

von Kaj (Gast)


Lesenswert?

Christian schrieb:
> Das heisst nun, dass ich das generierte Makefile nur bei mir auf dem
> Rechner nutzen kann, bzw auf einem Rechner wo die Pfade identisch sind?!
Ist das bei einem handgeschriebenen Makefile, mit fest eingetragenen 
Pfaden anders? Auf einem anderen Rechner fuehrst du einfach wieder CMake 
aus und alles ist gut.

von Christian (Gast)


Lesenswert?

Kaj schrieb:
> Auf einem anderen Rechner fuehrst du einfach wieder CMake
> aus und alles ist gut.

Ok dann sollte wohl jeder, der an diesem Projekt mitarbeitet auch CMake 
installiert haben.
Mein erster Eindruck war der, dass ich mit CMake ein Makefile erstelle 
und das verteilen kann. Dies funktionier aber nicht, da ja im Makefile 
Abhänghigkeiten zu CMake sind?!

von Rolf M. (rmagnus)


Lesenswert?

Christian schrieb:
> Kaj schrieb:
>> Auf einem anderen Rechner fuehrst du einfach wieder CMake
>> aus und alles ist gut.
>
> Ok dann sollte wohl jeder, der an diesem Projekt mitarbeitet auch CMake
> installiert haben.

Ja, und jeder, der das Programm bauen soll.

> Mein erster Eindruck war der, dass ich mit CMake ein Makefile erstelle
> und das verteilen kann. Dies funktionier aber nicht, da ja im Makefile
> Abhänghigkeiten zu CMake sind?!

CMake führt ja auch die ganze Suche nach Abhängigkeiten von z.B. Libs 
u.s.w. durch. Das Makefile nutzt dann das, was bei dieser Suche gefunden 
wurde. Das Makefile ist also immer nur für die Maschine gedacht, auf der 
du zuvor CMake ausgeführt hast.

von tictactoe (Gast)


Lesenswert?

Christian schrieb:
> Mein erster Eindruck war der, dass ich mit CMake ein Makefile erstelle
> und das verteilen kann.

Nein, das funktioniert anders: Jeder Entwickler, der am Code arbeitet, 
führt bei sich cmake aus und erhält dadurch seine eigenen Makefiles.

von René H. (Gast)


Lesenswert?

tictactoe schrieb:
> Nein, das funktioniert anders: Jeder Entwickler, der am Code arbeitet,
> führt bei sich cmake aus und erhält dadurch seine eigenen Makefiles.

Das ist so. Du checkst in ein SVN oder GIT auch nur das CMakeLists.txt 
ein.

Für Abhilfe gegen feste Pfade kannst Du eigene find_package scripts 
schreiben.

Aber generell, cmake ist nur ein Meta Makefile, das Makefile muss von 
jedem Entwickler selber erzeugt werden (das ist der Standard heute).

Grüsse,
René

von Christian (Gast)


Lesenswert?

Danke für die Hinweise!

Nun habe ich dann doch noch eine Frage. Kurzes Beispiel mit folgender 
Struktur: In meinem src Ordner sind die Files main.c, main.h und data.h. 
Im src Ordner ist noch ein Ordner namens app. In diesem sind die Files 
app.c und app.h.
Nun hab ich in jedem Ordner eine CMakeLists.txt, Makefile generiert und 
die erzeugte exe konnte ich ausführen. Soweit alles gut. Dann habe ich 
data.h ( src Ordner ) in die app.h ( app Ordner ) includiert und nun 
kommt beim Bauen die Fehlermeldung: app.h:1:19: fatal error: data.h: No 
such file or directory

Das bedeutet, dass er data.h nicht in dem übergeordnetem Ordner 
findet/kennt. Generell muss aber data.h bekannt sein, da es auch in main 
includiert ist.
Die Ordner src und src/app habe ich per add_subdirectory() bekannt 
gemacht ( das übergeordnete CMakeLists.txt liegt noch vor dem src 
Ordner, da ich auch noch libs einbinde ).
Hoffe das Problem ist deutlich genug beschrieben...

von Christian (Gast)


Lesenswert?

Habe es nun geschafft: Ich habe die Ordner nun mit include_directory 
eingebunden. Ich dachte zuerst, dass add_subdirectory reicht

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.