как предотвратить "ошибка каталога уже существует" в make-файле при использовании mkdir - PullRequest
106 голосов
/ 19 сентября 2008

Мне нужно создать каталог в моем make-файле, и я хотел бы, чтобы «ошибка каталога уже существовала» снова и снова, даже если я могу легко ее игнорировать.

Я в основном использую mingw / msys, но хотел бы что-то, что работает и в других оболочках / системах.

Я пробовал это, но это не сработало, есть идеи?

ifeq (,$(findstring $(OBJDIR),$(wildcard $(OBJDIR) )))
-mkdir $(OBJDIR)
endif

Ответы [ 12 ]

119 голосов
/ 30 мая 2011

Глядя на официальную документацию по изготовлению , вот хороший способ сделать это:

OBJDIR := objdir
OBJS := $(addprefix $(OBJDIR)/,foo.o bar.o baz.o)

$(OBJDIR)/%.o : %.c
    $(COMPILE.c) $(OUTPUT_OPTION) $<

all: $(OBJS)

$(OBJS): | $(OBJDIR)

$(OBJDIR):
    mkdir -p $(OBJDIR)

Вы должны увидеть здесь использование | Трубоукладчик, определяющий заказ только обязательное условие. Это означает, что цель $(OBJDIR) должна существовать (вместо более поздняя ) для построения текущей цели.

Обратите внимание, что я использовал mkdir -p. Флаг -p был добавлен по сравнению с примером документов. Смотрите другие ответы для другой альтернативы.

103 голосов
/ 19 сентября 2008

В UNIX Просто используйте это:

mkdir -p $(OBJDIR)

Параметр -p для mkdir предотвращает сообщение об ошибке, если каталог существует.

66 голосов
/ 19 сентября 2008

Вы можете использовать тестовую команду:

test -d $(OBJDIR) || mkdir $(OBJDIR)
18 голосов
/ 18 сентября 2010

Вот трюк, который я использую с GNU make для создания каталогов вывода компилятора. Сначала определите это правило:

  %/.d:
          mkdir -p $(@D)
          touch $@

Затем сделайте все файлы, которые идут в каталог, зависимыми от файла .d в этом каталоге:

 obj/%.o: %.c obj/.d
    $(CC) $(CFLAGS) -c -o $@ $<

Обратите внимание на использование $ <вместо $ ^. </p>

Наконец, запретите удаление файлов .d автоматически:

 .PRECIOUS: %/.d

Пропуск файла .d, зависящий непосредственно от каталога, не будет работать, поскольку время изменения каталога обновляется каждый раз, когда файл записывается в этот каталог, что приведет к перестройке при каждом вызове make.

13 голосов
/ 19 сентября 2008

Если наличие каталога уже не является для вас проблемой, вы можете просто перенаправить stderr для этой команды, избавившись от сообщения об ошибке:

-mkdir $(OBJDIR) 2>/dev/null
11 голосов
/ 19 сентября 2008

Внутри вашего make-файла:

target:
    if test -d dir; then echo "hello world!"; else mkdir dir; fi
9 голосов
/ 21 июля 2010

в Windows

if not exist "$(OBJDIR)" mkdir $(OBJDIR)

в Unix | Linux

if [ ! -d "$(OBJDIR)" ]; then mkdir $(OBJDIR); fi
7 голосов
/ 06 октября 2008
ifeq "$(wildcard $(MY_DIRNAME) )" ""
  -mkdir $(MY_DIRNAME)
endif
6 голосов
/ 04 февраля 2009
$(OBJDIR):
    mkdir $@

, который также работает для нескольких каталогов, например ..

OBJDIRS := $(sort $(dir $(OBJECTS)))

$(OBJDIRS):
    mkdir $@

Добавление $(OBJDIR) в качестве первой цели работает хорошо.

3 голосов
/ 11 апреля 2012

Работает под mingw32 / msys / cygwin / linux

ifeq "$(wildcard .dep)" ""
-include $(shell mkdir .dep) $(wildcard .dep/*)
endif
...