Autor Thema: Makefile mit Parametern  (Gelesen 16763 mal)

rizor

  • Beiträge: 521
    • Profil anzeigen
Gespeichert
« am: 18. September 2009, 10:30 »
Hallo zusammen,

ich bin gerade dabei meine Makefiles zu erweitern, um bedingtes Compiling hinzubekommen.
Wie kann ich die eingaben verarbeiten?
Mein Aufruf sieht wie folgt aus:
make ARCH_I386=1 all
Nun sollen in dem Makefile die Compiler-Flags angepasst werden.
Das habe ich mit ifdef gemacht.

ifdef ARCH_I386
      KRN_GCC += -march=i386 -m32
      KRN_LD += -melf_i386
   else
      echo "No architecture-flag found. Using ARCH_I386"
      KRN_GCC += -march=i386 -m32
      KRN_LD += -melf_i386
   endif

Leider sagt make, dass es das nicht gibt.
Wie sieht der Befehl denn genau aus?

Gruß
rizor
Programmiertechnik:
Vermeide in Assembler zu programmieren wann immer es geht.

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 18. September 2009, 10:43 »
Hi,

dass du das einrückst, sieht etwas komisch aus. Denn Einrücken bedeutet ja eigentlich, dass die Shell den Befehl ausführen soll. (Die genaue Fehlermeldung wäre hier vielleicht aufschlussreich gewesen.)

Also ich würde das deswegen erstmal versuchen, dass alles nicht einzurücken:

ifdef ARCH_I386
KRN_GCC += -march=i386 -m32
KRN_LD += -melf_i386
else
$(info No architecture-flag found. Using ARCH_I386)
KRN_GCC += -march=i386 -m32
KRN_LD += -melf_i386
endif

Dann geht echo allerdings nicht, aber dafür kannst du $(info ...) nehmen.
Dieser Text wird unter jedem Beitrag angezeigt.

rizor

  • Beiträge: 521
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 18. September 2009, 11:48 »
Danke.
Anscheinend kann er manche befehle jetzt umsetzen.
Leider gibt es den Fehler immernoch

make [ARCH_I386=1] -s all
No architecture-flag found. Using ARCH_I386
No mem-block-size-flag found. Using 4k-blocks
No Debug-Flag found. Using DEBUG_0
make[1]: ifdef: Kommando nicht gefunden
make[1]: *** [config] Fehler 127
make: *** [compile] Fehler 2

        ifdef ARCH_I386
KRN_GCC += -march=i386 -m32
KRN_LD += -melf_i386
else
$(info No architecture-flag found. Using ARCH_I386)
KRN_GCC += -march=i386 -m32
KRN_LD += -melf_i386
endif
ifdef MM_SIZE_4K
KRN_GCC += -DMM_SIZE_4K
else
ifdef MM_SIZE_4M
KRN_GCC += -DMM_SIZE_4M
else
KRN_GCC += -DMM_SIZE_4K
$(info No mem-block-size-flag found. Using MM_SIZE_4K)
endif
endif
ifdef DEBUG_0
KRN_GCC += -DDEBUG_0
else
ifdef DEBUG_1
KRN_GCC += -DDEBUG_1
else
ifdef DEBUG_2
KRN_GCC += -DDEBUG_2
else
ifdef DEBUG_3
KRN_GCC += -DDEBUG_3
else
$(info No debug-flag found. Using DEBUG_0)
KRN_GCC += -DDEBUG_0
endif
endif
endif
endif
KRN_GCC += -c
KRN_LD += -o

Woran kann es liegen, dass der Fehler immernoch auftaucht?
Wiese akzeptiert er das ARCH_I386-Flag denn nicht?
Programmiertechnik:
Vermeide in Assembler zu programmieren wann immer es geht.

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 18. September 2009, 12:11 »
Hi,

woher hast du das mit den eckigen Klammern um ARCH_I386=1? Ich glaube das funktioniert so nicht.

Außerdem darfst du das alles wie gesagt nicht einrücken.
Dieser Text wird unter jedem Beitrag angezeigt.

rizor

  • Beiträge: 521
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 18. September 2009, 12:19 »
Das habe ich in einem englischen Forum gelesen.
Hat ohne eckige Klammern auch nicht funktioniert.

Eingerückt habe ich auch nichts.
Kam eben nur durchs Copy-Paste
Programmiertechnik:
Vermeide in Assembler zu programmieren wann immer es geht.

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 18. September 2009, 12:46 »
Ich meine die Tabs vor den ganzen Zeilen. Die müssen da weg.

