代码之家  ›  专栏  ›  技术社区  ›  Beau Simensen

如何设置automake和autoconf以有条件地构建程序(测试或其他)

  •  2
  • Beau Simensen  · 技术社区  · 16 年前

    我目前在我的自动工具集项目中有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 ,只有 检查请求头 如人们所期望的那样重建。问题是,如果我正在处理库的requestheaders部分,并进行更改,比如说,src/curl/requestheaders.cc,那么所有的测试和其他二进制文件都会重新构建,而不仅仅是 检查请求头 . 花的时间太长了,这正是我想要避免的。如果我有十几个二进制文件,有没有办法只重建其中一个?

    3 回复  |  直到 15 年前
        1
  •  2
  •   William Pursell    15 年前

    我搞糊涂了。在我曾经工作过的任何项目中,从$top_buildDir或从$top_buildDir/tests/运行“make”不会重建或运行任何测试。只为“make check”生成和执行测试。您是否在makefile.am中使用check_程序?

    通常,条件编译是用automake条件和makefile.am片段处理的,如:

    if WANT_FOO
    bin_PROGRAMS += foo
    endif
    

    但我敢肯定这不是你要找的。听起来您在makefile.am中指定了伪依赖项,并且应该发布它/它们的最小版本。

    附言:在你的shell脚本中,你可以

    export OUT
    ...
    (cd src && make >> $OUT) || exit 3
    
        2
  •  0
  •   Martin v. Löwis    16 年前

    当您更改某个源文件时,根本不需要重新配置。只需再次运行make,它应该只重建那些实际受更改影响的二进制文件。所以当你改变的时候 test/check_curl_requestheaders ,然后做一个普通的 make 然后,只有 测试/检查curl请求头 无论如何,应该重建。如果还重建了其他内容,则makefile中有一个bug。

    当然,如果您首先进行配置(不应该这样做),那么重建更多的东西就不足为奇了。

    编辑 :如果更改库,然后只想重新生成单个测试,则

    make test/check_curl_requestheaders
    

    应该足够了。这将要求您有一个名为 测试/检查curl请求头 在顶层生成文件中。目标可能看起来像

    test/%:    library
        make -C test $*
    

    假设您在测试目录中有一个单独的makefile,并且假设这个makefile假定库已经构建。

        3
  •  0
  •   Beau Simensen    16 年前

    我不确定这是最好的方法,但我的测试文件夹中的程序确实有自己独特的make目标。但也有一些问题。

    1. 如果我在顶层发布make,那么所有的src/和test/都会被构建。
    2. 如果我在测试/级别发布make,则不会获取对src/的更改

    为了解决这个问题,我编写了一个shell脚本,它执行以下操作:

    1. 输入src,然后构建它。(如果对SRC/进行了更改,则重新生成SRC/)
    2. 输入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。我有一种感觉,这可能是这些工具开箱即用的东西,我只是还没有发现它。