Frage

In einer aktuelle Ausgabe , die ich gefunden habe, dass DJGPP kann nur die DOS-Kommandozeile Zeichenbegrenzung akzeptieren. Um diese Einschränkung zu umgehen, habe ich beschlossen, zu versuchen, eine Make-Datei zu schreiben, mir zu erlauben, zu passieren längere Strings . Im Verfahren zur Herstellung einer Make-Datei Hacking zusammen und testet es, ich habe über einen seltsamen Fehler kommen. Die Make-Datei ist wie folgt:

AS  :=  nasm
CC  :=  gcc
LD  :=  ld

TARGET      :=  $(shell basename $(CURDIR))
BUILD       :=  build
SOURCES     :=  source

CFLAGS  :=  -Wall -O -fstrength-reduce -fomit-frame-pointer -finline-functions \
            -nostdinc -fno-builtin -I./include
ASFLAGS :=  -f aout

export OUTPUT   :=  $(CURDIR)/$(TARGET)

CFILES      :=  $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c)))
SFILES      :=  $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s)))

SOBJS   :=  $(SFILES:.s=.o)
COBJS   :=  $(CFILES:.c=.o)
OBJS    :=  $(SOBJS) $(COBJS)

build   :   $(TARGET).img

$(TARGET).img   :   $(TARGET).bin
    concat.py

$(TARGET).bin   :   $(OBJS)
    $(LD) -T link.ld -o $@ $^

$(SOBJS)    :   %.o :   %.asm
    $(AS) $(ASFLAGS) $< -o $@

$(COBJS)    :   %.o :   %.c
    $(CC) -c $< $(CFLAGS) -o $@

Wenn es zu laufen versuchen, erhalte ich diesen Fehler:

make: *** No rule to make target `consoleio.c', needed by `consoleio.o'.  Stop.

Was ich nicht verstehe ist, warum es versucht, eine Regel für .c-Dateien zu finden. Von dem, was ich verstehe, wenn die Datei vorhanden ist, sollte es es einfach zu verwenden. Wie kann ich eine Regel für .c-Dateien machen nicht brauchen machen?

War es hilfreich?

Lösung

Was Sie versuchen, nicht ohne VPATH viel zu tun, und da Sie noch Makefiles lernen, würde ich mit VPATH vermeiden.

Die Regel sucht „consoleio.c“, die, wenn ich Ihr Make-Datei richtig verstanden nicht existiert; was existiert, ist „Quelle / consoleio.c“. Sie wahrscheinlich sollte es so etwas wie ändern "$ (sources) /%. C" anstelle von "% c".

Ich habe überprüfen Sie Ihre Syntax nicht für diese Regel aber nicht. Wenn es falsch ist, die builtin „% .o:% .c“. Wird Regel stattdessen verwendet werden, die das gleiche Problem haben würde

Die Art und Weise Sie tun, ist nicht der übliche Weg, den ich gesehen habe, aber. Der üblicher Weg ist:

  • Erstellen Sie eine implizite Regel "% .o:% .c" (oder in Ihrem Fall "% .o:. $ (Sources) /% c")
  • Explicit Liste der Abhängigkeiten für jede Datei: "foo.o: foo.c bar.h baz.h" (ohne Befehl, die implizite Regel hat den Befehl)

Andere Tipps

Lassen Sie uns versuchen, eine nicht-Kommentar Antwort ...

Möglichkeit A:

  • Ihr Makro für SFILES sucht nach Dateien in '.s' endet.
  • Ihre Regel SOBJS für die Erstellung sucht Dateien in '.asm' endet.

Möglichkeit B:

  • Ihre Regel für SOBJS und COBJS ist in einer Notation ich nicht erkennen.
  • Nach dem GNU Make Handbuch können Sie implizite Regeln schreiben, wie:

    % o.% .C; Befehl

Sie scheinen eine Liste von Zielen $ (SOBJS) zu haben, die auf ‚%.o : %.asm‘ abhängt. Ich bin mir nicht sicher, wie Sie sich, dass interpretieren werden.

Persönlich würde ich nicht Wildcards in Build-Regeln vertrauen. Ich würde viel lieber die Zeit damit verbringen, genau aufgeführt ist, die Quelldateien benötigt werden, um den Code zu bauen. Ich oft nicht in dieses Problem als Folge ausgeführt werden.

@CesarB scheint das Problem genagelt zu haben, ich werde nur ein paar Beobachtungen hinzuzufügen.

  1. Ich würde empfehlen dringend, gegen Platzhalter in Build-Regeln. Die Build-Regeln sollten klar definieren, genau das, was gebaut wird, und nicht davon abhängen, welche Dateien geschehen in dem Verzeichnis sein.

  2. Ich würde auch gegen die Verwendung von VPATH empfehlen, wenn Sie (1) Gebäude in einem separaten Build-Verzeichnis sind, oder (2) haben die Quelldateien verteilt über eine große Anzahl von Verzeichnissen. Wenn alle Ihre Quellen sind in einem einzigen Verzeichnis, mit VPATH ist nur zu verwirren.

  3. Die: = Zuweisung Form in der Regel nur dann verwendet wird, wenn die variable Auswertung lange Zeit in Anspruch nehmen, wie zum Beispiel bei der Verwendung eines $ (shell ...) bekannt ist. Andernfalls "=" ist preferrable.

  4. Mit „Export“ OUTDIR zu propagieren concat.py (was ich vermute, es ist, da concat.py keine Parameter nimmt) ist ein Code Geruch. Wenn möglich, geben sie als Parameter statt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top