2016-05-19 9 views
1

この非常にシンプルなメイクファイルでは、変数を条件内に設定しようとしましたが、変更外に気付かれません。ifステートメントの変数が正しく動作しない

all: 
     STUFF="nothing" 
ifeq (true, true) 
     echo "setting" 
     STUFF="hi" 
endif 
     echo $(STUFF) 

これを実行すると、最後のコマンドが "hi"を印刷すると予想されますが、そうではありません。

[email protected] ~/git % make 
STUFF="nothing" 
echo "setting" 
setting 
STUFF="hi" 
echo 

私はここで間違っていますか?

UPDATE:

run: build/aura.bin 
    ifdef DEBUGGING 
     $(eval DFLAGS=-s -S) 
    endif 
    qemu-system-i386 -serial stdio $(DFLAGS) -kernel build/aura.bin 
+0

発見したように、レシピに直接make変数を設定することはできません。 'eval'は動作しますが、おそらく別の方法があります。残念ながら、あなたの例はまともな解決策を与えるには余りにも工夫されています。 – user657267

+0

@ user657267更新された質問をご覧ください。 –

答えて

1

run: private DFLAGS += $(if $(DEBUGGING),-s -S) 
run: build/aura.bin 
    qemu-system-i386 -serial stdio $(DFLAGS) -kernel $< 

runの前提条件でDFLAGSの値が利用できるようにするprivateを削除しています。

+0

'$ <'とは何ですか? –

+1

@ chris13524これは[自動変数](https://www.gnu.org/software/make/manual/make.html#Automatic-Variables)です。具体的には、 '$ <'は最初の前提条件、この場合は 'ビルド/ aura.bin'。 – user657267

0

私は値を設定する$(eval <statement>)を使用して、それを修正しました。あなたはeval

ifdef DEBUGGING 
    run: private DFLAGS += -s -S 
endif 
run: build/aura.bin 
    qemu-system-i386 -serial stdio $(DFLAGS) -kernel $< 

せずに別の方法をこれを行うことができます

all: 
     STUFF="nothing" 
ifeq (true, true) 
     echo "setting" 
     $(eval STUFF="hi") 
endif 
     echo $(STUFF) 
+0

経験則: 'eval'は決して正しい答えではありません。 – MadScientist

関連する問題