使用 autotools 获取所需 headers 和库

Using autotools to get needed headers and libraries

configure.ac 可以包含对 headers 和库的检查:

AC_CHECK_LIB(cap,cap_compare,[cap_libs="-lcap"])
AC_CHECK_HEADERS([sys/acl.h linux/netlink.h])

因为有一个 autotools 支持只是为了简单地获取这些文件的列表(它们的默认位置,即使没有显示或至少显示这些文件的位置):

/usr/include/sys/acl.h
/lib/x86_64-linux-gnu/libcap.so.2

我正在尝试 find/create 工具,该工具会从 autotools 输入生成 Linux 发行版的缺失包。

UPDATE 我发现我没有正确表达自己,用不正确的陈述误导了你。我是 LTP project 的开发者之一。我扩展了我们的 autotools 宏,所以我知道它是如何工作的。由于这个项目的目标是从源代码编译(发行版中不会有包),我想让用户更容易编译它,为它提供所有主要 Linux 发行版的包依赖列表.

手动维护这些依赖项可能是最简单的方法。但是因为我们以 autotools AC_CHECK_LIB()AC_CHECK_HEADERS() 宏的形式拥有这些依赖项,所以我想使用它。以某种方式输入 autotools(configure.ac 和所有 m4/*.m4)并生成 headers 和目录列表:

sys/acl.h
linux/netlink.h
...

libcap.so
...

这份清单对我很有帮助。这就是我想知道的。

当然,我可以手动制作此列表或使用正则表达式从 autotools 或源代码中解析它,但如果能从 autotools 中直接获取它就更好了。

关于如何处理这个列表的想法:我有另一个带有预定义包含路径和默认库路径的脚本(/usr/include/ 将是大多数发行版的包含路径添加例如 Debian/Ubuntu 的 /lib/x86_64-linux-gnu/ 或 openSUSE 的 /usr/lib64),我将其放在 headers 和库的前面。恕我直言 pkg-config 不是一个选项,因为它的 *.pc 配置文件是随依赖项一起安装的,因此当我正在搜索的软件包未安装时它将不可用。

然后我会使用能够在线搜索的分发工具在这个列表中搜索包(即不依赖于正在安装的包,即 apt-file for Debian/Ubuntu,dnfyumzypper) 或在线搜索 (https://packages.qa.debian.org/、...),但这是另一个话题。

我在这里假设您不是 configure.ac 文件的所有者。 不幸的是,我认为不存在这样的工具。

根据 William Pursell 在 this post 中的回答,autotools 不是包管理器,因此它对包本身一无所知,就像 Linux 发行版的包管理器一样。

pkg-config 为 autotools 带来了一些包的概念,但根据我之前链接的 post,它给出的结果可能是错误的,尤其是当你考虑交叉编译时。

但是,您仍然可以使用 configure.ac 中的 pkg-config 宏来尝试识别缺少哪些包(您的 OS 包管理器知道)。

关于AC_CHECK_LIBAC_CHECK_HEADERS,我相信你会很难用它们来生成丢失的头文件和库的绝对路径,原因如下:

  • 头文件和库文件的位置前缀取决于分布(历史的 /usr/lib 与更新的 /usr/lib/x86_64-linux 在 Ubuntu 16.04 上看到的 ex)
  • 发行版本身也是如此(/usr/lib vs /usr/local/lib
  • 一些 OS 包管理器不会给你一个给定包中包含的文件列表,除非该包实际上已经安装在你的系统上(Ubuntu 上的 apt 就是这种情况) 16.04)
  • 包含给定库的包在不同的发行版上可能有不同的名称(我记得在 Ubuntu 之后使用 Fedora 时遇到过这个问题,我找不到任何我习惯的包)

简而言之,我认为不存在这样的工具(但可能是错误的),编写一个工具可能会揭示相当复杂,并且与特定的东西密切相关 OS/distribution。

As there an autotools support just to simply get list of these files (their default location even if not presented or at least location to these which are presented):

您似乎对 Autoconf 的工作原理有误解。它不知道头文件或库的位置,当然也没有默认位置的概念。相反,它使用它之前发现的编译器和链接器,以及在其标准变量中设置的任何标志,来检查头文件和库是否存在。

编译器有a built-in search path for headers, and the linker similarly has a built-in search path for libraries。这些可以通过 -I-L$CPPFLAGS$CFLAGS$LDFLAGS 中的其他标志进行扩充,视情况而定,在执行检查。这些组合决定了在哪些位置搜索任何特定的头文件或库,但同样,不是直接由 configure 脚本本身搜索。

I'm trying to find/create tool which would from autotools input generated missing packages of a Linux distro.

嗯,您当然可以解析Autoconf 输入文件。事实上,由于它被设计为通过 m4 进行处理,您可以编写一组替换的 m4 宏和配置来提供 AC_CHECK_HEADER、[=19] 的详细信息=],等等被调用的宏。通过这种方式,您可以很好地了解构建包所需的库,但不知道在其中找到它们的特定目录。