有关PHP 中 config.m4 的探索


Posted in PHP onAugust 26, 2020

最近在看php扩展相关的东西,虽然来来回回编辑了好多次config.m4,并且也在技术社区看到了 config.m4是什么?什么作用? 类的问题,但是还是觉得有必要在深入的了解下。

.m4后缀的文件一般被当做 通用的宏处理,来看下官方的介绍:

GNU M4 is an implementation of the traditional Unix macro processor. It is mostly SVR4 compatible although it has some extensions (for example, handling more than 9 positional parameters to macros). GNU M4 also has built-in functions for including files, running shell commands, doing arithmetic, etc.

GNU M4 is a macro processor in the sense that it copies its input to the output expanding macros as it goes. Macros are either builtin or user-defined and can take any number of arguments. Besides just doing macro expansion, m4 has builtin functions for including named files, running UNIX commands, doing integer arithmetic, manipulating text in various ways, recursion etc... m4 can be used either as a front-end to a compiler or as a macro processor in its own right.

One of the biggest users of GNU M4 is the GNU Autoconf project.

简单而通俗易懂的翻译下:GNU M4是传统UNIX宏处理器的一种实现方式,它还具有一些内置功能,包括文件,shell,运算等。
作为一个宏处理器,将输入复制到扩展的输出,它要么内置,要么用户定义,且可以接受参数。另外这个还有内置函数,包括命名文件、运行UNIX命令、执行整数运算、以各种方式操作文本、递归等。M4既可以作为编译器的前端使用,也可以作为自己的宏处理器使用。
GNU M4的最大用户之一是GNU AutoCOF项目。

到这里大致了解到,它是作为一个宏处理器,然后再想想PHP扩展里面用到它做了什么,先看看 php源码扩展目录ext中 bcmath 中的代码:

dnl
dnl $Id$
dnl

PHP_ARG_ENABLE(bcmath, whether to enable bc style precision math functions,
[ --enable-bcmath Enable bc style precision math functions])

if test "$PHP_BCMATH" != "no"; then
 PHP_NEW_EXTENSION(bcmath, bcmath.c \
libbcmath/src/add.c libbcmath/src/div.c libbcmath/src/init.c libbcmath/src/neg.c libbcmath/src/outofmem.c libbcmath/src/raisemod.c libbcmath/src/rt.c libbcmath/src/sub.c \
libbcmath/src/compare.c libbcmath/src/divmod.c libbcmath/src/int2num.c libbcmath/src/num2long.c libbcmath/src/output.c libbcmath/src/recmul.c \
libbcmath/src/sqrt.c libbcmath/src/zero.c libbcmath/src/debug.c libbcmath/src/doaddsub.c libbcmath/src/nearzero.c libbcmath/src/num2str.c libbcmath/src/raise.c \
libbcmath/src/rmzero.c libbcmath/src/str2num.c,
 $ext_shared,,-I@ext_srcdir@/libbcmath/src)
 PHP_ADD_BUILD_DIR($ext_builddir/libbcmath/src)
 AC_DEFINE(HAVE_BCMATH, 1, [Whether you have bcmath])
fi

【dnl 在m4语法中相当于行注释的意思】

一些书籍中说明: config.m4是包含了配置时所执行的指令,例如上面这段代码很显然表明了,我写这个bcmath扩展,需要libbcmath/src/add.c,libbcmath/src/div.c 等等这些外部c源文件。PHP_NEW_EXTENSION()则是PHP定义的一个宏,最后的$ext_shared参数用来声明这个扩展不是一个静态模块,而是在php运行时动态加载的。
好像 我感觉还是不算太清晰,我在用一段白话来试图描述下吧。
config.m4文件中的代码会进入配置脚本的,也就是 configure。这里面包含 扩展的开关,扩展的名称,所需要的代码等等你想做的事情。为什么这么玩呢,因为PHP是使用 autoconf, automake, and libtool 3件套来构建扩展的,这3剑客一起使用,威力很大,但是也有点难。当扩展是PHP源码中的一部分时,我们可以在顶级目录 运行buildconf脚本,它会扫描每个子目录中的config.m4文件,然后他会把所有的配置文件config.m4合成一个 包含所有配置开关的 配置脚本。 这样的话,每个扩展就可以自己实现自己的配置检查,检查其所需的任何依赖和系统支持。区域这些想法和过程,宏检查和配置等工作,PHP选择了使用通过的M4脚本来配置

这里config.4文件的探索告一段落了,好像明白了一些了~~-。-

另外附一些PHP的宏,buildconf 处理config.m4所用:

AC_MSG_CHECKING(message)
在执行 configure 命令时输出“checking ”等信息。

AC_MSG_RESULT(value)
取得 AC_MSG_CHECKING 的执行结果,一般情况下 value 应为 yes 或 no。

AC_MSG_ERROR(message)
在执行 configure 命令时输出一条错误消息 message 并中止脚本的执行。

AC_DEFINE(name,value,description)
向 php_config.h 添加一行定义:#define name value // description (这对模块的条件编译很有用。)

AC_ADD_INCLUDE(path)
添加一条编译器的包含路径,比如用于模块需要为头文件添加搜索路径。

AC_ADD_LIBRARY_WITH_PATH(libraryname,librarypath)
指定一个库的连接路径。

AC_ARG_WITH(modulename,description,unconditionaltest,conditionaltest)
这是一款比较强大的宏,用于将模块的描述 description 添加到“configure ?help”命令的输出里面。PHP 会检查当前执行的 configure 脚本里面有没有?with- 这个选项。 如果有则执行 unconditionaltest 语句(比如 ?with-myext=yes 等), 此时,选项的值会被包含在 $withval 变量里面。否则就执行 conditionaltest 语句。

