إنشاء تبعية دول مجلس التعاون الخليجي لدليل إخراج مختلف

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

سؤال

أنا أستخدم مجلس التعاون الخليجي لإنشاء ملف تبعية، ولكن قواعد البناء الخاصة بي تضع الإخراج في دليل فرعي.هل هناك طريقة لإخبار مجلس التعاون الخليجي بوضع بادئة الدليل الفرعي الخاصة بي في ملف التبعية الذي ينشئه لي؟

gcc $(INCLUDES) -E -MM $(CFLAGS) $(SRC) >>$(DEP)
هل كانت مفيدة؟

المحلول

الجواب في دليل دول مجلس التعاون الخليجي:استخدم ال -MT علَم.

-MT target

تغيير هدف القاعدة المنبعثة من توليد التبعية.افتراضيًا، يأخذ CPP اسم ملف الإدخال الرئيسي، ويحذف أي مكونات للدليل وأي لاحقة للملف مثل .c, ، ويلحق لاحقة الكائن المعتادة للنظام الأساسي.والنتيجة هي الهدف.

ان -MT سيؤدي الخيار إلى تعيين الهدف ليكون بالضبط السلسلة التي تحددها.إذا كنت تريد أهدافًا متعددة، فيمكنك تحديدها كوسيطة واحدة -MT, أو استخدم عدة -MT خيارات.

على سبيل المثال، -MT '$(objpfx)foo.o' ممكن يعطي

$(objpfx)foo.o: foo.c

نصائح أخرى

أفترض أنك تستخدم GNU Make وGCC.قم أولاً بإضافة متغير للاحتفاظ بقائمة ملفات التبعية الخاصة بك.على افتراض أن لديك بالفعل واحدًا يسرد جميع مصادرنا:

SRCS = \
        main.c \
        foo.c \
        stuff/bar.c

DEPS = $(SRCS:.c=.d)

ثم قم بتضمين التبعيات التي تم إنشاؤها في ملف التعريف:

include $(DEPS)

ثم أضف قاعدة النمط هذه:

# automatically generate dependency rules

%.d : %.c
        $(CC) $(CCFLAGS) -MF"$@" -MG -MM -MP -MT"$@" -MT"$(<:.c=.o)" "$<"

# -MF  write the generated dependency rule to a file
# -MG  assume missing headers will be generated and don't stop with an error
# -MM  generate dependency rule for prerequisite, skipping system headers
# -MP  add phony target for each header to prevent errors when header is missing
# -MT  add a target to the generated dependency

"$@" هو الهدف (الشيء الموجود على الجانب الأيسر من :)، "$<" هو الشرط الأساسي (الشيء الموجود على الجانب الأيمن من :).يستبدل التعبير "$(<:.c=.o)" الامتداد .c بـ .o.

الحيلة هنا هي إنشاء القاعدة بهدفين عن طريق إضافة -MT مرتين؛وهذا يجعل الملف .o والملف .d يعتمدان على الملف المصدر ورؤوسه؛بهذه الطريقة يتم إعادة إنشاء ملف التبعية تلقائيًا عند تغيير أي من ملفات .c أو .h المقابلة.

يحافظ الخياران -MG و-MP على الخوف في حالة فقدان ملف الرأس.

قد يعجبك هذا الإصدار المختصر من إجابة دون مكوجي:

SRCS = \
    main.c \
    foo.c \
    stuff/bar.c

DEPS = $(SRCS:.c=.d)

يضيف -include $(DEPS) لاحظ ال - البادئة، التي تعمل على إسكات الأخطاء إذا كان .d الملفات غير موجودة بعد.

ليست هناك حاجة لقاعدة نمط منفصلة لإنشاء ملفات التبعية.أضف ببساطة -MD أو -MMD إلى خط التجميع العادي الخاص بك، و .d يتم إنشاء الملفات في نفس الوقت الذي يتم فيه تجميع ملفات المصدر الخاصة بك.على سبيل المثال:

%.o: %.c
     gcc $(INCLUDE) -MMD -c $< -o $@

# -MD can be used to generate a dependency output file as a side-effect of the compilation process.

تفصيل على إجابة دجنتري, ، قد عملت بشكل سليم معي:

.depend: $(SOURCES)
    $(CC) $(CFLAGS) -MM $(SOURCES) | sed 's|[a-zA-Z0-9_-]*\.o|$(OBJDIR)/&|' > ./.depend

يعمل هذا أيضًا في حالة وجود ملف تبعية واحد فقط يحتوي على قواعد التبعية لجميع الملفات المصدر.

حسنًا ، فقط للتأكد من أنني حصلت على السؤال بشكل صحيح:أفترض أن لديك test.c الذي يتضمن test.h, ، وتريد إنشاء subdir/test.d (بينما لا توليد subdir/test.o) أين subdir/test.d يتضمن

subdir/test.o: test.c test.h

بدلا من

test.o: test.c test.h

وهو ما تحصل عليه الآن.هل هذا صحيح؟

لم أتمكن من التوصل إلى طريقة سهلة للقيام بالضبط بما تطلبه.ومع ذلك، النظر في تحسينات توليد التبعية, ، إذا كنت ترغب في إنشاء .d أثناء إنشاء ملف .o، يمكنك استخدام:

gcc $(INCLUDES) -MMD $(CFLAGS) $(SRC) -o $(SUBDIR)/$(OBJ)

(منح SRC=test.c, SUBDIR=subdir, ، و OBJ=test.o.) سيؤدي هذا إلى إنشاء كل من subdir/test.o وsubdir/test.d، حيث subdir/test.d يحتوي على الإخراج المطلوب على النحو الوارد أعلاه.

إذا كانت هناك حجة أمام دول مجلس التعاون الخليجي للقيام بذلك، فأنا لا أعرف ما هي.ينتهي بنا الأمر إلى توصيل مخرجات التبعية عبر الأنابيب سيد لإعادة كتابة كافة تكرارات <blah>.o مثل ${OBJDIR}/<blah>.o.

  1. يغضب [GNU] إذا لم تضع الإخراج في الدليل الحالي.يجب عليك بالفعل تشغيل make من دليل البناء، واستخدام متغير make VPATH لتحديد موقع الكود المصدري.إذا كذبت على أحد المترجمين، فسوف ينتقم عاجلاً أم آجلاً.

  2. إذا كنت تصر على إنشاء كائناتك وتبعياتك في دليل آخر، فستحتاج إلى استخدام ملف -o حجة، كما أجاب إميل.

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