質問
最近の問題では、DJGPPはDOSコマンドラインの文字制限を受け入れます。この制限を回避するために、を許可するメイクファイルを作成することにしました。より長い文字列を渡します。メイクファイルを一緒にハッキングしてテストする過程で、奇妙なエラーに遭遇しました。メイクファイルは次のとおりです。
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 $@
実行しようとすると、次のエラーが表示されます:
make: *** No rule to make target `consoleio.c', needed by `consoleio.o'. Stop.
.cファイルのルールを見つけようとしている理由がわかりません。私が理解していることから、ファイルがそこにあれば、それを使うべきです。 makeで.cファイルのルールが不要になるようにするにはどうすればよいですか?
解決
あなたがしようとしていることはVPATHなしでは機能しません。あなたはまだメイクファイルを学んでいるので、VPATHの使用を避けます。
ルールは<!> quot; consoleio.c <!> quot;を探しています。これは、メイクファイルが正しく理解されていれば存在しません。存在するのは<!> quot; source / consoleio.c <!> quot;です。おそらく<!> quot; $(SOURCES)/%。c <!> quot;のように変更する必要があります。 <!> quot;%c <!> quot;の代わりに。
ただし、そのルールの構文はチェックしませんでした。正しくない場合、組み込みの<!> quot;%。o:%.c <!> quot;代わりにルールが使用され、同じ問題が発生します。
あなたのやり方は、私が見た普通のやり方ではありません。通常の方法は次のとおりです。
- 暗黙のルールを作成<!> quot;%。o:%.c <!> quot; (または、あなたの場合<!> quot;%。o:$(SOURCES)/%。c <!> quot;)
- 各ファイルの依存関係を明示的にリストします:<!> quot; foo.o:foo.c bar.h baz.h <!> quot; (コマンドがない場合、暗黙のルールにはコマンドがあります)
他のヒント
コメント以外の回答を試してみましょう...
可能性A:
- SFILESのマクロは、「
.s
」で終わるファイルを探しています。 - SOBJSをコンパイルするためのルールは、「
.asm
」で終わるファイルを探します。
可能性B:
- SOBJSとCOBJSのルールは、私が認識できない表記法になっています。
-
GNU Makeマニュアルによると、暗黙のルールは次のように記述できます。
%。o:%.c; コマンド
「%.o : %.asm
」に依存するターゲット$(SOBJS)のリストがあるようです。
makeがそれをどのように解釈するのかわかりません。
個人的には、ビルドルールでワイルドカードを信頼しません。コードをビルドするためにどのソースファイルが必要かを正確にリストするのに時間を費やしたいです。その結果、この問題に遭遇することはあまりありません。
@CesarBが問題を解決したようです。いくつかの観察結果を追加します。
-
ビルドルールでワイルドカードを使用しないことを強くお勧めします。ビルドルールは、ビルド中のファイルを正確に定義する必要があり、ディレクトリにあるファイルに依存することはありません。
-
(1)別のビルドディレクトリにビルドする場合、または(2)ソースファイルを多数のディレクトリに分散させる場合を除き、VPATHの使用もお勧めします。すべてのソースが単一のディレクトリにある場合、VPATHを使用しても混乱するだけです。
-
通常、:=割り当て形式は、$(shell ...)を使用する場合など、変数の評価に時間がかかることがわかっている場合にのみ使用されます。それ以外の場合、<!> quot; = <!> quot;望ましいです。
-
<!> quot; export <!> quot;の使用OUTDIRをconcat.pyに伝播すること(concat.pyはパラメーターを受け取らないためです)はコード臭です。可能であれば、代わりにパラメータとして渡します。