编译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到底咋回事

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

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

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

完。

[strongswan][autoconf][automake][cento] 在CentOS上编译strongswan git源码时遇到的autoconf问题的更多相关文章

  1. 在Ubuntu Server14.04上编译Android6.0源码

    此前编译过Android4.4的源码,但是现在Android都到了7.0的版本,不禁让我感叹Google的步伐真心难跟上,趁这周周末时间比较充裕,于是在过去的24小时里,毅然花了9个小时编译了一把An ...

  2. 【转】Linux(ubuntu14.04)上编译Android4.4源码的环境搭建及编译全过程

    原文网址:http://jileniao.net/linux-android-building.html sublime text让我伤心.本来很信任sublime text的自动保存功能,之前使用一 ...

  3. 编译你的第一个Java虚拟机--Centos 7 编译openJdk1.7源码

    一.前言 最近在看<深入java虚拟机>,看完后,打算自己实际编译一个jvm出来看看,实践一下. 书上提到了Oracle JDK和OpenJdk的关系,Oracle Jdk7 和OpenJ ...

  4. CentOS上编译安装Git

    1. 安装(编译安装)软件 # 先安装git依赖的包 yum install zlib-devel yum install openssl-devel yum install perl yum ins ...

  5. 【原】storm源码之mac os x编译twitter storm源码

    twitter storm是由backtype公司创始人nathanmarz一手研发和开源的流计算(实时计算)框架,堪称实时计算领域的hadoop.nathanmarz也是在mac os x环境下开发 ...

  6. 【转】编译Android系统源码和内核源码

    原文网址:http://blog.csdn.net/jiangwei0910410003/article/details/37988637 好长时间没有写blog了,之所以没有写,主要还是工作上的事, ...

  7. FW 编译Android系统源码和内核源码

    编译Android系统源码和内核源码 分类: Android2014-07-21 20:58 7287人阅读 评论(28) 收藏 举报 好长时间没有写blog了,之所以没有写,主要还是工作上的事,发现 ...

  8. 编译Android系统源码和内核源码

    [日期:2016-01-11] 来源:Linux社区  作者:jiangwei [字体:大 中 小]     把我之前编译Android系统源码和内核源码的过程记录一下,因为这个过程真的是受益匪浅,看 ...

  9. 在Linux CentOS上编译CoreCLR

    经过几天的努力,终于解决了在CentOS上编译CoreCLR的问题.最终发现问题是CMAKE_C_FLAGS的设置引起的. 只要在“src/pal/tools/clang-compiler-overr ...

随机推荐

  1. DeepLearning.ai学习笔记(四)卷积神经网络 -- week4 特殊应用:人力脸识别和神经风格转换

    一.什么是人脸识别 老实说这一节中的人脸识别技术的演示的确很牛bi,但是演技好尴尬,233333 啥是人脸识别就不用介绍了,下面笔记会介绍如何实现人脸识别. 二.One-shot(一次)学习 假设我们 ...

  2. 对OAuth协议的认识

    一. OAuth是什么 OAuth 是Open Authorization的简写.OAuth 协议为用户资源的授权提供了一个安全的.开放而又简易的标准. 通俗地说,就是当我们想把自己系统的某些功能暴露 ...

  3. 1.2低级线程处理API

    并行扩展库相当有用,因为它允许使用更高级的抽象——任务,而不必直接和线程打交道.但有的时候,要处理的代码是在TPL和PLINQ问世(.NET4.0)之前写的.也有可能某个编程问题不能直接使用它们解决, ...

  4. Python-HTTP 概况

    前端知识 网页最主要由3部分组成: 结构.表现和行为.网页现在新的标准是W3C,目前模式是HTML.CSS和JavaScript. (1)HTML HTML,全称“Hyper Text Markup ...

  5. vue路由懒加载

    大项目中,为了提高初始化页面的效率,路由一般使用懒加载模式,一共三种实现方式.(1)第一种写法: component: (resolve) => require(['@/components/O ...

  6. C#+EntityFramework编程方式详细之Code First

    Code First Code First模式即“代码优先”模式,是从EF4.1开始新建加入的功能.使用Code First模式进行EF开发时只需要编写对应的数据类,然后自动生成数据库. Code F ...

  7. jsp 安全

    一.  身份验证和授权 认证是检验某人真正是他/她自称的那个人的过 程.在一个Servlet/JSP应用程序中,身份验证一般通过 检查用户名密码是否正确.授权是检查该级别的用户是 否具备访问权限.它适 ...

  8. XMLHttpRequest.withCredentials 解决跨域请求头无Cookie的问题

    查看原文 XMLHttpRequest.withCredentials  属性是一个Boolean类型,它指示了是否该使用类似cookies,authorization headers(头部授权)或者 ...

  9. word 内容控件属性编辑

    场景: 别人发给自己一份word模板,基于统一性,里面包含了很多“内容控件”,一般情况下,只需要根据内容控件进行编辑即可,但如果想对内容控件本身做编辑操作,例如删除等. 操作: 单击 文件>选项 ...

  10. DOS批处理高级教程(还不错)(转)

    前言 目录 第二节 常用特殊符号     1.@  命令行回显屏蔽符     2.%  批处理变量引导符     3.>   输出重定向符     4.>>  输出重定向符     ...