【问题标题】:Symbolic link in makefilemakefile 中的符号链接
【发布时间】:2016-09-05 15:19:44
【问题描述】:

考虑以下生成文件:

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_DIRJNI_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'.

我希望第二次表现得像第三次,因为符号链接已经存在。

【问题讨论】:

    标签: makefile ln


    【解决方案1】:

    发生的情况是,当第一次 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) 不存在,则创建它,但如果目录已更新,它不会重新创建链接。

    【讨论】:

    • 所以每次我在里面创建一个新目录时,目录的修改日期都会改变?
    • @AndréFratelli 是的,无论何时添加或删除某些内容。 (虽然不是递归的——只是在目录的顶层)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-06
    • 2020-12-20
    相关资源
    最近更新 更多