autoconf AC_ARG_WITH, AC_CACHE_CHECK, AC_TRY_LINK宏学习

http://www.searchtb.com/2011/07/autoconf-ac_arg_with-ac_cache_check-ac_try_link.html


最近在在RHEL4上编译一个使用Hadoop pipes库的程序浪费了很多时间。这个程序之前使用Hadoop 0.19.1 pipes库,现在Hadoop pipes版本提高到0.20.2,所以要修改configure.ac。但是改过configure.ac文件之后,程序在RHEL4上却又编译不过。为了让程序在RHEL4和RHEL5都能编译通过,则必须让程序编译时链接正确的库,RHEL4链接0.19.1版本,RHEL5链接0.20.2版本。从唐逸那里求得一本超赞的autoconf指南,啃了两天,略有小成,于是决定找个开源项目的configure.ac文件研究一番。发现memcached的比较简单,并且它还依赖libevent,就研究它了。

AC_ARG_WITH, AC_CACHE_CHECK, AC_TRY_LINK是autoconf中非常有用的三个宏,configure.ac文件中一大部分就是在用这三个宏。这三个宏的定义如下所示。

AC_ARG_WITH (package, help-string, [action-if-given], [action-if-not-given])

AC_CACHE_CHECK (message, cache-id, commands-to-set-it)

AC_TRY_LINK (includes, function-body, [action-if-true], [action-if-false])

memcached configure.in检测libevent的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
trylibeventdir=""
AC_ARG_WITH(libevent,
        [  --with-libevent=PATH     Specify path to libevent installation ],
        [
                 if test "x$withval" != "xno" ; then
                         trylibeventdir=$withval
                 fi
        ]
)
 
dnl ------------------------------------------------------
dnl libevent detection.  swiped from Tor.  modified a bit.
 
LIBEVENT_URL=http://www.monkey.org/~provos/libevent/
 
