2013-04-04 16 views
0

我想设置一个变量$(CFLAGS2)来保存不同的值,具体取决于我制作的目标。具体而言,我想有一个目标来编译我的项目与“-g -Wall”,另一个与“-O3”在规则中指定一个make变量

我试了一下这样的编译:

CC=gcc 
COPT=-c $< -o [email protected] $(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”一样) 我该怎么做到这一点?

+0

奥利奇:感谢编辑 – user1479670 2013-04-04 10:21:55

+0

我找到了解决办法,但我还没有找到如何创建一个答案在这里,我可以显示代码(即不是注释)...的 – user1479670 2013-04-04 10:59:25

+0

可能重复[Makefile文件 - 根据目标定义编译变量](http://stackoverflow.com/questions/5127977/makefile-define-compilation-variables-based-on-target-for) – Beta 2013-04-04 12:46:03

回答

0

不要在shell行中使用$(eval ...)。只是明显错了。

有很多方法可以做哟你想。既然你已经递归化妆设置,你可以使用命令行变量:

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

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

一个更好的风格是避开了递归化妆,也许有利于目标的具体变量:

CC=gcc 
COPT=-c $< -o [email protected] $(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 [email protected] Success 

. 
. 
. 

这看起来很可能会匆匆一瞥。

虽然设置的方式有问题。例如,下面的shell命令序列会给你一个优化的版本,没有警告。

$ make opti 
$ make debi