Rekursives Makefile



  • Nabend zusammen,

    ich habe mir eine rekursive Makefile-Struktur geschrieben.
    Leider funktioniert sie nicht richtig.
    Fehlerausgabe:

    make
    gcc -Wall -O3 -fstrength-reduce -fomit-frame-pointer -finline-functions -nostdinc -fno-builtin -march=i386 -I./kernel/include -c -o obj/boot_kernel.c.o boot_kernel.c
    gcc -Wall -O3 -fstrength-reduce -fomit-frame-pointer -finline-functions -nostdinc -fno-builtin -march=i386 -I./kernel/include -c -o obj/boot_system.c.o boot_system.c
    nasm -felf -o obj/boot_system.asm.o boot_system.asm
    for i in kernel/ kernel/interrupt kernel/driver kernel/memory; do make -c $i; done
    make: invalid option -- c
    Syntax: make [Optionen] [Target] ...
    Optionen:
      -b, -m                      Aus Kompatibilitätsgründen ignoriert
      -B, --always-make           Alle Ziele ohne Bedingungen erstellen
      -C VERZEICHNIS, --directory=VERZEICHNIS
                                  In VERZEICHNIS wechseln, bevor etwas getan wird
      -d                          Print lots of debugging information.
      --debug[=FLAGS]             Print various types of debugging information.
      -e, --environment-overrides
                                  Umgebungsvariablen überschreiben »make«-Steuerdateien
      -f DATEI, --file=DATEI, --makefile=DATEI
                                  DATEI als »make«-Steuerdatei lesen
      -h, --help                  Diese Meldung ausgeben und beenden
      -i, --ignore-errors         Ignore errors from commands.
      -I VERZEICHNIS, --include-dir=VERZEICHNIS
                                  VERZEICHNIS nach inkludierten
                                  »make«-Steuerdateien durchsuchen
      -j [N], --jobs[=N]          Allow N jobs at once; infinite jobs with no arg.
      -k, --keep-going            Keep going when some targets can't be made.
      -l [N], --load-average[=N], --max-load[=N]
                                   Bleibe bei nur einem einzigen Job bis die Last unter N fällt.
      -L, --check-symlink-times   Use the latest mtime between symlinks and target.
      -n, --just-print, --dry-run, --recon
                                   Führe die Kommandos nicht wirlich aus; zeige sie nur an.
      -o DATEI, --old-file=DATEI, --assume-old=DATEI
                                   Erachte DATEI als alt und verarbeite sie nicht von Neuem.
      -p, --print-data-base       Print make's internal database.
      -q, --question              Run no commands; exit status says if up to date.
      -r, --no-builtin-rules      Disable the built-in implicit rules.
      -R, --no-builtin-variables  Disable the built-in variable settings.
      -s, --silent, --quiet       Befehle nicht ausgeben.
      -S, --no-keep-going, --stop
                                  -k abschalten.
      -t, --touch                 Touch targets instead of remaking them.
      -v, --version               Print the version number of make and exit.
      -w, --print-directory       Print the current directory.
      --no-print-directory        Turn off -w, even if it was turned on implicitly.
      -W DATEI, --what-if=DATEI, --new-file=DATEI, --assume-new=DATEI
                                   Erachte DATEI als unendlich neu.
      --warn-undefined-variables  Warn when an undefined variable is referenced.
    
    Dieses Programm wurde erstellt für i486-pc-linux-gnu
    Fehlermeldungen (auf Englisch) an <bug-make@gnu.org> senden.
    make: *** [compile] Fehler 2
    

    Den langen Fehlerblock gibt er für jede Direction aus.

    Hier die Makefiles:
    1. Makefile (root-path)

    #start the makefile
    DIRS = kernel/ kernel/interrupt kernel/driver kernel/memory
    
    compile:
    	gcc -Wall -O3 -fstrength-reduce -fomit-frame-pointer -finline-functions -nostdinc -fno-builtin -march=i386 -I./kernel/include -c -o obj/boot_kernel.c.o boot_kernel.c
    	gcc -Wall -O3 -fstrength-reduce -fomit-frame-pointer -finline-functions -nostdinc -fno-builtin -march=i386 -I./kernel/include -c -o obj/boot_system.c.o boot_system.c
    	nasm -felf -o obj/boot_system.asm.o boot_system.asm
    	for i in $(DIRS); do make -c $$i; done
    

    2. Makefile (rules)

    CC = /usr/bin/gcc
    ASM = /usr/bin/nasm
    CFLAGS = -Wall -O3 -fstrength-reduce -fomit-frame-pointer -finline-functions -nostdinc -fno-builtin -march=i386 -I./kernel/include
    ASMFLAGS = -felf
    
    %.c.o:%.c
    	$(CC) $(CFLAGS) -c -o $<
    %.asm.c:%.asm
    	$(ASM) $(ASMFLAGS) -o $<
    

    3. Makefile (in den Directories der Source-codes)

    include ../Makefile.rules
    
    OBJ = gdt.c.o kernel32.c.o
    
    all: $(OBJ)
    

    Woran liegt der Fehler?

    Danke für eure Hilfe.

    Gruß
    rizor



  • rizor schrieb:

    make: invalid option -- c
    

    Woran liegt der Fehler?

    Steht doch da...



  • Ja, aber ich sehe den nicht in den Makefiles.
    Das ist mein Problem.
    Dass er mit -- c ein Problem hat, dachte ich mir auch schon.



  • btw. solltest du nicht make aus der Makefile aufrufen, sondern $(MAKE). Und das mit dem for ist nicht gut gelöst. Dafür gibt es schönere Wege. Schau einfach mal in das GNU/Make Handbuch.



  • rizor schrieb:

    Ja, aber ich sehe den nicht in den Makefiles.
    Das ist mein Problem.
    Dass er mit -- c ein Problem hat, dachte ich mir auch schon.

    Schau mal direkt die Zeile über dem Fehler an und dann schau dir nochmal ganz genau dein root-path Makefile an....



  • Es kann nicht ernsthaft so schwer sein in die Liste der möglichen Optionen, die Make selbst noch mit ausgibt, zu schauen, um zu ermitteln, welches die richtige Option statt -c ist, oder?

    Selber denken macht schlau!


Anmelden zum Antworten