2017-05-07 7 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-out : How to strip parameters from a variable in a makefile을 제안합니다. 하지만 예상대로 작동하는 방법을 얻지 못하는 것 같습니다.

어떻게 대체합니까?

답변

1

'대신'% '을 사용 하시겠습니까? 이거?

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

또는

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

내가 지금 어떤 리눅스 박스에 액세스 할 수 없습니다. 그래서 이것을 확인할 수 없었습니다. : p

+0

* "왜'%'"*를 사용하지 않는가? - 매뉴얼에 따르면'? '는 GNUmake에서 하나의 문자와 일치한다. 매뉴얼에서 [와일드 카드] (https://www.gnu.org/software/make/manual/html_node/Rules.html#Rules)를 참조하십시오. – jww

+0

GNU make의 패턴은 '?'를 사용하지 마십시오. 와일드 문자로. – ubercracker

+1

와일드 카드 섹션은 파일 이름 일치와 _only_ 관련이 있습니다. 명시 적으로 목표 및 전제 조건에 대해 수행한다고 명시되어 있습니다. 대체 참조를 설명하는 설명서를 읽어야합니다 (이것이 무엇인지). 그것은 초기 문자열이 단일'% '문자를 포함해야한다고 말한다. – MadScientist