سؤال

بالنسبة لأولئك الذين ليسوا على دراية بـ 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. انظر أيضًا وصف المتغير في دليل السيارات.

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