PHP_EXTENSION(modulename, [shared])
这个是配置你的扩展时 PHP 必定调用的一个宏。你可以在模块名后面提供第二个参数,用来表明是否将其编译为动态共享模块。这会导致在编译时为你的源码提供一个 COMPILE_DL_ 的定义。

上述有查到以下页面索取资料:
https://www.ibm.com/support/knowledgecenter/zh/ssw_aix_72/com.ibm.aix.genprogc/m4macro.htm
https://zh.wikipedia.org/wiki/M4_(%E7%A8%8B%E5%BC%8F%E8%AA%9E%E8%A8%80)
https://blog.csdn.net/timekeeperl/article/details/50738164
https://docstore.mik.ua/orelly/webprog/php/ch14_04.htm

总结

到此这篇关于PHP 中 config.m4 的探索的文章就介绍到这了,更多相关PHP 中 config.m4内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

PHP 相关文章推荐
提问的智慧(2)
Oct 09 PHP
PHP调用MsSQL Server 2012存储过程获取多结果集(包含output参数)的详解
Jul 03 PHP
php警告Creating default object from empty value 问题的解决方法
Apr 02 PHP
php面象对象数据库操作类实例
Dec 02 PHP
php程序内部post数据的方法
Mar 31 PHP
微信公众号支付之坑:调用支付jsapi缺少参数 timeStamp等错误解决方法
Jan 12 PHP
Yii数据模型中rules类验证器用法分析
Jul 15 PHP
php die()与exit()的区别实例详解
Dec 03 PHP
PHP常用函数总结(180多个)
Dec 25 PHP
php usort 使用用户自定义的比较函数对二维数组中的值进行排序
May 02 PHP
Laravel 中使用 Vue.js 实现基于 Ajax 的表单提交错误验证操作
Jun 30 PHP
PHP7扩展开发教程之Hello World实现方法示例
Aug 03 PHP
安装PHP扩展时解压官方 tgz 文件后没有configure文件无法进行配置编译的问题
Aug 26 #PHP
50个优秀经典PHP算法大集合 附源码
Aug 26 #PHP
Laravel登录失败次数限制的实现方法
Aug 26 #PHP
利用PHP计算有多少小于当前数字的数字方法示例
Aug 26 #PHP
one.php 多项目、函数库、类库 统一为一个版本的方法
Aug 24 #PHP
PHP执行普通shell命令流程解析
Aug 24 #PHP
PHP连接SQL server数据库测试脚本运行实例
Aug 24 #PHP
You might like
php switch语句多个值匹配同一代码块的实现
2014/03/03 PHP
PHP模版引擎原理、定义与用法实例
2019/03/29 PHP
用javascript实现兼容IE7的类库 IE7_0_9.zip提供下载
2007/08/08 Javascript
用AJAX返回HTML片段中的JavaScript脚本
2010/01/04 Javascript
JavaScript ( (__ = !$ + $)[+$] + ({} + $)[_/_] +({} + $)[_/_] )
2011/02/25 Javascript
8个超实用的jQuery功能代码分享
2015/01/08 Javascript
JavaScript设置body高度为浏览器高度的方法
2015/02/09 Javascript
浅析jQuery Ajax请求参数和返回数据的处理
2016/02/24 Javascript
JavaScript弹窗基础篇
2016/04/27 Javascript
简单实现jQuery多选框功能
2017/01/09 Javascript
vue 如何添加全局函数或全局变量以及单页面的title设置总结
2017/06/01 Javascript
node+koa实现数据mock接口的方法
2017/09/20 Javascript
Vue异步组件处理路由组件加载状态的解决方案
2018/09/07 Javascript
[49:42]DOTA2上海特级锦标赛主赛事日 - 3 胜者组第二轮#2Secret VS EG第一局
2016/03/04 DOTA
[53:36]Liquid vs VP Supermajor决赛 BO 第三场 6.10
2018/07/05 DOTA
[51:39]DOTA2-DPC中国联赛 正赛 Magma vs LBZS BO3 第二场 2月7日
2021/03/11 DOTA
使用python实现baidu hi自动登录的代码
2013/02/10 Python
Python中字符编码简介、方法及使用建议
2015/01/08 Python
python3射线法判断点是否在多边形内
2019/06/28 Python
Python编写打字训练小程序
2019/09/26 Python
PYTHON绘制雷达图代码实例
2019/10/15 Python
Pytorch: 自定义网络层实例
2020/01/07 Python
Python实现多线程下载脚本的示例代码
2020/04/03 Python
Pycharm pyuic5实现将ui文件转为py文件,让UI界面成功显示
2020/04/08 Python
pandas dataframe 中的explode函数用法详解
2020/05/18 Python
CSS3常用的几种颜色渐变模式总结
2016/11/18 HTML / CSS
详解canvas drawImage()方法绘制图片不显示的问题
2018/10/08 HTML / CSS
大学生个人简历中的自我评价
2013/12/27 职场文书
工程采购员岗位职责
2014/03/09 职场文书
结对共建工作方案
2014/06/02 职场文书
2014村书记党建工作汇报材料
2014/11/02 职场文书
电子商务专业求职信范文
2015/03/19 职场文书
论文评审意见
2015/06/05 职场文书
2015年小学教师培训工作总结
2015/07/21 职场文书
Python使用永中文档转换服务
2022/05/06 Python
教你如何用cmd快速登录服务器
2022/06/10 Servers