Makefile에서 쉘 명령을 사용하는 방법
ls
다른 명령 (예 : echo, rsync) 의 결과를 사용하려고합니다 .
all:
<Building, creating some .tgz files - removed for clarity>
FILES = $(shell ls)
echo $(FILES)
그러나 나는 얻는다 :
make
FILES = Makefile file1.tgz file2.tgz file3.tgz
make: FILES: No such file or directory
make: *** [all] Error 1
echo $$FILES
, echo ${FILES}
및을 사용해 보았습니다 echo $(FILES)
.
와:
FILES = $(shell ls)
아래에 들여 쓰기 all
는 빌드 명령입니다. 따라서 이것은 확장 된 $(shell ls)
다음 명령 실행을 시도합니다 FILES ...
.
경우 FILES
있어야하는데 make
변수이 변수는 레시피 부, 예를 들면 외부에 할당해야
FILES = $(shell ls)
all:
echo $(FILES)
물론 이는 .tgz 파일을 생성하는 명령을 실행 하기 전에FILES
"output from ls
" 으로 설정 된다는 것을 의미 합니다. ( Kaz가 지적했듯이 변수는 매번 다시 확장되므로 결국에는 .tgz 파일이 포함될 것입니다. 일부 는 효율성 및 / 또는 정확성을 위해이를 피해야합니다. 1 )FILES := ...
FILES
셸 변수가되어야하는 경우 설정할 수 있지만 공백없이 따옴표로 묶은 shell-ese로 수행해야합니다.
all:
FILES="$(shell ls)"
그러나 각 줄은 별도의 셸에서 실행되므로이 변수는 다음 줄까지 유지되지 않으므로 즉시 사용해야합니다.
FILES="$(shell ls)"; echo $$FILES
셸이 처음에 확장 *
(및 기타 셸 glob 표현식) 되기 때문에 이것은 모두 약간 어리석은 일입니다.
echo *
쉘 명령으로.
마지막으로, 일반적인 규칙 (이 예에 정말 해당되지 않음)과 같이 같은 에스페란토 주석 노트의 출력을 사용하여 ls
완전히 신뢰할 수 없습니다 (일부 세부 사항은 파일 이름에 의존하고 때로는 심지어 버전 ls
, 일부 버전 ls
살균 출력으로 시도 일부 경우에). 따라서 l0b0 및 이상적인 메모 처럼 GNU를 사용하는 경우 자체 내부의 모든 것을 사용 $(wildcard)
하고 $(subst ...)
수행 할 수 있습니다 make
( "파일 이름의 이상한 문자"문제 방지). ( sh
메이크 파일의 레시피 부분을 포함하는 스크립트에서 또 다른 방법은 find ... -print0 | xargs -0
공백, 줄 바꿈, 제어 문자 등이 넘어 가지 않도록하는 것입니다.)
1 GNU Make 문서는 POSIX ::=
가 2012 년에 추가 할당을 했다고 추가로 설명 합니다 . 나는 이것에 대한 POSIX 문서에 대한 빠른 참조 링크를 찾지 못했고 어떤 make
변형이 ::=
할당을 지원 하는지 직접 알지 못합니다 . 비록 GNU make가 오늘과 같은 의미를 가지고 있습니다 :=
. 즉, 확장으로 지금 할당을 수행합니다.
참고 VAR := $(shell command args...)
또한 철자 할 수 있습니다 VAR != command args...
몇 가지에 make
모든 현대적인 GNU를 포함, 변형 및 BSD는 내가 아는 한 변종입니다. 이 다른 변형이없는 $(shell)
때문에 사용 VAR != command args...
이 모두 짧은있는 우수 하고 더 변종에서 작업.
또한 torek의 답변 외에도 눈에 띄는 점은 느리게 평가 된 매크로 할당을 사용하고 있다는 것입니다.
당신이 GNU 메이크업에있어 경우, 사용하는 :=
대신 할당을 =
. 이 할당은 오른쪽이 즉시 확장되고 왼쪽 변수에 저장되도록합니다.
FILES := $(shell ...) # expand now; FILES is now the result of $(shell ...)
FILES = $(shell ...) # expand later: FILES holds the syntax $(shell ...)
=
할당 을 사용하면의 모든 단일 발생이 구문을 $(FILES)
확장 $(shell ...)
하여 쉘 명령을 호출 함을 의미합니다 . 이렇게하면 make 작업이 느리게 실행되거나 놀라운 결과가 발생할 수 있습니다.
참고 URL : https://stackoverflow.com/questions/10024279/how-to-use-shell-commands-in-makefile
'Programing' 카테고리의 다른 글
file_put_contents 권한이 거부되었습니다. (0) | 2020.09.19 |
---|---|
make :`all '을 위해 할 일이 없습니다. (0) | 2020.09.18 |
로그 파일 및 콘솔에 출력 쓰기 (0) | 2020.09.18 |
Django 템플릿에서 사용자 프로필에 액세스하는 방법은 무엇입니까? (0) | 2020.09.18 |
org.w3c.dom.Element를 Java의 문자열 형식으로 출력하는 방법은 무엇입니까? (0) | 2020.09.18 |