В стандарте GNU говорится, что не рекомендуется использовать команду -p
для mkdir
:
Например, не используйте ‘mkdir -p’, как бы удобно это ни было, потому что некоторые системы вообще не поддерживают его, а в других это небезопасно для параллельного выполнения.
Я хотел бы придерживаться этого стандарта, и поэтому я столкнулся с проблемой в моем Makefile.
Я рекурсивно компилирую все исходники C из всех каталогов в каталоге src
и хотел бы поместить их в каталог obj
. Та же самая структура каталогов отражается внутри каталога obj
, однако эти каталоги изначально не существуют.
Я мог бы очень легко сделать mkdir -p $(@D)
для создания своих каталогов, но, следуя стандарту GNU, я не могу этого сделать, что подводит меня к моему вопросу: как я могу обойти это в Makefile?
Мой Makefile ниже:
SRCDIR=src
OBJDIR=obj
CC=cc
CFLAGS=
CFLAGS=-g -O2 -pedantic -Wall
ALL_CFLAGS=-std=c89 $(CFLAGS)
# Copied from https://stackoverflow.com/questions/2483182/recursive-wildcards-in-gnu-make/18258352#18258352
rwildcard=$(foreach d, $(wildcard $1/*), $(call rwildcard, $d, $2) $(filter $(subst *, %, $2), $d))
SOURCES=$(call rwildcard, $(SRCDIR), *.c)
OBJECTS=$(subst $(SRCDIR),$(OBJDIR),$(SOURCES:.c=.o))
all: $(OBJECTS)
$(OBJDIR)/%.o: $(SRCDIR)/%.c
$(CC) $(ALL_CFLAGS) -c -o $@ $<