2009-09-09 4 views
16

메이크 파일에서 메이크 파일의 이름을 얻는 방법?메이크 파일에서 메이크 파일의 이름을 얻으려면

감사합니다.

참고 :

내가 필요

내 메이크가 자신을 호출하고 싶지만, 메이크가 메이크 호출되지 않습니다, 그래서 나는 이런 식으로 뭔가 쓰고 싶습니다 때문 :

target: 
    ($MAKE) -f ($MAKEFILENAME) other_target 
+0

내가 왜 필요한지 물어봐도 될까요? – erelender

답변

10
location = $(CURDIR)/$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)) 
WHERE_ART_THOU := $(location) 
$(warning $(WHERE_ART_THOU)) 

나는 또한 이것이 GNU make와 관련 있다고 믿지만, 나는 너무 확신하지 못한다.

+1

다른 메이크 파일을 포함시킨 후에 메이크 파일 이름을 확인하면이 솔루션이 작동하지 않습니다! (copy-pasteed comment) –

+0

첫 번째 줄을 고치면 작동합니다. "$ (단어)"대신 "$ (단어", 줄 끝에서 "없음")이 누락됩니다. – hcs42

+0

"다른 makefile을 포함시킨 후 makefile 이름을 확인하면이 해결책이 작동하지 않습니다!"이것은 큰 문제는 아니며이 코드의 처음 두 줄을 내 Makefile은 WHERE_ART_THOU 변수를 올바르게 설정합니다. 그런 다음 Makefile의 아무 곳에서나 그 변수를 사용할 수 있습니다. – hcs42

3

Google으로 빠른 여행은 this 사이트에 답변이 있음을 나타냅니다.

+0

GNU Make의 경우 - 일반적으로 비 GNU make에서는 작동하지 않습니다. –

+1

다른 메이크 파일을 포함시킨 후에 메이크 파일 이름을 확인하면이 솔루션이 작동하지 않습니다! –

7

(궁금한 점이 있으시면 놀라 울 정도로 작성된 GNU make manual을 참조하십시오.하지만 Makefile과 마찬가지로이 설명서는 개념을 실제로 적용하기 전에 완전히 읽어야합니다).

나는 그것이 어떻게 쉽게 이루어질 지 알 수 없었다. 내가 아는 한, 당신은 수동 작업을해야 할 것입니다.

나중에 어떻게 수행 할 수 있는지 설명하고 current_makefile 변수를 소개하는 스크립트를 보여줍니다. 그러나 나는 처음부터 중요한 개념을 강조하고 싶다.

변수 current_makefile이 있으면 현재 메이크 파일 이름으로 확장되므로 메이크 파일을 읽는 중 변경해야합니다. 즉, 은 즉 "즉각적인"확장 컨텍스트 내에서 사용되어야합니다. 즉,이 makefile을 읽는 동안 실행되는 명령 내에서 사용되어야합니다. 그러나 대부분의 명령은 makefile을 읽은 후에 실행됩니다. 따라서 "deferred"확장이 사용되는 특정 위치에서는 항상 루트 메이크 파일 이름으로 확장되는 반면, 일부 명령은 올바른 값을 부드럽게 인쇄합니다.

예를 들어 규칙 텍스트 내에이 변수를 사용하려면 규칙 텍스트에 지연 확장이 항상 있기 때문에 트릭을해야합니다. 따라서 규칙이있는 경우

rule: 
     echo In makefile $(current_makefile): 
     echo Making target [email protected] 

항상 루트 메이크 파일의 이름이 인쇄됩니다. 대신, 즉각적인 확장을 강제로, 당신은 메이크 특정 이름을 가진 다른 변수를 만들어야합니다 (예 : 변수 즉 이름은 각 메이크에서 달라야) :

this_makefile_unique_name := $(current_makefile) 
rule: 
     echo In makefile $(current_makefile): 
     echo Making target [email protected] 

또는 평가 사용 :.

define make_rule 
rule: 
     echo In makefile $(1): 
     echo Making target [email protected] 

$(eval $(call make_rule,$(current_makefile))) 

만 디버그 목적으로 현재 메이크 파일의 이름을 사용하려면

는 경고 또는 정보 같은 특별한 디버깅 기능을 고려 :.

