2

我目前在我的 autotoolset 项目中有 10 个测试。每当我对我的一个 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

指针?

编辑我没有在每次制作之前进行配置。check_curl_requestheaders如果我对, only进行更改,check_curl_requestheaders则会按预期进行重建。问题是,如果我正在处理库的 RequestHeaders 部分,并更改为 src/curl/requestheaders.cc,则所有测试和其他二进制文件都会重新构建,而不仅仅是check_curl_requestheaders. 花费的时间太长了,而这正是我试图避免的。如果我有十几个二进制文件,有没有办法只重建其中一个?

4

3 回答 3

2

我很困惑。在我从事过的任何项目中,从 ${top_builddir} 或 ${top_builddir}/tests/ 运行“make”都不会重建或运行任何测试。测试仅针对“make check”构建和执行。你在 Makefile.am 中使用 check_PROGRAMS 吗?

通常,条件编译是使用 automake 条件和 Makefile.am 片段处理的,例如:

如果 WANT_FOO
bin_PROGRAMS += foo
万一

但我敢肯定这不是你要找的。听起来您在 Makefile.am 中指定了虚假依赖项,您应该发布它/它们的最小版本。

PS:在你的shell脚本中,你可以这样做

出口
...
(cd src && make >> $OUT) || 3号出口
于 2009-07-22T09:54:18.203 回答
0

当您更改某些源文件时,您根本不需要重新配置。只需再次运行 make,它应该只重建那些实际受更改影响的二进制文件。所以当你改变时test/check_curl_requestheaders,然后做一个plain make,那么test/check_curl_requestheaders无论如何都应该重建。如果还重建了其他任何内容,则您的 makefile 中存在错误。

当然,如果您确实先配置(您不应该这样做),那么重建更多的东西也就不足为奇了。

编辑:如果您更改库,然后只想重建单个测试,那么

make test/check_curl_requestheaders

应该足够了。这将要求您test/check_curl_requestheaders在顶层 makefile 中有一个命名的目标。该目标可能看起来像

test/%:    library
    make -C test $*

假设您在 test 目录中有一个单独的 makefile,并假设此 makefile 假定该库已经构建。

于 2009-07-17T02:47:39.967 回答
0

我不确定这是不是最好的方法,但事实证明我的测试文件夹中的程序确实有自己独特的 make 目标。但是,出现了一些问题。

  1. 如果我在顶层发出 make ,所有的 src/ 和 test/ 都会被构建
  2. 如果我在 test/ 级别发出 make ,则不会获取对 src/ 的更改

为了解决这个问题,我编写了一个 shell 脚本,它执行以下操作:

  1. 输入 src,然后构建它。(如果 src/ 发生更改,则重建 src/)
  2. 输入 test,并构建一个特定的二进制文件。(这将重建特定的二进制文件,如果它已更改,并将重新链接 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。我有一种感觉,这可能是这些工具开箱即用的东西,我只是还没有发现它。

于 2009-07-18T00:49:24.110 回答