2012-03-07 2 views
9

Makefile 내에서 셸 명령을 즉시 확장하려고하지만 셸 명령에서 Makefile 내의 환경 변수에 액세스 할 수있게하려고합니다. $ (shell ...)을 사용하면 즉시 확장되지만 변수에 액세스 할 수는 없습니다. 역 인용 부호를 사용하면 확장이 즉시 이루어지지 않고 나중에 Makefile에서 문제가 발생합니다. 역 인용 부호를 즉시 확장하거나 현재 환경을 $ (쉘) 명령에 전달할 수있는 방법이 있는지 궁금합니다. 예를 들어Makefile 셸로 환경 변수 내보내기

, 다음 메이크 :

SOME_VAR := some_val 
export SOME_VAR 

VAR1 := `echo $$SOME_VAR` 
export VAR1 
VAR2 := `echo $$VAR1` 

all: 
     @echo VAR1=$(VAR1) 
     @echo VAR2=$(VAR2) 

윌 출력 : 나는 "VAR2 = some_val"인쇄 할

~/tmp/t2> make 
VAR1=some_val 
VAR2=`echo $SOME_VAR` 

. 실제 예제는 좀 더 복잡합니다 (환경 변수는 상위 makefile에서 상속되며 perl 스크립트를 사용하여 변수를 편집하려고합니다). 원칙은 동일합니다.

도움을 주시면 감사하겠습니다.

답변

1

, 내 실제 목표는 스크립트 객체가 컴파일되고 있던 설정에 따라 파일 이름을 생성하는 것이었다. 그런 다음 생성 된 모든 파일 이름의 특수 형식 목록을 생성하기 위해 다른 스크립트가 필요합니다 (대상은 JIT 컴파일러가없는 임베디드 시스템입니다). 어떤 주어진 시간에, 바이너리에 잠재적으로 영향을 미칠 수있는 30 개 이상의 설정이 있으며, 이것은 미래에 하나 이상의 모듈에서 사용될 수 있습니다. 그래서 나는 확장 가능한 것을 원합니다.

내 솔루션은 다음과 같습니다.

VAR1 := CONFIG_X1=$(CONFIG_X1) CONFIG_X2=$(CONFIG_X2) CONFIG_X33=$(CONFIG_X33) 

및 script2 :

-include $(SOME_MK_FILE) 

$(SOME_MK_FILE) : .phony 
    script.pl $(SETTINGS_OF_INTEREST_LIST) > $(SOME_MK_FILE) 

someFilename := $(shell script2.pl $(VAR1)) 

script.pl 같은 것을 보이는 문자열을 출력하는 대신에 변수를 전달하는, 내가 설정에 따라 출력 메이크 - 구문 분석 문자열을 내 스크립트를 수정 'someFilename.X1_y.X2_n.elf'

과 같은 형태의 파일 이름은, 나중에 다른 규칙에서, 나는이 출력 :

someobj: somedep 
    script3.pl $(someFilename) >> builtfiles.txt 

buildfiles.txt를 올바르게 빌드합니다 (차례대로 다른 스크립트의 입력입니다 ...). 결국 이것은 make가 environement를 $ (shell)에 넘길 수 없다는 것을 회피하는 방법이다. 지나치게 예쁘지는 않지만 작동합니다.

요한은 여기

4

무엇이 문제입니까?

VAR1 := $(shell echo $(SOME_VAR)) 
VAR2 := $(shell echo $(VAR1)) 
+0

흠 ... 그래, 내 예 결함이되었다. ..위의 예에서 VAR1은 Makefile 내에서 확장되지만, 필요한 것은 셸 스크립트 내에서 확장되는 VAR1입니다. 즉, ENV { 'VAR1'}에 액세스해야하는 펄 스크립트를 호출합니다. $ (shell ...)에서 호출하면 스크립트는 VAR1이 무엇인지 알 수 없습니다. 더 좋은 예를 들어 질문을 수정하겠습니다. 감사. – John

+0

@ 존, 나는 당신이 여기서 무엇을하려고하는지 이해하지 못합니다. 몇 가지 추측을 할 수는 있지만 질문을 편집하는 것이 더 빠를 것이라고 생각합니다. – Beta

+0

내가 실제로하려고하는 것은 : 나는 메이크 파일을 가지고 있는데,이 메이크 파일은 오브젝트 파일을 만들고 그것으로 빌드 된 구성 설정에 따라 이름을 짓는 것으로되어있다. 구성 설정을 이름으로 변환하는 펄 스크립트가 있습니다. 이 작업을 수행하려면 perl 스크립트가 구성 설정에 액세스 할 수 있어야합니다 (역 인용 부호를 사용해야합니다). 이것은 그 자체로는 괜찮지 만, 그 이름은 다른 펄 스크립트에서 사용되어야합니다. 두 번째 스크립트가 실행될 때 이름이 확장되지 않으므로 오류가 발생합니다. 해결 방법을 찾고 있는데요. – John

5

이게 원하는가요? 나는 의견의 일부에서 언급 한 바와 같이

VAR2 := $(shell VAR1="$(VAR1)" script_that_uses_var1)

+0

정확히는 아니요, 아니요. 필자가 원하는 것은 특정 바이너리를 빌드하고 현재 구성에 따라 이름을 지정하는 것입니다. 원하는 설정을 명시 적으로 내보낼 수는 있지만이 솔루션은 확장 성이 뛰어납니다. 그래서, 내가해야 할 일은 모든 메이크 파일 설정에 접근 할 수있는 스크립트를 실행하는 것입니다. 그런 다음 파일 이름을 출력 할 수 있습니다. 나중에 나중에 다른 스크립트로 전달되어야하는 파일 이름이므로 파일 이름은 나중에는 아니라 더 빨리 해결해야합니다. – John

+1

이것은 OP를 도운 도움이되지 않았지만 정확하게이 질문을 검색해야했습니다. 건배! –