كيف أقوم بإعداد Automake و Autoconf لإنشاء البرامج بشكل مشروط (اختبارات أو غير ذلك)

StackOverflow https://stackoverflow.com/questions/1141191

سؤال

لدي حاليا 10 اختبارات في مشروع Autotoolset الخاص بي. في أي وقت أقوم بإجراء تغيير في أحد SRC / ملفاتي وإعادة ترجمة، يتم إعادة بناء كل اختبار وربطه. هذا بدأ في الحصول على تأثير كبير على وقت التطوير الخاص بي.

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

لقد رأيت بعض ذكر استخدام شرطيات السيارات (مثل WASES_XXX) لكنني لست متأكدا 100٪ وهذا ما أبحث عنه ولا أنا متأكد من كيفية تكوين ذلك بواسطة Autoconf.

أنا نمل أمل في شيء سوف ينتهي به الأمر مثل هذا:

./configure
make test/check_curl_requestheaders

أو

./configure --only-build=test/check_curl_requestheaders
make

مؤشرات؟

تعديل أنا لا أقوم بالتكوين قبل كل جعل. إذا قمت بإجراء تغييرات على check_curl_requestheaders, ، فقط check_curl_requestheaders أعيد بناؤها كما يتوقع المرء. المشكلة هي أنه إذا كنت أعمل على طلبات الطلبات جزءا من المكتبة، وإجراء تغيير لتقوله، فإن SRC / Curl / PriceHeaders.cc، يتم إعادة بناء جميع الاختبارات وغيرها من الثنائيات، وليس فقط check_curl_requestheaders. الذي - التي يستغرق وقتا طويلا جدا، وهذا ما أحاول تجنبه. إذا كان لدي عشرات ثنائيات، هل هناك طريقة لإعادة بناء واحد منهم فقط؟

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

المحلول 3

لست متأكدا من أن هذه هي أفضل طريقة للقيام بذلك، ولكن اتضح أن البرامج في مجلد الاختبار الخاص بي لم يكن لها أهدافها الفريدة الخاصة بها. ومع ذلك، كانت هناك بعض القضايا.

  1. إذا تم إصدارها على المستوى الأعلى، فكلها SRC / واختبار / تم بناؤها
  2. إذا تصدر إجراؤها في الاختبار / المستوى، فإن التغييرات على SRC / لن يتم التقاطها

لحل هذا، كتبت رسالة نصية شل التي ما يلي:

  1. أدخل SRC، وبناء عليه. (إذا حدث التغييرات في SRC / قد حدث، يتم إعادة بناء SRC /
  2. أدخل الاختبار، وبناء ثنائي معين. (سيؤدي ذلك إلى إعادة بناء الثنائي المحدد إذا تغيرت وسيتم تحديث الرصيف في SRC / تم تحديثه بواسطة الخطوة السابقة)

يتم سرد الرمز أدناه:

#!/bin/sh

TYPE="$1"
WHICH="$2"
OUT="`readlink -f ./buildandrun.out`"

rm -rf $OUT

if test ! -n "$WHICH"
then
    echo "Please specify which type to build"
    exit 1
fi

if test ! -n "$WHICH"
then
    echo "Please specify which $TYPE to build"
    exit 2
fi

RV=0

echo "" >> $OUT
echo "Building src" >> $OUT
echo "" >> $OUT

cd src
make >> $OUT || RV=3
cd ..

if test $RV != 0; then exit $RV; fi

echo "" >> $OUT
echo "Building $TYPE/$WHICH" >> $OUT
echo "" >> $OUT

cd $TYPE
make "$WHICH" >>  $OUT || RV=4
cd ..

if test $RV != 0; then exit $RV; fi

echo "" >> $OUT
echo "Running $TYPE/$WHICH" >> $OUT
echo "" >> $OUT

$TYPE/$WHICH || RV=5

exit $RV

هذا يتيح لي أن أقوم بما يلي:

./buildandrun.sh test check_curl_requestheaders

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

نصائح أخرى

انا مرتبك. في أي مشروع عملته على الإطلاق، تشغيل "جعل" من أي دولار {top_builddir} أو من $ {top_builddir} / الاختبارات / لن إعادة بناء أو تشغيل أي اختبارات. يتم بناء الاختبارات فقط وتنفيذها ل "تحقق الشيكات". هل تستخدم Check_Programs في Makefile.am؟

بشكل عام، يتم التعامل مع الترجمة الشرطية مع شرائح السيارات و Makefile.am مقتطفات مثل:

إذا wanted_foo bin_programs + = foo endif

لكنني متأكد من أن هذا ليس ما تبحث عنه. يبدو أنك حددت تبعيات وهمية في makefile.am، ويجب عليك نشر نسخة ضئيلة من ذلك.

ملاحظة: في البرنامج النصي Shell الخاص بك، يمكنك فقط القيام به

تصدير ... (CD SRC && Make >> $ خارج) || الخروج 3.

عند تغيير بعض الملف المصدر، يجب ألا تضطر إلى إعادة تكوينها على الإطلاق. فقط تشغيل جعل مرة أخرى، وينبغي أن إعادة بناء هذه الثنائيات فقط التي تتأثر بالفعل بالتغيير. لذلك عندما تتغير test/check_curl_requestheaders, ، ثم تفعل سهل make, ، عندها فقط test/check_curl_requestheaders يجب إعادة بنائها، على أي حال. إذا تم إعادة بناء أي شيء آخر أيضا، فسيكون لديك خطأ في Makefile.

بالطبع، إذا قمت بالتكوين أولا (لا يجب عليك)، فليس من المستغرب أن يتم إعادة بناء المزيد من الأشياء.

يحرر: إذا قمت بتغيير المكتبة، ثم ترغب فقط في إعادة بناء اختبار واحد، ثم

make test/check_curl_requestheaders

يجب أن تكون كافية. هذا سيتطلب منك أن يكون لديك هدف يدعى test/check_curl_requestheaders في Toplevel Makefile. هذا الهدف قد يبدو

test/%:    library
    make -C test $*

على افتراض أن لديك Makefile منفصلة في دليل الاختبار، وافتراض أن هذا المصفوف يفترض أن المكتبة قد تم بناء بالفعل.

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