AC_CACHE_CHECK([for libevent directory], ac_cv_libevent_dir, [
   saved_LIBS="$LIBS"
   saved_LDFLAGS="$LDFLAGS"
   saved_CPPFLAGS="$CPPFLAGS"
   le_found=no
   for ledir in $trylibeventdir "" $prefix /usr/local ; do
     LDFLAGS="$saved_LDFLAGS"
     LIBS="$saved_LIBS -levent"
 
     # Skip the directory if it isn't there.
     if test ! -z "$ledir" -a ! -d "$ledir" ; then
        continue;
     fi
     if test ! -z "$ledir" ; then
       if test -d "$ledir/lib" ; then
         LDFLAGS="-L$ledir/lib $LDFLAGS"
       else
         LDFLAGS="-L$ledir $LDFLAGS"
       fi
       if test -d "$ledir/include" ; then
         CPPFLAGS="-I$ledir/include $CPPFLAGS"
       else
         CPPFLAGS="-I$ledir $CPPFLAGS"
       fi
     fi
     # Can I compile and link it?
     AC_TRY_LINK([#include <sys/time.h>
#include <sys/types.h>
#include <event.h>], [ event_init(); ],
        [ libevent_linked=yes ], [ libevent_linked=no ])
     if test $libevent_linked = yes; then
        if test ! -z "$ledir" ; then
          ac_cv_libevent_dir=$ledir
        else
          ac_cv_libevent_dir="(system)"
        fi
        le_found=yes
        break
     fi
   done
   LIBS="$saved_LIBS"
   LDFLAGS="$saved_LDFLAGS"
   CPPFLAGS="$saved_CPPFLAGS"
   if test $le_found = no ; then
     AC_MSG_ERROR([libevent is required.  You can get it from $LIBEVENT_URL
 
       If it's already installed, specify its path using --with-libevent=/dir/
])
   fi
])
LIBS="$LIBS -levent"
if test $ac_cv_libevent_dir != "(system)"; then
   if test -d "$ac_cv_libevent_dir/lib" ; then
     LDFLAGS="-L$ac_cv_libevent_dir/lib $LDFLAGS"
     le_libdir="$ac_cv_libevent_dir/lib"
   else
     LDFLAGS="-L$ac_cv_libevent_dir $LDFLAGS"
     le_libdir="$ac_cv_libevent_dir"
   fi
   if test -d "$ac_cv_libevent_dir/include" ; then
     CPPFLAGS="-I$ac_cv_libevent_dir/include $CPPFLAGS"
   else
     CPPFLAGS="-I$ac_cv_libevent_dir $CPPFLAGS"
   fi
fi

1-9行是在判断用户是否指定libevent的目录,如果没有指定的话,trylibeventdir将会是一个空值。这里并没有使用AC_HELP_STRING,所以”–with-libevent”前面有两个空格,要不然”congfigure –help”输出的格式不会太美观。

16-40行在遍历用户指定libevent的目录,以及prefix和/usr/local这几个目录(注意检查的先后顺序),如果存在一个合适的目录,那么就设置$LIBS, $LDFLAGS和$CPPFLAGS。这几个环境变量是为后面执行AC_TRY_LINK做准备的。它会遍历这三个目录是否安装libevent库,只要有一个目录下有libevent库就行,所以如果系统安装了,即使用户指定错了也没有关系。这里有一个空字符串,我怀疑是个bug,应该指定为当前目录才对。

42-54行在检查libevent库是否可用。如果仅仅检测到libevent.so存在并不能保证该库一定可用,最有效的方法是执行一个小程序测试下。这里调用了ev_init函数检查libevent库是否可用。如果检测到libevent库是可用的,那么将ac_cv_libevent_dir写入到cache中。关于cache的使用,后面会有详细的说明。

56-64行恢复$LIBS, $LDFLAGS和$CPPFLAGS这三个变量,如果最终没有找到可用的libevent库,那么AC_MSG_ERROR打印一个错误信息并退出。

66-80行在设置LIBS,这个变量将用在Makefile中。如果用的是系统的libevent,因为/usr/local/lib已经是默认的库加载目录,所以不许要特别指定。否则的话要设置LDFLAGS和CPPFLAGS两个变量值。

默认情况下configure不会使用cache,当指定-C参数时,configure会生成一个config.cache文件。AC_CACHE_CHECK首先会去该文件中查找变量的值,如果找到了,最后那个宏是不会被执行的。缓存的内容如下所示。

ac_cv_libevent_dir=${ac_cv_libevent_dir='(system)'}

configure执行时,如果发现该变量是从cache中读取时,会打印出以下信息。

checking for libevent directory... (cached) (system)

可以看出这段代码中cache拥有最高的级别,如果前面运行configure时指定错了cache,后面configure就不能正确执行了。这时可以使用”make distclean”删除cache文件。

如果要在RHEL4的机器上链接hadoop 0.19.1 pipes库,而在RHEL5的机器上链接0.20.2 pipes库,只需要将二者的路径都放到try的路径中。在RHEL4上链接0.19.1 pipes库时AC_TRY_LINK会成功,在RHEL5上则是链接0.20.2 pipes库才会成功,这样就能在所有的机器上都链接上正确的库。

感觉autoconf非常之复杂,有许多宏要学习。要彻底搞明白autoconf还需要学习libtools和Makefile,真是路漫漫其修远兮,上下求索而不得啊~


user@debian:~/ModSecurity$ git fetch --tags origin remote: Enumerating objects: 35757, done. remote: Counting objects: 100% (35757/35757), done. remote: Compressing objects: 100% (8282/8282), done. remote: Total 35008 (delta 26724), reused 34519 (delta 26239), pack-reused 0 (from 0) 接收对象中: 100% (35008/35008), 48.78 MiB | 2.72 MiB/s, 完成. 处理 delta 中: 100% (26724/26724), 完成 322 个本地对象. 来自 https://github.com/SpiderLabs/ModSecurity * [新标签] v2.1.0 -> v2.1.0 * [新标签] v2.1.0-rc7 -> v2.1.0-rc7 * [新标签] v2.1.1 -> v2.1.1 * [新标签] v2.1.1-dev2 -> v2.1.1-dev2 * [新标签] v2.1.1-dev3 -> v2.1.1-dev3 * [新标签] v2.1.1-dev4 -> v2.1.1-dev4 * [新标签] v2.1.1-rc1 -> v2.1.1-rc1 * [新标签] v2.1.1-rc2 -> v2.1.1-rc2 * [新标签] v2.1.2 -> v2.1.2 * [新标签] v2.1.2-rc1 -> v2.1.2-rc1 * [新标签] v2.1.2-rc2 -> v2.1.2-rc2 * [新标签] v2.1.2-rc3 -> v2.1.2-rc3 * [新标签] v2.1.3 -> v2.1.3 * [新标签] v2.1.3-rc1 -> v2.1.3-rc1 * [新标签] v2.1.3-rc2 -> v2.1.3-rc2 * [新标签] v2.1.4 -> v2.1.4 * [新标签] v2.1.4-rc1 -> v2.1.4-rc1 * [新标签] v2.1.4-rc2 -> v2.1.4-rc2 * [新标签] v2.1.4-rc3 -> v2.1.4-rc3 * [新标签] v2.1.4-rc4 -> v2.1.4-rc4 * [新标签] v2.1.5 -> v2.1.5 * [新标签] v2.1.5-rc1 -> v2.1.5-rc1 * [新标签] v2.1.6 -> v2.1.6 * [新标签] v2.1.6-rc1 -> v2.1.6-rc1 * [新标签] v2.1.7 -> v2.1.7 * [新标签] v2.2.0-dev1 -> v2.2.0-dev1 * [新标签] v2.5.0 -> v2.5.0 * [新标签] v2.5.0-dev2 -> v2.5.0-dev2 * [新标签] v2.5.0-rc1 -> v2.5.0-rc1 * [新标签] v2.5.0-rc2 -> v2.5.0-rc2 * [新标签] v2.5.0-rc3 -> v2.5.0-rc3 * [新标签] v2.5.0-rc3-pre2 -> v2.5.0-rc3-pre2 * [新标签] v2.5.0-rc4 -> v2.5.0-rc4 * [新标签] v2.5.1 -> v2.5.1 * [新标签] v2.5.1-rc1 -> v2.5.1-rc1 * [新标签] v2.5.10 -> v2.5.10 * [新标签] v2.5.10-dev1 -> v2.5.10-dev1 * [新标签] v2.5.10-dev2 -> v2.5.10-dev2 * [新标签] v2.5.10-dev3 -> v2.5.10-dev3 * [新标签] v2.5.11 -> v2.5.11 * [新标签] v2.5.12 -> v2.5.12 * [新标签] v2.5.13 -> v2.5.13 * [新标签] v2.5.2 -> v2.5.2 * [新标签] v2.5.3 -> v2.5.3 * [新标签] v2.5.4 -> v2.5.4 * [新标签] v2.5.5 -> v2.5.5 * [新标签] v2.5.6 -> v2.5.6 * [新标签] v2.5.7 -> v2.5.7 * [新标签] v2.5.7-rc1 -> v2.5.7-rc1 * [新标签] v2.5.8 -> v2.5.8 * [新标签] v2.5.9 -> v2.5.9 * [新标签] v2.6.0 -> v2.6.0 * [新标签] v2.6.0-rc1 -> v2.6.0-rc1 * [新标签] v2.6.0-rc2 -> v2.6.0-rc2 * [新标签] v2.6.1 -> v2.6.1 * [新标签] v2.6.2 -> v2.6.2 * [新标签] v2.6.2-rc1 -> v2.6.2-rc1 * [新标签] v2.6.3 -> v2.6.3 * [新标签] v2.6.3-rc1 -> v2.6.3-rc1 * [新标签] v2.6.4 -> v2.6.4 * [新标签] v2.6.4-rc1 -> v2.6.4-rc1 * [新标签] v2.6.5 -> v2.6.5 * [新标签] v2.6.6 -> v2.6.6 * [新标签] v2.6.7 -> v2.6.7 * [新标签] v2.6.8 -> v2.6.8 * [新标签] v2.7.0 -> v2.7.0 * [新标签] v2.7.0-rc1 -> v2.7.0-rc1 * [新标签] v2.7.0-rc3 -> v2.7.0-rc3 * [新标签] v2.7.1 -> v2.7.1 * [新标签] v2.7.2 -> v2.7.2 * [新标签] v2.7.3 -> v2.7.3 * [新标签] v2.7.4 -> v2.7.4 * [新标签] v2.7.5 -> v2.7.5 * [新标签] v2.7.6 -> v2.7.6 * [新标签] v2.7.7 -> v2.7.7 * [新标签] v2.8.0 -> v2.8.0 * [新标签] v2.8.0-rc1 -> v2.8.0-rc1 * [新标签] v2.9.0 -> v2.9.0 * [新标签] v2.9.0-rc1 -> v2.9.0-rc1 * [新标签] v2.9.0-rc2 -> v2.9.0-rc2 * [新标签] v2.9.1 -> v2.9.1 * [新标签] v2.9.1-rc1 -> v2.9.1-rc1 * [新标签] v2.9.10 -> v2.9.10 * [新标签] v2.9.2 -> v2.9.2 * [新标签] v2.9.3 -> v2.9.3 * [新标签] v2.9.4 -> v2.9.4 * [新标签] v2.9.5 -> v2.9.5 * [新标签] v2.9.6 -> v2.9.6 * [新标签] v2.9.7 -> v2.9.7 * [新标签] v2.9.8 -> v2.9.8 * [新标签] v2.9.9 -> v2.9.9 * [新标签] v3.0.0 -> v3.0.0 * [新标签] v3.0.0-rc1 -> v3.0.0-rc1 * [新标签] v3.0.1 -> v3.0.1 * [新标签] v3.0.10 -> v3.0.10 * [新标签] v3.0.11 -> v3.0.11 * [新标签] v3.0.12 -> v3.0.12 * [新标签] v3.0.13 -> v3.0.13 * [新标签] v3.0.14 -> v3.0.14 * [新标签] v3.0.2 -> v3.0.2 * [新标签] v3.0.3 -> v3.0.3 * [新标签] v3.0.4 -> v3.0.4 * [新标签] v3.0.5 -> v3.0.5 * [新标签] v3.0.6 -> v3.0.6 * [新标签] v3.0.7 -> v3.0.7 * [新标签] v3.0.8 -> v3.0.8 * [新标签] v3.0.9 -> v3.0.9 user@debian:~/ModSecurity$ git checkout v3.0.8 注意:正在切换到 'v3.0.8'。 您正处于分离头指针状态。您可以查看、做试验性的修改及提交,并且您可以在切换 回一个分支时,丢弃在此状态下所做的提交而不对分支造成影响。 如果您想要通过创建分支来保留在此状态下所做的提交,您可以通过在 switch 命令 中添加参数 -c 来实现(现在或稍后)。例如: git switch -c <新分支名> 或者撤销此操作: git switch - 通过将配置变量 advice.detachedHead 设置为 false 来关闭此建议 HEAD 目前位于 996c7e1e Change release version to v3.0.8 user@debian:~/ModSecurity$ ./build.sh libtoolize: putting auxiliary files in '.'. libtoolize: copying file './ltmain.sh' libtoolize: putting macros in AC_CONFIG_MACRO_DIRS, 'build'. libtoolize: copying file 'build/libtool.m4' libtoolize: copying file 'build/ltoptions.m4' libtoolize: copying file 'build/ltsugar.m4' libtoolize: copying file 'build/ltversion.m4' libtoolize: copying file 'build/lt~obsolete.m4' configure.ac:84: warning: The macro `AC_HELP_STRING' is obsolete. configure.ac:84: You should run autoupdate. ./lib/autoconf/general.m4:204: AC_HELP_STRING is expanded from... build/yajl.m4:4: PROG_YAJL is expanded from... configure.ac:84: the top level configure.ac:98: warning: The macro `AC_HELP_STRING' is obsolete. configure.ac:98: You should run autoupdate. ./lib/autoconf/general.m4:204: AC_HELP_STRING is expanded from... build/lmdb.m4:4: PROG_LMDB is expanded from... configure.ac:98: the top level configure.ac:102: warning: The macro `AC_HELP_STRING' is obsolete. configure.ac:102: You should run autoupdate. ./lib/autoconf/general.m4:204: AC_HELP_STRING is expanded from... build/ssdeep.m4:5: CHECK_SSDEEP is expanded from... configure.ac:102: the top level configure.ac:106: warning: The macro `AC_HELP_STRING' is obsolete. configure.ac:106: You should run autoupdate. ./lib/autoconf/general.m4:204: AC_HELP_STRING is expanded from... build/lua.m4:5: CHECK_LUA is expanded from... configure.ac:106: the top level configure.ac:106: warning: The macro `AC_TRY_COMPILE' is obsolete. configure.ac:106: You should run autoupdate. ./lib/autoconf/general.m4:2847: AC_TRY_COMPILE is expanded from... build/lua.m4:121: CHECK_FOR_LUA_AT is expanded from... build/lua.m4:5: CHECK_LUA is expanded from... configure.ac:106: the top level configure.ac:113: warning: The macro `AC_HELP_STRING' is obsolete. configure.ac:113: You should run autoupdate. ./lib/autoconf/general.m4:204: AC_HELP_STRING is expanded from... ./lib/autoconf/general.m4:1553: AC_ARG_WITH is expanded from... build/curl.m4:15: CHECK_CURL is expanded from... configure.ac:113: the top level configure.ac:123: warning: The macro `AC_HELP_STRING' is obsolete. configure.ac:123: You should run autoupdate. ./lib/autoconf/general.m4:204: AC_HELP_STRING is expanded from... ./lib/autoconf/general.m4:1553: AC_ARG_WITH is expanded from... build/libxml.m4:14: CHECK_LIBXML2 is expanded from... configure.ac:123: the top level configure.ac:129: warning: The macro `AC_HELP_STRING' is obsolete. configure.ac:129: You should run autoupdate. ./lib/autoconf/general.m4:204: AC_HELP_STRING is expanded from... ./lib/autoconf/general.m4:1553: AC_ARG_WITH is expanded from... build/pcre.m4:15: CHECK_PCRE is expanded from... configure.ac:129: the top level configure.ac:129: warning: The macro `AC_TRY_LINK' is obsolete. configure.ac:129: You should run autoupdate. ./lib/autoconf/general.m4:2920: AC_TRY_LINK is expanded from... build/pcre.m4:15: CHECK_PCRE is expanded from... configure.ac:129: the top level configure.ac:135: warning: The macro `AC_HELP_STRING' is obsolete. configure.ac:135: You should run autoupdate. ./lib/autoconf/general.m4:204: AC_HELP_STRING is expanded from... build/pcre2.m4:4: PROG_PCRE2 is expanded from... configure.ac:135: the top level configure.ac:140: warning: The macro `AC_HEADER_STDC' is obsolete. configure.ac:140: You should run autoupdate. ./lib/autoconf/headers.m4:704: AC_HEADER_STDC is expanded from... configure.ac:140: the top level configure.ac:231: warning: The macro `AC_HELP_STRING' is obsolete. configure.ac:231: You should run autoupdate. ./lib/autoconf/general.m4:204: AC_HELP_STRING is expanded from... ./lib/autoconf/general.m4:1534: AC_ARG_ENABLE is expanded from... configure.ac:231: the top level configure.ac:249: warning: The macro `AC_HELP_STRING' is obsolete. configure.ac:249: You should run autoupdate. ./lib/autoconf/general.m4:204: AC_HELP_STRING is expanded from... ./lib/autoconf/general.m4:1534: AC_ARG_ENABLE is expanded from... configure.ac:249: the top level configure.ac:262: warning: The macro `AC_HELP_STRING' is obsolete. configure.ac:262: You should run autoupdate. ./lib/autoconf/general.m4:204: AC_HELP_STRING is expanded from... ./lib/autoconf/general.m4:1534: AC_ARG_ENABLE is expanded from... configure.ac:262: the top level configure.ac:275: warning: The macro `AC_HELP_STRING' is obsolete. configure.ac:275: You should run autoupdate. ./lib/autoconf/general.m4:204: AC_HELP_STRING is expanded from... ./lib/autoconf/general.m4:1534: AC_ARG_ENABLE is expanded from... configure.ac:275: the top level configure.ac:288: warning: The macro `AC_HELP_STRING' is obsolete. configure.ac:288: You should run autoupdate. ./lib/autoconf/general.m4:204: AC_HELP_STRING is expanded from... ./lib/autoconf/general.m4:1534: AC_ARG_ENABLE is expanded from... configure.ac:288: the top level configure.ac:307: warning: AC_PROG_LEX without either yywrap or noyywrap is obsolete ./lib/autoconf/programs.m4:716: _AC_PROG_LEX is expanded from... ./lib/autoconf/programs.m4:709: AC_PROG_LEX is expanded from... configure.ac:307: the top level configure.ac:50: installing './compile' configure.ac:45: installing './missing' examples/multiprocess_c/Makefile.am: installing './depcomp' configure.ac:84: warning: The macro `AC_HELP_STRING' is obsolete. configure.ac:84: You should run autoupdate. ./lib/autoconf/general.m4:204: AC_HELP_STRING is expanded from... build/yajl.m4:4: PROG_YAJL is expanded from... configure.ac:84: the top level configure.ac:98: warning: The macro `AC_HELP_STRING' is obsolete. configure.ac:98: You should run autoupdate. ./lib/autoconf/general.m4:204: AC_HELP_STRING is expanded from... build/lmdb.m4:4: PROG_LMDB is expanded from... configure.ac:98: the top level configure.ac:102: warning: The macro `AC_HELP_STRING' is obsolete. configure.ac:102: You should run autoupdate. ./lib/autoconf/general.m4:204: AC_HELP_STRING is expanded from... build/ssdeep.m4:5: CHECK_SSDEEP is expanded from... configure.ac:102: the top level configure.ac:106: warning: The macro `AC_HELP_STRING' is obsolete. configure.ac:106: You should run autoupdate. ./lib/autoconf/general.m4:204: AC_HELP_STRING is expanded from... build/lua.m4:5: CHECK_LUA is expanded from... configure.ac:106: the top level configure.ac:106: warning: The macro `AC_TRY_COMPILE' is obsolete. configure.ac:106: You should run autoupdate. ./lib/autoconf/general.m4:2847: AC_TRY_COMPILE is expanded from... build/lua.m4:121: CHECK_FOR_LUA_AT is expanded from... build/lua.m4:5: CHECK_LUA is expanded from... configure.ac:106: the top level configure.ac:113: warning: The macro `AC_HELP_STRING' is obsolete. configure.ac:113: You should run autoupdate. ./lib/autoconf/general.m4:204: AC_HELP_STRING is expanded from... ./lib/autoconf/general.m4:1553: AC_ARG_WITH is expanded from... build/curl.m4:15: CHECK_CURL is expanded from... configure.ac:113: the top level configure.ac:123: warning: The macro `AC_HELP_STRING' is obsolete. configure.ac:123: You should run autoupdate. ./lib/autoconf/general.m4:204: AC_HELP_STRING is expanded from... ./lib/autoconf/general.m4:1553: AC_ARG_WITH is expanded from... build/libxml.m4:14: CHECK_LIBXML2 is expanded from... configure.ac:123: the top level configure.ac:129: warning: The macro `AC_HELP_STRING' is obsolete. configure.ac:129: You should run autoupdate. ./lib/autoconf/general.m4:204: AC_HELP_STRING is expanded from... ./lib/autoconf/general.m4:1553: AC_ARG_WITH is expanded from... build/pcre.m4:15: CHECK_PCRE is expanded from... configure.ac:129: the top level configure.ac:129: warning: The macro `AC_TRY_LINK' is obsolete. configure.ac:129: You should run autoupdate. ./lib/autoconf/general.m4:2920: AC_TRY_LINK is expanded from... build/pcre.m4:15: CHECK_PCRE is expanded from... configure.ac:129: the top level configure.ac:135: warning: The macro `AC_HELP_STRING' is obsolete. configure.ac:135: You should run autoupdate. ./lib/autoconf/general.m4:204: AC_HELP_STRING is expanded from... build/pcre2.m4:4: PROG_PCRE2 is expanded from... configure.ac:135: the top level configure.ac:140: warning: The macro `AC_HEADER_STDC' is obsolete. configure.ac:140: You should run autoupdate. ./lib/autoconf/headers.m4:704: AC_HEADER_STDC is expanded from... configure.ac:140: the top level configure.ac:231: warning: The macro `AC_HELP_STRING' is obsolete. configure.ac:231: You should run autoupdate. ./lib/autoconf/general.m4:204: AC_HELP_STRING is expanded from... ./lib/autoconf/general.m4:1534: AC_ARG_ENABLE is expanded from... configure.ac:231: the top level configure.ac:249: warning: The macro `AC_HELP_STRING' is obsolete. configure.ac:249: You should run autoupdate. ./lib/autoconf/general.m4:204: AC_HELP_STRING is expanded from... ./lib/autoconf/general.m4:1534: AC_ARG_ENABLE is expanded from... configure.ac:249: the top level configure.ac:262: warning: The macro `AC_HELP_STRING' is obsolete. configure.ac:262: You should run autoupdate. ./lib/autoconf/general.m4:204: AC_HELP_STRING is expanded from... ./lib/autoconf/general.m4:1534: AC_ARG_ENABLE is expanded from... configure.ac:262: the top level configure.ac:275: warning: The macro `AC_HELP_STRING' is obsolete. configure.ac:275: You should run autoupdate. ./lib/autoconf/general.m4:204: AC_HELP_STRING is expanded from... ./lib/autoconf/general.m4:1534: AC_ARG_ENABLE is expanded from... configure.ac:275: the top level configure.ac:288: warning: The macro `AC_HELP_STRING' is obsolete. configure.ac:288: You should run autoupdate. ./lib/autoconf/general.m4:204: AC_HELP_STRING is expanded from... ./lib/autoconf/general.m4:1534: AC_ARG_ENABLE is expanded from... configure.ac:288: the top level configure.ac:307: warning: AC_PROG_LEX without either yywrap or noyywrap is obsolete ./lib/autoconf/programs.m4:716: _AC_PROG_LEX is expanded from... ./lib/autoconf/programs.m4:709: AC_PROG_LEX is expanded from... configure.ac:307: the top level user@debian:~/ModSecurity$
最新发布
06-29
### 使用 `AC_ARG_ENABLE` 和 `--with-gtwwanstate` 根据系统变量 `ENABLE_GTWWANSTATE` 传递配置选项 在 Autoconf 中,可以通过 `AC_ARG_ENABLE` 实现一个布尔开关选项,允许用户通过 `--enable-<feature>` 或 `--disable-<feature>` 来启用或禁用特定功能。此外,也可以结合 `--with-gtwwanstate` 选项和系统变量 `ENABLE_GTWWANSTATE` 来实现更灵活的配置[^1]。 以下是如何使用 `AC_ARG_ENABLE` 和 `--with-gtwwanstate` 的详细说明: --- #### 1. 使用 `AC_ARG_ENABLE` 实现布尔开关选项 `AC_ARG_ENABLE` 用于定义一个布尔开关选项,例如 `--enable-gtwwanstate` 或 `--disable-gtwwanstate`。以下是具体实现代码: ```bash AC_ARG_ENABLE([gtwwanstate], [AS_HELP_STRING([--enable-gtwwanstate], [Enable GTW WAN state feature (default is no)])], [ case "${enableval}" in yes) ENABLE_GTWWANSTATE="yes" ;; no) ENABLE_GTWWANSTATE="no" ;; *) AC_MSG_ERROR([Invalid value for --enable-gtwwanstate. Use 'yes' or 'no'.]) ;; esac ], [ # 如果未指定 --enable-gtwwanstate,则尝试从环境变量获取 if test -n "$ENABLE_GTWWANSTATE"; then : # 环境变量已定义,直接使用 else ENABLE_GTWWANSTATE="no" # 默认值 fi ] ) ``` **代码说明:** - 的第一个参数是选项名称(去掉 `--enable-` 前缀),这里是 `gtwwanstate`。 - 第二个参数是帮助信息字符串,描述了该选项的作用及用法。 - 第三个参数是一个 shell 片段,用于处理用户提供的值。如果用户传递了 `--enable-gtwwanstate` 或 `--disable-gtwwanstate`,则分别设置 `ENABLE_GTWWANSTATE` 为 `yes` 或 `no`。 - 第四个参数是默认行为。如果用户未提供 `--enable-gtwwanstate` 参数,则检查环境变量 `ENABLE_GTWWANSTATE` 是否已定义。如果未定义,则将 `ENABLE_GTWWANSTATE` 设置为默认值 `no`。 --- #### 2. 使用 `AC_ARG_WITH` 实现带值的配置选项 `AC_ARG_WITH` 用于定义一个带值的配置选项,例如 `--with-gtwwanstate=VALUE`。以下是具体实现代码: ```bash AC_ARG_WITH([gtwwanstate], [AS_HELP_STRING([--with-gtwwanstate=VALUE], [Set ENABLE_GTWWANSTATE variable for GTW WAN state feature (default is no)])], [ case "${withval}" in yes|no) ENABLE_GTWWANSTATE="${withval}" ;; *) AC_MSG_ERROR([Invalid value for --with-gtwwanstate. Use 'yes' or 'no'.]) ;; esac ], [ # 如果未指定 --with-gtwwanstate,则尝试从环境变量获取 if test -n "$ENABLE_GTWWANSTATE"; then : # 环境变量已定义,直接使用 else ENABLE_GTWWANSTATE="no" # 默认值 fi ] ) ``` **代码说明:** - 的第一个参数是选项名称(去掉 `--with-` 前缀),这里是 `gtwwanstate`。 - 第二个参数是帮助信息字符串,描述了该选项的作用及用法。 - 第三个参数是一个 shell 片段,用于处理用户提供的值。如果用户传递了 `--with-gtwwanstate=yes` 或 `--with-gtwwanstate=no`,则分别设置 `ENABLE_GTWWANSTATE` 为 `yes` 或 `no`。 - 第四个参数是默认行为。如果用户未提供 `--with-gtwwanstate` 参数,则检查环境变量 `ENABLE_GTWWANSTATE` 是否已定义。如果未定义,则将 `ENABLE_GTWWANSTATE` 设置为默认值 `no`。 --- #### 3. 将变量替换到 Makefile 中 无论使用 `AC_ARG_ENABLE` 还是 `AC_ARG_WITH`,都需要通过 `AC_SUBST` 将变量替换到生成的 `Makefile` 中: ```bash AC_SUBST([ENABLE_GTWWANSTATE]) ``` 在 `Makefile.am` 中,可以根据 `ENABLE_GTWWANSTATE` 的值来控制编译逻辑: ```makefile if ENABLE_GTWWANSTATE_TRUE SOURCES += gtwwanstate.c endif ``` --- #### 4. 自动生成 `configure` 脚本 完成 `configure.ac` 编辑后,运行以下命令以生成 `configure` 脚本: ```bash autoreconf -i ``` 这将确保所有必要的文件(如 `configure` 和 `Makefile.in`)被正确生成。 --- #### 示例用法 假设用户运行以下命令: ```bash ./configure --enable-gtwwanstate ``` 则 `ENABLE_GTWWANSTATE` 将被设置为 `yes`,并且相关功能会被启用。 如果用户运行以下命令: ```bash ./configure --with-gtwwanstate=yes ``` 同样地,`ENABLE_GTWWANSTATE` 将被设置为 `yes`。 如果用户未指定任何选项,则会检查环境变量 `ENABLE_GTWWANSTATE` 的值。如果环境变量也未定义,则默认设置为 `no`。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值