哪些宏可用于php config.m4文件?

哪些宏可用于php config.m4文件?,php,php-extension,Php,Php Extension,编写PHP扩展时,指示应提供一个config.m4文件供autoconf使用。它给出了一些此类文件的示例,但文档不完整。例如,示例文件使用宏PHP\u EVAL\u-slend,但后面的文档中没有提到它 那么,在config.m4文件中可以使用哪些特定于PHP的宏,它们是做什么的?是否有编写这些文件的全面文档?我在互联网上找不到任何这样的列表。 但是,我们可以只解析acinclude.m4,其中定义了所有这些宏。 acinclude.m4可以在任何PHP源tarball的根目录中找到,也可以在任

编写PHP扩展时,指示应提供一个
config.m4
文件供autoconf使用。它给出了一些此类文件的示例,但文档不完整。例如,示例文件使用宏
PHP\u EVAL\u-slend
,但后面的文档中没有提到它


那么,在
config.m4
文件中可以使用哪些特定于PHP的宏,它们是做什么的?是否有编写这些文件的全面文档?

我在互联网上找不到任何这样的列表。
但是,我们可以只解析
acinclude.m4
,其中定义了所有这些宏。
acinclude.m4
可以在任何PHP源tarball的根目录中找到,也可以在任何PHP安装的
lib/PHP/build
中找到

宏是使用
AC_DEFUN([name],[replacement])
宏声明的。
它前面通常有一行或多行注释,以
dnl
开头,作为基本文档

我编写了以下脚本,将每个函数声明解析为名称、用法和描述:

$funcs=[];
$matches=[];
//扫描“AC_DEFUN([FUNCTION_NAME_HERE]…”,因为这些是函数声明,
//以及前面所有以“dbl”开头的行,因为它们是注释,可能包括文档
preg\u match\u all(“#”((?:dnl(?:)\\n)*)AC\u DEFUN\\(\\[(\\w+\\\\]\”,文件获取内容('acinclude.m4'),$matches);
//$matches[1][$i]包含以“dbl”开头的所有行
//$matches[2][$i]包含函数名
对于($i=0;$i'',
“说明”=>“
];
$start=TRUE;
//处理每个注释行
//由于注释可以,但不必包含使用信息,所以我们尝试将其过滤掉。
foreach(分解(“\n”,$matches[1][$i])为$line)
{
//丢弃空行
如果($line='dnl')
{
//除非它们在零件描述中,否则块应保持分离。
如果(!$开始)
{
$func['description']。=“\n\n”;
}
继续;
}
$m=[];
//如果还没有行包含内容,并且当前行以函数名开头,那么这就是使用信息!
如果($start&&preg_match('.$dnl('.$name.'(?:.*))#,$line,$m)==1)
{
$func['usage']=$m[1];
}
//其他一切都只是描述。
其他的
{
$func['description'].=substr($line,3);
}
$beging=FALSE;
}
//删除不必要的空白,并确保描述中没有隐藏的HTML。
$func['description']=htmlspecialchars(trim($func['description']);
$funcs[$name]=$func;
}
//按函数名排序
ksort($funcs);
acinclude.m4
所在的文件夹中运行此命令,将使用排序数组填充
$funcs
,其中函数名作为键,其用法和描述作为值

这可以通过几行代码解析为HTML表,如

$html='';
foreach($funcs作为$name=>$func)
{
$html.=''.$name.'.$func['usage'.'.'.'.'.$func['description'.'”;
}
文件内容('acinclude.html','.$html');
对它应用一些漂亮的CSS并添加一个标题行,您就得到了一个可读的可用宏列表

虽然有些宏有很好的文档,有些没有,或者完全没有文档,但我仍然认为它总比没有好

应用于PHP5.6.11的
acinclude.m4
,这将产生(最佳全屏浏览):

表格
{
边界塌陷:塌陷;
}
tr
{
背景:#f8f8;
}
tr:n个孩子(偶数)
{
背景:#f0;
}
th
{
背景:#e0;
}
td,th
{
填充:10px;
边框:实心1px#BBB;
}
td:最后一个孩子
{
空白:行前;
}
NameUsageDescription
PHP_AC_breaked_snprintfhp_AC_breaked_SNPRINTFCheck for breaked snprintf()、C99一致性PHP_AC_breaked_SPRINTFPHP_AC_breaked_SPRINTFCheck for breaked sprintf()、C99一致性PHP_ADD_BUILD_DIRPHP_ADD_EXTENSION_deppp_ADD_EXTENSION_DEP(extname,depname,depconf)genif.sh在构建内部函数列表时扫描此宏,以便模块可以按照正确的顺序初始化$1=扩展名,$2=它所依赖的扩展名$3=可选:如果为true,则未配置$2是可以的默认值为false并应停止构建。要生效,必须调用此宏*after*PHP_NEW_EXTENSION。它所依赖的扩展必须也已配置。请参阅win32 buildPHP中的ADD_EXTENSION_DEP\u ADD_FRAMEWORKPHP_ADD_FRAMEWORK FRAMEWORK(FRAMEWORK[,before])将(Darwin/Mac OS X)框架添加到链接行。如果before为1,则框架将添加到行的开头。PHP_ADD_FRAMEWORKPATHPHP_ADD_FRAMEWORKPATH(路径[,之前])将(Darwin/Mac OS X)框架路径添加到链接并包含行。默认路径包括(但不限于)/Local/Library/Frameworks和/System/Library/Frameworks,因此不需要特别添加它们。如果before为1,则将框架路径添加到相关行的开头。PHP_ADD_framework_WITH_PATHPHP_ADD_framework_WITH_path(framework,path)添加一个(Darwin/Mac OS X)将框架路径和框架本身添加到链接和包含行。PHP_ADD_includehp_ADD_include(path[,before])添加一个包含路径。如果before为1,则在INCLUDES的开头添加。PHP_ADD_LIBPATHPHP_ADD_LIBPATH(path[,SHARED-LIBADD])将路径添加到linkpath/runpath(LDFLAGS)PHP_ADD_LIBRARY PHP_ADD LIBRARY(LIBRARY[,append[,SHARED LIBADD])将库添加到链接行php_add_library_DEFERPHP_add_library_DEFER(library[,append[,shared libadd]])将库添加到链接行(deferred,
PHP_ARG_ENABLE(extname, whether to enable extname support,
[  --enable-extname           Enable extname support])

if test "$PHP_EXTNAME" != "no"; then
    PHP_REQUIRE_CXX() dnl If you need c++.please add this.
    PHP_ADD_INCLUDE(./include) dnl Extra include file 
    PHP_ADD_LIBRARY_WITH_PATH(staticlib,"./lib", EXTRA_LDFLAGS)  dnl static library needed in the extension
    PHP_ADD_LIBRARY_WITH_PATH(dynamiclib, ./lib, EXTNAME_SHARED_LIBADD)  dnl dynamic libarary needed in the extension
    PHP_NEW_EXTENSION(extname, extname.cpp, $ext_shared)
fi