2016-08-17 4 views
1

나는 makefile을 가지고 있는데, 내가 썼던 bash 스크립트에 이미 존재하는 몇 가지 변수를 설정하려고한다 : set-vars.sh (단지 변수 이름과 값을 포함하고있다).bash 스크립트에서 메이크 파일 변수 읽기

나는 여러 가지 다른 bash 스크립트에서 이러한 변수를 사용하고 있습니다. 내 makefile에서도 사용할 수 있어야합니다.

bash 스크립트에서 변수를 설정하는 가장 좋은 방법은 무엇인지 알아 내려고 시도한 결과, makefile의 작동 방식을 발견했습니다.

set-vars.sh :

# set vars 
foo=FOO1 
bar=BAR1 
baz=BAZ1 

# if a command line arg is given (e.g. foo) 
# echo value command line arg (e.g. echo $foo) 

if ! [ -z ${1+x} ]; then echo ${!1}; fi 

이의 이름을 명령 행 인수에 제공되는 변수의 값을 말이지 echo 마지막 줄이 여기에 마법이되어있는 경우에는 다음과 같이한다입니다 명령 행 인수 나는 makefile에서이 스크립트를 호출하고 변수 이름을 제공하고 makefile 변수를 설정 echo 에드 값을 사용합니다.

Makefile

:

.PHONY: target1 target2 target3 

export foo = $(shell sh set-vars.sh foo) 

target1: 
    @echo $(foo) 

# ... other targets which reference $(foo) ... 

이 작동하지만, 아마 그 일의 해키 방법입니다. 내가하고 싶은 일을하는 더 단순하고 우아한 방법이 있는지 궁금합니다.

는 I에 유래에 몇 가지 유사한 질문과 답변 건너했지만 내 예와 함께 작동 아무것도 찾지 못했습니다. 내가 이미 놓친 답변이 있다면, 저를 지적하십시오.

감사합니다.

+0

쉘에서'make'를 호출하는 변수를 설정하거나'make' 명령 행에 넣을 수 없습니까? – Barmar

+0

다른 스크립트는'if! [-z ...'라인? – Beta

+0

@Barmar,이 메이크 파일은이 메이크 파일의 내부 동작에 익숙하거나 잘 모르는 다른 사람들이 사용하기 때문에 명령 줄에 넣을 수 없습니다. 가능한 한 간단하게 makefile의 호출을 유지하고 싶습니다 ... 그러나 쉘에서'make '를 호출하는 변수를 설정한다는 것은 무엇을 의미합니까? 쉘 스크립팅에 너무 능숙하지 않아서 미안해. – tamjd1

답변

3

당신은 당신의 메이크에서 쉘 스크립트에서 공급하고 포함 할 수있는 파일에 변수를 정의 할 수 있습니다

$ cat vardef.txt 
foo=FOO1 
bar=BAR1 
baz=BAZ1 
$ cat set-vars.sh 
source ./vardef.txt 
echo "$foo $bar $baz" 
$ sh ./set-vars.sh 
FOO1 BAR1 BAZ1 
$ cat Makefile 
include vardef.txt 
all: 
    @echo "$(foo) $(bar) $(baz)" 
$ make 
FOO1 BAR1 BAZ1 

는 그냥 멋진 두 언어가 부분적으로 동일한 구문을 사용하지 않을 때입니다? 덜 해키,하지만 당신은 메이크 파일에 포함 할 수있는 파일을 "만들"수 있다면

+0

이것은 유망 해 보입니다 ... 시도해 보겠습니다. 감사! – tamjd1

+0

시도해보십시오. 쉘 스크립트와 잘 맞지 않는'Makefile'을 잘 사용합니다. 이것을 얻는 방법은'subtest.sh : line 3 : source : vars.txt : file not found '입니다. – tamjd1

+0

'source./vars.txt' 또는'source vars.txt'을 사용해 보셨습니까? –

1

확실하지. 런타임에. 이렇게 :

$(shell grep '=' vars.sh > /tmp/vars.tmp) 
include /tmp/vars.tmp 
$(shell rm /tmp/vars.tmp) 

첫 번째 줄을 더 정상적으로 바꿉니다. 그들이 할 경우 출력은 명령 행에서뿐만 아니라 환경 변수의 상태에뿐만 아니라 의존 할 때 갑자기 재현성에 문제가 있기 때문에 빌드 시스템 환경 변수에 의존하는

1

그것은 일반적으로 가난한 연습으로 간주됩니다.

모든 환경 변수, 예를 들어, make에 액세스 할 수 있습니다, 당신을 경고 데: 또는

#!/bin/bash 
export foo=FOO1 
export bar=BAR1 
export baz=BAZ1 
exec make "[email protected]" 

, 당신은 export foo=FOO1 계산서를 가진 쉘 스크립트를 가질 수 있습니다

user := ${USER} # ${USER} comes from the environment. 
all : 
    @echo ${user} 

make를 환경 변수를 설정하고 호출하는 스크립트가 있습니다. 이것은 유효한 메이크 파일 문법이므로, Makefileinclude set-vars.sh을 할 수 있습니다.

+0

이 작업을 할 수 있지만 스크립트에서가 아니라 명령 줄에서'make '를 실행할 수 있어야합니다. 후드 아래에서 모든 올바른 변수와 값을 얻을 수 있으려면'make '가 필요합니다. 따라서 사용자가'make install '을 실행하거나'Makefile' 내부에 무엇이 있는지 모른 채 실행하고 싶은 대상을 실행하는 것 외에는 아무 것도 할 필요가없는 수준의 추상화를 만듭니다. – tamjd1

+0

@ tamjd1 대체 솔루션을 추가했습니다. –

+0

@RenaudPacalet이 원래이 조언을 주셨습니다. –

관련 문제