Makefile 변수에서 항목을 제거 하시겠습니까?


82

다른 여러 메이크 파일을 포함하는 메이크 파일이 있는데, 모두 다음과 같은 변수에 추가됩니다.

VAR := Something SomethingElse
VAR += SomeOtherThing

(...)

이제 변수 SomethingElse에서 제거 하고 싶습니다 VAR. (...)이 작업을 수행하려면 대신 무엇을 입력해야 합니까?

나는 GNU Make를 사용하고 있으며 GNU Make 특정 솔루션이 좋습니다.

답변:


109

GNU Make를 사용하는 경우 filter-out텍스트 기능을 사용할 수 있습니다 .

OTHERVAR := $(filter-out SomethingElse,$(VAR))

그리고 당신은 확실히 내가 사용할 필요가있다 =하지 :=?
Bjarke Freund-Hansen

1
내가 준 예에서 둘 다 맞습니까? 내가 사용하면 =VAR에 대해 결국 무한 재귀에서 자신을 참조하는 makefile 오류가 발생합니다. ( VAR = $(filter-out SomethingElse,$(VAR)))
Bjarke Freund-Hansen

4
요약하자면 원인은 용도에 따라 다릅니다. 그러나 내 예에서 정답은 VAR := $(filter-out SomethingElse,$(VAR)) (With :=and not =)입니다. 감사. :)
Bjarke Freund-Hansen

12
참고 : 여러 항목에도 사용할 수 있습니다. 예 : VAR := $(filter-out A B C,$(VAR)).
검사

1
다른 사람을위한 메모. filter-out공백으로 구분 된 단어에서만 작동합니다. 단어로 구분되지 않은 문자열에서 무언가를 제거해야하는 경우 subst대신 사용할 수 있습니다 filter-out. 즉 : $(subst -world,,hello-world)결과를 줄 것 hello입니다.
Jacob

6

위의 정답 위에 :

VAR = bla1 bla2 bla3 bla4 bla5

TMPVAR := $(VAR)
VAR = $(filter-out bla3, $(TMPVAR))

all:
    @echo "VAR is: $(VAR)"

출력 :
VAR : bla1 bla2 bla4 bla5

이것은 필터 아웃이 실행될 때 모든 "재 귀성"을 깨뜨리지 만 귀하의 경우에는 중요하지 않을 수 있습니다.


예상되는 동작이 아닙니까? VAR을 정상적으로 정의하면 즉시 TMPVAR을 설정하여이 시점에서 VAR을 확장합니다. 그런 다음 일반적으로 VAR을 재설정하여 필터링 된 TMPVAR 버전으로 리퍼러합니다. 그리고 all ​​target에서 VAR을 사용하여 확장하십시오. 이것이 어떻게 재 귀성을 깨뜨 리거나 어떤 식 으로든 문제가되는 행동인지 모르겠습니다.
Bjarke Freund-Hansen

1
내가 의미하는 바가 명확하지 않았을 수도 있습니다. 위의 VAR 정의 대신 BLA1 = bla1,가 있다고 상상해보십시오 VAR = $(BLA1) bla2 bla3 bla4 bla5. BLA1 += bla1111필터 아웃 후에 실행 하면 $ (BLA1) 값에 대한 참조가 손실되므로 VAR 값에 영향을주지 않습니다.
Andreas Mikael Bank

0

저도 비슷한 상황이기 때문에 새로운 답변을 추가하고 싶습니다. 제 경우에는 변수 문자열에도 쉼표가 있었고 더 나아가 쉼표와 마지막 단어를 제거하고 싶었습니다.

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)"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.