توليد كيانات IDL باستخدام Automake/Makefile.am
-
26-09-2019 - |
سؤال
بالنسبة لأولئك الذين ليسوا على دراية بـ IDL (لغة الوصف الواجهة) ، يقوم بتجريد وصف البيانات للاستخدام عبر المنصات (Java ، C ، C ++ ، إلخ). مشروعي لديه تبعيات foo.c و foo.h و foohelper.c و foohelper.h التي تم إنشاؤها من foo.idl. كيف يمكنني تشغيل أمر تعسفي عندما يتغير foo.idl ، ولكن لا يزال يتضمن foo.c ، foohelper.c ، في عملية الإنشاء؟
محاولاتي الحالية تضيف قاعدة إلى makefile.am - الأمل هو أن يتم نسخ القاعدة إلى Makefile المولدة.
لقد حاولت:
Foo.idl : Foo.idl
${the_generate_command}
ثم أضاف foo.idl إلى my_program_sources ، لكنه لا يعمل على _generate_command عند البناء.
لقد نجحت في توليد IDL مع
Foo.c Foo.h FooHelper.h FooHelper.c : Foo.idl
${the_generate_command}
لكنه لن يضيف foo.c ، foohelper.c إلى عملية التجميع ، لذلك لم يتم بناؤها مطلقًا ، تم إنشاؤها فقط بواسطة the_generate_command!
جميع التعليمات البرمجية (بما في ذلك IDL) موجودة في $ project_dir/src.
المحلول
إجابة RQ صحيحة تقريبًا ، لكنها تفوت بعض التفاصيل الدقيقة. جرب هذا:
bin_PROGRAMS = myprogram
myprogram_SOURCES = Foo.c Foo.h FooHelper.h FooHelper.c $(OTHER_SOURCES)
BUILT_SOURCES = Foo.c Foo.h FooHelper.h FooHelper.c
EXTRA_DIST = Foo.idl
MAINTAINERCLEANFILES = Foo.c Foo.h FooHelper.h FooHelper.c
Foo.c: Foo.idl
$(THE_GENERATE_COMMAND)
Foo.h FooHelper.h FooHelper.c: Foo.c
@if test -f $@; then \
touch $@; \
else \
## Recover from the removal of $@
rm -rf $<; \
$(MAKE) $(AM_MAKEFLAGS) $<; \
fi
القواعد الإضافية "لتوليد" Foo.h
, FooHelper.h
و FooHelper.c
من عند Foo.c
تأكد من أن التصميمات الموازية لن تحاول التشغيل $(THE_GENERATE_COMMAND)
مرتين. إنه تعبير مفصل في دليل السيارات والتي ستعمل على بنيات متوازية. لا يزال هناك القليل من الهشاشة هنا: إذا أزال المستخدم (على سبيل المثال) FooHelper.h
و FooHelper.c
ويبدأ بتكوين موازٍ ، قد يدير $(MAKE) $(AM_MAKEFLAGS) $<
جزء الاسترداد من القاعدة عدة مرات بالتوازي. كما يقول الدليل ، لا يمكن أن يحدث هذا السباق إلا إذا قام المستخدم بتشويه شجرة البناء يدويًا ، وحتى ذلك لا شيء make clean; make
لا يمكن إصلاح.
ال BUILT_SOURCES
الخط يضمن ذلك Foo.c
, Foo.h
, FooHelper.h
و FooHelper.c
بنيت قبل محاولة البناء myprogram
(يرى هذا القسم من دليل السيارات لمعرفة لماذا فقط إضافتها إلى myprog_SOURCES
غير كافية). ال EXTRA_DIST
المتغير يضمن أن .idl
سيتم التقاط الملف بواسطة make dist
(المرجعي).
MAINTAINERCLEANFILES
يحدد ملفات إضافية للحذف عند التشغيل make maintainer-clean
; ؛ هذا للامتثال ل معايير GNU Makefile. انظر أيضًا وصف المتغير في دليل السيارات.