make - Sinnvoll das Projekt verwalten, aber wie?

Pascal, Basic und andere nicht aufgelistete
Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

make - Sinnvoll das Projekt verwalten, aber wie?

Beitrag von Dirty Oerti » So Mai 17, 2009 9:44 am

Tag :)

So, gleich eins vorne weg, das hier brauche ich für meinen Kernel, ich denke aber, dass das Thema wohl eher hier rein passt. (Make kann man wohl schon als eine Art Programmier, bzw Skriptsprache ansehen^^)

Ich habe folgende Verzeichnisstruktur:

/
---src/
-------------bio/ (enthalten jeweils ca 1-2 Source-Dateien)
-------------gdt/
-------------noch_mehr_verzeichnisse/
---inc/
-------------(alle Header)
---build/
-------------(hierhin soll alles, was "fertig" ist)


Gut, nun brauche ich einen "Komplex" aus Makefiles, mit dem ich das möglichst dynamisch realisieren kann.
Heißt: Im "obersten" Verzeichnis wird make eingetippt.

Daraufhin müssen die Unterverzeichnisse von src "durchsucht" werden, und evtl gefundene Sourcedateien (unter Abhändigkeit ihrer includierten Header) in Objektdateien compiliert werden (test.c -> test.o)
Diese Objektdateien sollen sich nun im Ordner build "einfinden".
Aus diesen wird dann ein einziges Objektfile gelinkt. (was in build sein soll)

Hilfe?
daniel@daniel-lap:/$ make --version
GNU Make 3.81
Copyright (C) 2006 Free Software Foundation, Inc.
Dies ist Freie Software; siehe die Programmquellen für Vervielfältigungsbedingungen.
Es gibt KEINE Gewährleistung; nicht einmal für VERMARKTUNG oder NUTZBARKEIT FÜR EINEN
BESONDEREN ZWECK.

Dieses Programm wurde erstellt für x86_64-pc-linux-gnu
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Benutzeravatar
fat-lobyte
Beiträge: 1398
Registriert: Sa Jul 05, 2008 12:23 pm
Wohnort: ::1
Kontaktdaten:

Re: make - Sinnvoll das Projekt verwalten, aber wie?

Beitrag von fat-lobyte » So Mai 17, 2009 11:53 am

Tag
Dirty Oerti hat geschrieben:ich denke aber, dass das Thema wohl eher hier rein passt. (Make kann man wohl schon als eine Art Programmier, bzw Skriptsprache ansehen^^)
Schon, aber eigentlich ist es Tool, gehört also zu "Software". Aber du hast recht, das ist grauzone. Lassen wirs mal drin.


Gleich mal vorweg: Ich habe vor mein Projekt auf CMake umzustellen, weil GNU Make einfach zu kompliziert anstrengend und nervig ist. GNU Autoconf/Autotools will ich auf keinen Fall lernen, weil es da wirklich Horrorgeschichten dazu gibt...
Soviel zu der Sache.

Also ich habe für mein Projekt jetzt mittlerweile ein halbwegs akzeptables build- system für GNU Make aufgebaut. Du kannst ja mal hier durchbrowsen:
http://git.berlios.de/cgi-bin/gitweb.cg ... ;a=summary
Das Programm selbst ist (noch) Müll, aber wenigstens funktionieren die Makefiles ;-)

Also ich habe das so gelöst:
* /build/config.mak:
Eine Datei, die alle "Build-Einstellungen" enhätl. Das sind: Verzeichnisse, Compiler Flags, Linker Flags, optionen... Dieses wird von der build/global.mak eingebunden.
* /build/global.mak:
Globale Makefile datei. Wird von allen anderen Makefiles eingebunden, "baut" die Compiler und Linker flags zusammen.
* /Makefile: "Bequemlichkeits" Makefile, ruft einfach alle Makefiles der Programme auf (client, server, common).
* /src/client, server, common/Makefile: Ruft die Makefiles der einzelnen "Komponenten" (gui, network, ...) auf

Die Komponenten-Makefiles erstellen .o files, die Programm- makefiles erstellen Programme (oder eine .a von /src/common).

Das "durchsuchen" der Verzeichnisse nach allen ".cpp" files geht so:

Code: Alles auswählen

# create a variable that contains all source files
# first expand the wildcard in the working directory
SOURCES := $(wildcard *.cpp)
# finally create the names for the object file
OBJECTS := $(patsubst %.cpp,%.o,$(SOURCES))

nuke-ms-serv: $(OBJECTS)
	$(CXX) $(CXXFLAGS) -o $@ $^ $(LDFLAGS) -lnukems
Zuerst speicherst du die Namen aller .cpp's in dem Verzeichnis in die Variable "SOURCE". Dann ersetzt du einfach ".cpp" durch ".o" und speicherst das ergebnis in "OBJECTS". Anschließend gibst du nur das Target für das "Hauptprogramm" an, dass alles linkt. Die Objektdateien sollten automatisch, durch implizite Regeln erstellt werden, solange die CXXFLAGS stimmen.


