سؤال

ولقد نسخ libtool إلى شجرة المصدر برنامجي لتوزيعه مع البرنامج. ولكن عند تشغيل 'جعل distclean "يتم حذف libtool مع بقية بقية الملفات التي تم إنشاؤها. كيف أتوقف عن ذلك من الحدوث؟

وحاولت وضع EXTRA_DIST = libtool في Makefile.am ولكن هذا لا يعمل.

وهنا هو أساسا ما يبدو لي configure.ac مثل.

AC_PREREQ(2.53)
AC_INIT( [program], [0.16], [program] )
AC_CONFIG_SRCDIR([src/c/program.c])
AC_CONFIG_HEADER([config.h])
AC_CONFIG_AUX_DIR(build-aux)
AM_INIT_AUTOMAKE( [-Wall -Werror foreign] )

m4_include(ax_pkg_swig.m4)

# Checks for programs.
AC_PROG_CC
AC_PROG_LIBTOOL
AC_ENABLE_SHARED
AC_PROG_SWIG

# Checks for libraries.

# Checks for header files.
AC_HEADER_STDC
AC_CHECK_HEADERS([stdlib.h string.h unistd.h])

# Checks for typedefs, structures, and compiler characteristics.
AC_TYPE_SIZE_T

# Checks for library functions.
AC_REPLACE_FNMATCH
AC_FUNC_MALLOC
AC_FUNC_STAT
AC_CHECK_FUNCS([regcomp strdup strtoull])

AC_CONFIG_FILES([
    Makefile
    src/c/Makefile
    src/perl/Makefile
    src/verilog/Makefile
])
AC_OUTPUT
هل كانت مفيدة؟

المحلول

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

#!/bin/sh
aclocal -I config &&
    libtoolize --force --copy &&
    autoheader &&
    automake --add-missing --copy --foreign &&
    autoconf &&
    ./configure -C "$@"

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

لدرجة كبيرة على اسم السيناريو هو مسألة الموضة والأناقة. انها ليست سطحية تماما لأن جزءا من الطراز الحديث هو الابتعاد عن تشغيل configure في نهاية البرنامج النصي. bootstrap هو اسم أحدث، لذلك السيناريو اسمه أن أقل عرضة للتشغيل configure في نهاية المطاف. الفصل 8 من Autobook يعني أن هذا هو الحال أيضا، ولكن أنا 'لقد صادف المعاكسة. (وهذا هو، مشاريع مع برنامج نصي autogen.sh التي لا تدعو configure، والمشاريع مع برنامج نصي bootstrap أن تفعل).

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

وسوف يكاد يكون من المؤكد أن تخصيص هذا البرنامج النصي لاحتياجات المشروع الخاص بك. أهم شيء لترك كما هو هو ترتيب العمليات. وAutotools هي حساسة لذلك. قد تضطر إلى تغيير الأعلام تعطى الأوامر. و-I config على الأمر aclocal ليس عالمي، على سبيل المثال. كنت أكثر من المرجح أن تحتاج إلى إضافة خطوات لهذه العملية، إما المحيطة بهذه الخطوات المشتركة، أو ربما حتى معشق معهم.

وأما بالنسبة لل autoreconf الخيار ، ليس لدي حتى الآن أن تصبح مروحة. أجد أن الافتراضات المدمج في كسر على كل مشاريعي، بطريقة أو بأخرى. إذا كان المشروع هو مشروع نصب GNU-المستنقع القياسية، فإنه قد عمل لك.

وبالمناسبة، الماكرو AC_PROG_LIBTOOL هو عفا عليها الزمن . يجب أن تستخدم LT_INIT بدلا من ذلك.

نصائح أخرى

في الواقع، لا تحتاج إلى استدعاء كل ما aclocal وlibtoolize وautoheader و...

ومجرد دعوة

$ autoreconf -i

ووautoreconf سيتم تشغيل aclocal، libtoolize (إذا كان هناك وحدات الماكرو libtool في configure.ac)، automake (إذا configure.ac ينطوي automake) وautoconf. كافة الملفات ذات الصلة التي تحتاج إلى أن تضاف إلى شجرة المصدر سيتم نسخ هناك، من بينها ltmain.sh.2

وأنا عادة إضافة بعض الإسهاب (الخامس)، وبدلا من مجرد نسخ الملفات، I الرمزي لهم، مما أدى إلى دعوتي القياسية

$ autoreconf -vis

الملف "libtool" التي تم إنشاؤها بواسطة "تكوين" تشغيل محددة لنظام يحدث على المدى تكوين على وبالتالي سوف بالطبع تنظيفها مرة أخرى عن طريق "جعل distclean".

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