Зависимость от возможного симлинк в Makefile?

мне нужна пара символических ссылок в моем проекте.

С src/openlayers папки img и theme должны быть symlinked в contrib/openlayers. The contrib/openlayers папка также должна быть создана автоматически.

.PHONY: run
run: contrib/openlayers/theme contrib/openlayers/img
   ../bin/pserve development.ini --reload

contrib/openlayers/theme:
    ln -s src/openlayers/theme $@

contrib/openlayers/img:
    ln -s src/openlayers/img $@

но это правило пытается создавать символические ссылки каждый раз. (Я положил -f флаг ln, поэтому он каждый раз создает символические ссылки.)

2 ответов


конечно, это может работать. Make рассматривает все как файл, включая символическую ссылку. Он проверит, существует ли файл (поскольку вы не перечисляете никаких предварительных условий, нет сравнения временных меток). В случае символической ссылки это действительно проверка того, на что указывает ссылка, конечно, а не сама ссылка.

вы не показываете, что происходит, когда вы это делаете, но на основе вашего описания происходит одна из двух вещей: либо (a) каталог contrib/openlayers не существует, поэтому ln команда генерирует ошибку и не создает символическую ссылку, поэтому, конечно, make попытается воссоздать ее при следующем запуске, или (b) ваша символическая ссылка создается неправильно и указывает ни на что, что означает, когда make пытается увидеть, существует ли она, она терпит неудачу и make попытается воссоздать ее.

если, например,src каталог является братом вашего contrib каталог, тогда ваши символические ссылки просто неправильны; вы получите:

contrib/openlayers/theme -> src/openlayers/theme

или, когда ядро пытается решить это:

contrib/openlayers/src/openlayers/theme

маловероятно, что это то, что вы хотите. Я предлагаю вам использовать что-то вроде этого:

contrib/openlayers/theme:
        mkdir -p contrib/openlayers
        ln -s ../../src/openlayers/theme contrib/openlayers/theme

затем убедитесь, что символическая ссылка, после создания точки, где вы хотите пойти.


Если вы когда-нибудь столкнетесь с этой проблемой, несмотря на то, что ваша символическая ссылка правильно указывает на существующий файл: также имейте в виду, что "make" смотрит на mtime целевого файла символической ссылки и не в mtime самой символической ссылки.

поэтому, если правило, вызывающее "ln-s", имеет любую зависимость, которая новая чем файл, на который указывает ваша символическая ссылка, тогда "make" должен каждый раз повторять команды в этом правиле. Оно будет делайте это снова и снова, потому что создание символической ссылки, указывающей на файл, не обновляет mtime этого файла.

вы можете использовать команду "touch", чтобы убедиться, что назначение вашей ссылки имеет более недавнее mtime, чем ваша зависимость.