8

プロジェクトにいくつかのシンボリックリンクが必要です。

からsrc/openlayers、フォルダimgthemeはでシンボリックリンクする必要がありますcontrib/openlayerscontrib/openlayersフォルダも自動的に作成されます。

.PHONY: run
run: contrib/openlayers/theme contrib/openlayers/img
   ../bin/pserve development.ini --reload

contrib/openlayers/theme:
    ln -s src/openlayers/theme $@

contrib/openlayers/img:
    ln -s src/openlayers/img $@

ただし、このルールは毎回シンボリックリンクを作成しようとします。(-fフラグを付けlnたので、毎回シンボリックリンクを再作成します。)

4

2 に答える 2

20

シンボリックリンクが既存のファイルを正しく指しているにもかかわらずこの問題が発生した場合:「make」はシンボリックリンクのmtimeではなく、シンボリックリンクの宛先ファイルのmtimeを参照することにも注意してください。自体。

したがって、「ln -s」を呼び出すルールに、シンボリックリンクが指すファイルよりも新しい依存関係がある場合、「make」はそのルールのコマンドを毎回再実行する必要があります。ファイルを指すシンボリックリンクを作成してもそのファイルのmtimeは更新されないため、これは何度も繰り返されます。

「touch」コマンドを使用して、リンクの宛先が依存関係よりも新しいmtimeであることを確認できる場合があります。

于 2013-10-02T13:32:49.947 に答える
3

確かに、これは機能します。Makeは、シンボリックリンクを含め、すべてをファイルのように扱います。ファイルが存在するかどうかをチェックします(前提条件をリストしていないため、タイムスタンプの比較はありません)。シンボリックリンクの場合は、もちろん、リンク自体ではなく、リンクが指しているものを実際にチェックしています。

これを行ったときに何が起こるかは示されていませんが、説明に基づいて、次の2つのいずれかが発生しています。(a)contrib / openlayersディレクトリが存在しないため、lnコマンドがエラーを生成し、シンボリックリンクを作成していません。もちろん、makeは次に実行するときに再作成を試みます。または、(b)シンボリックリンクが正しく作成されておらず、何も指していません。つまり、makeが存在するかどうかを確認しようとすると失敗し、makeは再作成を試みます。

たとえば、srcディレクトリがディレクトリの兄弟であるcontrib場合、シンボリックリンクは間違っています。あなたが得るでしょう:

contrib/openlayers/theme -> src/openlayers/theme

または、カーネルがそれを解決しようとしたとき:

contrib/openlayers/src/openlayers/theme

それがあなたが望むものである可能性は非常に低いです。次のようなものを使用することをお勧めします。

contrib/openlayers/theme:
        mkdir -p contrib/openlayers
        ln -s ../../src/openlayers/theme contrib/openlayers/theme

次に、シンボリックリンクが作成されたら、実際に目的の場所を指していることを確認します。

于 2012-04-16T21:21:17.807 に答える