为什么autoconf缓存我的宏?

时间:2013-04-25 14:50:46

标签: autotools autoconf

我正在创建一个android.m4文件,以便轻松查找android SDK / NDK中程序的路径。

android.m4文件包含一个名为_android_path_found_notfound的辅助函数:

# _android_path_found_notfound(variable, program, path, found, notfound)
#
# search for a program in path. If found, 'variable' is set to the absolute path,
# then executes 'found', otherwise, 'variable' is set to '' and 'notfound' is run
m4_define([_android_path_found_notfound],
    [AC_PATH_PROG([_android_temp_],[$2],[_android_notfound],[$3])
     AS_IF( [test x"$_android_temp_" = x"_android_notfound"],
        [$1=""
        AC_SUBST([$1],[])
        $5],
        [$1="$_android_temp_"
        AC_SUBST([$1],[$_android_temp_])
        $4] )])

以及许多使用该辅助函数的函数:

AC_DEFUN([AC_PROG_ANDROID],
     [_android_path_found_notfound([ANDROID],[android],[$ANDROID_HOME:$PATH],[$1],[$2])]
)

AC_DEFUN([AC_PROG_DX],
     [_android_path_found_notfound([DX],[dx],[$ANDROID_HOME:$PATH],[$1],[$2])]
)

...

但是,当我运行一个调用AC_PROG_ANDROID然后调用AC_PROG_DX的配置脚本时,我得到了这个:

checking for android... /opt/android-sdk-update-manager/tools/android
checking for dx... (cached) /opt/android-sdk-update-manager/tools/android

第二行指向与第一行相同的程序,并读取(缓存)。为什么缓存结果?

1 个答案:

答案 0 :(得分:4)

AC_PATH_PROG将其结果保存在autoconf特定的变量中,该变量链接到AC_PATH_PROG中给出的变量。因此,如果您说AC_PATH_PROG([something],...,那么它将记住“某事”的答案。由于您的AC_PROG_ANDROID和AC_PROG_DX都设置了值_android_temp_,因此缓存并稍后使用该结果。

修复它的最简单方法可能是为AC_PROG_ANDROID和AC_PROG_DX使用不同的变量