Wenn ich den Ausschnitt aus deinem letzten Post 1:1 kopiere (und in der ersten Zeile die Leerzeichen durch ein Tab ersetze), dann kommt exakt der von dir beschriebene Fehler. Wenn ich dann die ganzen Tabs lösche, funktioniert alles wie es soll.
Dieser Text wird unter jedem Beitrag angezeigt.

rizor

  • Beiträge: 521
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 18. September 2009, 13:27 »
Danke.
Jetzt funktioniert es
Programmiertechnik:
Vermeide in Assembler zu programmieren wann immer es geht.

rizor

  • Beiträge: 521
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 18. September 2009, 17:52 »
Jetzt habe ich ein anderes Problem.
Ich übergebe dem Makefile ja ein paar Parameter.
Diese sollen dann die Compiler-Flags manipulieren.
Das KRN_GCC ist angegeben in Makefile.rules (damit die rekursiven Aufrufe einfach funktionieren).
Leider ist mir aufgefallen, dass die Flags nicht verändert werden.

Wie kriege ich es hin, dass die Flags verändert werden und auch bei rekursiven Aufrufen so bleiben?
Programmiertechnik:
Vermeide in Assembler zu programmieren wann immer es geht.

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #8 am: 19. September 2009, 11:41 »
Über "export blub = foobar" (oder :=), siehe auch make Manual.
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

rizor

  • Beiträge: 521
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 22. September 2009, 00:47 »
Danke. Es hat funktioniert.
Nun wollte ich das allerdings durch ein config-script vereinfachen.
Leider läuft das nicht so, wie ich es mir erhofft habe.

Hier das Script:
#!/bin/sh
# param $1 - the name of the kernel

main_dir = ""
krn_libs = "$(ROOT-PATH)/build/libc/libc.slib /usr/lib/gcc/i486-linux-gnu/4.2.4/libgcc.a"
krn_dirs = "asm shell io_com"
gcc_flags = "-O0 -m32 -g -fstrength-reduce -fomit-frame-pointer -finline-functions -fno-stack-protector -nostdinc -fno-builtin -I$(SRC-PATH)/include/ -I$(ROOT-PATH)/libc/include/"
ld_flags = "-Tkernel.ld"

echo "Configuration of $1 compilation"

# get the main-dir
echo "Select the directory of the system"
echo "Enter the path to the system [/home/rizor/Dokumente/projects]"
read answer
if[ -z "$answer" ]; then \
main_dir += "/home/rizor/Dokumente/projects"; \
else \
main_dir += "$answer"; \
fi

#choose the included libraries
echo "Select the included libraries"
echo "Do you want the librizor? (y/n)"
read answer
if[ "$answer" = "y" ]; then \
gcc_flags += " -I$(ROOT-PATH)/librizor/include/"; \
ld_flags += " -I$(ROOT_PATH)/librizor/include/"; \
krn_libs += " $(ROOT-PATH)/build/librizor/librizor.slib"; \
fi
echo "Do you want the libcollection? (y/n)"
if[ "$answer" = "y" ]; then \
gcc_flags += " -I$(ROOT-PATH)/libcollection/include/"; \
ld_flags += " -I$(ROOT_PATH)/libcollection/include/"; \
krn_libs += " $(ROOT-PATH)/build/libcollection/libcollection.slib"; \
fi

#choose the architecture
echo "Select the wanted architecture"
echo "Do you want to use the x86-architecture? (y/n)"
read answer
if[ "$answer" = "y" ]; then \
gcc_flags += " -march=i386 -m32 -DARCH_I386"; \
ld_flags += " -melf_i386"; \
krn_dirs += " arch/i386"; \
else \
echo "Their is no other supported architecture"; \
exit 1; \
fi

#choose the page-size
echo "Select the page-size of the mem-manager"
echo "Do you want the use of 4k-pages? (y/n)"
read answer
if[ "$answer" = "y" ]; then \
gcc_flags += " -DMM_SIZE_4K"; \
else \
echo "Selected the 4M-pages"; \
gcc_flags += " -DMM_SIZE_4M"; \
fi

#choose the debug-level
echo "Select the debug-level of the kernel"
echo "Please Select the debug-level? (0/1/2/3)"
read answer
case answer in
0*) echo "Selected the debug-level 0"; gcc_flags += " -DDEBUG_0";;
1*) echo "Selected the debug-level 1"; gcc_flags += " -DDEBUG_1";;
2*) echo "Selected the debug-level 2"; gcc_flags += " -DDEBUG_2";;
3*) echo "Selected the debug-level 3"; gcc_flags += " -DDEBUG_3";;
*) echo "You Selected a not supported debug-level. Choose level 000"; gcc_flags += " -DDEBUG_0";;
esac

