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

时间:2009-07-17 02:17:17

标签: makefile gnu autoconf automake

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

使用GNU autotoolset有条件地构建二进制程序,测试或其他方法的最佳方法是什么?例如,如果我在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进行更改,则会重建所有测试和其他二进制文件,而不仅仅是{{1} }。 花了太长时间,这就是我想要避免的。如果我有十几个二进制文件,有没有办法只重建其中一个?

3 个答案:

答案 0 :(得分:2)

我很困惑。在我曾经做过的任何项目中,从$ {top_builddir}或$ {top_builddir} / tests /运行'make'都不会重建或运行任何测试。测试仅为'make check'构建和执行。你在Makefile.am中使用check_PROGRAMS吗?

通常,条件编译由automake条件和Makefile.am片段处理,如:

if WANT_FOO
bin_PROGRAMS += foo
endif

但我确信这不是你想要的。听起来你在Makefile.am中指定了伪造的依赖关系,你应该发布它/它们的最小版本。

PS:在你的shell脚本中,你可以做到

export OUT
...
(cd src && make >> $OUT) || exit 3

答案 1 :(得分:0)

更改某些源文件时,根本不需要重新配置。只需再次运行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假定该库已经构建。

答案 2 :(得分:0)

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

  1. 如果我在顶级发出make,则构建所有src /和test /
  2. 如果我在测试/级别发出make,则不会选择更改为src /
  3. 为了解决这个问题,我编写了一个执行以下操作的shell脚本:

    1. 输入src,然后构建它。 (如果发生src /的更改,则重建src /)
    2. 输入test,并构建特定的二进制文件。 (这将重建特定的二进制文件,如果它已经更改并将重新链接src /中的代码已被上一步更新)
    3. 代码如下:

      #!/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。我觉得这可能是这些工具开箱即用的东西,我还没有发现它。