Возможна ли зависимость от символической ссылки в Makefile?

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

Из src/openlayers папки img и theme должны быть связаны символическими ссылками в contrib/openlayers. Папка 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, поэтому символические ссылки каждый раз создаются заново.)


person culebrón    schedule 16.04.2012    source источник


Ответы (2)


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

Вы не показываете, что происходит, когда вы это делаете, но на основе вашего описания происходит одно из двух: либо (а) каталог 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

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

person MadScientist    schedule 16.04.2012

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

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

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

person Markus Kuhn    schedule 02.10.2013
comment
Хорошая точка зрения! Помогли мне понять, почему мое правило все время хотело создать ссылку (stackoverflow.com/a/19213369/1510289) - person Velimir Mlaker; 07.10.2013