سؤال

أنا في منتصف إعداد بيئة بناء لمشروع لعبة C ++. شرطنا الرئيسي هو القدرة على بناء رمز اللعبة فقط، ولكن أيضا تبعياتها (OGRE3D، Cegui، دفعة، إلخ). علاوة على ذلك، نود أن نكون قادرين على بناء نظام Linux وكذلك على Windows حيث يتكون فريق التطوير لدينا من الأعضاء باستخدام أنظمة تشغيل مختلفة.

يستخدم ogre3d cmake. كأداة بناء لها. هذا هو السبب في أننا قائم على مشروعنا على CMAKE أيضا حتى الآن. يمكننا تجميع بشكل جيد تماما بمجرد إنشاء جميع التبعيات يدويا على نظام أعضاء فريق كعضو ك Cmake قادر على العثور على المكتبات.

والسؤال هو إذا كان هناك طريقة ممكنة للحصول على التبعيات إعداد تلقائيا. كمطور Java أعرف من Maven، ولكن الأدوات الموجودة في عالم C ++؟


تحديث: شكرا على الإجابات والروابط الجميلة. خلال الأيام القليلة القادمة، سأحاول بعض الأدوات لمعرفة ما يلبي متطلباتنا، بدءا من cmake. لقد حصلت بالفعل على مشاركتي مع AutoTools حتى الآن وبقدر ما أحب الوثائق (The Autobook هو قراءة جيدة جدا)، أخشى عدم المقصود استخدام AutoTools على Windows أصلا.

اقترح البعض منكم السماح ببعض IDE مع إدارة التبعية. نتألف من الأفراد الذين يستخدمون جميع التقنيات الممكنة لرمز من VIM النقي لاستكشاف CDT أو Visual Studio. هذا هو المكان الذي يسمح فيه Cmake باستخدام بعض المرونة بقدرتها لتوليد ملفات المشروع الأصلية.

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

المحلول

في أحدث إصدار Cmake 2.8 هناك الجديد externalproject. وحدة. يسمح ذلك بتنزيل / رمز الخروج، وتكوين وبناء عليه كجزء من شجرة البناء الرئيسية الخاصة بك. يجب أن تسمح أيضا بتعيين التبعيات.

