سؤال

لدي مشروع C ++ Autoconf المدار الذي أقيمه لتجميعه على مضيفين FreeBSD. كان النظام الأصلي Linux، لذا قمت بإجراء AM_CONDITITITAL لتمييز المضيف الذي أقوم بإنشاء وفصل الشفرة في ملفات النظام الخاصة بالنظام.

configure.ac.

AC_CANONICAL_HOST AM_CONDITITITITAL ([IS_FREEBSD]، FALSE $ Host in * Free *) AC_Define ([IS_FreeBSD]، [1]، [مضيف FreeBSD]) AM_CONDITITITITAL ([IS_FREEBSD]، TRUE) BP_ADD_LDFLAG ([- l / usr / local / local ليب])؛ esac.

makefile.am.

lib_ltlibraries = mylib.la mylib_la_sources = a.cpp  b.cpp إذا is_freebsd mylib_la_sources + = freebsd / c.cpp آخر mylib_la_sources + = linux / c.cpp endif

عندما أقوم بتشغيل Automake، فشل مع هذا النوع من الرسالة:

makefile.am: كائن `c.lo" تم إنشاؤها بواسطة "Linux / C.CPP" و "FreeBSD / C.CPP"

أي أفكار حول كيفية تكوين Automake لاحترام هذا الشرط حتى في Makefile.in بناء Proccess؟

أنا هذا يعمل إذا كانت الملفات لها أسماء مختلفة، ولكن رمز C ++ وأحاول الاحتفاظ بأسماء الملفات بنفس اسم الفصل.

شكرا مقدما!

هل كانت مفيدة؟

المحلول

يمكنك طلب الكائنات التي يجب بناؤها في الدلائل الفرعية الخاصة بكل منها

AUTOMAKE_OPTIONS = subdir-objects

نصائح أخرى

خيار آخر، إلى جانب subdir-الكائنات, ، هو منح كل مشروع فرعي بعض أعلام بناء كل مشروع حسب الطلب. عند القيام بذلك، تقوم Automake بتغيير قواعد Naming * .o لإعداد الاسم الهدف على اسم الوحدة النمطية. على سبيل المثال، هذا:

mylib_la_CXXFLAGS=$(AM_CXXFLAGS)
mylib_la_SOURCES=a.cpp b.cpp

ستؤدي إلى ملفات الإخراج MyLib_la-ao و mylib_la-bo، بدلا من ao و bo، وبالتالي يمكنك الحصول على مشروعين مختلفين مع نفس دليل الإخراج الذي لكل منهما، على سبيل المثال، ملف b.cpp، وليس لديك تعارض مخرجاتها.

لاحظ أنني فعلت هذا من خلال تعيين CXXFLags المحددة للمشروع إلى القيم تم استخدام Automake بالفعل، am_cxxflags. Automake ليست ذكية بما فيه الكفاية للكشف عن هذه الخدعة واستخدام أسماء * .o الأقصر. إذا حدث ذلك بحاجة إلى خيارات بناء كل مشروع، فيمكنك بالطبع القيام بذلك بدلا من هذا الاختراق.

هناك القائمة كاملة من متغيرات السيارات التي، عند تعيينها على أساس قابل للتنفيذ، تعطي هذا التأثير نفسه. لذلك على سبيل المثال، ربما يحتاج مشروع واحد فرعي إلى أعلام رابط خاص بالفعل، لذلك تعطيه شيئا مثل:

mylib_la_LDFLAGS=-lfoo

هذا سيوفر لك ملفات البادئة * .o تماما مثل خدعة AM_CXXXFLAG، أنت الآن "فقط" باستخدام هذه الميزة، بدلا من خداع السيارات في القيام بذلك.

بالمناسبة، إنه أسلوب Autoconf السيئ لتغيير كيفية إنشاء برنامجك بناء فقط على نظام التشغيل الذي يتم بناؤه ل. أسلوب Autoconf الجيد هو التحقق فقط لميزات النظام الأساسي المحدد، وليس منصات كاملة، لأن المنصات تتغير. قد يكون FreeBSD طريقة معينة اليوم، ولكن ربما في الإصدار التالي، سيقوم بنسخ ميزة من Linux التي من شأنها محو الحاجة لك لبناء برنامجك بطريقتين مختلفتين. أو، ربما يتم إهمال الميزة التي تستخدمها اليوم، وسيتم إسقاطها في الإصدار التالي.

هناك أربعين عاما من الحكمة البرمجة المحمولة UNIX المحمولة في AutoTools، Gradhopper. "Maybes" لقد قدمت أعلاه يملك حدث في الماضي، وسوف تفعل بالتأكيد مرة أخرى. اختبار الميزات الفردية هي طريقة Nimblest للتعامل مع المنصات المتغيرة باستمرار.

يمكنك الحصول على مكافآت غير متوقعة من هذا النهج أيضا. على سبيل المثال، ربما يحتاج برنامجك إلى ميزتين غير قابلين للقيام بعمله. قل أنه على FreeBSD، هذه هي ميزات A و B، وعلى Linux، إنها ميزات X و Y؛ A و X هي آليات مماثلة ولكن مع واجهات مختلفة، ونفس الشيء بالنسبة ل B و Y. قد يكون ذلك ميزة يأتي من BSDs الأصلي، وهو في سولاريس لأنه يحتوي على جذور BSD من سونوس في الثمانينيات، و Solaris أيضا ميزة Y من إعادة تصميم نظام V النظام في أوائل التسعينيات. من خلال اختبار هذه الميزات، يمكن أن يعمل برنامجك على Solaris، أيضا، لأنه يحتوي على ميزات احتياجات البرنامج الخاصة بك، ليس فقط في نفس المجموعة كما في FreeBSD و Linux.

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