Autor Thema: Makefile "spinnt"  (Gelesen 5697 mal)

rizor

  • Beiträge: 521
    • Profil anzeigen
Gespeichert
« 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?
Programmiertechnik:
Vermeide in Assembler zu programmieren wann immer es geht.

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 17. December 2008, 09:30 »
Du hast einen Buchstabendreher in CLFAGS.

Vielleicht so spät nicht mehr programmieren ;)
Dieser Text wird unter jedem Beitrag angezeigt.

rizor

  • Beiträge: 521
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 17. December 2008, 09:56 »
Danke.
Ein klarer Fall von Betriebsblindheit
Programmiertechnik:
Vermeide in Assembler zu programmieren wann immer es geht.

rizor

  • Beiträge: 521
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 11. January 2009, 12:34 »
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.

« Letzte Änderung: 11. January 2009, 13:08 von rizor »
Programmiertechnik:
Vermeide in Assembler zu programmieren wann immer es geht.

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 11. January 2009, 13:16 »
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.
« Letzte Änderung: 11. January 2009, 13:18 von PorkChicken »
Dieser Text wird unter jedem Beitrag angezeigt.

rizor

  • Beiträge: 521
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 11. January 2009, 13:31 »
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?
Programmiertechnik:
Vermeide in Assembler zu programmieren wann immer es geht.

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 11. January 2009, 13:39 »
Diese zirkuläre Abhängigkeit hat dann wohl irgendwas mit internen Regeln von make zu tun. Nimmt halt .asm.obj statt .asm.o.
Dieser Text wird unter jedem Beitrag angezeigt.

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 11. January 2009, 13:56 »
%_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
« Letzte Änderung: 11. January 2009, 14:03 von MNemo »
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

rizor

  • Beiträge: 521
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 11. January 2009, 14:19 »
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 =
Programmiertechnik:
Vermeide in Assembler zu programmieren wann immer es geht.

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 11. January 2009, 14:23 »
Im Fehlermeldungen von Anfang bis Ende lesen:
Zitat
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.

Zitat
das problem liegt warscheinlich an dieser internen definition
Ah, ich hab die Regel nicht gefunden. Wenn ich das Manual 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.
« Letzte Änderung: 11. January 2009, 14:25 von PorkChicken »
Dieser Text wird unter jedem Beitrag angezeigt.

rizor

  • Beiträge: 521
    • Profil anzeigen
Gespeichert
« Antwort #10 am: 11. January 2009, 14:33 »
Danke, jetzt geht alles.
Programmiertechnik:
Vermeide in Assembler zu programmieren wann immer es geht.

 

Einloggen