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: %.asm
fuktioniert 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
%: %.o
abschalten können, und deine Regel sollte gehen. Aber falls das klappt, könnte da auch anderes kaputt gehen.
-
Danke, jetzt geht alles.