2012-04-16 3 views
7

Мне нужен пара символических ссылок в моем проекте.Является ли зависимость от символической ссылки возможной в 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 [email protected] 

contrib/openlayers/img: 
    ln -s src/openlayers/img [email protected] 

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

ответ

3

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

Вы не показываете, что происходит, когда вы делаете это, но на основе вашего описания происходит одна из двух вещей: либо (a) каталог contrib/openlayers не существует, поэтому команда ln генерирует ошибку, а не создание символической ссылки, поэтому, конечно, попытка будет пытаться воссоздать ее в следующий раз, когда она будет запущена, или (б) ваша символическая ссылка создается некорректно и ничего не указывает, а значит, когда 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 

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

+0

Вы правы, символические ссылки были сломаны. –

12

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

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

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

+1

Хорошая точка! Помог мне понять, почему мое правило продолжало создавать ссылку (http://stackoverflow.com/a/19213369/1510289) –