내 makefile에 디렉토리를 생성해야하며 쉽게 무시할 수 있지만 “디렉토리가 이미 존재 함 오류”를 반복해서 표시하지 않으려 고합니다.
나는 주로 mingw / msys를 사용하지만 다른 쉘 / 시스템에서도 작동하는 것을 원합니다.
나는 이것을 시도했지만 작동하지 않았다, 어떤 아이디어?
ifeq (,$(findstring $(OBJDIR),$(wildcard $(OBJDIR) )))
-mkdir $(OBJDIR)
endif
답변
UNIX에서는 다음을 사용하십시오.
mkdir -p $(OBJDIR)
mkdir에 대한 -p 옵션은 디렉토리가 존재하는 경우 오류 메시지를 방지합니다.
답변
보면 공식 메이크업 문서 , 여기에 그것을 할 수있는 좋은 방법입니다 :
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
플래그가 문서의 예를 비교 하였다. 다른 대안에 대해서는 다른 답변을 참조하십시오.
답변
test 명령을 사용할 수 있습니다.
test -d $(OBJDIR) || mkdir $(OBJDIR)
답변
다음은 컴파일러 출력 디렉토리를 만들기 위해 GNU make와 함께 사용하는 트릭입니다. 먼저이 규칙을 정의하십시오.
%/.d:
mkdir -p $(@D)
touch $@
그런 다음 해당 디렉토리의 .d 파일에 종속 된 디렉토리로 이동하는 모든 파일을 만듭니다.
obj/%.o: %.c obj/.d
$(CC) $(CFLAGS) -c -o $@ $<
$ ^ 대신 $ <를 사용하십시오.
마지막으로 .d 파일이 자동으로 제거되지 않도록합니다.
.PRECIOUS: %/.d
.d 파일을 건너 뛰고 디렉토리에 직접 의존하는 것은 파일이 해당 디렉토리에 기록 될 때마다 디렉토리 수정 시간이 업데이트되어 make를 호출 할 때마다 강제로 다시 작성되므로 작동하지 않습니다.
답변
디렉토리가 이미 존재하는 것이 문제가되지 않는 경우 해당 명령에 대한 stderr을 리디렉션하여 오류 메시지를 제거 할 수 있습니다.
-mkdir $(OBJDIR) 2>/dev/null
답변
메이크 파일 내부 :
target:
if test -d dir; then echo "hello world!"; else mkdir dir; fi
답변
Windows에서
if not exist "$(OBJDIR)" mkdir $(OBJDIR)
유닉스에서 | 리눅스
if [ ! -d "$(OBJDIR)" ]; then mkdir $(OBJDIR); fi