Makefile 如何设置automake和autoconf以有条件地构建程序(测试或其他)
我目前在autotoolset项目中有10个测试。每当我对其中一个src/文件进行更改并重新编译时,每个测试都会重新生成并链接。这开始对我的开发时间产生相当大的影响 使用GNU autotoolset有条件地构建二进制程序、测试或其他的最佳方法是什么?例如,如果我在test/check\u curl\u requestheaders.cc中工作,并且我做了一个更改,那么我只想重新编译库,然后是一个测试,而不是其他二进制文件 我看到一些人提到使用automake条件(如WANTS_XXX),但我不能100%确定这就是我要寻找的,也不能确定autoconf将如何配置它 我有点希望最终会变成这样:Makefile 如何设置automake和autoconf以有条件地构建程序(测试或其他),makefile,gnu,autoconf,automake,Makefile,Gnu,Autoconf,Automake,我目前在autotoolset项目中有10个测试。每当我对其中一个src/文件进行更改并重新编译时,每个测试都会重新生成并链接。这开始对我的开发时间产生相当大的影响 使用GNU autotoolset有条件地构建二进制程序、测试或其他的最佳方法是什么?例如,如果我在test/check\u curl\u requestheaders.cc中工作,并且我做了一个更改,那么我只想重新编译库,然后是一个测试,而不是其他二进制文件 我看到一些人提到使用automake条件(如WANTS_XXX),但我不
./configure
make test/check_curl_requestheaders
或
指针
编辑我不会在每次制作前进行配置。如果我对
check\u curl\u requestheaders
进行更改,则只会按照预期重建check\u curl\u requestheaders
。问题是,若我正在处理库的RequestHeaders部分,并更改为src/curl/RequestHeaders.cc,则所有测试和其他二进制文件都将重建,而不仅仅是检查\u curl\u RequestHeaders
。这花费的时间太长了,这正是我试图避免的。如果我有十几个二进制文件,有没有办法只重建其中的一个?当您更改某些源文件时,您应该根本不需要重新配置。只需再次运行make,它应该只重建那些实际受更改影响的二进制文件。因此,当您更改test/check\u curl\u requestheaders
,然后执行一个简单的make
,那么无论如何,只应重建test/check\u curl\u requestheaders
。如果其他任何东西也被重建,那么您的makefile中就有一个bug
当然,如果您先进行配置(您不应该这样做),那么重建更多内容也就不足为奇了
编辑:如果更改库,然后只想重建单个测试,则
make test/check_curl_requestheaders
应该足够了。这需要在顶级makefile中有一个名为test/check\u curl\u requestheaders
的目标。这个目标可能看起来像
test/%: library
make -C test $*
假设您在测试目录中有一个单独的makefile,并且假设这个makefile假设库已经构建。我不确定这是最好的方法,但事实证明,我的测试文件夹中的程序确实有自己独特的make目标。然而,也存在一些问题
./buildandrun.sh test check_curl_requestheaders
#!/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。我有一种感觉,这可能是这些工具开箱即用的东西,我只是还没有发现它。我很困惑。在我工作过的任何项目中,从${top_builddir}或${top_builddir}/tests/运行“make”都不会重建或运行任何测试。测试仅为“进行检查”而生成和执行。您是否在Makefile.am中使用check_程序 一般来说,条件编译是通过automake条件和Makefile.am代码段处理的,如: if WANT_FOO bin_PROGRAMS += foo endif 如果你想知道的话 bin_程序+=foo 恩迪夫 但我肯定这不是你想要的。听起来您在Makefile.am中指定了虚假的依赖项,您应该发布它/它们的最低版本 PS:在shell脚本中,您可以 export OUT ... (cd src && make >> $OUT) || exit 3 输出 ... (cd src&制作>>$OUT)| |退出3
我不是每次都进行配置。:)问题是对任何src/*文件的任何更改都需要重建所有测试和二进制文件,因为它们都依赖于src/*文件。如果我对check_curl_requestheaders进行更改,则只会重新生成check_curl_requestheaders。这是意料之中的事。很抱歉造成混淆。如果您不显示makefile,以及它如何重建超出您需要的内容,则很难提供帮助。请参阅我的编辑以了解另一个猜测。问题是我正在使用autoconf和automake,因此我自己没有生成生成文件,我正在询问如何指示autoconf和automake只生成部分二进制文件,而不是所有二进制文件。我可以稍后再写更多,但这就是我现在拥有的!我的推荐是正确的。汽车制造商:不要。您可以自己编写makefiles,所以您应该这样做。谢谢您的反馈,Martin。我以后会记住的。现在,我将不得不坚持AutoKAK和AutoCONF,但在将来,我可能会考虑尝试找到一些其他的工作。谢谢你的反馈!我没有使用
检查程序
,我一直在使用测试
。不知道为什么我会用一个而不是另一个。我在各种autotoolset文档和教程中迷失了方向:-/