Символическая ссылка в make-файле

Рассмотрим следующий make-файл:

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)

Этот make-файл создает две символические ссылки (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'.

Я бы хотел, чтобы второй раз вел себя как третий, так как символические ссылки уже есть.

1 ответ

Решение

Происходит то, что, когда символические ссылки создаются первым make dirs вызов, время модификации каталога обновляется. Поскольку у вас есть зависимость от каталога, это означает, что при следующем запуске make dirs, make решает, что цели устарели.

Вы можете изменить зависимость от $(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) если он не существует, но он не будет воссоздавать ссылки, если каталог был обновлен.

Другие вопросы по тегам