Makefile 如何设置automake和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),但我不

我目前在autotoolset项目中有10个测试。每当我对其中一个src/文件进行更改并重新编译时,每个测试都会重新生成并链接。这开始对我的开发时间产生相当大的影响

使用GNU autotoolset有条件地构建二进制程序、测试或其他的最佳方法是什么?例如,如果我在test/check\u curl\u requestheaders.cc中工作,并且我做了一个更改,那么我只想重新编译库,然后是一个测试,而不是其他二进制文件

我看到一些人提到使用automake条件(如WANTS_XXX),但我不能100%确定这就是我要寻找的,也不能确定autoconf将如何配置它

我有点希望最终会变成这样:

./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目标。然而,也存在一些问题

  • 如果我在顶层发布make,那么所有src/和test/都将生成
  • 如果我在test/level发布make,将无法获取对src/的更改
  • 为了解决这个问题,我编写了一个shell脚本,它执行以下操作:

    ./buildandrun.sh test check_curl_requestheaders
    
  • 输入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。我有一种感觉,这可能是这些工具开箱即用的东西,我只是还没有发现它。

    我很困惑。在我工作过的任何项目中,从${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文档和教程中迷失了方向:-/