zoukankan      html  css  js  c++  java
  • [strongswan][autoconf][automake][cento] 在CentOS上编译strongswan git源码时遇到的autoconf问题

    编译strongswan的git源码问题

    1. 概述

    首先,我们想要通过源码编译strongswan。当满足以下条件时,通常你会遇见此问题:

    1. 源码时通过git clone的得来的,而不是官网下载的源码包。
    2. 使用CentOS 7操作系统,或其他类redhat系统。

    问题:当执行autogen.sh时,会报错如下:

    [root@T9 strongswan.git]# ./autogen.sh 
    libtoolize: putting auxiliary files in `.'.
    libtoolize: copying file `./ltmain.sh'
    libtoolize: putting macros in AC_CONFIG_MACRO_DIR, `m4/config'.
    libtoolize: copying file `m4/config/libtool.m4'
    libtoolize: copying file `m4/config/ltoptions.m4'
    libtoolize: copying file `m4/config/ltsugar.m4'
    libtoolize: copying file `m4/config/ltversion.m4'
    libtoolize: copying file `m4/config/lt~obsolete.m4'
    configure.ac:360: error: possibly undefined macro: AC_LIB_PREFIX
          If this token and others are legitimate, please use m4_pattern_allow.
          See the Autoconf documentation.
    autoreconf: /usr/bin/autoconf failed with exit status: 1
    [root@T9 strongswan.git]# 
    

    解决方法:

    [root@T9 strongswan.git]# yum install gettext-devel 
    

    如果想知道为什么,请继续阅读。

    • ------------------------------------------ 丑陋的分割线 ----------------------------------

    2. 分析

    这个问题,奇怪的地方在与我们使用git的源码来编译就会出现这个问题。但是使用官网现在的源码包就没有问题。
    当然,版本自然是相同的。虽然我没有逐字节比较,但是我相信源码也是相同的。

    所以这就很奇怪。然后,google好久,把能看的全都看了,也没有解决方法。没办法只能自己分析了,过程如下。

    2.1 分析过程

    2.1.1 官方指引

    首先,先看一下官方指引。以及代码里的readme,install等文档。解决正常的依赖问题。比如装什么样的包。
    指引手册在这里:https://wiki.strongswan.org/projects/strongswan/repository/entry/HACKING
    自然,没有提供任何帮助,问题依然复现。

    2.1.2 源码包和Git的区别

    源码包的编译过程是运行configure脚本,再运行make。在相同的环境里是好的。
    GIt的代码是没有configure脚本的,需要使用autoconf工具生成。
    这便是二者的区别。如果你理解autoconf的设计理念,自然也就明白了为什么会有这种区别。
    源码包是一种发布方式,它是面向user的。Git代码自然是面向maintainer的。所以这个区别就是GNU的标准工作流,
    也没有任何问题。

    自此,我们可以将问题定位到autoconf,automake上面。

    2.1.3 autoconf,automake到底咋回事

    系统的学了一下,之后会另起一文详见讲,这里只描述一下关键信息,见下图:
    autoconf.jpg

    应该。。。看图就懂了,不做赘述。。。

    2.1.4 分析错误信息

    基于2.1.3,我们已经理解了autoconf,automake的基本运行和操作逻辑。现在分析一下关键的错误信息
    AC_LIB_PREFIX,m4_pattern_allow

    m4_pattern_allow是什么

    详见:
    https://www.gnu.org/software/autoconf/manual/autoconf.html#Forbidden-Patterns

    m4_pattern_allow是aclocal程序对于autoconf程序的控制。
    最终决定输出脚本configure中的语法。它写在autoconfg的输入文件configure.in中的。

    [root@T9 strongswan.git]# cat configure |grep AC_LIB_PRE
    AC_LIB_PREFIX
    [root@T9 strongswan.git]# cat configure.ac |grep AC_LIB_PRE
    AC_LIB_PREFIX
    [root@T9 strongswan.git]#
    

    这条日志信息的意思就是说,aclocal程序不允许AC_LIB_PREFIX作为关键字输出。
    可以使用
    m4_pattern_allow命令设置允许它的输出。

    所以现在问题可以定位到CentOS里边为什么没有对AC_LIB_PREFIX进行m4_pattern_allow。
    同时对比我的archlinux确实好用的。通过search发现在我的archlinux里,的lib-perfix.m4里定义了这个变量

    ╰─>$ cat /usr/share/aclocal/lib-prefix.m4 |grep AC_LIB_PREFIX
    dnl AC_LIB_PREFIX adds to the CPPFLAGS and LDFLAGS the flags that are needed
    AC_DEFUN([AC_LIB_PREFIX],
    
    

    2.1.5 分析lib-perfix.m4文件

    那我现在问题定位到,为什么CentOS里边没有lib-perfix.m4文件。
    现在已经知道lib-perfix.m4是由gettext包提供的。

    ╰─>$ pacman -Qo /usr/share/aclocal/lib-prefix.m4
    /usr/share/aclocal/lib-prefix.m4 is owned by gettext 0.19.8.1-3
    
    

    对比两台设备的软件版本:
    archlinux:

    ╰─>$ pacman -Q gettext
    gettext 0.19.8.1-3
    
    

    redhat:

    [root@T9 strongswan.git]# rpm -q gettext
    gettext-0.19.8.1-2.el7.x86_64
    
    

    好了!版本是一样的,都是0.19.8.1。后边的-2和-3代表打包时候的版本。
    那么就奇怪了,为什么少文件呢?

    因为CentOS把gettext分成了两个包,一个gettext一个gettext-devel。这个gettext-devel是CentOS自己搞的,
    人家GNU的官方release是没有的。见:http://ftp.gnu.org/pub/gnu/gettext/

    [root@T9 strongswan.git]# rpm -ql gettext-devel |grep lib-prefix
    /usr/share/aclocal/lib-prefix.m4
    
    

    完。

  • 相关阅读:
    Codeforces 101487E
    算法笔记--2-sat
    算法笔记--图的存储之链式前向星
    算法笔记--强连通分量分解
    Uva 11995 I Can Guess the Data Structure!
    算法笔记--米勒-罗宾素数测试
    HDU 5183 Negative and Positive (NP)
    算法笔记--快读(输入外挂)模板
    POJ 3258 River Hopscotch
    HDU 2289 Cup
  • 原文地址:https://www.cnblogs.com/hugetong/p/10282937.html
Copyright © 2011-2022 走看看