Como escrever um script bash no Makefile

2

Eu tenho uma estrutura de diretórios como esta:

'-- 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

Gostaria de ter um diretório com apenas esses arquivos:

'-- 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

Esse script bash faz o que eu quero, mas além de copiar / colar em um Makefile, não consigo descobrir como usar a funcionalidade do Make para fazer o mesmo:

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
    
por Sean Allred 16.01.2016 / 18:50

1 resposta

1

Você não pode escrever scripts de bash de várias linhas em Makefile . Cada linha é executada em um novo shell, então você perderá o contexto. Além disso, as variáveis são avaliadas como make variables. Em vez disso, armazene seu código em script bash separado e execute isso em Makefile . Não vale a pena abusar do seu script bash nem make para fazer esse trabalho.

Se você realmente quiser tê-lo em seu Makefile , você precisa torná-lo uma linha e escapar dos dólares em variáveis.

Exemplo que não funcionará:

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

Escapado:

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

Tags