다음 명령을 포함하고 싶습니다(다음 명령에서 가져옴).여기) 안에 Makefile
. 이 명령을 포함하는 간단한 스크립트 버전은 Makefile
다음과 같습니다.
copy_files:
sed 's/^/\./' ./input_file | \
rev | \
LC_ALL=C sort -u | \
awk 'p == "" || substr($0,1,length(p)) != p { print $0; p = $0 }' | \
rev | \
sed 's/^\.//' > ./output_file
내가 겪고 있는 문제는 다음을 사용하여 실행할 때 기호를 make
인식하지 못한다는 것 입니다 $0
.
awk: cmd. line:1: p == "" || substr(,1,length(p)) != p { print ; p = }
awk: cmd. line:1: ^ syntax error
awk: cmd. line:1: p == "" || substr(,1,length(p)) != p { print ; p = }
awk: cmd. line:1: ^ syntax error
나는 성공하지 못한 채 $0
사용을 피하려고 노력했다 \$0
. 해결책은 무엇입니까?
답변1
당신은 올바른 길을 가고 있습니다. Makefile에서 달러 기호를 피하세요.당신은 사용해야합니다$$
, 아니요 \$
:
copy_files:
sed 's/^/\./' ./input_file | \
rev | \
LC_ALL=C sort -u | \
awk 'p == "" || substr($$0,1,length(p)) != p { print $$0; p = $$0 }' | \
rev | \
sed 's/^\.//' > ./output_file
입력 파일을 사용하여 출력 파일을 빌드하므로 Make에 명시적으로 알려야 합니다.
output_file: input_file
sed 's/^/\./' $< | \
rev | \
LC_ALL=C sort -u | \
awk 'p == "" || substr($$0,1,length(p)) != p { print $$0; p = $$0 }' | \
rev | \
sed 's/^\.//' > $@
output_file
이 정의에 따라 input_file
Make는 해당 항목이 없거나 최신 버전인 경우 이를 "다시 빌드"합니다. $<
참조 입력(전제 조건이라고 함), $@
참조 출력(목표라고 함).
대상 을 원하면 copy_files
다음에 종속되도록 선언하십시오 output_file
.
copy_files: output_file
Make가 가짜 대상에 대해 알고 있는 경우 해당 내용도 언급해 주세요.
.PHONY: copy_files
copy_files: output_file