오류 "/bin/sh: 1: 구문 오류: Makefile의 "(" 예기치 않은"

오류 "/bin/sh: 1: 구문 오류: Makefile의 "(" 예기치 않은"

setup과 clean이라는 두 가지 대상을 사용하여 Makefile을 만들려고 합니다. 설정 대상은 /usr/lib/man-db에서 모든 파일을 찾아서 proj/lib 디렉토리에 복사해야 합니다.

setup:
    files=( $( find /usr/lib/man-db -name "*.so" ) )
    mkdir proj; cd proj; mkdir lib bin
    cd
    cp $HOME/proj/lib "${files[@]}"
clean:
    rm -r proj

답변1

Makefile에 두 가지 오류가 있습니다.

  1. 변수를 (또는 쉘 실행 파일에 대한 경로가 무엇이든) bash설정하지 않고 (또는 동일한 배열 구문을 가진 쉘을 사용하여 ) 의존합니다 .makeSHELL/bin/bash

  2. 이는 동일한 셸 인스턴스에서 실행되는 각 작업에 의존합니다. 일반적으로 각 액션 라인은분리된 $SHELL( /bin/sh기본값), 이는 한 줄에서 쉘 변수를 설정한 다음 다른 줄이나 한 디렉터리에서 사용할 수 없으며 cdMakefile의 다음 줄에서 여전히 같은 디렉터리에 있다고 가정할 수 없음을 의미합니다.

나는 아마도 setup목표를 다음과 같이 다시 작성할 것입니다.

setup:
    mkdir -p proj/lib proj/bin
    find /usr/lib/man-db -type f -name '*.so' -exec cp {} proj/lib \;

bash이는 또한 에서 사용하는 셸인 셸 에 의존하지 않으며 make인수 순서도 수정합니다 cp(인수 순서는 뒤에서 앞으로).

관련 정보