$(warning We're in makefile $(current_makefile)) 

이 함수는 "즉시"확장을 사용하고 올바른 값을 인쇄합니다.


어떻게 그런 $ (current_makefile)를 정의 하는가?

makefile 흠집 스택을 수동으로 관리해야합니다. makefile을 포함 시키면 그 이름이 스택 맨 위에 놓입니다. 포함 된 메이크 파일에서 바깥 쪽 메이크 파일로 돌아 가면 최상위 이름이 스택 밖으로 튀어 나옵니다. 이것은 메이크 파일의 시작과 끝 부분에 특별한 호출을 삽입하여 이루어집니다 :

# Beginning of makefile 
$(eval $(makefile_names_push)) 
#... makefile text 
$(warning $(current_makefile)) 
#... 
$(eval $(makefile_names_pop)) 
#End of file 

이제 루트 메이크 파일의 시작 부분에 함수를 정의하십시오. 당신이 당신의 메이크업은 (3.81+ 버전)만큼 새로운 생각하는 경우

lastword=$(word $(words $(1)),$(1)) 

define makefile_names_push 
current_makefile := $$(CURDIR)/$$(call lastword,$$(MAKEFILE_LIST)) 
makefile_stack :=$$(makefile_stack) $$(current_makefile) 
endef 

define makefile_names_pop 
makefile_stack := $$(filter-out $$(current_makefile),$$(makefile_stack)) 
current_makefile := $$(call lastword,$$(makefile_stack)) 
endef 

, 내장 기능 lastword 전화를 대체 :.

#inctead of $$(call lastword,$$(MAKEFILE_LIST)) 
$$(lastword $$(MAKEFILE_LIST)) 

가 유용합니까?

전혀 쓸모가 없습니다. 여기에서 유용 할 수있는 유일한 사용법은 하나의 makefile에 대한 심볼 링크 인 100 개의 makefile을 만드는 것입니다.이 makefile의 규칙은 이름에 따라 다릅니다. 그러나 매뉴얼에 설명 된 하나의 makefile 및 foreach-eval 기술 내에서이를 달성 할 수 있습니다. 그래서 내 글은 시간이 많이 걸렸지 만, 약간의 재미를 보냈다. :-)

2

간단한 반복적 인 작업을 관리하기 위해 Make를 사용할 때 비슷한 것을 (예 : Makefile의 내용을 반향시키기 위해)하고 싶었다. 나는이 페이지를 보았고 그것이 정확하게 내가 만든 것임을 알았고 나의 제한된 이해에 유용했다. 이 페이지를 읽은 후

내 결과 :이 페이지의

 
    # Makefile - 'make' and 'make help' now echo the makefile. 
    help: 
     cat $(lastword $(MAKEFILE_LIST)) 
    start: 
     sudo -u www /path/to/webapp/myhttpd restart 
    stop: 
     sudo kill cat /path/to/webapp/data/httpd.pid 

감사합니다 여러분.

1

G'day,

당신이 원래 메이크 파일의 복사본을 만들 경우, makefile_test 말, 다음 명령을 입력 : 메이크과 메이크업 환경을 평가하지만 실행되지 않습니다

make -np -f makefile_test 2>&1 | tee output 

모든 명령. makefile_test에 대한 참조를위한 출력 파일을 살펴보면 make 환경에 설정된 내용과 그 값이 설정되는 위치가 표시됩니다.

N.B. 이것은 많은 정보를 생성 할 수 있습니다! 그리고 make의 의사 결정 프로세스에 대한 추가적인 출력을 생성하는 -d (디버그) 스위치를 추가하지 말고 make의 env에 대한 최소한의 추가 정보를 추가하십시오. 결과 makedepend 비 크로스 재귀 적 상황 (예에

MAKEFILE_JUSTNAME := $(firstword $(MAKEFILE_LIST)) 
MAKEFILE_COMPLETE := $(CURDIR)/$(MAKEFILE_JUSTNAME) 

을 사용 :

HTH

1

이 호출 스택의 맨 아래에있는 일, 즉라는 첫 번째 메이크 파일의 이름을 반환), 그것은 현재 makefile의 이름 일뿐입니다.