Мне нужно создать каталог в моем make-файле, и я бы не хотел, чтобы снова и снова появлялась ошибка «каталог уже существует», даже если я легко могу ее игнорировать.
Я в основном использую mingw / msys, но хотел бы, чтобы что-то работало и в других оболочках / системах.
Я пробовал это, но это не сработало, есть идеи?
ifeq (,$(findstring $(OBJDIR),$(wildcard $(OBJDIR) )))
-mkdir $(OBJDIR)
endif
-p
не работает в Windows, о чем, вероятно, и задается вопрос. Не знаю, как это вообще было принято.make -p
Unix или Linux?Взглянув на официальную документацию make , вот хороший способ сделать это:
Вы должны увидеть здесь использование | оператор pipe, определяющий только предварительное условие заказа. Это означает, что
$(OBJDIR)
цель должна существовать (а не более поздней ), чтобы создать текущую цель.Обратите внимание, что я использовал
mkdir -p
.-p
Флаг был добавлен по сравнению с примером Документов. См. Другие ответы для другой альтернативы.источник
$(OBJDIR)
цель должна существовать » . Сделайте проверки наличия файла (и отметок времени), чтобы решить, нужно ли создавать цель. Следовательно, здесь, если$(OBJDIR)
он отсутствует, он будет строить его, так что он существует , чтобы построить текущую цель$(OBJS)
, которая будет создана внутри.Вы можете использовать тестовую команду:
источник
make -j
) из-за состояния гонки между проверкой существования каталога и его созданием. Одно задание может проверить, что его нет, но перед его созданием другое задание создает каталог. Затем, когда первая попытается это сделать, это не удастся, потому что каталог уже существует. Лучшее решение в этом случае - использовать предварительные условия только для порядка, как указано в ответе @ TeKa (который должен быть принятым ответом).Вот трюк, который я использую с GNU make для создания каталогов вывода компилятора. Сначала определите это правило:
Затем сделайте все файлы, которые входят в каталог, зависимыми от файла .d в этом каталоге:
Обратите внимание на использование $ <вместо $ ^.
Наконец, предотвратите автоматическое удаление файлов .d:
Пропуск файла .d и прямая зависимость от каталога не сработает, поскольку время модификации каталога обновляется каждый раз, когда файл записывается в этот каталог, что приводит к принудительной перестройке при каждом вызове make.
источник
Если наличие каталога уже не является проблемой для вас, вы можете просто перенаправить stderr для этой команды, избавившись от сообщения об ошибке:
источник
Внутри вашего make-файла:
источник
В Windows
В Unix | Linux
источник
/bin/sh: 1: Syntax error: end of file unexpected (expecting "then")
источник
Что также работает для нескольких каталогов, например.
Добавление
$(OBJDIR)
в качестве первой цели работает хорошо.источник
Работает под mingw32 / msys / cygwin / linux
источник
Если вы явно проигнорируете код возврата и сбросите поток ошибок, ваша программа make проигнорирует ошибку, если она возникнет:
Это не должно вызывать опасности гонки в параллельной модели - но я не проверял это, чтобы быть уверенным.
источник
Немного проще, чем ответ Ларса:
и общее правило:
Нет touch-файлов, которые нужно чистить или делать .PRECIOUS :-)
Если вы хотите увидеть еще один общий трюк с gmake или если вас интересует нерекурсивный make с минимальным набором шаблонов , вы можете попробовать еще два дешевых трюка с gmake и другие сообщения, связанные с make, в этом блоге.
источник