make - Sinnvoll das Projekt verwalten, aber wie?

Pascal, Basic und andere nicht aufgelistete
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 Jun 21, 2009 9:58 am

Dirty Oerti hat geschrieben:Ok, also das von Hand kompilierte läuft ohne Probleme...
Jetzt muss ich nur CMake davon überzeugen, dass für mich zu tun^^
Du kompilierst also auch statische Libraries. Dafür gibt es glaub ich wieder eine extra Variable. Was ich gefunden habe gibt es folgende drei Variablen:

CMAKE_EXE_LINKER_FLAGS
CMAKE_SHARED_LINKER_FLAGS
CMAKE_MODULE_LINKER_FLAGS

Ansonsten könnte es auch hilfreich sein mit "make VERBOSE=1" zu kompilieren, um zu sehen mit welchen Flags der Linker aufgerufen wird.

edit: Das hab ich auch noch gefunden:

Code: Alles auswählen

set_target_properties(kernel_mod PROPERTIES LINK_FLAGS "-T linkerscript.ld")
"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 Jun 21, 2009 11:33 am

Tag :)

Hier mal, wie er die C-Dateien kompiliert:
[ 77%] Building C object src/phys_mm/CMakeFiles/kernel_pmm.dir/pmm_functions.c.o
cd /home/daniel/Projekte/Programmieren/Kernel/build/src/phys_mm && /usr/bin/gcc -I/home/daniel/Projekte/Programmieren/Kernel/inc -fno-builtin -fno-leading-underscore -fno-strict-aliasing -fno-stack-protector -Wall -m32 -O3 -o CMakeFiles/kernel_pmm.dir/pmm_functions.c.o -c /home/daniel/Projekte/Programmieren/Kernel/src/phys_mm/pmm_functions.c
/usr/bin/cmake -E cmake_progress_report /home/daniel/Projekte/Programmieren/Kernel/build/CMakeFiles 9
[ 88%] Building C object src/phys_mm/CMakeFiles/kernel_pmm.dir/pmm_init.c.o
cd /home/daniel/Projekte/Programmieren/Kernel/build/src/phys_mm && /usr/bin/gcc -I/home/daniel/Projekte/Programmieren/Kernel/inc -fno-builtin -fno-leading-underscore -fno-strict-aliasing -fno-stack-protector -Wall -m32 -O3 -o CMakeFiles/kernel_pmm.dir/pmm_init.c.o -c /home/daniel/Projekte/Programmieren/Kernel/src/phys_mm/pmm_init.c
Linking C static library libkernel_pmm.a
cd /home/daniel/Projekte/Programmieren/Kernel/build/src/phys_mm && /usr/bin/cmake -P CMakeFiles/kernel_pmm.dir/cmake_clean_target.cmake
cd /home/daniel/Projekte/Programmieren/Kernel/build/src/phys_mm && /usr/bin/cmake -E cmake_link_script CMakeFiles/kernel_pmm.dir/link.txt --verbose=1
/usr/bin/ar cr libkernel_pmm.a CMakeFiles/kernel_pmm.dir/pmm_functions.c.o CMakeFiles/kernel_pmm.dir/pmm_init.c.o
/usr/bin/ranlib libkernel_pmm.a

make[2]: Verlasse Verzeichnis '/home/daniel/Projekte/Programmieren/Kernel/build'
/usr/bin/cmake -E cmake_progress_report /home/daniel/Projekte/Programmieren/Kernel/build/CMakeFiles 8 9
Im Unterstrichenen Part sieht man, wie er die einzelnen Dateien kompiliert. Das sieht soweit richtig aus.
Im kursiven Part liegt meiner Ansicht nach der Fehler.
Dort linkt er die Object Files nämlich zu einer (Linuxspezifischen)statischen Library.

"Normalerweise" müsste das so ablaufen:
Per gcc -c werden die *.o Dateien kompiliert, und die werden am Ende ALLE von ld zu einem Objectfile gelinkt (elf_i386).

Das zweite Problem liegt bei den Assemblerdateien. Die werden einfach ignoriert. Das es dann nicht funktionieren kann, ist klar:
/usr/bin/ld: warning: cannot find entry symbol kernelentry; defaulting to 0000000000100000
Laut Linkerskript gehts bei kernelentry los, das befindet sich aber in einer asm-Datei...
Und von der wird iwie nirgendwo was erwähnt, nichtmal ein Fehler...??

Ich muss CMake also jetzt dazu bringen:
Meine C-Dateien einzeln zu kompilieren und dann erst am Ende zu linken, und zwar so, wie ich es sage.
Meine Asm-Dateien überhaupt mal zu kompilieren.

