не получается: какие-то подкаталоги бывает появляются раньше.
я чтобы make не путать, делаю touch всему дереву ниже создаваемого файла/каталога:${WORKDIR}${FILE}: ${WORKDIR}
install myfile ${WORKDIR}/
find ${WORKDIR}/ | while read $$NAME; do touch $$NAME; doneтакой вот циклище каждому файлу.
а если не сделать, время модификации ${WORKDIR} становится моложе подкаталогов и сценарий пытается пересоздать уже созданное.Можно было бы выстроить граф более строго и исключить независимые, но пересекающиеся каталогами ветки. Поставить их в строгую очередь, одну за другой. Но не хочется. Они ведь независимы! А т.к. все возможные пересечения отследить очень сложно, я и приписал такой TOUCH почти каждому файлу.
Вопрос гуру: правильно ли я делаю и не делается ли это более простыми средствами?
>правильно ли я делаю и не делается ли это более
>простыми средствами?А что, собственно, вы хотите сделать? В чём конкретно состоит задача?
>А что, собственно, вы хотите сделать? В чём конкретно состоит задача?собираю свою (специализированную) версию дистрибутива RH из того, который у меня на диске.
создаю дерево каталогов и копирую туда нужные мне файлы, создаю сценарии.
потом упаковываю это на загрузочный CD.хочется сделать создание веток дерева каталогов независимым друг от друга.
но если я создаю подкаталог в точке пересечения этих веток, в корне, например, то дата модификации корня становится моложе всех уже существующих ниже веток. после чего make пытается пересоздать все уже существующие цели, если на них показать.можно написать сценарий так, чтобы он их пересоздавал без аварийного завершения, но тогда исчезает одно из главных ценных свойств make-а: не делать уже сделанное.
я не слишком многословен ;-)?
А в чём смысл зависимости файлов от времени изменения директорий, в которых они находятся?
>А в чём смысл зависимости файлов от времени изменения директорий, в которых
>они находятся?чтобы создать в каталоге файлы (подкаталоги), нужно создать сначала каталог
КАТАЛОГ:
mkdir КАТАЛОГу подкаталогов показываем зависимость, т.к. если КАТАЛОГ не будет, сценарий завершится с ошибкой.
ПОДКАТАЛОГ_1: КАТАЛОГ
mkdir ПОДКАТАЛОГ1ПОДКАТАЛОГ_2: КАТАЛОГ
mkdir ПОДКАТАЛОГ_2Получается две ветки подкаталогов, которые пересекаются в КАТАЛОГЕ.
Теперь, если мы создали ПОДКАТАЛОГ_1 (в нём сценарий сгенерил кучу файлов) мы балдеем! нам клёво!
Но если мы ПОСЛЕ этого создадим ПОДКАТАЛОГ_2, время модификации КАТАЛОГ станет моложе, чем вся ветка ПОДКАТАЛОГ_1. В результате make пытается всю эту ветку пересоздать, если на неё показать. Чего нафиг не надо.
Понятно?
В общем, я думаю особо простого решения тут нет.
Нужно выделить все точки пересечения в отдельные цели и показывать зависимость подкаталогов от них. Тогда можно будет touch делать только раз в конце создания в каталоге всех файлов. Или применять уже найденное решение, не такое уж оно и плохое.
>В общем, я думаю особо простого решения тут нет.
>Нужно выделить все точки пересечения в отдельные цели и показывать зависимость подкаталогов
>от них. Тогда можно будет touch делать только раз в конце
>создания в каталоге всех файлов. Или применять уже найденное решение, не
>такое уж оно и плохое.Можно получить список всех необходимых директорий, а затем создать их все с помощью mkdir -p.
Допустим есть файл list, в котором содержится список всего, что нужно скопировать в $DESTDIR. Делаем:(while read i; do echo `dirname $i`; done) < list | sort | uniq > dirlist
(while read i; do mkdir -p $DESTDIR$i; done) < dirlist
(while read i; do cp $i $DESTDIR$i; done) < listи никаких заморочек с Makefile не нужно. list - что-то вроде:
/bin/sh
/bin/cp
/bin/ls
/usr/bin/vi
...Если в именах есть пробелы, нужно сделать соответствующие дополнительные телодвижения; если список изначально отсортирован (хотя бы по директориям), sort не нужен; ещё было бы неплохо позаботиться о корректных правах/владельцах директорий/файлов и т.д. Словом, дальше можно проявить полёт фантазии...
А ещё можно поискать - наверняка этой проблемой уже озаботилась куча народу и есть готовые проверенные решения.