Sous Unix, est-ce que je peux lancer 'make' dans un répertoire sans cd'ing d'abord dans ce répertoire?

210

Sous Unix, puis-je exécuter makedans un répertoire sans y cdaccéder au préalable?

user46795
la source

Réponses:

338

make -C /path/to/dir

bmotmans
la source
8
Grump - qui n'est pas de marque standard; ce doit être une extension GNU. Puisque vous dites Linux et Unix, vous ne savez pas exactement ce que vous voulez, mais l'option -C ne fonctionnera pas sur Solaris 10 (/ usr / ccs / bin / make), AIX (/ usr / bin / make) ou HP-UX 11.23 (/ usr / bin / make). Pourtant, 1 sur 4 n'est pas trop mal.
Jonathan Leffler
6
Il fonctionne également dans BSD, donc ce n'est pas seulement une extension GNU.
Chris Dodd
4
assurez-vous que «C» est en majuscules.
m.r226
101

Comme indiqué dans d'autres réponses, make (1) a une -C option pour cela; plusieurs commandes ont des options similaires (par exemple tar). Il est utile de noter que pour d'autres commandes qui manquent de telles options, les éléments suivants peuvent être utilisés:

(cd /dir/path && command-to-run)

Cela exécute la commande dans un sous-shell dont le répertoire de travail a d'abord été modifié (tout en laissant le répertoire de travail du shell parent seul). Ici && est utilisé au lieu de ; pour détecter les cas d'erreur où le répertoire ne peut pas être modifié.

Dave C
la source
22

Si la raison pour laquelle vous ne voulez pas cd dans un répertoire est parce que vous devez rester dans le répertoire en cours pour une tâche ultérieure, vous pouvez utiliser pushd et popd:

pushd ProjectDir ; make ; popd

Cela va dans le ProjectDir, exécute make et revient là où vous étiez.

EnigmaCurry
la source
11

Vous pouvez également utiliser:

make --directory /path/to/dir
korst1k
la source
-3

makefile:

all:
    gcc -Wall -Wpedantic -std=gnu99 -g src/test.c -o build/test

run:
    ./build/test

ou

run:
    ./../build/test

etc.

Oldpilsbury
la source
1
La réponse a complètement manqué la question - il s'agit de savoir comment appeler make, pas comment écrire makefile.
Petr