makefile 中的符号 link
Symbolic link in makefile
考虑以下 makefile:
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 创建两个符号链接(JNI_SRC_DIR
和 JNI_INC_DIR
)并将 JNI_DIR
设置为它们的依赖项。一切都很好,除了一件事:调用 make dirs
两次创建链接,然后在这些文件夹中链接。我知道这是标准的 ln
符号链接文件夹时的行为,我只是不知道任何 ln
选项标志来防止它没有错误(-n
这样做但是用一个错误)。不管怎样,我想改变的是make
运行 第二次的规则。显然它也遵循符号链接,但我只是想让它检查它们是否存在:
这是一个示例输出,包含三个调用:
$ 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'.
我希望第二次表现得像第三次一样,因为符号链接已经存在。
发生的事情是,当第一次 make dirs
调用创建符号链接时,目录的修改时间会更新。因为您对目录有依赖性,这意味着下次您 运行 make dirs
、make
确定目标已过时。
您可以将 $(JNI_DIR)
的依赖改为 order-only prerequisite,如下所示:
$(JNI_SRC_DIR): | $(JNI_DIR)
ln -s $(BASE_SRC_DIR) $@
$(JNI_INC_DIR): | $(JNI_DIR)
ln -s $(BASE_INC_DIR) $@
这告诉 make
如果目录不存在则创建 $(JNI_DIR)
,但如果目录已更新则不会重新创建链接。
考虑以下 makefile:
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 创建两个符号链接(JNI_SRC_DIR
和 JNI_INC_DIR
)并将 JNI_DIR
设置为它们的依赖项。一切都很好,除了一件事:调用 make dirs
两次创建链接,然后在这些文件夹中链接。我知道这是标准的 ln
符号链接文件夹时的行为,我只是不知道任何 ln
选项标志来防止它没有错误(-n
这样做但是用一个错误)。不管怎样,我想改变的是make
运行 第二次的规则。显然它也遵循符号链接,但我只是想让它检查它们是否存在:
这是一个示例输出,包含三个调用:
$ 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'.
我希望第二次表现得像第三次一样,因为符号链接已经存在。
发生的事情是,当第一次 make dirs
调用创建符号链接时,目录的修改时间会更新。因为您对目录有依赖性,这意味着下次您 运行 make dirs
、make
确定目标已过时。
您可以将 $(JNI_DIR)
的依赖改为 order-only prerequisite,如下所示:
$(JNI_SRC_DIR): | $(JNI_DIR)
ln -s $(BASE_SRC_DIR) $@
$(JNI_INC_DIR): | $(JNI_DIR)
ln -s $(BASE_INC_DIR) $@
这告诉 make
如果目录不存在则创建 $(JNI_DIR)
,但如果目录已更新则不会重新创建链接。