有关PHP 中 config.m4 的探索

最近在看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内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • phpinfo()中Loaded Configuration File(none)的解决方法

    前言 单独编译php7,并安装在/usr/local/php7/中,今天开发插件修改了 php.ini 的配置信息,但是什么都没生效. 排查 通过phpinfo()查看配置信息: 发现Loaded Configuration File => (none) ,表明没有载入php.ini文件.然而/usr/local/php7/etc/php.ini这个文件确实是存在的. 解决 用strace去跟踪一下: strace /usr/local/php7/sbin/php-fpm -i 2>1.log

  • phpmyadmin config.inc.php配置示例

    文件地址:D:\wamp\apps\phpmyadmin4.0.4\config.inc.php 文件内容: 复制代码 代码如下: <?php /* * Generated configuration file * Generated by: phpMyAdmin 4.0.4 setup script * Date: Mon, 26 Aug 2013 05:32:47 +0000 */ $cfg['blowfish_secret'] = 'a8b7c6d'; $i = 0; $i++; $cfg

  • CodeIgniter配置之config.php用法实例分析

    本文实例分析了CodeIgniter配置之config.php用法.分享给大家供大家参考,具体如下: 配置说明 $config['language']:指定项目语言包.需要注意的时Codeigniter自带的类库错误提示语言包位于/system/language/english/目录下,当这里配置非english时, 如果需要用到这些类库,则需要拷贝语言包到指定的目录中,否则会出现load出错. $config['charset']:设置系统使用的编码,在某些需要指定编码的函数中会用到,系统.数

  • php中配置文件操作 如config.php文件的读取修改等操作

    复制代码 代码如下: <?php $name="admin";//kkkk $bb='234'; $db=4561321; $kkk="admin"; ?> 函数定义: 配置文件数据值获取:function getconfig($file, $ini, $type="string") 配置文件数据项更新:function updateconfig($file, $ini, $value,$type="string"

  • 编译PHP报错configure error Cannot find libmysqlclient under usr的解决方法

    今天在64位Red Hat Enterprise Linux AS release 4 .7上编译PHP5.2.6出错,mysql是使用的RPM方式安装的,PHP编译代码如下: ./configure --prefix=/usr/local/php --with-mysql --with-apxs2=/usr/local/apache/bin/apxs --with-openssl --with-curl --enable-xml --with-mcrypt --with-ttf --enabl

  • PHP中防止直接访问或查看或下载config.php文件的方法

    或是,PHP的设计本身就避免直接查看文件内容的情况? 从安全角度考虑,这个系统级的文件应该做什么保护措施? 网友完善的答案 经调研,得出以下常用方法: 1 在程序中定义一个标识变量 复制代码 代码如下: define('IN_SYS', TRUE); 2 在config.php中获取这变量 复制代码 代码如下: if(!defined('IN_SYS')) { exit('禁止访问'); }

  • 有关PHP 中 config.m4 的探索

    最近在看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 extension

  • Java微信公众平台开发(13) 微信JSSDK中Config配置

    前端开发工程师和关注前端开发的开发者们在2015年中肯定被腾讯的JSSDk引爆过,搞APP的.搞前端的甚至是是搞后端的都跑过来凑热闹,一时之间也把微信JSSDK捧得特别牛逼,但是在我们的技术眼里它的实现原理和根本是不能够被改变的,这篇文章就不对其js的实现做任何评价和解说了(因为我也不是很懂,哈哈),这里要说的是它的config配置实现,参考文档:http://mp.weixin.qq.com/wiki/11/74ad127cc054f6b80759c40f77ec03db.html  ! 微信

  • ASP.NET中Config文件的读写示例

    本文主要给大家介绍了关于ASP.NET中Config读写示例的相关内容,分享出来供大家参考学习,话不多说,来一起看看详细的介绍吧. 方法如下: 如果是WinForm程序,需要添加引用: System.ServiceModel System.Configuration App.config <?xml version="1.0" encoding="utf-8" ?> <configuration> <appSettings> &l

  • 浅谈c#中config.exe 引发的一些问题

    如下: public static void CreateConfig(){ //c#可以添加内置的app.config,我们通过ConfigrationManager类可以 //可以很轻松的操作相关节点,操作的方式,这里不做多介绍, //引发的问题 当程序编译的时候会自动生成 程序名.config.exe这样格式的文件 //这是我们实际操作保存的配置文件, 如果这个文件丢失的话就需要我们自己判断 //配置文件是否存在,也就是说这个配置只是在编译的时候生成 //解决方法 //将app.confi

  • 解决python flask中config配置管理的问题

    在项目中我们需要配置各种环境.如果我们的配置项很少的话,可以直接简单粗暴的来: 比如: app =Flask(__name__) app.config['DEBUG']=True app.config其实是实例化了flask.config.Config类的实例, 继承于python内置数据结构dict字典,可以使用update方法: app.config.update( DEBUG=true, SECRET_KEY='xxxx' ) 如果设置很多的情况下,想要集中起来管理设置项, 应该将他们存放

  • Eclipse中自动重构实现探索

    本文用eclipse的自动重构功能对一个程序实例进行重构,目的是探索Eclipse自动重构可以在多大程度上辅助重构这个过程.程序实例使用<Refactoring:Improving the Design of Existing Code>一书中的例子. Eclipse的自动重构功能能够很好地支持各种程序元素的重命名,并自动更新相关的引用.Eclipse能够支持方法.字段在类之间移动,并自动更新引用.Eclipse较好地支持内联字段.函数的更新替换.Eclipse较好地支持抽取方法.变量等程序元

  • 基于java中cas实现的探索

    目录 1.背景简介 2. java源码追踪 3. hotspot jvm源码追踪 4. 手写一个cas实现 1. 通过汇编手写一个cas方法 2. 多线程条件下测试自行实现的cas方法 3. cas与互斥锁方式的对比 4. 结论 5. 思考 1.背景简介 当我们在并发场景下,增加某个integer值的时,就涉及到多线程安全的问题,解决思路两个 将值增加的方法使用同步代码块同步 使用AtomicInteger,来逐步增加其值 这两种实现方式代码如下 import java.util.concurr

  • javascript中length属性的探索

    例子1: 复制代码 代码如下: var obj={0:'a',1:'b'} alert(obj.length); //undefined var arr=['a','b'] alert(arr.length); // 2 从上面的例子看,类数组对象中的length属性并不和它储存的数据数量直接挂钩,无论是索引属性(0,1)还是length属性都作为对象的普通属性存在,它们之间并没有任何关系,js引擎并不会根据储存数据的数量来自动计算类数组对象的长度. 但是类数组对象的length所确实和存储的数

  • 安装PHP扩展时解压官方 tgz 文件后没有configure文件无法进行配置编译的问题

    我们以 PHP 扩展 zip 为例 访问PHP 官方插件库 搜索我们所需要的扩展 zip,我们选择最新的 stable 版本,进行下载 解压 tgz 下载到本地后,使用 tar -zxvf filename.tgz cd 进入文件,我们发现并不存在 .configure 文件,用于我们进行编译 这时我们使用 phpize 命令 执行完成后,即可展示我们熟悉的编译内容 即可进行正常的编译安装 参考文章: PHP 中 config.m4 的探索 总结 到此这篇关于安装PHP扩展时解压官方 tgz 文

  • C#读写操作app.config中的数据应用介绍

    读语句: 复制代码 代码如下: String str = ConfigurationManager.AppSettings["DemoKey"]; 写语句: 复制代码 代码如下: Configuration cfa = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 2 cfa.AppSettings.Settings["DemoKey"].Value = "D

随机推荐