다른 여러 메이크 파일을 포함하는 메이크 파일이 있는데, 모두 다음과 같은 변수에 추가됩니다.
VAR := Something SomethingElse
VAR += SomeOtherThing
(...)
이제 변수 SomethingElse에서 제거 하고 싶습니다 VAR. (...)이 작업을 수행하려면 대신 무엇을 입력해야 합니까?
나는 GNU Make를 사용하고 있으며 GNU Make 특정 솔루션이 좋습니다.
다른 여러 메이크 파일을 포함하는 메이크 파일이 있는데, 모두 다음과 같은 변수에 추가됩니다.
VAR := Something SomethingElse
VAR += SomeOtherThing
(...)
이제 변수 SomethingElse에서 제거 하고 싶습니다 VAR. (...)이 작업을 수행하려면 대신 무엇을 입력해야 합니까?
나는 GNU Make를 사용하고 있으며 GNU Make 특정 솔루션이 좋습니다.
답변:
GNU Make를 사용하는 경우 filter-out텍스트 기능을 사용할 수 있습니다 .
OTHERVAR := $(filter-out SomethingElse,$(VAR))
=VAR에 대해 결국 무한 재귀에서 자신을 참조하는 makefile 오류가 발생합니다. ( VAR = $(filter-out SomethingElse,$(VAR)))
VAR := $(filter-out SomethingElse,$(VAR)) (With :=and not =)입니다. 감사. :)
VAR := $(filter-out A B C,$(VAR)).
filter-out공백으로 구분 된 단어에서만 작동합니다. 단어로 구분되지 않은 문자열에서 무언가를 제거해야하는 경우 subst대신 사용할 수 있습니다 filter-out. 즉 : $(subst -world,,hello-world)결과를 줄 것 hello입니다.
위의 정답 위에 :
VAR = bla1 bla2 bla3 bla4 bla5
TMPVAR := $(VAR)
VAR = $(filter-out bla3, $(TMPVAR))
all:
@echo "VAR is: $(VAR)"
출력 :
VAR : bla1 bla2 bla4 bla5
이것은 필터 아웃이 실행될 때 모든 "재 귀성"을 깨뜨리지 만 귀하의 경우에는 중요하지 않을 수 있습니다.
BLA1 = bla1,가 있다고 상상해보십시오 VAR = $(BLA1) bla2 bla3 bla4 bla5. BLA1 += bla1111필터 아웃 후에 실행 하면 $ (BLA1) 값에 대한 참조가 손실되므로 VAR 값에 영향을주지 않습니다.
저도 비슷한 상황이기 때문에 새로운 답변을 추가하고 싶습니다. 제 경우에는 변수 문자열에도 쉼표가 있었고 더 나아가 쉼표와 마지막 단어를 제거하고 싶었습니다.
VAR = "bla1, bla2"
이 경우 필터 아웃이 작동하지 않습니다 (이전 답변에서도 따옴표가없는 경우)
내 해결책은 다음을 사용하는 것입니다 subst.
VAR = "bla1, bla2"
TTT = , bla2
TMPVAR := $(VAR)
SUBST = $(subst $(TTT),, $(TMPVAR))
FILT = $(filter-out $(TTT), $(TMPVAR))
subst:
@echo "subst : $(SUBST)"
filter:
@echo "filter-out : $(FILT)"
=하지:=?