GNU make,不需要隐式规则

GNU make, implicit rules not needed

我有以下目录:

Makefile
src/
   main.c
   dummy.raw
   (main.o)    (<- to be built)
   (dummy.txt) (<- to be built)
build/
   (main)      (<- to be built)

以及以下 Makefile:

C_FILES=$(wildcard src/*.c)
O_FILES=$(C_FILES:%.c=%.o)

main: build/main


build/main: $(O_FILES) 
    gcc $(O_FILES) -o build/main 


src/%.o: src/%.c src/dummy.txt
    echo "Compiling using my rule"
    gcc -c $< -o $@


src/%.txt: src/%.raw
    touch $@
    @echo "Created dummy file"


clean:
    rm -f src/*.o
    rm -f src/*.txt
    rm -f build/*

问题是 make 似乎忽略了我生成 .o 文件的规则并使用它自己的内置版本;特别是,它不会构建 dummy.txt。这是示例输出:

$ make clean
rm -f src/*.o
rm -f src/*.txt
rm -f build/*
$ make
cc    -c -o src/main.o src/main.c
gcc src/main.o -o build/main 
如果我自己使用 make src/dummy.txt.

构建 .txt 文件,

make 只会开始使用 Makefile 中的规则

谢谢!

问题在于您的方法调用了一系列模式规则,一个用于构建 src/main.o,一个用于构建 src/dummy.txt,以及 Make will prefer an implicit rule to a chain of pattern rules.

有几种方法可以解决这个问题。两个简单的:

您可以使用 ‘-r’ a.k.a. ‘--no-builtin-rules’ option:

调用 Make
make -r

或者您可以对 src/dummy.txt 的规则进行硬编码:

src/%.txt: src/%.raw
    touch $@
    @echo "Created dummy file"

src/dummy.txt: src/dummy.raw