سؤال

أود إنشاء ملف Makefile.am الملف الذي ينشئ ملف رأس واحد مذكور في أ xxx.c ملف.

دعنا نقول ذلك xxx.c يحتوي على:

#include <version.h>
...

وأن لدي قاعدة لإنشائها في نهاية Makefile.am:

version.h:
       echo '#define VERSION "'`hg id`'"' > version.h.tmp
       cmp version.h.tmp version.h || mv version.h.tmp version.h

ماذا علي أن أغير لجعل xxx.c التجميع يعتمد على version.h؟ حاولت nodist_progname_SOURCES=version.h, ، لكن هذا لا يبدو أنه يفعل ذلك.

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

المحلول

BUILT_SOURCES = version.h

جميع الملفات المذكورة باسم BUILT_SOURCES سيتم بناء قبل أي من قواعد التجميع العادية.

ومع ذلك ، فإن هذا سيخلق مشكلة بسيطة: كما version.h سوف تحتاج إلى إعادة بنائها على كل make الاحتجاج ، إعادة تجميع كل foo.c ملف الذي #includeس version.h سيتم تشغيله مرة أخرى على كل make يركض. نفضل ما إذا كان إعادة التجميع يحدث فقط عندما يكون هناك بالفعل شيء تغير.

للتغلب على هذه المشكلة ، استخدم أ BUILT_SOURCES الاعتماد على ملف الطوابع الذي "تم إنشاؤه" في كل مرة (لا يتم إنشاؤه أبدًا ، وبالتالي يتم تشغيل قاعدة البناء في كل مرة). قاعدة الإنشاء لهذا ملف الطوابع تنشئ جديدًا version.h ملف كما version.h.tmp, ، والنسخ فقط version.h.tmp ل version.h لو version.h.tmp في الواقع يختلف عن version.h (تماما مثل version.h القاعدة لا). لذلك إذا لم يتغير شيء version.h, ، الطابع الطابع (MTIME) يبقى كما هو ، ولا يوجد بناء للكائنات حسب version.h يتم تشغيل:

BUILT_SOURCES = version.stamp

version.stamp:
        echo '#define VERSION "'`hg id`'"' > version.h.tmp
        cmp version.h.tmp version.h || mv version.h.tmp version.h

هذا الحل سيفعل ما تطلبه.

لسوء الحظ ، ستكون هناك مشكلة بسيطة عندما تبني من لعبة Tarball: ثم hg id سوف يعطيك معلومات زائفة ، وربما لا يوجد version.h في Tarball الخاص بك ، لذلك سوف يفشل البناء أو يحتوي على معلومات إصدار وهمية.

لقد حللت هذه المشكلة ل XF86-Video-Radeonhd المشروع الذي يستخدم git. ال git-version.h يحتوي الملف الذي تم إنشاؤه في هذا الحل على بعض معلومات الإصدار أكثر من مجرد رقم إصدار واحد. يمكنك رؤية هذا تحديث فقط إذا كان الاختلاف حل لي في نهاية git_version.sh و ال BUILT_SOURCES Hookup (بما في ذلك التعامل مع الجميع على أمل خارج الشجرة و من كرة التزحلق بناء الحالات) في Radeonhd.am إذا كنت مهتم.

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