Makefile에서 $0을 어떻게 사용하나요?

Makefile에서 $0을 어떻게 사용하나요?

다음 명령을 포함하고 싶습니다(다음 명령에서 가져옴).여기) 안에 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_fileMake는 해당 항목이 없거나 최신 버전인 경우 이를 "다시 빌드"합니다. $<참조 입력(전제 조건이라고 함), $@참조 출력(목표라고 함).

대상 을 원하면 copy_files다음에 종속되도록 선언하십시오 output_file.

copy_files: output_file

Make가 가짜 대상에 대해 알고 있는 경우 해당 내용도 언급해 주세요.

.PHONY: copy_files
copy_files: output_file

관련 정보