쉘 스크립트의 다른 Makefile에서 변수를 가져오는 방법

쉘 스크립트의 다른 Makefile에서 변수를 가져오는 방법

~/kernelbuild/linux-3.14.37내 쉘 스크립트에서 이 디렉토리에 있는 다른 Makefile의 변수를 사용하고 싶습니다 .

필요한 변수는 다음과 같습니다.

VERSION = 3
PATCHLEVEL = 14
SUBLEVEL = 37

문제는 Makefile을 변경할 수 없다는 것입니다., 따라서 변수 내보내기는 여기서 옵션이 아닙니다.

또한 필요한 모든 공통 변수가 포함된 별도의 파일을 갖는 것에 대해 이야기하는 사람도 보았습니다.이것은 작동하지만 모든 것을 단일 쉘 스크립트에 넣어야 합니다..

. ~/kernelbuild/linux-3.14.37/Makefile이러한 변수를 사용할 수 있어야 한다고 생각하는 쉘 스크립트에 포함하려고 하는데 다음과 같은 오류가 발생합니다.

/home/jl4347/kernelbuild/linux-3.14.37/Makefile: line 1: VERSION: command not found
/home/jl4347/kernelbuild/linux-3.14.37/Makefile: line 2: PATCHLEVEL: command not found
/home/jl4347/kernelbuild/linux-3.14.37/Makefile: line 3: SUBLEVEL: command not found
/home/jl4347/kernelbuild/linux-3.14.37/Makefile: line 4: EXTRAVERSION: command not found
/home/jl4347/kernelbuild/linux-3.14.37/Makefile: line 5: NAME: command not found
/home/jl4347/kernelbuild/linux-3.14.37/Makefile: line 17: MAKEFLAGS: command not found
/home/jl4347/kernelbuild/linux-3.14.37/Makefile: line 20: unexport: command not found
/home/jl4347/kernelbuild/linux-3.14.37/Makefile: line 26: unexport: command not found
/home/jl4347/kernelbuild/linux-3.14.37/Makefile: line 47: syntax error near unexpected token `"$(origin V)",'
/home/jl4347/kernelbuild/linux-3.14.37/Makefile: line 47: `ifeq ("$(origin V)", "command line")'

Makefile이 쉘 스크립트의 구문 규칙을 따르지 않기 때문이라고 생각합니다. 어떻게 해야 하나요?

미리 감사드립니다!

답변1

간단한 것(예: 예제)이 필요한 경우 grepMakefile에서 꺼내십시오.

좀 더 복잡한 경우를 위해 GNU Make에는 -pMake를 실행한 후 모든 변수 정의(및 그 이상)를 포함하여 데이터베이스를 인쇄하는 옵션이 있습니다. 이것을 와 함께 사용할 수 있으며 -n, 이로 인해 작업이 실제로 실행되지 않습니다(그래서 아무것도 빌드되지 않습니다). 출력 grep에서 변수를 가져올 수 있습니다 .-p

답변2

grep 및 sed를 사용하여 값을 추출해 볼 수 있습니다. 예를 들어:

filename="$HOME/kernelbuild/linux-3.14.37/Makefile"
version=$(grep -m 1 VERSION $filename | sed 's/^.*= //g')

이 grep은 Makefile에서 "VERSION"이 처음으로 나타나는 것을 찾습니다.

답변3

Make는 stdin에서 makefile을 읽을 수 있으므로여기 문서그것은 메이크파일입니다. 다음은 커널 makefile을 가져와 %.var지정된 make 변수의 값을 출력하는 레시피가 있는 새 와일드카드 대상을 추가하는 makefile입니다 . ( .var물론, 로 끝나는 파일이나 다른 대상이 없다고 가정합니다.)

showvar() {
make -f - ${1}.var <<'EOF'
include $(HOME)/kernelbuild/linux-3.14.37/Makefile

%.var:
    @echo $($*)
EOF
}

my_version=$(showvar VERSION)
patchlevel=$(showvar PATCHLEVEL)
the_sublevel=$(showvar SUBLEVEL)

$*Make는 대상의 트렁크로 대체됩니다 %.var.

레시피 @echo줄은 실제 TAB문자로 시작됩니다.

관련 정보