2

次のメイクファイルを検討してください。

SHELL = /bin/sh

MY_DIR := $(realpath ./)

BASE_DIR := $(realpath ../..)
BASE_SRC_DIR = $(BASE_DIR)/src
BASE_INC_DIR = $(BASE_DIR)/include

HUL_DIR = $(MY_DIR)/hul

JNI_DIR = $(HUL_DIR)/jni
JNI_SRC_DIR = $(JNI_DIR)/src
JNI_INC_DIR = $(JNI_DIR)/include

dirs: $(JNI_SRC_DIR) $(JNI_INC_DIR)

$(JNI_SRC_DIR): $(JNI_DIR)
    ln -s $(BASE_SRC_DIR) $@

$(JNI_INC_DIR): $(JNI_DIR)
    ln -s $(BASE_INC_DIR) $@

$(JNI_DIR):
    mkdir -p $(JNI_DIR)

この makefile は 2 つのシンボリック リンク (JNI_SRC_DIRおよびJNI_INC_DIR) を作成JNI_DIRし、それらの依存関係として を設定します。1 つのことを除いて、すべて問題ありません。2 回呼び出すmake dirsと、リンクが作成され、次にそれらのフォルダー内にリンクが作成されます。これは、既に存在するフォルダーをシンボリックリンクするときの標準的な動作であることを知っていますが、エラーなしでそれを防ぐためのオプションフラグがlnわかりません(実行しますが、エラーがあります)。とにかく変更したいのは、ルールを 2 回実行することです。どうやらシンボリックリンクもたどっているようですが、シンボリックリンクがあるかどうかを確認したいだけです:ln-nmake

3 つの呼び出しを含む出力例を次に示します。

$ make dirs
mkdir -p /Users/fratelli/Documents/hul/platform/android/hul/jni
ln -s /Users/fratelli/Documents/hul/src /Users/fratelli/Documents/hul/platform/android/hul/jni/src
ln -s /Users/fratelli/Documents/hul/include /Users/fratelli/Documents/hul/platform/android/hul/jni/include

$ make dirs
ln -s /Users/fratelli/Documents/hul/src /Users/fratelli/Documents/hul/platform/android/hul/jni/src
ln -s /Users/fratelli/Documents/hul/include /Users/fratelli/Documents/hul/platform/android/hul/jni/include

$ make dirs
make: Nothing to be done for `dirs'.

シンボリックリンクが既に存在するため、2 回目は 3 回目として動作させたいと思います。

4

1 に答える 1

3

何が起こっているかというと、最初のmake dirs呼び出しでシンボリック リンクが作成されると、ディレクトリの変更時刻が更新されます。ディレクトリに依存しているため、次に を実行したときに、ターゲットが古くなっていると判断されますmake dirsmake

$(JNI_DIR)次のように、依存関係を注文のみの前提条件に変更できます。

$(JNI_SRC_DIR): | $(JNI_DIR)
    ln -s $(BASE_SRC_DIR) $@

$(JNI_INC_DIR): | $(JNI_DIR)
    ln -s $(BASE_INC_DIR) $@

これは、存在しない場合はmake作成するように指示しますが、ディレクトリが更新されている場合はリンクを再作成しません。$(JNI_DIR)

于 2016-09-05T15:31:41.843 に答える