0

変数 $(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」と同じ)。どうすればこれを達成できますか?

4

1 に答える 1

0

$(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

.
.
.

これは、ざっと見ただけでうまくいくように見えます。

ただし、これを設定する方法には問題があります。たとえば、次の一連のシェル コマンドは、警告なしで最適化されたビルドを提供します。

$ make opti
$ make debi
于 2013-04-09T15:32:52.277 に答える