Makefile에서 셸 명령어를 사용하는 방법
나는그결사합니다고려용의 하려고 합니다.ls
echo, rsync(표시: 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)
물론, 그것은 그것을 의미합니다.FILES
▁from▁"다로▁""에서 됩니다.ls
명령을 실행하기 전에 .vmsz 파일을 생성합니다.(카즈가 지적했듯이 변수는 매번 다시 확장되므로 결국 .tgz 파일을 포함하게 될 것입니다. 일부 변형은FILES := ...
효율성 및/1또는 정확성을 위해 이를 방지합니다.)
한다면FILES
는 셸 변수여야 합니다. 이 변수를 설정할 수 있지만 공백 없이 셸-e로 설정해야 하며 따옴표로 묶어야 합니다.
all:
FILES="$(shell ls)"
그러나 각 행은 별도의 셸에 의해 실행되므로 이 변수는 다음 행까지 생존할 수 없으므로 즉시 사용해야 합니다.
FILES="$(shell ls)"; echo $$FILES
이 확장될 같은 입니다.*
은 그냥 다음과 같이 할 수 : ( 및 기 셸 표 글 브 수 수 있 다 니 습 할 행 작 을 업 같 은 우 타 식 현 선 과 로 다 음 다 니 ▁( 있 습 ▁just
echo *
당신의 포탄 명령대로.
마지막으로, 일반적인 규칙으로서(이 예에는 실제로 적용되지 않음): 주석의 에스페란토 노트로서, 출력을 사용합니다.ls
신뢰할 수 있는 것은 . ( 정보는 달라지기도 하고 는 의 에 따라 달라지기도 합니다.)ls
의 일부 ls
경우에 따라 출력을 검사하려고 시도합니다.따라서, 만약 당신이 GNU를 사용하고 있다면, l0b0과 idelic note로서 당신은 사용할 수 있습니다.$(wildcard)
그리고.$(subst ...)
안에서make
파일 이름에 포함된 모든 "파일 이름에 포함된 문자" 문제입니다.(인sh
는 makefiles를 하는 방법도 있습니다.find ... -print0 | xargs -0
공백, 새 줄, 제어 문자 등에 걸려 넘어지는 것을 방지합니다.)
GNU Make 문서는 POSIX가 2012년에 추가 할당을 한다고 추가로 1언급합니다.나는 이것에 대한 POSIX 문서에 대한 빠른 참조 링크를 찾지 못했고, 어떤 것이 있는지도 즉시 알지 못합니다.make
모델 지원 형변지::=
가 오늘날 과제, 비가 GNU, 같의를은, 미가고지있습과 같은 로 과제를 .:=
즉, 확장을 사용하여 지금 바로 할당을 수행합니다.
참고:VAR := $(shell command args...)
맞춤법을 사용할 수도 있습니다.VAR != command args...
여러 개로make
제가 아는 한 모든 현대 GNU 및 BSD 변형을 포함한 변형입니다.이러한 다른 변형 모델에는 다음이 없습니다.$(shell)
그래서 사용하기VAR != command args...
더 짧은 것과 더 많은 변형에서 일하는 것 모두에서 더 우수합니다.
또한, Torrek의 대답 외에도, 한 가지 눈에 띄는 것은 여러분이 게으르게 평가된 매크로 과제를 사용하고 있다는 것입니다.
당신이 GNU Make에, GNU Make를 사용하세요.:=
할 대신 =
이 할당으로 인해 오른쪽이 즉시 확장되고 왼쪽 변수에 저장됩니다.
FILES := $(shell ...) # expand now; FILES is now the result of $(shell ...)
FILES = $(shell ...) # expand later: FILES holds the syntax $(shell ...)
를 사용하는 .=
할당, 그것은 모든 발생을 의미합니다.$(FILES)
는 확할것장입니다것▁the다.$(shell ...)
구문을 사용하여 셸 명령을 참조하십시오.이것은 여러분의 일을 더 느리게 하거나 심지어 놀라운 결과를 초래할 것입니다.
언급URL : https://stackoverflow.com/questions/10024279/how-to-use-shell-commands-in-makefile
'programing' 카테고리의 다른 글
WPF 창에서 유형별로 모든 컨트롤 찾기 (0) | 2023.05.28 |
---|---|
목표-C에서 언제 0과 NULL을 사용해야 합니까? (0) | 2023.05.28 |
Xcode 11에 Assistant Editor 누락 표시? (0) | 2023.05.28 |
WPF/MVVM 애플리케이션에서 종속성 주입을 처리하는 방법 (0) | 2023.05.28 |
코드 뒤에 있는 ASP.Net 페이지의 URL 가져오기 (0) | 2023.05.28 |