在规则中指定make变量

时间:2013-04-04 10:15:42

标签: variables makefile gnu

我想设置一个变量$(CFLAGS2)来保存不同的值,具体取决于我制作的目标。具体来说,我希望有一个目标用“-g -Wall”编译我的项目,另一个用“-O3”编译

我试过这样:

CC=gcc
COPT=-c $<  -o $@ $(CADD) $(CFLAGS) $(CFLAGS2)

.PHONY: opti
.PHONY: debi

opti: seto
    make hammingtest
debi: setd 
    make hammingtest

.PHONY: seto
seto: 
    $(eval CFLAGS2 := -O3)

.PHONY: setd
setd: 
    $(eval CFLAGS2 :=-g -Wall)

hamming.o: hamming.cpp hamming.h
    $(CC) $(COPT) $(DEFS) $(CFLAGS2)

hammingtest.o: hammingtest.cpp hamming.h
    $(CC) $(COPT) $(DEFS) $(CFLAGS2)

hammingtest: hammingtest.o hamming.o
    $(CC)  -o hammingtest hammingtest.o hamming.o

但是当我做“debi”时,就好像$(CFLAGS“)根本没有设置(与”make opti“相同) 我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:0)

不要在shell行中使用$(eval ...)。这通常是完全错误的。

有很多方法可以做你想要的。由于您已经设置了递归make,因此可以使用命令行变量:

opti:
    ${MAKE} COPTS2='-O3' hammingtest

debi:
    ${MAKE} COPTS2='-g -Wall' hammingtest

更好的风格是避开递归制作,可能支持目标特定变量:

CC=gcc
COPT=-c $<  -o $@ $(CADD) $(CFLAGS) $(CFLAGS2)

CFLAGS2 = $(error Someone tried to deref CFLAGS2!)
opti: CFLAGS2 := -O3
debi: CFLAGS2 := -g -Wall

.PHONY: all
all:
    @echo 'What do you want to make?'

.PHONY: opti debi
opti debi: hammingtest
opti debi: ; @echo $@ Success

.
.
.

这看起来很粗略。

这种设置的方式虽然有问题。例如,以下shell命令序列将为您提供优化的构建,没有警告。

$ make opti
$ make debi