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에 두 가지 오류가 있습니다.
변수를 (또는 쉘 실행 파일에 대한 경로가 무엇이든)
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
(인수 순서는 뒤에서 앞으로).