gpt4 book ai didi

makefile - makefile 中的符号链接(symbolic link)

转载 作者:行者123 更新时间:2023-12-05 03:10:37 26 4
gpt4 key购买 nike

考虑以下生成文件:

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 创建两个符号链接(symbolic link)(JNI_SRC_DIRJNI_INC_DIR)并将 JNI_DIR 设置为它们的依赖项。一切都很好,除了一件事:调用 make dirs 两次创建链接,然后在这些文件夹中链接。我知道这是标准的 ln 符号链接(symbolic link)文件夹时的行为已经存在,我只是不知道任何 ln 选项标志来防止它没有错误( -n 执行但有错误)。不管怎样,我想改变的是 make 第二次运行规则。显然它也遵循符号链接(symbolic link),但我只是想让它检查它们是否存在:

这是一个示例输出,包含三个调用:

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

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

最佳答案

发生的事情是,当符号链接(symbolic link)由第一个 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) $@

如果 $(JNI_DIR) 不存在,这会告诉 make 创建它,但如果目录已更新,它不会重新创建链接。

关于makefile - makefile 中的符号链接(symbolic link),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39333586/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com