كيفية منع "الدليل موجود بالفعل خطأ" في makefile عند استخدام mkdir

StackOverflow https://stackoverflow.com/questions/99132

  •  01-07-2019
  •  | 
  •  

سؤال

أنا بحاجة إلى إنشاء دليل في makefile وأود أن لا تحصل على "الدليل موجود بالفعل خطأ" على الرغم من أنني يمكن بسهولة تجاهل ذلك.

أنا أساسا استخدام مينغو/msys ولكن أود شيء يعمل عبر قذائف أخرى/نظم جدا.

حاولت ذلك ولكن لم ينجح أي أفكار ؟

ifeq (,$(findstring $(OBJDIR),$(wildcard $(OBJDIR) )))
-mkdir $(OBJDIR)
endif
هل كانت مفيدة؟

المحلول

على يونكس فقط استخدام هذا:

mkdir -p $(OBJDIR)

الخيار-p إلى mkdir يمنع ظهور رسالة خطأ إذا كان الدليل موجودا.

نصائح أخرى

تبحث في الرسمية جعل الوثائق, هنا هو وسيلة جيدة للقيام بذلك:

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 -d $(OBJDIR) || mkdir $(OBJDIR)

هنا هو خدعة أنا استخدم مع جنو جعل لخلق مترجم-إخراج الدلائل.أولا تعريف هذه القاعدة:

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

ثم جعل جميع الملفات التي تدخل في الدليل تعتمد على .د ملف في هذا الدليل:

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

ملاحظة استخدام $< بدلا من $^.

وأخيرا منع .د الملفات من يتم إزالتها تلقائيا:

 .PRECIOUS: %/.d

تخطي .د الملف ، اعتمادا مباشرا على الدليل ، بما في ذلك الدليل تعديل الوقت يتم تحديثها في كل مرة تتم كتابة ملف في هذا الدليل ، والذي من شأنه أن قوة بناء في كل احتجاج من جعل.

إذا كان وجود الدليل موجودة بالفعل ليست مشكلة بالنسبة لك, هل يمكن أن مجرد توجيه stderr لهذا الأمر ، والتخلص من رسالة الخطأ:

-mkdir $(OBJDIR) 2>/dev/null

داخل ملف makefile:

target:
    if test -d dir; then echo "hello world!"; else mkdir dir; fi

على ويندوز

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

على يونكس | لينكس

if [ ! -d "$(OBJDIR)" ]; then mkdir $(OBJDIR); fi
ifeq "$(wildcard $(MY_DIRNAME) )" ""
  -mkdir $(MY_DIRNAME)
endif
$(OBJDIR):
    mkdir $@

الذي يعمل أيضا على الدلائل متعددة, e.ز..

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

$(OBJDIRS):
    mkdir $@

إضافة $(OBJDIR) كما الهدف الأول يعمل بشكل جيد.

يعمل تحت mingw32/msys/cygwin/لينكس

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

إذا كنت صراحة تجاهل رمز الإرجاع و تفريغ تيار الخطأ ثم جعل الخاص بك سوف تجاهل الخطأ إذا كان يحدث:

mkdir 2>/dev/null || true

هذا لا ينبغي أن يسبب سباق الخطر في موازاة ذلك جعل لكني لم اختباره للتأكد.

أبسط قليلا من لارس الجواب:

something_needs_directory_xxx : xxx/..

و قاعدة عامة:

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

لا تلمس ملفات لتنظيف أو جعل .الثمينة :-)

إذا كنت تريد أن ترى قليلا آخر عام gmake خدعة, أو إذا كنت ترغب في غير متكررة تجعل مع الحد الأدنى من السقالات ، قد الرعاية للتحقق من اثنين من أكثر رخيصة gmake الحيل والآخر جعل الوظائف ذات الصلة في هذا بلوق.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top