make로 처리하려는 파일이 다른 프로그램의 출력에 의존하는 설정이 있습니다. 프로그램과 모든 사전 요구 사항을 빌드하는 것은 복잡한 작업이기 때문에 make도 이것을 사용하고 싶습니다. 이제 제 문제는 Makefile의 요리법에서 규칙과 전제 조건을 생성 할 수 없다는 것입니다. 다음 코드를 고려하십시오 Makefile : 레시피에서 규칙 및 전제 조건 정의하기
bar:
echo target1 target2 target3 > bar
foo: bar
$(eval BAR := $(shell cat bar))
define FUN
$(1):
touch a$(1)
endef
ifdef BAR
$(foreach i,$BAR,$(eval $(call FUN,$(i))))
endif
blub: foo $(BAR)
나는 내가
bar
조리법에 의해 결국이 할 파일 목록의 생성으로 이어질 복잡한 조리법의 큰 세트를 교체했다. 실제로,
bar
의 컨텐츠를 생산하는 것은 매우 복잡하고 메이크 조리법의 집합에 의해 수행되어야하고 (위 알 수 있듯이) 만 수행 할 수 없습니다
BAR:=$(shell echo target1 target2 target3)
나는에 foreach
루프를 넣어 싶습니다 foo
에 대한 조리법하지만 그 의미가 또한 function define in makefile
설명하지만 내가 make blub
을 수행 할 때 시간에 다른 값을 foo
평가의 BAR
이 blub
의 전제 조건을 다시하지 않을 때 것으로 보인다됩니다 prerequisites cannot be defined in recipes
실패 - 평가.
그래서 나는 결국 내가 두 가지 일을 찾고 있어요 생각 :
가 어떻게 무엇을 (이 경우
bar
) 다른 조리법 출력에 따라 (과에 따라 다름), 동적 런타임 조리법 생성합니까?런타임에 다른 레서피 (여기서는
bar
)가 출력하는 결과에 따라 (그리고이 결과에 따라) 대상의 전제 조건 (이 경우blub
)을 어떻게 동적으로 업데이트합니까?
고맙습니다!
편집 : 다음은 내 문제를 해결하는 것 user657267 @의 도움으로 해결
: 당신이 메이크업의 자기 리메이크 기능을 사용한다처럼
.PHONY: all
all: blub
-include bar.make
.PHONY: blub
blub: $(BAR)
echo $^
bar.make: Makefile
printf 'BAR=target1 target2 target3\n' > [email protected]
printf 'target1 target2 target3:\n' >>[email protected]
printf '\ttouch [email protected]' >> [email protected]
.PHONY: clean
clean:
rm -f target1 target2 target3 bar.make
FWIW,이 에코의 사용은 매우 휴대하기 어렵습니다. printf (프로그램)를 사용하여 간단한 텍스트와 그 뒤에 개행 문자를 출력해야합니다. 참고로 FYI에서는 eval을 사용하여 조리법에서 변수를 설정할 수 있지만이 규칙을 사용하여 새 규칙을 만들 수는 없습니다. 이것은 make가 모든 메이크 파일을 읽은 후 레서피를 실행하기 전에 모든 메이크 파일 데이터를 내부 그래프로 정렬하는 프로세스를 수행하기 때문입니다. 그런 일이 발생하면 새 규칙을 추가하여 그래프를 변경할 수 없습니다. – MadScientist
@MadScientist 아, 감사합니다.이 질문에 대한 대답에서 당신에게 물어 보았던 다른 질문에 대한 귀하의 커밋 wrt'eval()'이 대답 할 것입니다. 즉, 이것을 포함시키기 위해서는'include '의 사용이 정말로 필요하며 존재할 수 없다는 것입니다 'eval' 전용 솔루션입니다. 여기에'echo'를 사용하는 방법 중 어느 부분이 이식성이 있지 않습니까? – josch
모든 echo 명령이'\ t' 문자 시퀀스를 TAB 문자로 바꾸는 것은 아닙니다. – MadScientist