web-dev-qa-db-fra.com

Répertoire de travail actuel du makefile

J'ai la structure de répertoire suivante

project
|-- Makefile
|-- data
    |-- report.tex
    |-- plot_1.eps

Une des règles de la Makefile exécute latex data/report.tex. Comme le répertoire de travail est project, j'obtiens seulement report.dvi et les autres fichiers de sortie. Comment puis-je les obtenir dans ./data?

De plus, j'ai inclus plot_1.eps dans le rapport. Mais attend toujours le chemin data/plot_1.eps. Devons-nous donner le chemin du fichier par rapport au répertoire de travail en cours à partir duquel latex est exécuté? Ou l'emplacement de report.tex?

Dans la Makefile, j'ai essayé

reportdvi: outputparser
        cd data
        latex report.tex
        cd ..

Mais cela n'a pas changé le répertoire de travail et le problème persiste. Que faire?

12
Shashwat

C'est un "gotcha" commun dans les makefiles. Chaque commande étant exécutée dans son propre shell, "cd" n'apparaît que dans ce shell, mais les commandes suivantes sont réexécutées à partir du répertoire actuel de make.

Ce que vous voulez faire est de mettre toutes les commandes sur une seule ligne (et vous n'avez pas besoin de "cd .."):

cd data && latex report.tex

ou utilisez \ à la fin de la ligne pour indiquer à make de concaténer les lignes et de toutes les transmettre au shell. Notez que vous avez toujours besoin de ; ou && pour séparer les commandes.

cd data && \
latex report.tex
26
ArtemB

La question de savoir où latex met ses fichiers de sortie et où il s'attend à trouver des fichiers d'entrée n'a rien à voir avec make. Vous devez savoir comment obtenir latex se comporter comme vous le souhaitez. Vraisemblablement, il y a des drapeaux ou similaires pour contrôler où placer la sortie et où trouver les fichiers inclus. Utilisez les balises latex pour votre question.

En ce qui concerne la modification des répertoires, chaque ligne de la recette est exécutée dans un shell différent. Vous ne pouvez donc pas modifier les répertoires sur une seule ligne, puis les appliquer à la ligne suivante: le répertoire de travail (sous UNIX) est un répertoire. fonction du processus en cours et est perdue une fois ce processus terminé.

Vous voulez écrire quelque chose comme:

reportdvi: outputparser
         cd data && latex report.tex

(vous n'êtes pas obligé de cd .., car comme je l'ai dit, les modifications du répertoire de travail ne prennent effet que pour la commande en cours)

1
MadScientist

Ayant un problème similaire, j’ai constaté que lors de l’exécution des programmes après le changement de répertoire, il ne faisait rien pour la vue des programmes de son répertoire "position";

(cd ../../../yourdir && ./yourprogram.exe parameters) > output &

sans parenthèse, "yourprogram.exe" conservera le répertoire actuel de makefiles comme vue de position du répertoire.

0
serup