2009-07-17 7 views
2

В настоящее время у меня 10 тестов в моем проекте autotoolset. Каждый раз, когда я вношу изменения в один из моих src/файлов и перекомпилирую, каждый тест перестраивается и связывается. Это начинает оказывать значительное влияние на мое время разработки.Как настроить automake и autoconf для условной сборки программ (тестов или иначе)

Каков наилучший способ условно построить двоичные программы, тесты или иным образом с помощью GNU autotoolset? Например, если я работаю в test/check_curl_requestheaders.cc, и я вношу изменения, я только захочу перекомпилировать библиотеку, а затем один тест и ни один из других двоичных файлов.

Я заметил некоторые упоминания об использовании условных обозначений automake (например, WANTS_XXX), но я не уверен, что это то, что я ищу, и не уверен, как это будет настроено autoconf.

Я вроде в надежде на то, что будет в конечном итоге выглядит так:

./configure 
make test/check_curl_requestheaders 

или

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

легавых?

EDIT Я не делаю настройки перед каждым изготовлением. Если я вношу изменения в check_curl_requestheaders, только check_curl_requestheaders будет перестроен, как и следовало ожидать. Проблема в том, что если я работаю над частью библиотеки RequestHeaders и делаю изменения, чтобы сказать: src/curl/requestheaders.cc, все тесты и другие двоичные файлы перестраиваются, а не только check_curl_requestheaders. То, что занимает слишком много времени, и это то, чего я пытаюсь избежать. Если у меня есть дюжина двоичных файлов, есть ли способ перестроить только один из них?

ответ

0

Я не уверен, что это лучший способ сделать это, но оказывается, что программы в моей тестовой папке действительно имеют свои уникальные целевые объекты. Однако были некоторые проблемы.

  1. Если я выполняю сделать на высшем уровне, все SRC/и тест/построены
  2. Если я выполняю сделать на тест/уровень, изменения в SRC/не будет подобран

Чтобы решить эту проблему, я написал скрипт, который выполняет следующие действия:

  1. Enter ЦСИ и построить его. (если изменения в 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 и Automake. Я чувствую, что это, вероятно, то, что эти инструменты делают из коробки, и я просто еще не открыл его.

0

Когда вы меняете какой-либо исходный файл, вам не нужно перенастраивать его вообще. Просто запустите make снова, и он должен только перестроить те двоичные файлы, на которые действительно повлияло изменение. Поэтому, когда вы меняете test/check_curl_requestheaders, сделайте простой make, тогда только test/check_curl_requestheaders следует перестроить. Если что-то еще будет восстановлено, у вас есть ошибка в вашем make-файле.

Конечно, если вы сначала настроите (что вам не нужно), неудивительно, что больше вещей перестраивается.

Edit: Если вы измените библиотеку, а затем только хотите восстановить один тест, а затем

make test/check_curl_requestheaders 

должно быть достаточно. Это потребует, чтобы у вас была цель с именем test/check_curl_requestheaders в вашем файле makeplevel. Эта цель может выглядеть

test/%: library 
    make -C test $* 

если у вас есть отдельный Makefile в каталоге тестов, и предполагая, что это Makefile предполагается, что библиотека уже построена.

+0

Я не делаю Конфигурировать каждый раз. :) Проблема в том, что любые изменения в любом из файлов src/* требуют * all * тестов и двоичных файлов для перестройки, потому что все они полагаются на файлы src/*. Если я вношу изменения в check_curl_requestheaders, восстанавливается только check_curl_requestheaders. Это работает так, как ожидалось. Прошу прощения за путаницу. –

+0

Трудно помочь, когда вы не показываете свои файлы Makefile, и как он приходит, что он перестраивает больше, чем вы хотите. См. Мое редактирование для другой догадки. –

+0

Проблема заключается в том, что я использую autoconf и automake, поэтому я сам не создаю свои Makefiles, и я спрашиваю, как проинструктировать autoconf и automake только создавать некоторые из двоичных файлов, а не все из них. Я могу попытаться написать еще об этом позже, но это то, что у меня есть сейчас! –

2

Я смущен. В любом проекте, над которым я когда-либо работал, выполняется «make» из $ {top _ builddir} или из $ {top _ builddir}/tests/не будет перестраивать или запускать какие-либо тесты. Тесты только строятся и выполняются для «make check». Вы используете check_PROGRAMS в своем Makefile.am?

В общем условной компиляции обрабатывается с AutoMake условных и Makefile.am фрагментами, как:

 
if WANT_FOO 
bin_PROGRAMS += foo 
endif 

, но я уверен, что это не то, что вы ищете. Похоже, что вы указали фальшивые зависимости в Makefile.am, и вы должны опубликовать их минимальную версию.

PS: в сценарии оболочки, вы можете просто сделать

 
export OUT 
... 
(cd src && make >> $OUT) || exit 3 
+0

Спасибо, что обратились к нам! Я не использовал 'check_PROGRAMS', я использовал' TESTS'. Не знаю, почему я буду использовать один над другим. Я теряюсь в различных документах и ​​учебниках по автозагрузкам. : - / –