如何设置 automake 和 autoconf 以有条件地构建程序(测试或其他)
Posted
技术标签:
【中文标题】如何设置 automake 和 autoconf 以有条件地构建程序(测试或其他)【英文标题】:How do I setup automake and autoconf to conditionally build programs (tests or otherwise) 【发布时间】:2009-07-17 02:17:16 【问题描述】:我目前在我的 autotoolset 项目中有 10 个测试。每当我对我的一个 src/ 文件进行更改并重新编译时,都会重新构建和链接每个测试。这开始对我的开发时间产生相当大的影响。
使用 GNU 自动工具集有条件地构建二进制程序、测试或其他方式的最佳方法是什么?例如,如果我在 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,则所有测试和其他二进制文件都将重新构建,而不仅仅是 check_curl_requestheaders
。 那 花费的时间太长了,而这正是我试图避免的。如果我有十几个二进制文件,有没有办法只重建其中一个?
【问题讨论】:
【参考方案1】:我很困惑。在我从事过的任何项目中,从 $top_builddir 或 $top_builddir/tests/ 运行“make”都不会重建或运行任何测试。测试仅针对“make check”构建和执行。你在 Makefile.am 中使用 check_PROGRAMS 吗?
一般情况下,条件编译是用 automake 条件句和 Makefile.am sn-ps 来处理的:
如果 WANT_FOO bin_PROGRAMS += foo 万一但我确定这不是您想要的。听起来您在 Makefile.am 中指定了虚假依赖项,您应该发布它/它们的最小版本。
PS:在你的shell脚本中,你可以这样做
出口 ... (cd src && make >> $OUT) || 3号出口【讨论】:
感谢您的反馈!我没有使用check_PROGRAMS
,我一直在使用TESTS
。不知道为什么我会使用一个而不是另一个。我迷失在各种 autotoolset 文档和教程中。 :-/【参考方案2】:
当您更改某些源文件时,您根本不需要重新配置。只需再次运行 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 假定该库已经构建。
【讨论】:
我不是每次都进行配置。 :) 问题是对任何 src/* 文件的任何更改都需要重建 all 的测试和二进制文件,因为它们都依赖于 src/* 文件。如果我对 check_curl_requestheaders 进行更改,则只会重建 check_curl_requestheaders。这按预期工作。对于造成的混乱,我深表歉意。 当你不显示你的 Makefiles 时很难提供帮助,它是如何重建的比你想要的更多。请参阅我的编辑以获取另一个猜测。 问题是我正在使用 autoconf 和 automake,所以我没有自己生成我的 Makefile,我在问如何指示 autoconf 和 automake 只构建一些二进制文件而不是全部.我可以稍后再写更多,但这就是我现在所拥有的! 我的建议。自动制造:不要。 可以自己编写makefile,所以你应该这样做。 感谢您的反馈,马丁。以后我会记住的。现在我将不得不坚持使用 automake 和 autoconf,但将来我可能会考虑尝试找到其他可以使用的东西。【参考方案3】:我不确定这是不是最好的方法,但事实证明我的测试文件夹中的程序确实有自己独特的 make 目标。但是,出现了一些问题。
-
如果我在顶层发布 make,所有 src/ 和 test/ 都会构建
如果我在 test/ 级别发出 make,将不会获取对 src/ 的更改
为了解决这个问题,我编写了一个执行以下操作的 shell 脚本:
-
输入 src,然后构建它。 (如果 src/ 发生更改,则重新构建 src/)
输入 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。我有一种感觉,这可能是这些工具开箱即用的东西,我只是还没有发现。
【讨论】:
以上是关于如何设置 automake 和 autoconf 以有条件地构建程序(测试或其他)的主要内容,如果未能解决你的问题,请参考以下文章
如何通过 autoconf/automake 排除 boost 库/头文件包含问题?
如何正确更新 m4、autoconf、automake 和 libtool? Mac OSX
如何将编译器标志从 Autoconf 传递给 Automake?