Makefile에서 bash 스크립트를 작성하는 방법

Makefile에서 bash 스크립트를 작성하는 방법

다음과 같은 디렉토리 구조가 있습니다.

`-- dev
    |-- example-object
    |   |-- example-object.tex
    |   `-- example-template
    |       |-- example-template.tex
    |       `-- instances
    |           `-- example-instance.tex
    `-- example-object2
        |-- example-object2.tex
        `-- example-template2
            |-- example-template2.tex
            `-- instances
                `-- example-instance2.tex

다음 파일만 포함된 디렉터리를 원합니다.

`-- src
    |-- xcv.example-object.tex
    |-- xcv.example-object.example-template.tex
    |-- xcv.example-object.example-template.example-instance.tex
    |-- xcv.example-object2.tex
    |-- xcv.example-object2.example-template2.tex
    `-- xcv.example-object2.example-template2.example-instance2.tex

이 bash 스크립트는 내가 원하는 작업을 수행하지만 Makefile에 복사/붙여넣기하는 것 외에 Make의 기능을 사용하여 동일한 작업을 수행하는 방법을 모르겠습니다.

mkdir -p src/
dest=$(pwd)/src

for object in $(find dev ! -path dev -type d -maxdepth 1); do
    oname=$(basename "${object}")
    echo cp "${oname}.tex" "${dest}"/xcv."${oname}".tex
    for template in $(find "${object}" ! -path "${object}" -type d -maxdepth 1); do
        tname=$(basename "${template}")
        echo cp "${tname}.tex" "${dest}"/xcv."${oname}"."${tname}".tex
        for instance in $(find "${template}"/instances -type f); do
            iname=$(basename "${instance}")
            echo cp "${iname}.tex" "${dest}"/xcv."${oname}"."${tname}"."${iname}"
        done
    done
done

답변1

새 셸에서 각 줄을 bash실행할 수 없으므로 컨텍스트가 손실됩니다. Makefile변수는 변수로도 평가됩니다 make. 대신 코드를 별도의 bash스크립트에 저장하고 에서 실행하는 것은 스크립트를 Makefile남용 bash하거나 작업을 수행할 make가치가 없습니다 .

정말로 그것을 당신의 것에 넣고 싶다면 Makefile, 그것을 한 줄로 만들고 변수에서 $를 이스케이프해야 합니다.

작동하지 않는 예:

$ cat Makefile
test: 
    VAR="YES";
    echo "x${VAR}";
$ make
VAR="YES";
echo "x";
x 

탈출하다:

$ cat Makefile
test: 
    VAR="YES"; \
    echo "x$${VAR}";
jakuje@E6430:/tmp/test$ make
VAR="YES"; \
echo "x${VAR}";
xYES

관련 정보