Autor Thema: Makefile Erweiterung von Variablen  (Gelesen 7710 mal)

rizor

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

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 17. September 2011, 19:27 »
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
Dieser Text wird unter jedem Beitrag angezeigt.

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 17. September 2011, 19:34 »
Einrücken geht schon, nur dürfen das keine TABs sein.
„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 #3 am: 19. September 2011, 20:20 »
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?
Programmiertechnik:
Vermeide in Assembler zu programmieren wann immer es geht.

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 19. September 2011, 20:43 »
An den Anführungsstrichen. Die sind in deiner Makefile nicht korrekt. Einfach alle weglassen (außer in den Shell-Befehlen).
Dieser Text wird unter jedem Beitrag angezeigt.

rizor

  • Beiträge: 521
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 19. September 2011, 21:03 »
Danke. Jetzt funktioniert alles.
Programmiertechnik:
Vermeide in Assembler zu programmieren wann immer es geht.

 

Einloggen