في عملي (مجموعة معالجة الصور الطبية) نستخدم CMAKE لبناء جميع المكتبات والتطبيقات الخاصة بنا. لدينا أداة داخلية لتتبع جميع التبعيات بين المشاريع (المعرفة في قاعدة بيانات XML). معظم مكتبات الطرف الثالث (مثل دفعة، كيو تي، VTK، ITK، إلخ.) تبني مرة واحدة لكل نظام نحن ندعمه (MSWIN32، MSWIN64، Linux32 وما إلى ذلك. سيتم بعد ذلك استخراج CMAKE وتكوين ملف ZIP الصحيح وفقا للنظام الذي يعمل المطور عليه.

نصائح أخرى

كنت أستخدم GNU AutoTools (Autoconf، Automake، Libtool) على مدار الشهرين الماضيين في العديد من المشاريع التي شاركت فيها وأعتقد أنها تعمل بشكل جميل. يتم إخبار الحقيقة أنه يتطلب قليلا للتعود على بناء الجملة، لكنني استخدمته بنجاح في مشروع يتطلب توزيع البرامج النصية Python، ومكتبات C، وتطبيق C ++. سأقدم لك بعض الروابط التي ساعدتني عندما سئلت أولا عن سؤال مماثل هنا.

  • صفحة GNU AutoTools يوفر أفضل الوثائق على النظام ككل ولكنه مطلي تماما.
  • ويكيبيديا لديه صفحة التي تشرح كيف يعمل كل شيء. يقوم Autoconf بتكوين المشروع استنادا إلى النظام الأساسي الذي أنت على وشك ترجمة عليه، يقوم Automake بإنشاء Makefiles لمشروعك ومكتبات Libtool التي تعالج المكتبات.
  • مثال Makefile.am و configure.ac مثال يجب أن تساعدك على البدء.

بعض الروابط الأخرى:

  1. http://www.lrde.epita.fr/~adl/autoTools.html.
  2. http://www.developingprogrammers.com/index.php/2006/01/05/AutoTools-Tutorian /
  3. http://sources.redhat.com/autobook/

شيء واحد أنا لست متأكدا هو أي نوع من مجمع النوافذ ل AutoTools جنو. أعلم أنك قادر على استخدامه داخل Cygwin، ولكن بالنسبة لتوزيع الملفات والتبعية في الواقع على منصات Windows، فمن المحتمل أن تكون أفضل حالا باستخدام تثبيت Windows MSI (أو شيء يمكن أن يحمل مشروعك داخل Visual Studio).

إذا كنت ترغب في توزيع التبعيات، فيمكنك ضبطها بموجب دليل فرعي مختلف، على سبيل المثال، libzip., مع إدخال Makefile.am معين الذي سيبني هذه المكتبة. عند إجراء جعل التثبيت سيتم تثبيت المكتبة على ليب المجلد الذي حدد البرنامج النصي تكوينه يجب استخدامه.

حظ سعيد!

هناك العديد من البدائل المثيرة للاهتمام التي تتبع التبعيات الضمنية تلقائيا (من ملفات الرأس)، وهي عبارة عن نظام أساسي ويمكن التعامل مع الملفات التي تم إنشاؤها (مثل تعريفات التظليل). مثالين اعتدت أن أعمل معه المعسكر و مربى/بيمة.

لا أعرف وسيلة عبر منصة للاحتفال بها * لتتبع التبعيات تلقائيا. أفضل ما يمكنك القيام به هو استخدام بعض النصي الذي يقوم بمسح الملفات المصدر (أو يحتوي على برنامج تحويل C ++ تفعل ذلك) ويجد #includes (تجميع مشروط يجعل هذه الصعبة) ويولد جزءا من Makefile. ولكن كنت بحاجة إلى استدعاء هذا البرنامج النصي كلما كان هناك شيء قد تغير.

والسؤال هو إذا كان هناك طريقة ممكنة للحصول على التبعيات إعداد تلقائيا.

ماذا تقصد إعداد؟

كما قلت، سيقوم Cmake بتجميع كل شيء بمجرد أن تكون التبعيات على الآلات. هل تبحث فقط عن وسيلة لتحديث مصدر التبعية؟ مرة واحدة كل المصدر موجود، cmake وأداة البناء (دول مجلس التعاون الخليجي، nmake، msvs، إلخ) هو كل ما تحتاجه.

تحرير: ملاحظة جانبية، Cmake لديه أمر الملف الذي يمكن استخدامه لتنزيل الملفات إذا كانت هناك حاجة إليها: file(DOWNLOAD url file [TIMEOUT timeout] [STATUS status] [LOG log])

تحرير 2: cpack. هي أداة أخرى من قبل شباب Cmake التي يمكن استخدامها لتحسين الملفات ومثل التوزيع على منصات مختلفة. يمكن أن تخلق NSIS لنظام التشغيل Windows وملفات .deb أو .tgz ل * nix.

في مكان عملي (نحن نبني أنظمة مضمنة لحماية الطاقة) استخدمنا CMAKE لحل المشكلة. يسمح الإعداد لدينا بتشغيل CMAKE من مواقع مختلفة.

/
CMakeLists.txt "install precompiled dependencies and build project"
   project/
      CMakeLists.txt "build the project managing dependencies of subsystems"
      subsystem1/
         CMakeLists.txt "build subsystem 1 assume dependecies are already met"
      subsystem2/
         CMakeLists.txt "build subsystem 2 assume dependecies are already met"

الحيلة هي التأكد من أن كل ملف cmakelists.txt يمكن استدعاؤه بمعزل، لكن ملف المستوى الأعلى لا يزال بإمكانه بناء كل شيء بشكل صحيح. من الناحية الفنية، لا نحتاج إلى ملفات CMAKelists الفرعية ولكنها تجعل المطورين سعداء. سيكون من الألم المطلق إذا كان علينا جميعا تعديل ملف بناء مونثي واحد في جذر المشروع.

لم أقم بإنشاء النظام (لقد ساعدت ولكن ليس طفلي). قال المؤلف إن نظام Bost Cmake Build كان لديه بعض الأشياء الجيدة حقا فيه، وهذا يساعده في الحصول على بناء كل شيء بسلاسة.

على العديد من أنظمة NIX، يستخدم نوع من إدارة الحزم أو نظام الإنشاء لهذا الغرض. الأكثر شيوعا للأشياء المصدر هو autotools جنو، والتي سمعتها هي مصدر للحزن الشديد. ومع ذلك، مع وجود عدد قليل من البرامج النصية وإيداع عبر الإنترنت لمسؤول الخاص بك، يمكنك إعداد شيء مماثل مثل:

  • في المشروع الخاص بك Makefile، قم بإنشاء هدف (اختياريا مع SubTargets) يغطي تبعياتك.
  • ضمن الهدف لكل اعتماد، تحقق أولا لمعرفة ما إذا كان مصدر DEP موجود في المشروع (على * Nix، يمكنك استخدامه touch لهذا، ولكن قد تكون أكثر شمولا)
  • إذا كان DEP ليس هناك، يمكنك استخدام curl, ، الخ لتحميل DEP
  • في جميع الحالات، احصل على أهداف المنظمة إجراء مكالمة متكررة (make; make install; make clean; إلخ) إلى Makefile (أو غيرها من ملف البرنامج النصي / بناء البرنامج) من التبعية. إذا تم تصميم DEP بالفعل وتثبيته، فسيظهر سيعود على الفور إلى حد ما.

ستكون هناك الكثير من الحالات الزاوية التي ستسبب هذا لكسر، اعتمادا على المثبتين لكل ديب (ربما يكون المثبت تفاعليا؟)، ولكن يجب أن يغطي هذا النهج الفكرة العامة.

الآن أنا أعمل على أداة قادرة على تثبيت جميع التبعيات تلقائيا من تطبيق C / C ++ مع متطلبات الإصدار الدقيق:

  • مترجم
  • ليبس
  • أدوات (cmake، autotools)

الآن يعمل، للحصول على تطبيقي. (تثبيت Unittest ++، Boost، WT، SQLite، CMAKE كل ذلك بالترتيب الصحيح)

يتم ترميز الأداة، المسمى «C ++ Version Manager» (مستوحاة من إدارة الإصدار الروبي الممتاز)، في باش واستضافت على جيثب: https://github.com/offirmo/cvm.

ورحب أي نصيحة والاقتراحات.

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