私は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))
同様の質問は、subst
とfilter-out
:How to strip parameters from a variable in a makefileの両方を示唆しています。しかし、私は期待どおりの方法で作業するようには思えません。
交換を実行するにはどうすればよいですか?
* "なぜあなたは'% '" *を使用しないのですか? - マニュアルによれば、 '?'はGNUmakeの1文字にマッチします。マニュアルの[ワイルドカード](https://www.gnu.org/software/make/manual/html_node/Rules.html#Rules)を参照してください。 – jww
GNU makeのパターンは '?'を使わないでください。野生のキャラクターとして。 – ubercracker
ワイルドカードセクションは、ファイル名の一致に_only_関与します。ターゲットと前提条件で実行されていると明示的に述べています。これはそれらのどちらでもありません。代入参照を説明しているドキュメントを読むべきです(これはこれです)。最初の文字列には単一の '% '文字が含まれている必要があります。 – MadScientist