Lowlevel
Lowlevel => Softwareentwicklung => Thema gestartet von: rizor am 17. September 2011, 19:04
-
Hallo zusammen,
ich habe ein Problem mit meinen Makefiles.
Derzeit versuche ich folgendes Makefile in den Kernel einzubauen:
KERNEL:=kernel lib
SRC:=$(shell find $(KERNEL) -type f -name '*.c')
CFLAGS:=-Wall -Wextra -nostdinc -fno-zero-initialized-in-bss -fno-builtin \
-fstrength-reduce -fomit-frame-pointer -finline-functions \
-fno-stack-protector -Iinclude -lgcc -MMD -O2 -g
LDFLAGS:=-Iinclude -Map kernel.map -nostdlib -O2
build:
ifneq ($(shell find . -type f -name '.config'),)
ifeq ($(shell grep ARCH .config), CONFIG_ARCH_X86_32)
CFLAGS+="-m32 -march=i686"
LDFLAGS+="-Tarch/x86/linker.ld -melf_i386 -o"
KERNEL+="arch/x86"
endif
@echo $(CFLAGS)
@echo $(LDFLAGS)
@echo $(KERNEL)
else
@echo "You have to run 'make config' first"
exit 0
endif
Wenn ich den Code so ausfuehre, laeuft der Code ohne fehler durch, aber die Echos geben nicht die erweiterten Variablen aus. Habe es schon ueberprueft, der Code laeuft den Pfad der Erweiterungen ab.
Woran kann das liegen?
Danke.
Gruss,
rizor
-
CFLAGS+="-m32 -march=i686"
LDFLAGS+="-Tarch/x86/linker.ld -melf_i386 -o"
KERNEL+="arch/x86"
Wenn du das einrückst, wird es nicht von make verarbeitet. Das heißt du musst das direkt an den Anfang der Zeile schreiben. Eine Konsequenz davon ist, dass du es dann nicht mehr direkt unter das build: schreiben kannst. So könnte es zum Beispiel funktionieren:
ifneq ($(shell find . -type f -name '.config'),)
ifeq ($(shell grep ARCH .config), CONFIG_ARCH_X86_32)
CFLAGS+="-m32 -march=i686"
LDFLAGS+="-Tarch/x86/linker.ld -melf_i386 -o"
KERNEL+="arch/x86"
endif
build:
@echo $(CFLAGS)
@echo $(LDFLAGS)
@echo $(KERNEL)
else
build:
@echo "You have to run 'make config' first"
exit 0
endif
-
Einrücken geht schon, nur dürfen das keine TABs sein.
-
Danke fuer die Tipps. Das hat soweit funktioniert.
Jetzt habe ich nur leider ein anderes Problem.
Ich habe in den If-Zweig das gesamte Build-Skript gebaut.
Das Skript sieht jetzt wie folgt aus:
ifneq ($(shell find . -type f -name '.config'),)
ifeq ($(shell grep ARCH .config), CONFIG_ARCH_X86_32)
CFLAGS+="-m32 -march=i686"
LDFLAGS+="-Tarch/x86/linker.ld -melf_i386 -o"
KERNEL+="arch/x86"
endif
CFLAGS+=$(shell for i in `cat .config`; do echo " -D$$i"; done)
CFLAGS+="-c -o"
SRC_C:=$(shell find $(KERNEL) -type f -name '*.c')
SRC_ASM:=$(shell find $(KERNEL) -type f -name '*.S')
SRC:="$(SRC_C) $(SRC_ASM)"
OBJ:="$(patsubst %.c,%.o,$(SRC_C)) $(patsubst %.S,%.o,$(SRC_ASM))"
BUILD:=nerdy-kernel
.PHONY: clean
-include $(OBJ:.o=.d)
build: $(BUILD)
$(BUILD): $(OBJ)
@echo " LD " $@
$(LD) $(LDFLAGS) $@ $^
%.o: %.c
@echo " CC " $@
$(GCC) $(CFLAGS) $@ $<
%.o: %.S
@echo " CC " $@
$(GCC) $(CFLAGS) $@ $<
else
build:
@echo "You have to run 'make config' first"
exit 0
endif
Nun bekomme ich die Meldung, dass das Skript es nicht schafft, dass aus einer *.c-Datei eine *.o-Datei wird.
Woran liegt es, dass er die Wildcards nicht trifft?
-
An den Anführungsstrichen. Die sind in deiner Makefile nicht korrekt. Einfach alle weglassen (außer in den Shell-Befehlen).
-
Danke. Jetzt funktioniert alles.