#create the Makefile.rules
if[ -f "$main_dir"/Makefile.rules]; then \
rm -f "$main_dir"/Makefile.rules; \
fi
touch "$main_dir"/Makefile.rules
echo "BUILD-PATH = "$main_dir"/build/kernel" >> "$main_dir"/Makefile.rules
echo "ROOT_PATH = "$main_dir >> "$main_dir"/Makefile.rules
echo "SRC-PATH = "/kernel_nextgen >> "$main_dir"/Makefile.rules
echo "CC = /usr/bin/gcc" >> "$main_dir"/Makefile.rules
echo "" >> "$main_dir"/Makefile.rules
echo "KRN_GCC = "$gcc_flags >> "$main_dir"/Makefile.rules
echo "LIBRARIES = "$krn_libs >> "$main_dir"/Makefile.rules
echo "KRN_LD = "$ld_flags >> "$main_dir"/Makefile.rules
echo "DIRS = "krn_dirs >> "$main_dir"/Makefile.rules
echo "" >> "$main_dir"/Makefile.rules
echo "%.c.krn:%.c" >> "$main_dir"/Makefile.rules
echo " echo "\tCC" $<" >> "$main_dir"/Makefile.rules
echo " $(CC) $(KRN_GCC) -c -o $(BUILD-PATH)/tmp/$@ $<" >> "$main_dir"/Makefile.rules
echo "" >> "$main_dir"/Makefile.rules
echo "%.S.krn:%.S" >> "$main_dir"/Makefile.rules
echo " echo "\tASM" $<" >> "$main_dir"/Makefile.rules
echo " $(CC) $(KRN_GCC) -c -o $(BUILD-PATH)/tmp/$@ $<" >> "$main_dir"/Makefile.rules

Dabei treten folgende Fehler auf:
config/config.sh: 4: main_dir: not found
config/config.sh: 5: ROOT-PATH: not found
config/config.sh: 5: krn_libs: not found
config/config.sh: 6: krn_dirs: not found
config/config.sh: 7: SRC-PATH: not found
config/config.sh: 7: ROOT-PATH: not found
config/config.sh: 7: gcc_flags: not found
config/config.sh: 8: ld_flags: not found
Configuration of  compilation
Select the directory of the system
Enter the path to the system [/home/rizor/Dokumente/projects]

