我的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
进行了更改,则只会按照预期重建check_curl_requestheaders
。问题是,如果我正在处理库的RequestHeaders部分,并对src / curl / requestheaders.cc进行更改,则会重建所有测试和其他二进制文件,而不仅仅是{{1} }。 那花了太长时间,这就是我想要避免的。如果我有十几个二进制文件,有没有办法只重建其中一个?
答案 0 :(得分:2)
我很困惑。在我曾经做过的任何项目中,从$ {top_builddir}或$ {top_builddir} / tests /运行'make'都不会重建或运行任何测试。测试仅为'make check'构建和执行。你在Makefile.am中使用check_PROGRAMS吗?
通常,条件编译由automake条件和Makefile.am片段处理,如:
if WANT_FOO bin_PROGRAMS += foo endif
但我确信这不是你想要的。听起来你在Makefile.am中指定了伪造的依赖关系,你应该发布它/它们的最小版本。
PS:在你的shell脚本中,你可以做到
export OUT ... (cd src && make >> $OUT) || exit 3
答案 1 :(得分:0)
更改某些源文件时,根本不需要重新配置。只需再次运行make,它应该只重建那些实际受更改影响的二进制文件。因此,当您更改test/check_curl_requestheaders
,然后执行简单make
时,无论如何都只应重建test/check_curl_requestheaders
。如果还有其他任何东西被重建,你的makefile中就会出现错误。
当然,如果你先配置(你不应该这样做),那么重建更多东西就不足为奇了。
编辑:如果您更改了库,然后只想重建一个测试,那么
make test/check_curl_requestheaders
应该足够了。这将要求您在顶级makefile中有一个名为test/check_curl_requestheaders
的目标。该目标可能看起来像
test/%: library
make -C test $*
假设您在测试目录中有一个单独的makefile,并假设此makefile假定该库已经构建。
答案 2 :(得分:0)
我不确定这是最好的方法,但事实证明我的测试文件夹中的程序确实有自己独特的制作目标。但是,有一些问题。
为了解决这个问题,我编写了一个执行以下操作的shell脚本:
代码如下:
#!/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。我觉得这可能是这些工具开箱即用的东西,我还没有发现它。