Das ganze System hat eine Schwäche: ich kann nicht beliebig viele Unterverzeichnisse haben, die .o Dateien enthalten, da die Unterprozesse von Make keine Variablen "zurückgeben" können.

Alles irgendwie nervig... ziemlich viel Frickelei und ich habe so das Gefühl dass das ganze ein Kartenhaus ist, dass ganz leicht zusammenfällt. Also ich steige auf CMake um, wenn ich Zeit dazu habe.

Ach ja, das "aufrufen" eines Makefiles sieht zum Beispiel so aus:

Code: Alles auswählen

nuke-ms-serv: nuke-ms-common
	$(MAKE) -C $(SERVDIR)
So, ich hoffe ich konnte dir helfen...
"Feel free to" durchstöbern meiner Makefiles, und stell Fragen wenn was nicht klar ist. Oder stell am liebsten sofort viele Fragen :-)

ps.: GNU Make suxx :evil:
Haters gonna hate, potatoes gonna potate.

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: make - Sinnvoll das Projekt verwalten, aber wie?

Beitrag von Dirty Oerti » So Mai 17, 2009 5:39 pm

Danke schonmal für deine Antwort :)

Also du stellst dein Projekt auf cmake um?
Von cmake habe ich ja auch schon einiges gehört, aber so wirklich bin ich da noch nicht durchgestiegen.
Wie würde man das denn mit cmake erledigen?

(Seh das nicht so, als hätte ich nur den Anfang deines Beitrags gelesen. Ich will mir nur das evtl. bessere/schnellere Verfahren raussuchen :) )
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Benutzeravatar
Kerli
Beiträge: 1456
Registriert: So Jul 06, 2008 10:17 am
Wohnort: Österreich
Kontaktdaten:

Re: make - Sinnvoll das Projekt verwalten, aber wie?

Beitrag von Kerli » So Mai 17, 2009 6:25 pm

Dirty Oerti hat geschrieben:Wie würde man das denn mit cmake erledigen?
In jedes Verzeichnis in dem was gebaut (oder/und in einem Unterverzeichnis) werden soll eine CMakeList.txt erstellen, die in etwa wie folgt ausschauen:

In /:

Code: Alles auswählen

cmake_minimum_required(VERSION 2.6)
PROJECT(dirty_oerti_kernel)

include_directories(inc)

add_subdirectory(src)
in src/:

Code: Alles auswählen

add_subdirectory(bio)
add_subdirectory(gdt)
# ... noch mehr verzeichnisse

add_executable(kernel kernel.c)
target_target_link_libraries(kernel kernel_bio kernel_gdt)
in src/bio/:

Code: Alles auswählen

add_library(kernel_bio STATIC source1.c source2.c)
Das ist jetzt ein Beispiel wie es ausschauen könnte. Es ist natürlich auch möglich in einem Verzeichnis die Dateien der Unterverzeichnisse direkt anzugeben und damit das ganze zentral in einer Datei zu haben, aber das ist geschmackssache.

Falls du Bazaar hast kannst du dir das ganze auch in einem Programm von mir anschauen. Auf meiner Bazaar-Repository Seite findest du ein Programm das ich mit CMake baue.
"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)

OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: make - Sinnvoll das Projekt verwalten, aber wie?

Beitrag von Dirty Oerti » So Mai 17, 2009 6:30 pm

Kann ich auch genau bestimmen, WIE (mit welchem Befehl) cmake mir die einzelnen Dateien erstellt?
Das ist wichtig, da ich ja spezielle Parameter an gcc übergeben muss, die sich teilweise auch von Datei zu Datei unterscheiden.
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Benutzeravatar
Kerli
Beiträge: 1456
Registriert: So Jul 06, 2008 10:17 am
Wohnort: Österreich
Kontaktdaten:

Re: make - Sinnvoll das Projekt verwalten, aber wie?

Beitrag von Kerli » So Mai 17, 2009 6:53 pm

Dirty Oerti hat geschrieben:Kann ich auch genau bestimmen, WIE (mit welchem Befehl) cmake mir die einzelnen Dateien erstellt?
Das ist wichtig, da ich ja spezielle Parameter an gcc übergeben muss, die sich teilweise auch von Datei zu Datei unterscheiden.
Ja das geht. Mit 'add_definitions' kannst du beliebige Flags für den Compiler übergeben (ursprünglich nur für Definen -D gedacht...). Diese werden auf das aktuelle Verzeichnis und alle Unterverzeichnisse weitergegeben. Und wenn es dann wirklich auch auf Dateibasis sein soll dann versuch es einmal mit 'add_custom_command'. Da ich das noch nie gebraucht habe kann ich nicht sagen ob es andere Möglichkeiten gibt, aber mit den genannten sollte es gehen.
"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)

OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: make - Sinnvoll das Projekt verwalten, aber wie?

Beitrag von Dirty Oerti » Sa Jun 20, 2009 10:12 am

Tag :)

So, im Moment bin ich dabei, den Kernel das erstmal zum Kompilieren zu bringen.
Dazu brauche ich ja CMake.

