LINUX.ORG.RU

[Makefile] Почему make делает то что уже сделано?

 


0

0

Вот Makefile:

all: build/program1 build/program2

build/program1: build
	touch $@

build/program2:
	touch $@

build:
	mkdir $@

Запускаем:

$ make
mkdir build
touch build/program1
touch build/program2
$ make
touch build/program1
$ make
make: Nothing to be done for `all'.

Спрашивается, почему при втором запуске он делает то, что уже было сделано?

P.S. Если перенести зависимость build в all, то всё работает правильно. Это выглядит карсивее и правильнее. Но теоретически, приведённое содержимое Makefile'а тоже должно работать.

Ответ на: комментарий от dilmah

Каюсь, изначально проверял только в Cygwin. Работает так как я написал. Сейчас проверил в GNU/Linux - работает так как должно.

Но даже не смотря на это, всё равно странно, потому как версии программы make одинаковые - 3.81.

LinuxUser ★★★
() автор топика
Ответ на: комментарий от dilmah

ага, становится светлее.

Если сделать sleep после каждой команды в Makefile, то воспроизводится везде:

$ make
mkdir build; sleep 1
touch build/program1; sleep 1
touch build/program2; sleep 1

$ make
touch build/program1; sleep 1

$ make
make: Nothing to be done for `all'.

dilmah ★★★★★
()

ну ты Славик, лошара!

touch build/program2 ведб обновляет build -- значит program1 теперь устарел!

dilmah ★★★★★
()

Потому что после 'touch build/program2' директория (цель) 'build' меняется (размер, дата)

ip1981 ☆☆
()
Ответ на: комментарий от true_admin

> ржачно вышло. Значит в обычной ОС ctime таки с точностью до секунды, если не брать ext4.

А в виндах (=цигвине) с точностью до 2 секунд!

Кстати, из-за этого древняя wget (а может и щас, не проверял) многократно перекачивала файл в режиме mirror -- файл имел дату допустим 31 секунда, винды делали из этого 30 секунд, новый запуск wget требовал перекачать...

www_linux_org_ru ★★★★★
()

>P.S. Если перенести зависимость build в all, то всё работает правильно. Это выглядит карсивее и правильнее.
угу, особенно если учесть, что некоторые задачи могут распараллеливаться...
так что правильней:
-all: build/program1 build/program2
+all: build build/program1 build/program2

или

-build/program2:
+build/program2: build

xydo ★★
()

Всем спасибо. :)

LinuxUser ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.