Как настроить automake и autoconf для условной сборки программ (тестов или иным образом) - PullRequest
2 голосов
/ 17 июля 2009

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

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

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

Я надеюсь на что-то похожее на это:

./configure
make test/check_curl_requestheaders

или

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

Pointers

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

Ответы [ 3 ]

2 голосов
/ 22 июля 2009

Я в замешательстве. В любом проекте, над которым я когда-либо работал, запуск команды make из $ {top_builddir} или из $ {top_builddir} / tests / не будет перестраивать или запускать какие-либо тесты. Тесты создаются и выполняются только для проверки. Используете ли вы 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 голосов
/ 18 июля 2009

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

  1. Если я выдаю команду make на верхнем уровне, все src / и test / собираются
  2. Если я выполню команду make на тесте / уровне, изменения в 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 и automake. У меня такое ощущение, что это, вероятно, то, что эти инструменты делают из коробки, и я просто еще не обнаружил это.

0 голосов
/ 17 июля 2009

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

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

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

make test/check_curl_requestheaders

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

test/%:    library
    make -C test $*

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

...