[makefile] mkdir을 사용할 때 makefile에서 “directory already exists error”를 방지하는 방법

내 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