كيفية التحقق مما إذا كان هناك ملف في makefile
-
05-07-2019 - |
سؤال
لديّ قالب صنع لتجميع DLL واحد (لنظام البرنامج المساعد). يبدو أن Makefile of the User:
EXTRA_SRCS=file1 file2
include makefile.in
في ال makefile.in
أملك:
plugin.dll: plugin.os $(patsubst %,%.os,$(EXTRA_SRCS))
أين plugin.os
هو ملف C ++ الرئيسي المراد تجميعه. راجع للشغل ، والملفات تنتهي .os
هل تم تجميع ملفات الكائن للمكتبة المشتركة (أي باستخدام -fpic
الخيار مع gcc
)
الآن ، المشكلة هي أن المصادر الإضافية ربما (ولكن ليس بالضرورة) تكون ملفات رأس. من الناحية المثالية ، أود إضافتها كتبعيات للهدف plugin.os
و ال file.cpp
, ، ولكن فقط إذا كانت موجودة.
يجب أن تعمل الطريقة لكل من Windows و Linux ، أو على الأقل قابلة للتكيف مع كل منها. ومع ذلك ، أنا فقط استخدم إصدار GNU من Make.
المحلول
استخدم وظيفة "Wildcard":
$(wildcard *.h)
تحرير: من أجل مطابقة قائمة محددة ، افعل
$(wildcard $(HEADER_FILES))
ليست هناك حاجة لاستخدام $ (Filter ...) ، تقوم دالة WildCard تلقائيًا بتصفية الملفات غير الموجودة.
نصائح أخرى
لم تقم بتحديد المترجم (المترجمات) التي تستخدمها ، ولكن إذا كان لديك إمكانية الوصول إلى GCC/G ++ ، فيمكنك استخدام خيار -mm.
ما أقوم به هو إنشاء ملف مع امتداد .D لكل ملف .c أو .cpp ، ثم "تضمين" ملفات .D. أستخدم شيئًا كهذا في Makefile:
%.d: %.c
gcc $(INCS) $(CFLAGS) -MM $< -MF $@
%.d: %.cpp
g++ $(INCS) $(CXXFLAGS) -MM $< -MF $@
ثم أقوم بإنشاء تبعيات مثل هذا:
C_DEPS=$(C_SRCS:.c=.d)
CPP_DEPS=$(CPP_SRCS:.cpp=.d)
DEPS=$(C_DEPS) $(CPP_DEPS)
وهذا في أسفل Makefile:
include $(DEPS)
هل هذا هو نوع السلوك الذي ستذهب إليه؟ إن جمال هذه الطريقة هو أنه حتى لو كنت تستخدم برنامج التحويل البرمجي غير GNU للتجميع الفعلي ، فإن مجموعة GNU تقوم بعمل جيد في حساب التبعيات.
هل البساطة
$(filter $(wildcard *.h),$(HEADER_FILES))
افعل ما تريد؟