web-dev-qa-db-ja.com

makefileの現在の作業ディレクトリ

私は次のディレクトリ構造を持っています

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

Makefileのルールの1つがlatex data/report.texを実行します。作業ディレクトリはprojectなので、report.dviとその他の出力ファイルのみを取得しています。 ./dataでそれらを取得するにはどうすればよいですか?

また、レポートにはplot_1.epsを含めました。しかし、それでもパスdata/plot_1.epsを期待しています。 latexが実行される現在の作業ディレクトリを基準にしたファイルパスを指定する必要がありますか?またはreport.texの場所?

Makefileで、私は試しました

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

しかし、これは作業ディレクトリを変更せず、問題は解決しません。何をすべきか?

12
Shashwat

これは、メイクファイルでよくある「落とし穴」です。各コマンドは独自のシェルで実行されるため、「cd」はそのシェル内でのみ発生しますが、後続のコマンドはmakeの現在のディレクトリから再度実行されます。

あなたがしたいことは、すべてのコマンドを1行に置くことです(そしてあなたは "cd .."を必要としません):

cd data && latex report.tex

または、行の終わりで\を使用して、行を連結してすべてをシェルに渡すようにmakeに指示します。コマンドを区切るには、;または&&が必要であることに注意してください。

cd data && \
latex report.tex
26
ArtemB

ラテックスが出力ファイルを置く場所と入力ファイルを見つけることを期待する場所の問題は、makeとは何の関係もありません。 latexを取得して、希望どおりに動作させる方法を見つける必要があります。おそらく、出力を配置する場所とインクルードファイルを検索する場所を制御するフラグなどがあります。質問にはlatexタグを使用してください。

ディレクトリの変更に関しては、レシピの個々の行が異なるシェルで実行されるため、1行でディレクトリを変更してから、次の行でそれを有効にすることはできません。作業ディレクトリ(UNIXシステムの場合)は現在のプロセスの機能であり、そのプロセスが終了すると失われます。

あなたは次のようなものを書きたいと思います:

reportdvi: outputparser
         cd data && latex report.tex

(私が言ったように、作業ディレクトリの変更は現在のコマンドに対してのみ有効になるため、cd ..する必要はありません)

1
MadScientist

同様の問題があり、ディレクトリの変更後にプログラムを実行すると、ディレクトリの「位置」のプログラムビューに対して何も実行されないことがわかりました。その後、次のように解決できることがわかりました。

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

パランセシスがない場合、「yourprogram.exe」は、ディレクトリ位置ビューとしてmakefileの現在のディレクトリを保持します。

0
serup