第一版实现(会覆盖原有编译选项)
Makefile内容
CFLAGS := $(CFLAGS) -O3
test: main.c
gcc $(CFLAGS) -o $@ $^
测试输出
- 执行命令make输出
gcc -O3 -o test main.c
- 执行命令make CFLAGS="-Wall -Werror -DTEST_MACRO"输出
gcc -Wall -Werror -DTEST_MACRO -o test main.c
- 可以发现在外部指定的变量CFLAGS覆盖了内部的CFLAGS变量
- 当然,此时可以在外部把内部的编译选项也加上:make CFLAGS=“-Wall -Werror -DTEST_MACRO -O3”
override命令测试
Makefile内容
# 被注释的CFLAGS赋值, 是因为执行make命令时报错
# CFLAGS1 = $(CFLAGS1) -O3
CFLAGS2 := $(CFLAGS2) -O3
# CFLAGS3 += $(CFLAGS3) -O3
# CFLAGS4 ?= $(CFLAGS4) -O3
override CFLAGS5 = -O3
override CFLAGS6 := -O3
override CFLAGS7 += -O3
override CFLAGS8 ?= -O3
# override CFLAGS9 = $(CFLAGS9) -O3
override CFLAGS10 := $(CFLAGS10) -O3
# override CFLAGS11 += $(CFLAGS11) -O3
# override CFLAGS12 ?= $(CFLAGS12) -O3
all: test1 test2 test3 test4 test5 test6 test7 test8 test9 test10 test11 test12
test1: main.c
gcc $(CFLAGS1) -o $@ $^
test2: main.c
gcc $(CFLAGS2) -o $@ $^
test3: main.c
gcc $(CFLAGS3) -o $@ $^
test4: main.c
gcc $(CFLAGS4) -o $@ $^
test5: main.c
gcc $(CFLAGS5) -o $@ $^
test6: main.c
gcc $(CFLAGS6) -o $@ $^
test7: main.c
gcc $(CFLAGS7) -o $@ $^
test8: main.c
gcc $(CFLAGS8) -o $@ $^
test9: main.c
gcc $(CFLAGS9) -o $@ $^
test10: main.c
gcc $(CFLAGS10) -o $@ $^
test11: main.c
gcc $(CFLAGS11) -o $@ $^
test12: main.c
gcc $(CFLAGS12) -o $@ $^
clean:
rm test* -f
测试输出
- 执行make命令输出
gcc -o test1 main.c gcc -O3 -o test2 main.c gcc -o test3 main.c gcc -o test4 main.c gcc -O3 -o test5 main.c gcc -O3 -o test6 main.c gcc -O3 -o test7 main.c gcc -O3 -o test8 main.c gcc -o test9 main.c gcc -O3 -o test10 main.c gcc -o test11 main.c gcc -o test12 main.c
- 执行make CFLAGS1=-DTEST CFLAGS2=-DTEST CFLAGS3=-DTEST CFLAGS4=-DTEST CFLAGS5=-DTEST CFLAGS6=-DTEST CFLAGS7=-DTEST CFLAGS8=-DTEST CFLAGS9=-DTEST CFLAGS10=-DTEST CFLAGS11=-DTEST CFLAGS12=-DTEST命令输出
gcc -DTEST -o test1 main.c gcc -DTEST -o test2 main.c gcc -DTEST -o test3 main.c gcc -DTEST -o test4 main.c gcc -O3 -o test5 main.c gcc -O3 -o test6 main.c gcc -DTEST -O3 -o test7 main.c gcc -DTEST -o test8 main.c gcc -DTEST -o test9 main.c gcc -DTEST -O3 -o test10 main.c gcc -DTEST -o test11 main.c gcc -DTEST -o test12 main.c
测试结论
可以发现编译test7和test10时-DTEST和-O3同时存在,也就是说如下两种方式可以达到目的:
override CFLAGS7 += -O3
override CFLAGS10 := $(CFLAGS10) -O3
第二版实现(不覆盖原有编译选项)
实现一
override CFLAGS := $(CFLAGS) -O3
test: main.c
gcc $(CFLAGS) -o $@ $^
实现二
override CFLAGS += -O3
test: main.c
gcc $(CFLAGS) -o $@ $^
参考文档
https://www.gnu.org/software/make/manual/make.html#Override-Directive