Lowlevel
		Lowlevel => Lowlevel-Coding => Thema gestartet von: rizor am 17. December 2008, 00:02
		
			
			- 
				nabend,
 
 wollte eben meinen neuen virtuellen Speichermanager compilieren.
 Leider funktioniert mein Makefile nicht.
 Der Aufruf sieht wie folgt aus:
 
 CC = /usr/bin/gcc
 ASM = /usr/bin/nasm
 CFLAGS = -O3 -fstrength-reduce -fomit-frame-pointer -finline-functions -fno-stack-protector -nostdinc -fno-builtin -march=i386 -I../include
 ASMFLAGS = -felf
 
 all:
 $(CC) $(CLFAGS) -c -o ../../obj/virtmem.c.o virtmem.c
 $(CC) $(CFLAGS) -c -o ../../obj/physmem.c.o physmem.c
 $(ASM) $(ASMFLAGS) -o ../../obj/virtmem.asm.o virtmem.asm
 
 Die physmem und die asm Datei werden kompiliert.
 Das Problem ist, dass er die Header-Dateien nicht findet.
 Die befinden sich aber genau da, wo sie sein sollten.
 Wenn ich die virtmem-Datei von Hand kompiliere, geht es.
 Woran liegt es, dass er es mit dem Makefile nicht macht?
- 
				Du hast einen Buchstabendreher in CLFAGS. 
 
 Vielleicht so spät nicht mehr programmieren ;)
- 
				Danke.
 Ein klarer Fall von Betriebsblindheit
- 
				Hallo,
 
 ich habe mir nochmal ein neues Makefile geschrieben.
 Es kompiliert auhc alles; es gibt aber ein "Fehlermeldung":
 
 make[1]: Zirkuläre Datei init.asm <- init.asm.o Abhängigkeit wird nicht verwendet.
 
 Ich habe nachgeschaut, dass tritt bei allen ASM-Files auf.
 Aber die hängen ja von nichts ab.
 Sie werden auch erstellt.
 Wie bekomme ich den Fehler weg?
 Meine Makeregel sieht dazu folgender Maßen aus:
 
 %.asm.o:%.asm
 $(NASM) $(ASMFLAGS) -o $(HOME_DIR)/obj/$@ $<
 
 Woran liegt die Meldung.
 Sie stört zwar nicht, ist aber auch nicht schön.
 
 [Edit]
 Ich habe mir dann auch noch ein Linker-Teil geschrieben, der sich aus einer Directory alle Object-Files sammelt und die dann linkt.
 Dabei kommt der Fehler 127 zustande.
 
 Die Befehle:
 #Makefile for the hole project
 include Makefile.rules
 
 KERNEL_DIRS = kernel kernel/driver kernel/interrupt kernel/memory
 LIBC_DIRS = usr/src
 
 #Makros
 EXTENSIONS = .asm.o .c.o
 OBJ_FILES = $(wildcard $(addprefix $(1)/*,$(EXTENSIONS)))
 
 all: build-kernel
 
 build-kernel:
 for i in $(KERNEL_DIRS); do make -C $$i; done
 KERNEL_OBJ = $(call OBJ_FILES,$(HOME_DIR)/obj)
 $(LD) $(LDFLAGS) $(HOME_DIR)/bin/kernel.bin $(KERNEL_OBJ)
 
 HOME_DIR, LD und LDFLAGS sind in der Makefile.rules definiert.
 
 
- 
				Du mischst da zwei Arten Regeln zu schreiben. %.asm.o:%.asm bedeutet, dass du aus eine .asm-Datei eine .asm.o-Datei erstellen willst (keine .o-Datei).
 
 Richtig ist entweder:%.o: %.asm
 ...
oder:.SUFFIXES: .asm .o <------ hier müssen dann auch alle anderen Endungen stehen
 
 .asm.o:
 ...
Letztere Methode ist veraltet. Die erstere ist ja auch einfacher.
- 
				Ich wollte aber, dass hinter den ASM-kompilierten Files die Extension asm.o steht, damit ich die untwerscheiden kann.
 Wie kann ich denn das dann machen?
- 
				Diese zirkuläre Abhängigkeit hat dann wohl irgendwas mit internen Regeln von make zu tun. Nimmt halt .asm.obj statt .asm.o.
			
- 
				%_asm.o: %.asmfuktioniert auch
 
 edit:
 das problem liegt warscheinlich an dieser internen definition
 %: %.o
 #  Auszuführende Kommandos (eingebaut):
 $(LINK.o) $^ $(LOADLIBES) $(LDLIBS) -o $@
 
 womit foo.asm wieder von foo.asm.o abhängt
- 
				Das mit der Abhängigkeit habe ich behoben.
 Was hat das nun mit dem Fehler 127 auf sich?
 
 Die Meldung sieht so aus:
 make: KERNEL_OBJ: Kommando nicht gefunden
 make: *** [build-kernel] Fehler 127
 make: Das Target »all« wurde wegen Fehlern nicht aktualisiert.
 KERNEL_OBJ =
- 
				Im Fehlermeldungen von Anfang bis Ende lesen:
 make: KERNEL_OBJ: Kommando nicht gefunden Bezieht sich wohl auf diese Zeile:
 KERNEL_OBJ = $(call OBJ_FILES,$(HOME_DIR)/obj)Die darfst du erstens nicht einrücken, und zweitens sollte das nicht in einer Regel stehen. Da klappt sowas nicht.
 
 das problem liegt warscheinlich an dieser internen definition Ah, ich hab die Regel nicht gefunden. Wenn ich das Manual (http://www.gnu.org/software/make/manual/make.html#Canceling-Rules) richtig interpretiere, dann solltest du diese mittels der leeren Regel
 %: %.oabschalten können, und deine Regel sollte gehen. Aber falls das klappt, könnte da auch anderes kaputt gehen.
- 
				Danke, jetzt geht alles.