다른 여러 메이크 파일을 포함하는 메이크 파일이 있는데, 모두 다음과 같은 변수에 추가됩니다.
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)"
=
하지:=
?