كيفية منع "الدليل موجود بالفعل خطأ" في makefile عند استخدام mkdir
سؤال
أنا بحاجة إلى إنشاء دليل في 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 الحيل والآخر جعل الوظائف ذات الصلة في هذا بلوق.