makefile 中的符号链接

And*_*lli 4 makefile ln

考虑以下 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)
Run Code Online (Sandbox Code Playgroud)

该 makefile 创建两个符号链接(JNI_SRC_DIRJNI_INC_DIR)并将 a 设置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'.
Run Code Online (Sandbox Code Playgroud)

我希望第二次的行为与第三次相同,因为符号链接已经存在。

Ism*_*awi 5

发生的情况是,当第一次调用创建符号链接时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) $@
Run Code Online (Sandbox Code Playgroud)

如果目录不存在,则指示make创建$(JNI_DIR),但如果目录已更新,则不会重新创建链接。