【问题标题】:In autoconf, how to create temporary files and test shell command?在 autoconf 中,如何创建临时文件和测试 shell 命令?
【发布时间】:2020-12-06 17:35:26
【问题描述】:

在我的 configure.ac 中,我想创建一个临时文件(一个 Makefile),并执行一些东西(make)。验证某些包含中的某些已定义变量(此处无关紧要)。

当然我可以创建 /tmp/Makefile、cd /tmp、make 等...但我需要清理,可能创建一个随机子文件夹,这样我就不会在那里覆盖 Makefile 等。

但是没有像 AC_TRY_COMPILE 这样的东西吗?但不尝试编译,只是运行一些东西。显然 AC_TRY_*** 嵌入了一种创建临时文件、删除它等的方法。我看到了参考 $ac_tmp 或 $tmp 但没有被正确替换。

【问题讨论】:

    标签: makefile autotools autoconf


    【解决方案1】:

    在我的 configure.ac 中,我想创建一个临时文件(一个 Makefile), 并执行某事(制作)。验证一些定义的变量 包括(这里没关系)。

    make 需要参与这对我来说听起来非常可疑,但我会从表面上回答这个问题。

    当然我可以创建 /tmp/Makefile、cd /tmp、make 等...但我需要 清理,创建一个随机子文件夹,这样我就不会覆盖 Makefile 那里等等。

    细节听起来仍然很可疑....

    但是没有像 AC_TRY_COMPILE 这样的东西吗?但不尝试 编译,只是运行一些东西。显然 AC_TRY_*** 嵌入了一种方式 创建一个临时文件,删除它等。我看到了参考 $ac_tmp 或 $tmp 但它没有被正确替换。

    不,Autoconf 没有内置的、面向用户的宏来运行任意 shell 命令。为什么会呢?通常只需将命令逐字写入 Autoconf 输入。有AC_RUN_IFELSE,但它的用途比你描述的更专业:不是运行任意命令,而是将提供的源代码编译到程序中并运行那个

    但是你的注意力似乎在这里滑落了。您开始询问有关创建临时文件的问题,现在您已转向运行命令。两者联系不紧密。特别是,是的,Autoconf configure 脚本确实会在执行某些执行特定命令的测试时创建和删除临时文件,但它们使用预定义的、(合理的)众所周知的名称,听起来不像这将达到您的目的。

    另一方面,Section 11.15 of the Autoconf manual,“常用工具的限制”,在其对mktemp 命令的讨论中准确地解决了您关于临时文件和目录的问题:

    Shell 脚本可以通过 mktemp 安全地使用临时文件,但确实如此 并非在所有系统上都存在。一种创建安全临时的便携式方法 文件名是创建一个模式为 700 的临时目录并使用 这个目录里面的文件。这两种方法都可以防止攻击者 获得控制权,尽管mktemp 不太可能无缘无故地失败 受到攻击。

    以下是安全创建新临时目录“$dir”的示例代码:

        # Create a temporary directory $dir in $TMPDIR (default /tmp).
        # Use mktemp if possible; otherwise fall back on mkdir,
        # with $RANDOM to make collisions less likely.
        : "${TMPDIR:=/tmp}"
        {
          dir=`
           (umask 077 && mktemp -d "$TMPDIR/fooXXXXXX") 2>/dev/null
          ` &&
          test -d "$dir"
        } || {
          dir=$TMPDIR/foo$$-$RANDOM
        
          (umask 077 && mkdir "$dir")
        } || exit $?
    

    如果你想要的不仅仅是一个简单的“不”关于有一个内置宏,如果有一个内置宏已经做到了,那么手册不太可能会打扰讨论细节给你。

    【讨论】:

    • 是的,make 很可疑,但我需要让库 (DPDK) 导出 CFLAGS。获得它们的唯一方法是通过包含他们的 Makefile 的复杂图表。他们正在转向 pkg-config,但与此同时,我仍然需要支持他们的 Make 系统。这很具体,我同意。但过分我不会问。是的,这是两件事,但 AC_RUN_IFELSE 也做了几乎相同的两件事。
    猜你喜欢
    • 1970-01-01
    • 2020-11-25
    • 2011-12-30
    • 2021-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-19
    • 1970-01-01
    相关资源
    最近更新 更多