Добро пожаловать, Гость. Пожалуйста авторизуйтесь здесь.
FGHIGate на GaNJa NeTWoRK ST@Ti0N - Просмотр сообщения в эхоконференции RU.UNIX.BSD
Введите FGHI ссылку:


Присутствуют сообщения из эхоконференции RU.UNIX.BSD с датами от 18 Jan 11 22:51:00 до 16 Sep 24 17:28:15, всего сообщений: 10763
Ответить на сообщение К списку сообщений Предыдущее сообщение Следующее сообщение
= Сообщение: 7431 из 10763 ===================================== RU.UNIX.BSD =
От   : Eugene Grosbein                  2:5006/1           14 May 18 17:56:18
Кому : Victor Sudakov                                      14 May 18 17:56:18
Тема : Re: Makefile
FGHI : area://RU.UNIX.BSD?msgid=grosbein.net+c67a81a7
На   : area://RU.UNIX.BSD?msgid=2:5005/49+5af8f833
= Кодировка сообщения определена как: IBM866 =================================
Ответ: area://RU.UNIX.BSD?msgid=grosbein.net+55f41890
Ответ: area://RU.UNIX.BSD?msgid=2:5005/49+5afb91ad
==============================================================================
14 мая 2018, понедельник, в 07:36 NOVT, Victor Sudakov написал(а):

EG>> Так что там в реальности-то? Если это нечто пишет в файл, не создавая
      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^

И в третий раз спрошу, а можно всё-таки услышать ответ?
Потому как теоретически решение от него не зависит,
но практически очень даже.

EG>> собственных блокировок против параллельной записи другой своей копией,
EG>> то эта проблема вообще не имеет отношения к make и решается
EG>> стандартно, приписыванием lockf к вызову этого нечта.
VS> Приписывание lockf IMHO приведёт только к тому, что вторая ветка make дождется
VS> выполнения первого экземпляра нечта и таки запустит второй экземпляр.

It depends. От того, возвращает ли "нечто" когда-нибуь
код ошибки EX_TEMPFAIL (75) и нет. Если нет, то проблема решается через

lockf -t0 ... && [ $? != 75 ] && while [ ! -s foo ]; do sleep 1 || break; done

то есть если lockf вернул EX_TEMPFAIL из-за блокировки,
то это не проблема и мы просто поспим до создания foo.

EG>> foo bar: fileflag
EG>> fileflag: sources
EG>>         lockf /tmp/touch.${.MAKE.PID} touch foo bar && echo -n fileflag
EG>> clean:
EG>>         rm -f fileflag ...
VS> Это некая вариация на тему "Dummy targets" из
VS> https://www.cmcrossroads.com/article/rules-multiple-outputs-gnu-make

И она работает.

VS> "We can work around this by changing the generate_parser rule so that it also
VS> creates a file on disk named "generate_parser"; then on an incremental build,
VS> make will see that the file "generate_parser" is newer than parser.i and will
VS> not rebuild.  But this is messy:  we'll have an extra file hanging around that
VS> serves no purpose other than to work around a *deficiency* *in* *the* *build*
VS> *tool*, and we need to remember to manage that file along with the other outputs
VS> of the build.  It should be deleted by "make clean", for example.  And if
VS> somebody does something like "touch generate_output" in between builds, that
VS> make may not be able to correctly detect that parser.c and parser.h must be
VS> rebuilt.  As with the previous solution, if you only do from-scratch full
VS> builds, this solution will work fine, but with incrementals you need to be
VS> careful."

Я не вижу никаких практических препятствий к использованию этого метода.
Более того, я активно использую его на практике и не только для сборки
чего-нибудь. У меня есть централизованное хранилище конфигов
для удалённых офисов, которые сисадмины центрального офиса могут
править локально и потом используют команду upload, которая просто
говорит cd dir && make upload и Makefile уже разбирается тупо
по timestamps, на который сервер нужно влить копию которого
локального конфига, создавая такие файл-флаги при успехе
и вливая ssh-ем обновления на конкретный сервер именно при отсутствии файл-флага.

И всё работает.

Аргумент if somebody does something like "touch generate_output"
просто смешон, а если самбоди с правами за запись в obj подменит
сгенерированные файлы там и/или подставит им фейковые mtime?

Eugene
--- slrn/1.0.2 (FreeBSD)
* Origin: RDTC JSC (2:5006/1@fidonet)

К главной странице гейта
Powered by NoSFeRaTU`s FGHIGate
Открытие страницы: 0.104877 секунды