如何设置 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 以有条件地构建程序(测试或其他)的主要内容,如果未能解决你的问题,请参考以下文章

包括使用 automake 和 autoconf 的动态库

如何通过 autoconf/automake 排除 boost 库/头文件包含问题?

如何正确更新 m4、autoconf、automake 和 libtool? Mac OSX

如何将编译器标志从 Autoconf 传递给 Automake?

使用 autoconf/automake,如何指定包含文件路径?

如何正确使用带有子目录的 automake/autoconf?