C++学习(三五八)configure脚本

由bash/sh解释执行

configure脚本为了让一个程序能够在各种不同类型的机器上运行而设计的。在使用make编译源代码之前,configure会根据自己所依赖的库而在目标机器上进行匹配。

约定俗成的,所有的configure脚本都把脚本文件名起为configure,一般来讲都是shell脚本,根据所在的系统环境生成makefile文件。

configure脚本运行时扫描当前环境,生成一个名为config.status的子脚本。子脚本将Makefile.in文件转换为适应于当前系统环境的Makefile文件。

configure.ac 该文件为autoconfigure文件使用的一个文件,该文件用来生成configure文件,这个文件一般是开发者维护,我们安装该软件的时候只需要执行configure就可以,这个configure.ac我们一般不用理会

configure 这个是我们需要监测环境的主要入口文件,使用该文件可以生成Makefile文件,它会替换Makefile中需要替换的变量。

config.guess 这个是在构建环境上运行的一个脚本,它用来猜测构建机的配置环境,因为这个脚本是在构建机上运行,所以它可以动态执行uname等命令来获得构建机的环境,所以我们一般不要指定这个变量,从而让脚本自动获得。

config.sub 这个是将host target build变量正则化的一个脚本,它的sub就是substitute的缩写。因为用户提供的build可能并不符合脚本正规的四元组或者三元组的结

`autoconf` 生成的 `configure` 脚本本身是一个 shell 脚本,它用于检测目标系统的特性,以确保软件能够在该系统上正确编译和运行。如果你需要修改内核版本相关的检测逻辑,通常是为了适配特定的内核功能或规避某些版本的兼容性问题。 ### 1. 修改 configure 脚本中的内核版本检测逻辑 通常,`configure` 脚本不会直接检测“内核版本”,而是通过 `uname -r` 或系统头文件(如 `<linux/version.h>`)来获取内核信息。以下是一个典型的检测逻辑示例: #### 示例:检查内核版本是否大于等于 5.4.0 ```m4 AC_DEFUN([AX_CHECK_KERNEL_VERSION], [ AC_MSG_CHECKING([for kernel version >= 5.4.0]) kernel_version=`uname -r` AC_SUBST(KERNEL_VERSION, "$kernel_version") # Compare version using awk valid_version=`echo "$kernel_version 5.4.0" | awk ' function version_num(v) { split(v, a, "."); if (length(a) < 3) return 0; sum = a[1] * 1000000 + a[2] * 1000 + a[3]; return sum; } BEGIN { if (version_num($1) >= version_num($2)) print "yes"; else print "no"; }'` if test "$valid_version" = "yes"; then AC_MSG_RESULT([yes]) AC_DEFINE([HAVE_KERNEL_5_4_0], [1], [Define if kernel version >= 5.4.0]) else AC_MSG_RESULT([no]) AC_MSG_ERROR([Kernel version must be >= 5.4.0]) fi ]) ``` #### 在 `configure.ac` 中调用 ```m4 AX_CHECK_KERNEL_VERSION ``` 运行 `autoconf` 后生成的 `configure` 脚本会包含上述逻辑。 --- ### 2. 修改已生成的 `configure` 脚本 如果你已经生成了 `configure` 脚本,也可以直接修改它: ```sh # 在 configure 脚本中添加如下代码段 echo "Checking kernel version..." kernel_version=$(uname -r) echo "Current kernel version: $kernel_version" # 使用 awk 比较版本号 valid_version=$(echo "$kernel_version 5.4.0" | awk ' function version_num(v) { split(v, a, "."); sum = a[1] * 1000000 + a[2] * 1000 + a[3]; return sum; } BEGIN { if (version_num($1) >= version_num($2)) print "yes"; else print "no"; }') if [ "$valid_version" = "yes" ]; then echo "Kernel version is OK." else echo "Error: Kernel version must be >= 5.4.0" exit 1 fi ``` --- ### 3. 在 `Makefile.am` 或代码中使用检测结果 在 `configure.ac` 中使用 `AC_DEFINE` 定义宏后,你可以在 C/C++ 源码中使用: ```c #ifdef HAVE_KERNEL_5_4_0 printf("Running on kernel >= 5.4.0\n"); #else printf("Older kernel detected\n"); #endif ``` --- ### 4. 重新生成 configure 脚本 如果你修改了 `configure.ac`,需要重新运行: ```bash autoconf ``` 有时还需要 `automake` 和 `aclocal`: ```bash aclocal autoconf autoheader automake --add-missing ``` --- ### 总结 - `autoconf` 生成的 `configure` 可以通过修改 `configure.ac` 来添加内核版本检测逻辑。 - 使用 `uname -r` 获取内核版本,使用 `awk` 比较版本号。 - 可以通过 `AC_DEFINE` 向代码中传递配置信息。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值