Ich hab das jetzt im Großen und Ganzen so gemacht, wie du mir das vorgeschlagen hast :)
Funktioniert auch (anscheinend) super.
(Cmake scheint sogar die .asm Dateien ohne Probleme übersetzen zu können..?)

Das einzige Problem liegt jetzt noch beim Linken.
CMake möchte natürlich eine ausführbare Datei linken, ich hab aber ein Linkerskript (ld), dass genau angibt, wie gelinkt werden muss.
Wie mache ich CMake jetzt klar, dass er das Skript zum Linken nehmen soll?
Geht das auch per add_definition...?


*edit*
Und irgendwie lässt er micht nicht für 32Bit kompilieren....
-- Configuring done
-- Generating done
-- Build files have been written to: /home/daniel/Projekte/Programmieren/Kernel/build
[ 11%] Built target kernel_bio
[ 22%] Built target kernel_boot
[ 33%] Built target kernel_gdt
[ 44%] Built target kernel_idt
[ 66%] Built target kernel_int
[ 88%] Built target kernel_pmm
Scanning dependencies of target kernel
Linking C executable kernel
/usr/bin/ld: i386 architecture of input file `CMakeFiles/kernel.dir/main.c.o' is incompatible with i386:x86-64 output
/usr/bin/ld: i386 architecture of input file `../boot/libkernel_boot.a(multiboot.c.o)' is incompatible with i386:x86-64 output
/usr/bin/ld: i386 architecture of input file `../gdt/libkernel_gdt.a(gdt.c.o)' is incompatible with i386:x86-64 output
/usr/bin/ld: i386 architecture of input file `../phys_mm/libkernel_pmm.a(pmm_init.c.o)' is incompatible with i386:x86-64 output
/usr/bin/ld: i386 architecture of input file `../phys_mm/libkernel_pmm.a(pmm_functions.c.o)' is incompatible with i386:x86-64 output
/usr/lib/gcc/x86_64-linux-gnu/4.3.3/../../../../lib/crt1.o: In function `_start':
/build/buildd/glibc-2.9/csu/../sysdeps/x86_64/elf/start.S:109: undefined reference to `main'
../boot/libkernel_boot.a(multiboot.c.o): In function `read_mboot_info':
multiboot.c:(.text+0x2c): undefined reference to `memcpy8'
../gdt/libkernel_gdt.a(gdt.c.o): In function `WriteTSS':
gdt.c:(.text+0x100): undefined reference to `memset8'
../gdt/libkernel_gdt.a(gdt.c.o): In function `GDT_Setup':
gdt.c:(.text+0x182): undefined reference to `memset32'
gdt.c:(.text+0x297): undefined reference to `GDT_flush'
gdt.c:(.text+0x29c): undefined reference to `TSS_flush'
../phys_mm/libkernel_pmm.a(pmm_init.c.o): In function `pmm_Setup':
pmm_init.c:(.text+0x5d): undefined reference to `__kernel_space_end'
pmm_init.c:(.text+0xff): undefined reference to `memset32'
pmm_init.c:(.text+0x109): undefined reference to `__kernel_space_end'
collect2: ld gab 1 als Ende-Status zurück
make[2]: *** [src/main/kernel] Fehler 1
make[1]: *** [src/main/CMakeFiles/kernel.dir/all] Fehler 2
make: *** [all] Fehler 2
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Benutzeravatar
Kerli
Beiträge: 1456
Registriert: So Jul 06, 2008 10:17 am
Wohnort: Österreich
Kontaktdaten:

Re: make - Sinnvoll das Projekt verwalten, aber wie?

Beitrag von Kerli » Sa Jun 20, 2009 11:16 am

Dirty Oerti hat geschrieben:Das einzige Problem liegt jetzt noch beim Linken.
CMake möchte natürlich eine ausführbare Datei linken, ich hab aber ein Linkerskript (ld), dass genau angibt, wie gelinkt werden muss.
Wie mache ich CMake jetzt klar, dass er das Skript zum Linken nehmen soll?
Dafür sollte es eigentlich reichen wenn du das zu den Linkerflags hinzufügst:

Code: Alles auswählen

set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -T linkerscript.ld")
Dirty Oerti hat geschrieben:Und irgendwie lässt er micht nicht für 32Bit kompilieren....
Vielleicht hilft dir diese Seite.
"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)

OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: make - Sinnvoll das Projekt verwalten, aber wie?

Beitrag von Dirty Oerti » Sa Jun 20, 2009 11:53 am

Hm, iwie funktioniert das nicht richtig :)
Cmake kompiliert die statischen Libs iwie so, dass sie nicht mehr eingelesen werden können (lauter undefined reference etc)
Auch scheint er die asm-Dateien einfach ignoriert zu haben...
Ich habs jetzt einmal von Hand (im Terminal) kompiliert und guck gleich mal, obs überhaupt läuft.
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: make - Sinnvoll das Projekt verwalten, aber wie?

Beitrag von Dirty Oerti » Sa Jun 20, 2009 12:44 pm

Ok, also das von Hand kompilierte läuft ohne Probleme...
Jetzt muss ich nur CMake davon überzeugen, dass für mich zu tun^^
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Antworten