PHP 中 config.m4 的探索

PHP 中 config.m4 的探索

最近在看php擴展相關的東西,雖然來來回回編輯了好屢次config.m4,而且也在技術社區看到了 config.m4是什麼?什麼做用? 類的問題,可是仍是以爲有必要在深刻的瞭解下。php

.m4後綴的文件通常被當作 通用的宏處理,來看下官方的介紹:html

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.web

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

簡單而通俗易懂的翻譯下:GNU M4是傳統UNIX宏處理器的一種實現方式,它還具備一些內置功能,包括文件,shell,運算等。
做爲一個宏處理器,將輸入複製到擴展的輸出,它要麼內置,要麼用戶定義,且能夠接受參數。另外這個還有內置函數,包括命名文件、運行UNIX命令、執行整數運算、以各類方式操做文本、遞歸等。M4既能夠做爲編譯器的前端使用,也能夠做爲本身的宏處理器使用。
GNU M4的最大用戶之一是GNU AutoCOF項目。ide

到這裏大體瞭解到,它是做爲一個宏處理器,而後再想一想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語法中至關於行註釋的意思】ui

一些書籍中說明: 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腳原本配置.net

這裏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

做者:fredGui

來源:http://www.cnblogs.com/guixiaoming/p/8927233.html

著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。

相關文章
相關標籤/搜索