Easyelectronics.ru

Электроника для всех
Текущее время: 14 окт 2019, 15:51

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 10 ] 
Автор Сообщение
 Заголовок сообщения: make и создание папок
СообщениеДобавлено: 02 дек 2015, 23:59 
Старожил

Зарегистрирован: 28 дек 2010, 23:30
Сообщения: 340
Написал Makefile:
Код:
PROJECT = MakeTest

LIST_FOLDER = First
LIST_FILES = file1.dat file2.dat file3.dat

TARGET = $(PROJECT).file

LIST = $(addprefix $(LIST_FOLDER)/, $(LIST_FILES))

all: $(TARGET) size

.PHONY: clean distclean

$(TARGET): $(LIST)
   touch $(TARGET)

$(LIST): $(LIST_FOLDER)
   touch $@

$(LIST_FOLDER):
   "mkdir" -p $(LIST_FOLDER)

size: $(TARGET)
   @echo -= Size =-

clean:
   rm -f $(LIST)
   rm -f $(TARGET)

distclean: clean
   -rmdir $(LIST_FOLDER)

Беда в том, что если в папке удалить один из файлов, то все три файла будут пересозданы. Подозреваю, что это связано с изменением даты обращения к папке.
Пробовал через ifeq (,$(wildcard $(LIST_FOLDER))), тоже не решение.
Как сделать просто и/или по феншую?

ЗЫ Файл специально упрощен, для примера.


Последний раз редактировалось Sicorski 03 дек 2015, 01:21, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: make и создание папок
СообщениеДобавлено: 03 дек 2015, 00:27 
Старожил

Зарегистрирован: 17 янв 2013, 13:13
Сообщения: 268
Откуда: Жуковский
Может быть touch -c, что бы запретить создание файлов, если их нет. Либо я не понял.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: make и создание папок
СообщениеДобавлено: 03 дек 2015, 01:16 
Старожил

Зарегистрирован: 28 дек 2010, 23:30
Сообщения: 340
Да, не понял. Просто создай Makefile с текстом что я привёл, вызови make, потом удали скажем file2.dat, и снова вызови make. Будут пересозданы все 4 файла: file1.dat, file2.dat, file3.dat и MakeTest.file. А должен пересоздать только два: file2.dat и MakeTest.file.

В догонку: если после первого вызова make убрать из текста правило $(LIST_FOLDER), то следующий вызов make отработает правильно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: make и создание папок
СообщениеДобавлено: 03 дек 2015, 03:59 
Старожил

Зарегистрирован: 17 янв 2013, 13:13
Сообщения: 268
Откуда: Жуковский
Работает в моем понимании нормально.
1. Запустил make, создался подкаталог в нем 3 файла, а в текущем - файл MakeTest.file.
2. В файл file1.dat редактором занес 1, в file2.dat - 2, в MakeTest.file - 4.
3. Удалил file3.dat
4. Запустил заново, создался файл file3.dat (пустой), остальные файлы остались со своим текстом, т.е. НЕ создались пустые файлы. Обновилось только время модификации всех файлов.
Т.е. всё нормально.

Предполагаю, что непонятность только в слове "пересоздать". В моём понимании - это создать новый пустой файл. Что touch и делает. А если файлы существует, то у них обновляется время модификации или что там, но содержимое не меняется.
Запускал всё под Win10, make (3.81) & touch от mingw.

Makefile раньше частенько использовал, на первый взгляд ничего особенного в нем не нашел.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: make и создание папок
СообщениеДобавлено: 03 дек 2015, 05:27 
Старожил

Зарегистрирован: 22 мар 2010, 22:54
Сообщения: 3995
Sicorski писал(а):
потом удали скажем file2.dat, и снова вызови make. Будут пересозданы все 4 файла: file1.dat, file2.dat, file3.dat и MakeTest.file.

потому что $(LIST): $(LIST_FOLDER) как бы говорит, если $(LIST_FOLDER) новее, то пересобери $(LIST).
нужно сделать так, чтобы сборка файлов не зависела от даты создания каталогов.

например:

$(LIST):
touch $@

будут собираться только файлы которые новее, чем $(TARGET).
а чтобы каталоги-таки создавались, создать их перед созданием файлов, типа:

$(TARGET): $(LIST_FOLDER) $(LIST)
touch $(TARGET)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: make и создание папок
СообщениеДобавлено: 03 дек 2015, 12:32 
Старожил

Зарегистрирован: 28 дек 2010, 23:30
Сообщения: 340
Ink писал(а):
$(TARGET): $(LIST_FOLDER) $(LIST)
touch $(TARGET)

А порядок создания точно будет такой как пишется в зависимостях? Не будет ли ситуации, когда make начнёт создавать $(LIST) до того как создаст $(LIST_FOLDER)? Вроде бы порядок вызова правил может быть любой, если они в одной строке?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: make и создание папок
СообщениеДобавлено: 03 дек 2015, 15:06 
Старожил

Зарегистрирован: 28 дек 2010, 23:30
Сообщения: 340
Проверил на реальном make. Есть ситуация, когда сначала пытается собраться файл из $(LIST) и естественно падает, потому что ещё не создана папка. По логике надо поставить зависимость $(LIST) от $(LIST_FOLDER), но тогда вернемся с чего начали.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: make и создание папок
СообщениеДобавлено: 03 дек 2015, 15:55 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2621
Откуда: Санкт-Петербург
Усугублю: у make есть аргумент -j, который позволяет запускать задачи вообще параллельно.
Вместо зависимости можно просто создавать файл с путём вместе. Что-то типа
mkdir -p $(LIST_FOLDER)
touch $(TARGET)
(mkdir -p при существующей папке ничего не стОит, и экономить на её вызове нет смысла)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: make и создание папок
СообщениеДобавлено: 03 дек 2015, 16:28 
Старожил

Зарегистрирован: 28 дек 2010, 23:30
Сообщения: 340
aamonster писал(а):
Вместо зависимости можно просто создавать файл с путём вместе. Что-то типа
mkdir -p $(LIST_FOLDER)
touch $(TARGET)
(mkdir -p при существующей папке ничего не стОит, и экономить на её вызове нет смысла)

Это не решение, это костыль.
mkdir - отдельное приложение. прежде чем до реальной проверки наличия папки дойдет дело будет выполнена масса действий, типа выделения памяти под процесс, кучу, обращение к файловой системе и т.д. А если файлов в папке 1000? А если 10000? Это не наш метод!
Да и просто интересно разобраться.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: make и создание папок
СообщениеДобавлено: 03 дек 2015, 16:39 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2621
Откуда: Санкт-Петербург
Ну, можете сделать mkdir .PHONY, чтобы вызывался ровно один раз.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 10 ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB