使用 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,dnf
、yum
或 zypper
) 或在线搜索 (https://packages.qa.debian.org/、...),但这是另一个话题。
我在这里假设您不是 configure.ac
文件的所有者。
不幸的是,我认为不存在这样的工具。
根据 William Pursell 在 this post 中的回答,autotools 不是包管理器,因此它对包本身一无所知,就像 Linux 发行版的包管理器一样。
pkg-config 为 autotools 带来了一些包的概念,但根据我之前链接的 post,它给出的结果可能是错误的,尤其是当你考虑交叉编译时。
但是,您仍然可以使用 configure.ac 中的 pkg-config 宏来尝试识别缺少哪些包(您的 OS 包管理器知道)。
关于AC_CHECK_LIB
和AC_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] 的详细信息=],等等被调用的宏。通过这种方式,您可以很好地了解构建包所需的库,但不知道在其中找到它们的特定目录。
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,dnf
、yum
或 zypper
) 或在线搜索 (https://packages.qa.debian.org/、...),但这是另一个话题。
我在这里假设您不是 configure.ac
文件的所有者。
不幸的是,我认为不存在这样的工具。
根据 William Pursell 在 this post 中的回答,autotools 不是包管理器,因此它对包本身一无所知,就像 Linux 发行版的包管理器一样。
pkg-config 为 autotools 带来了一些包的概念,但根据我之前链接的 post,它给出的结果可能是错误的,尤其是当你考虑交叉编译时。
但是,您仍然可以使用 configure.ac 中的 pkg-config 宏来尝试识别缺少哪些包(您的 OS 包管理器知道)。
关于AC_CHECK_LIB
和AC_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] 的详细信息=],等等被调用的宏。通过这种方式,您可以很好地了解构建包所需的库,但不知道在其中找到它们的特定目录。