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