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 中的规则
- 为什么
make
会这样?
- 如何更正我的 Makefile 以强制
make
构建中间体 dummy.txt
?
谢谢!
问题在于您的方法调用了一系列模式规则,一个用于构建 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
我有以下目录:
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 中的规则
- 为什么
make
会这样? - 如何更正我的 Makefile 以强制
make
构建中间体dummy.txt
?
谢谢!
问题在于您的方法调用了一系列模式规则,一个用于构建 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:
调用 Makemake -r
或者您可以对 src/dummy.txt
的规则进行硬编码:
src/%.txt: src/%.raw
touch $@
@echo "Created dummy file"
src/dummy.txt: src/dummy.raw