Ich versuche, ein Makefile mit zwei Zielen zu erstellen: setup und clean. Das Setup-Ziel soll alle Dateien in /usr/lib/man-db finden und sie in das Verzeichnis proj/lib kopieren.
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
Antwort1
Ihr Makefile weist zwei Fehler auf:
Es basiert auf
bash
(oder auf einer Shell mit derselben Array-Syntax), ohne diemake
VariableSHELL
auf/bin/bash
(oder den Pfad zur ausführbaren Shell-Datei) zu setzen.Dabei wird jede Aktion in derselben Shell-Instanz ausgeführt. Normalerweise wird jede Aktionszeile von einemseparate
$SHELL
(/bin/sh
standardmäßig), was bedeutet, dass Sie eine Shell-Variable nicht in einer Zeile festlegen und dann in einer anderen verwenden können, odercd
in einem Verzeichnis und dann in der nächsten Zeile des Makefiles davon ausgehen können, dass Sie sich noch im selben Verzeichnis befinden.
Ich würde das setup
Ziel wahrscheinlich etwa so umschreiben:
setup:
mkdir -p proj/lib proj/bin
find /usr/lib/man-db -type f -name '*.so' -exec cp {} proj/lib \;
Dies hängt außerdem nicht davon ab, bash
ob es sich bei der Shell um die von verwendete Shell handelt make
, und korrigiert auch die Reihenfolge der Argumente cp
(Sie haben Ihre verkehrt herum).