2017-05-07 15 views
0

私はGNU Makeのtext substitutionを使用して、既存の(そしておそらく不足している)最適化レベルを-O1に変更しようとしています。ここで私は使用しています何:予想通りCFLAGSまたはCXXFLAGSのオプションを置き換える方法

$(var:pattern=replacement) 

物事が働いていない。

# Valgrind testing. Issue 'make valgrind'. 
ifneq ($(filter valgrind,$(MAKECMDGOALS)),) 
$(info: Valgrind build) 

CXXFLAGS := $(CXXFLAGS:-g?=-g3) 
CXXFLAGS := $(CXXFLAGS:-O?=-O1) 

ifeq ($(findstring -DVALGRIND_BUILD,$(CXXFLAGS)),) 
$(info: adding -DVALGRIND_BUILD) 
CXXFLAGS += -DVALGRIND_BUILD 
endif # -DVALGRIND_BUILD 

ifeq ($(findstring -O,$(CXXFLAGS)),) 
$(info: adding -O1) 
CXXFLAGS += -O1 
endif # Optimizations 

endif # Valgrind 

私はマニュアルから、このルールまたは関数を呼び出しています信じています。定義追加されますが、置換が発生していない:

$ CXXFLAGS="-DNDEBUG -g2 -O3" make valgrind 
g++ -DNDEBUG -g2 -O3 -DVALGRIND_BUILD -c cryptlib.cpp 
g++ -DNDEBUG -g2 -O3 -DVALGRIND_BUILD -c cpu.cpp 
g++ -DNDEBUG -g2 -O3 -DVALGRIND_BUILD -c integer.cpp 
... 

私も$(filter-out ...)に試してみました(私はその後希望の最適化を追加することができます考えて)、それはどちらか動作しませんでした:ここだ

CXXFLAGS := $(filter-out -g?,$(CXXFLAGS)) 
CXXFLAGS := $(filter-out -O?,$(CXXFLAGS)) 

同様の質問は、substfilter-outHow to strip parameters from a variable in a makefileの両方を示唆しています。しかし、私は期待どおりの方法で作業するようには思えません。

交換を実行するにはどうすればよいですか?

答えて

1

なぜ、 '?'の代わりに '%'を使用しないでください。このような?

CXXFLAGS := $(CXXFLAGS:-g%=-g3) 

または

CXXFLAGS := $(patsubst -g%,-g3,$(CXXFLAGS)) 

私は今、すべてのLinuxボックスにアクセスすることはできません。 これを確認できませんでした。 :p

+0

* "なぜあなたは'% '" *を使用しないのですか? - マニュアルによれば、 '?'はGNUmakeの1文字にマッチします。マニュアルの[ワイルドカード](https://www.gnu.org/software/make/manual/html_node/Rules.html#Rules)を参照してください。 – jww

+0

GNU makeのパターンは '?'を使わないでください。野生のキャラクターとして。 – ubercracker

+1

ワイルドカードセクションは、ファイル名の一致に_only_関与します。ターゲットと前提条件で実行されていると明示的に述べています。これはそれらのどちらでもありません。代入参照を説明しているドキュメントを読むべきです(これはこれです)。最初の文字列には単一の '% '文字が含まれている必要があります。 – MadScientist

関連する問題