web-dev-qa-db-ja.com

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
2
Sean Allred

bashに複数行のMakefileスクリプトを書くことはできません。すべての行が新しいシェルで実行されるため、コンテキストが失われます。また、変数はmake変数として評価されます。むしろ、コードを別のbashスクリプトに保存し、それをMakefileから実行します。 bashスクリプトやmakeを悪用してその仕事をする価値はありません。

本当にMakefileに入れたい場合は、1行にして、変数のドルをエスケープする必要があります。

動作しない例:

$ 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
1
Jakuje