在规则中指定make变量



我想设置一个变量$(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

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

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

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

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

一个更好的风格是避免递归的make,可能更倾向于目标特定的变量:

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

最新更新