config/config.sh: 16: if[: not found
config/config.sh: 18: main_dir: not found
config/config.sh: 20: main_dir: not found
Select the included libraries
Do you want the librizor? (y/n)
y
config/config.sh: 26: if[: not found
config/config.sh: 30: ROOT-PATH: not found
config/config.sh: 30: gcc_flags: not found
config/config.sh: 30: ROOT_PATH: not found
config/config.sh: 30: ld_flags: not found
config/config.sh: 30: ROOT-PATH: not found
config/config.sh: 30: krn_libs: not found
Do you want the libcollection? (y/n)
config/config.sh: 32: if[: not found
config/config.sh: 36: ROOT-PATH: not found
config/config.sh: 36: gcc_flags: not found
config/config.sh: 36: ROOT_PATH: not found
config/config.sh: 36: ld_flags: not found
config/config.sh: 36: ROOT-PATH: not found
config/config.sh: 36: krn_libs: not found
Select the wanted architecture
Do you want to use the x86-architecture? (y/n)
y
config/config.sh: 42: if[: not found
config/config.sh: 46: gcc_flags: not found
config/config.sh: 46: ld_flags: not found
config/config.sh: 46: krn_dirs: not found
Their is no other supported architecture
config/config.sh: 47:  : not found

Leider kann ich mir auf diese Fehler keinen Reim machen.
Seht ihr den/die Fehler?

Gruß
rizor
Programmiertechnik:
Vermeide in Assembler zu programmieren wann immer es geht.

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #10 am: 22. September 2009, 10:33 »
In Shellskripten darf bei einer Zuweisung zwischen dem Variablennamen und dem = kein Leerzeichen sein. Umgekehrt heißt es if und nicht if[, deswegen muss da noch ein Leerzeichen rein (und [ ist nur ein anderer Name für test, an dieser Stelle kann jedes beliebige Programm stehen). ; und \ am Ende sind auch überflüssig, die Shell kann ganz gut damit umgehen, dass jeder Befehl auf seiner eigenen Zeile steht.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

rizor

  • Beiträge: 521
    • Profil anzeigen
Gespeichert
« Antwort #11 am: 22. September 2009, 10:57 »
Okay, jetzt geht es zum Teil.
Danke.
Wie kriege ich jetzt noch die Fehler weg, dass er nicht mehr sagt, dass er ROOT_PATH, etc nicht gefunden hat?

EDIT:
Mir ist aufgefallen, dass das mit der -z Abfrage nciht richtig funktioniert.
Wie kann ich anders prüfen, ob der User nur Return gedrückt hat?
« Letzte Änderung: 22. September 2009, 11:01 von rizor »
Programmiertechnik:
Vermeide in Assembler zu programmieren wann immer es geht.

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #12 am: 22. September 2009, 11:14 »
$(ROOT_PATH) ist make, Shell benutzt $ROOT_PATH oder ${ROOT_PATH} (letzteres brauchst du, wenn es danach z.B. mit einem Buchstaben weitergeht, der noch zum Variablennamen gehören könnte)
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

rizor

  • Beiträge: 521
    • Profil anzeigen
Gespeichert
« Antwort #13 am: 22. September 2009, 11:27 »
Das Problem ist nur, dass ich darin nichts ersetzen möchte.
ROOT_PATH ist eine Variable für die Makefiles.
Die soll gar nicht durch irgendetwas anderes ersetzt werden.
Programmiertechnik:
Vermeide in Assembler zu programmieren wann immer es geht.

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #14 am: 22. September 2009, 11:34 »
$(foo) ist dasselbe wie `foo`, führt also foo aus und fügt seine Ausgabe an dieser Stelle ein. Das tut auch in Anführungszeichen. Damit du die Spezialbedeutung loswirst, kannst du entweder einfache Anführungszeichen benutzen (da drin gibt es keine Variablenersetzung) oder das $ als \$ escapen.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

rizor

  • Beiträge: 521
    • Profil anzeigen
Gespeichert
« Antwort #15 am: 22. September 2009, 12:07 »
Wie müsste das denn aussehen?
Habe das einfach mal wie folgt gemacht:
gcc_flags+=" -I$$(ROOT-PATH)\$/libcollection/include/";

Dabei gibt es dann folgenden Fehler:
config.sh: 53: gcc_flags+= -I7873(ROOT-PATH)$/libcollection/include/: not found
Programmiertechnik:
Vermeide in Assembler zu programmieren wann immer es geht.

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #16 am: 22. September 2009, 12:42 »
Ähm, += geht in Shell übrigens auch nicht.

gcc_flags="$gcc_flags -I \$(ROOT_PATH)/libcollection/include"
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

rizor

  • Beiträge: 521
    • Profil anzeigen
Gespeichert
« Antwort #17 am: 22. September 2009, 13:53 »
Danke.
Nun habe ich nur noch en Problem.
Makefile.rules wird nicht geschrieben.
Gibt es bei den Aufrufen Probleme?

EDIT:
Mir ist grad aufgefallen, dass die Abfrage ob das File (Makefile.rules) existiert nicht richtig arbeitet.
Das File wird immer wieder erweitert.
Wie kann ich sonst feststellen ob das File existiert?
« Letzte Änderung: 22. September 2009, 14:03 von rizor »
Programmiertechnik:
Vermeide in Assembler zu programmieren wann immer es geht.

ChristianF

  • Beiträge: 296
    • Profil anzeigen
    • DeutschOS - Betriebssystem Projekt
Gespeichert
« Antwort #18 am: 23. September 2009, 09:38 »
Wenn du das Makefile doch so oder so löschst und neu anlegst, warum überschreibst du es dann nicht einfach?

Mach doch einfach aus
#create the Makefile.rules
if[ -f "$main_dir"/Makefile.rules]; then \
rm -f "$main_dir"/Makefile.rules; \
fi
touch "$main_dir"/Makefile.rules
echo "BUILD-PATH = "$main_dir"/build/kernel" >> "$main_dir"/Makefile.rules
folgendes:
echo "BUILD-PATH = "$main_dir"/build/kernel" > "$main_dir"/Makefile.rules

So müsste Makefile.rules jedes mal überschrieben werden und wenn es nicht vorhanden sein sollte, wird es einfach angelegt.

rizor

  • Beiträge: 521
    • Profil anzeigen
Gespeichert
« Antwort #19 am: 23. September 2009, 10:56 »
So geht es leider nicht.
Wenn ich das so mache, dann schreibt er nur die letzte Zeile.
Ich vermute mal, dass er immer wieder die erste Zeile überschreibt.
Programmiertechnik:
Vermeide in Assembler zu programmieren wann immer es geht.

 

Einloggen