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에서 하나의 문자와 일치한다. 매뉴얼에서 [와일드 카드] (https://www.gnu.org/software/make/manual/html_node/Rules.html#Rules)를 참조하십시오. – jww
GNU make의 패턴은 '?'를 사용하지 마십시오. 와일드 문자로. – ubercracker
와일드 카드 섹션은 파일 이름 일치와 _only_ 관련이 있습니다. 명시 적으로 목표 및 전제 조건에 대해 수행한다고 명시되어 있습니다. 대체 참조를 설명하는 설명서를 읽어야합니다 (이것이 무엇인지). 그것은 초기 문자열이 단일'% '문자를 포함해야한다고 말한다. – MadScientist