저는 설정과 정리라는 두 가지 목표를 가지고 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에 두 가지 오류가 있습니다.
변수를 (또는 쉘 실행 파일의 경로) 로 설정
bash
하지 않고 (또는 동일한 배열 구문을 가진 쉘) 에 의존합니다 .make
SHELL
/bin/bash
이는 동일한 셸 인스턴스에서 실행되는 각 작업에 의존합니다. 일반적으로 각 작업 줄은 다음과 같이 표시됩니다.분리
$SHELL
(/bin/sh
기본값) 이는 한 줄에서 쉘 변수를 설정한 다음 다른 줄에서 이를 사용하거나,cd
디렉토리로 이동한 다음 Makefile의 다음 줄에서 여전히 동일한 디렉토리에 있다고 가정할 수 없음을 의미합니다.
setup
타겟을 다음과 같이 다시 작성할 수도 있습니다 .
setup:
mkdir -p proj/lib proj/bin
find /usr/lib/man-db -type f -name '*.so' -exec cp {} proj/lib \;
bash
또한 이는 사용된 쉘 에 의존하지 않으며 make
인수의 순서도 수정합니다 cp
(인수는 마지막에서 처음으로임).