Zum Problem mit dem linken:
Ich führe out-of-source Builds durch.
D.h. alle Objectdateien kommen nach build/.

Also müsste es doch gehen, wenn ich ein custom_command hinzufüge, das per find alle Dateien, die auch .o enden findet und an die "Dateiliste" von ld (mit meinen Parametern) anhängt...?
Muss ich das auch für jede .c Datei und gcc machen...?
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 Jun 21, 2009 1:03 pm

Dirty Oerti hat geschrieben:Ich muss CMake also jetzt dazu bringen:
Meine C-Dateien einzeln zu kompilieren und dann erst am Ende zu linken, und zwar so, wie ich es sage.
Also ich weiß jetzt nicht genau wie deine CMakeLists.txt ausschauen aber wenn ich bei mir mehrere Sourcefiles in eine statische Bibliothek stecke werden zuerst alle Sourcefiles zuerst einzeln kompiliert und dann erst am Ende gelinkt.

Bei mir funktioniert das in etwa mit folgender CMakeLists.txt

Code: Alles auswählen

SET(kernel_SOURCES
  dir1/src1.c
  dir2/scr2.c
  dir2/src3.c
)

include_directories(../include)

add_library(kernel STATIC ${kernel_SOURCES})
set_target_properties(kernel PROPERTIES LINK_FLAGS "-T linkerscript.ld")
Dirty Oerti hat geschrieben:Meine Asm-Dateien überhaupt mal zu kompilieren.
Vielleicht hilft dir einer der folgenden Links weiter:
http://www.cmake.org/Wiki/CMake/Assembler
http://www.cmake.org/pipermail/cmake/20 ... 14929.html

Btw. wenn das ganze geht wäre das doch einmal ein gutes Kapitel fürs Wiki...

Aktuell bin ich zwar noch viel mit der Uni beschäftigt, aber schreibs mal ins Todo.
"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 Jun 21, 2009 1:32 pm

Hm, du meinst also bei einem CMakeLists im src Ordner bleiben?
Ich versuchs mal.
Kann ich auch automatisch alle *.c Dateien in eine Variable (KERNEL_SRC) eintragen lassen?

Das mit dem ASM (in meinem Fall NASM) Support will nicht. Ich hab leider auch keine Ahnung was ich da wo hinzufügen/ändern muss...
Kann ich nicht mit add_custom_command eine Regel für *.asm Dateien hinzufügen? Oder funktionieren da keine Wildcards?
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 » So Jun 21, 2009 4:36 pm

Hm, also (eigentlich) nur für den Übergang hab ich mir jetzt ein Makefile erstellt, dass den Job auch erledigt :)
Und so lang ist das auch nicht geworden:

Code: Alles auswählen

# makefile for the kernel

###########################################################################################################
## Vars
CC = gcc
CCFLAGS = -m32 -fno-builtin -fno-leading-underscore -fno-strict-aliasing -fno-stack-protector -Wall -c 
NM = nasm
NMFLAGS = -f elf
LD = ld
LDFLAGS = -m elf_i386 -T linkerscript.ld 

CINCPATH = -I../inc/
OUTPATH = ../build/
###########################################################################################################
## Default target, do everything

all: allsources kernel



###########################################################################################################
## locate (find) all source files in subdirs and include them as var SOURCES
.PHONY: allsources
allsources:
	@echo -n "SOURCES = " > allsources
	@find . -name "*.c" -printf "%p " >> allsources
	@echo "\n" >> allsources
	@echo -n "ASMSRC = " >> allsources
	@find . -name "*_asm.asm" -printf "%p " >> allsources

include allsources
objects = $(patsubst %.c,%.o,$(SOURCES)) $(patsubst %_asm.asm,%_asm.o,$(ASMSRC))
###########################################################################################################
## build and link the kernel
.PHONY: kernel
kernel: $(objects)
	@$(LD) $(LDFLAGS) -o $(OUTPATH)/kernel.bin `find $(OUTPATH) -name "*.o" -printf "%p "`


%.o: %.c
	@$(CC) $(CCFLAGS) $(CINCPATH) $< -o $(OUTPATH)$@

%_asm.o: %_asm.asm
	@$(NM) $(NMFLAGS) $< -o $(OUTPATH)$@

###########################################################################################################

Es liegt im src/ Verzeichnis und tut alles, was an kompilieren und linken notwendig ist :)
Das einzige, was mir daran nicht gefällt:

Es kompiliert immer komplett neu (ja ich weiß, das Target kernel ist als PHONY gekennzeichnet, aber dadurch ändert sich das Verhalten nicht.). Wenn ich das noch hinbekommen würde, dann wärs eigentlich DIE Lösung :)
(Man braucht kein cmake installieren, make reicht, portabel ist es auch)
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