�� UNIX ����ϵͳ����: config.m4

��չ�� config.m4 �ļ����� UNIX ����ϵͳ��Щ��չ configure ѡ����֧�ֵģ�����Ҫ��Щ��չ�⣬�Լ���ЩԴ�ļ�Ҫ���������һ���֡������о���ʹ�õ� autoconf �꣬���� PHP �ض��ļ� autoconf �ڽ��ģ���鿴 Zend Engine 2 API �ο� �½ڡ�

Tip

������ PHP ��չʱ��ǿ�����鰲װ autoconf 2.13 �棬�����ø��µİ汾��ʹ�á�2.13 �汻��Ϊ���� autoconf �п����ԣ������Լ��û������ȷ�����õİ汾��ʹ�����°汾��ʱ������������ configure �������ʽ��������ͬ��

Example #1 config.m4 �ļ�����

dnl $Id$
dnl config.m4 for extension example
PHP_ARG_WITH(example, for example support,
[  --with-example[=FILE]       Include example support. File is the optional path to example-config])
PHP_ARG_ENABLE(example-debug, whether to enable debugging support in example,
[  --enable-example-debug        example: Enable debugging support in example], no, no)
PHP_ARG_WITH(example-extra, for extra libraries for example,
[  --with-example-extra=DIR      example: Location of extra libraries for example], no, no)

dnl �����չ�Ƿ�������
if test "$PHP_EXAMPLE" != "no"; then
  
  dnl ��� example-config�����ȳ�����������·����Ȼ���� $PATH ��Ѱ��
  AC_MSG_CHECKING([for example-config])
  EXAMPLE_CONFIG="example-config"
  if test "$PHP_EXAMPLE" != "yes"; then
    EXAMPLE_PATH=$PHP_EXAMPLE
  else
    EXAMPLE_PATH=`$php_shtool path $EXAMPLE_CONFIG`
  fi
  
  dnl ����ҵ����õ� example-config����ʹ����
  if test -f "$EXAMPLE_PATH" && test -x "$EXAMPLE_PATH" && $EXAMPLE_PATH --version > /dev/null 2>&1; then
    AC_MSG_RESULT([$EXAMPLE_PATH])
    EXAMPLE_LIB_NAME=`$EXAMPLE_PATH --libname`
    EXAMPLE_INCDIRS=`$EXAMPLE_PATH --incdirs`
    EXAMPLE_LIBS=`$EXAMPLE_PATH --libs`
    
    dnl �����չ���Ƿ�������
    PHP_CHECK_LIBRARY($EXAMPLE_LIB_NAME, example_critical_function,
    [
      dnl �������� include Ŀ¼
      PHP_EVAL_INCLINE($EXAMPLE_INCDIRS)
      dnl ����������չ�⼰��չ������Ŀ¼
      PHP_EVAL_LIBLINE($EXAMPLE_LIBS, EXAMPLE_SHARED_LIBADD)
    ],[
      dnl ����
      AC_MSG_ERROR([example library not found. Check config.log for more information.])
    ],[$EXAMPLE_LIBS]
    )
  else
    dnl û�п��õ� example-config������
    AC_MSG_RESULT([not found])
    AC_MSG_ERROR([Please check your example installation.])
  fi
  
  dnl ����Ƿ����õ���
  if test "$PHP_EXAMPLE_DEBUG" != "no"; then
    dnl �ǣ������� C ���Ժ�ָ��
    AC_DEFINE(USE_EXAMPLE_DEBUG,1,[Include debugging support in example])
  fi
  
  dnl �������֧��
  if test "$PHP_EXAMPLE_EXTRA" != "no"; then
    if test "$PHP_EXAMPLE_EXTRA" == "yes"; then
      AC_MSG_ERROR([You must specify a path when using --with-example-extra])
    fi
    
    PHP_CHECK_LIBRARY(example-extra, example_critical_extra_function,
    [
      dnl �������·��
      PHP_ADD_INCLUDE($PHP_EXAMPLE_EXTRA/include)
      PHP_ADD_LIBRARY_WITH_PATH(example-extra, $PHP_EXAMPLE_EXTRA/lib, EXAMPLE_SHARED_LIBADD)
      AC_DEFINE(HAVE_EXAMPLEEXTRALIB,1,[Whether example-extra support is present and requested])
      EXAMPLE_SOURCES="$EXAMPLE_SOURCES example_extra.c"
    ],[
      AC_MSG_ERROR([example-extra lib not found. See config.log for more information.])
    ],[-L$PHP_EXAMPLE_EXTRA/lib]
    )
  fi
  
  dnl ��󣬽���չ���������ļ�����Ϣ��������ϵͳ
  PHP_NEW_EXTENSION(example, example.c $EXAMPLE_SOURCES, $ext_shared)
  PHP_SUBST(EXAMPLE_SHARED_LIBADD)
fi

autoconf �﷨���

config.m4 �ļ�ʹ�� GNU autoconf �﷨��д�������֮��������ǿ��ĺ�������ǿ�� shell �ű���ע�����ַ��� dnl �ָ����ַ�����������ҷ������м䣨���磬[ �� ]�����ַ����ɰ���Ҫ���Ƕ�����á��������﷨�ο��ɲμ�λ�� » http://www.gnu.org/software/autoconf/manual/ �� autoconf �ֲᡣ

PHP_ARG_*: �����û���ѡ��

�����ϵ� config.m4 �����У�����ע�ͺ����ȼ����� 3 �д��룬ʹ���� PHP_ARG_WITH() �� PHP_ARG_ENABLE()����Щ�� configure �ṩ�˿�ѡ��������� ./configure --help ʱ��ʾ�İ����ı���������������ʾ�ģ������ߵIJ�ͬ�������Ǵ��� --with-* ѡ��� --enable-* ѡ�ÿ����չӦ�ṩ����һ�����ϵ�ѡ���Լ���չ���ƣ��Ա��û���ѡ���Ƿ���չ������ PHP �С���������PHP_ARG_WITH() ����ȡ�ò�����ѡ�������չ����������λ�ã��� PHP_ARG_ENABLE() ���ڴ���򵥱�־��ѡ�

Example #2 configure �������

$ ./configure --help
...
  --with-example[=FILE]       Include example support. FILE is the optional path to example-config
  --enable-example-debug        example: Enable debugging support in example
  --with-example-extra=DIR      example: Location of extra libraries for example
...

$ ./configure --with-example=/some/library/path/example-config --disable-example-debug --with-example-extra=/another/library/path
...
checking for example support... yes
checking whether to enable debugging support in example... no
checking for extra libraries for example... /another/library/path
...

Note:

�ڵ��� configure ʱ������ѡ�����������е�˳����Σ����ᰴ�� config.m4 ��ָ����˳����м�⡣

�����û�ѡ��

config.m4 �ɸ��û��ṩһЩ��ʲô��ѡ�����ھ�������ѡ���ʱ���ˡ��������У�����ѡ����δָ��ʱ��ȻĬ��Ϊ "no"��ϰ���ϣ�����ô�ֵ��Ϊ����������չ��ѡ���Ĭ��ֵ��Ϊ����չ�� PHP �ֿ��������� phpize ���Ǵ�ֵ����Ҫ������ PHP ��ʱ��Ӧ��Ĭ��ֵ����չ�ռ�Ū�ҡ�����������ѡ��Ĵ���Ҫ���ӵöࡣ

���� --with-example[=FILE] ѡ��

���ȼ���Ƿ������� --with-example[=FILE] ѡ����ѡ��δ��ָ������ʹ�÷񶨵ĸ�ʽ��--without-example ������ֵΪ "no" ʱ���������������չ�ĺ����������κ����鶼���ᷢ�������������������ָ����ֵΪ /some/library/path/example-config�����Ե�һ�� test �ɹ��ˡ�

��������������� AC_MSG_CHECKING()������һ�� autoconf �꣬���һ�б�׼���� "checking for ..." ����Ϣ��������û��ٶ��� example-config �Ƿ���һ����ȷ��·��������������У�PHP_EXAMPLE ��ȡ����ֵΪ /some/library/path/example-config�����Ѹ��Ƶ� EXAMPLE_PATH �������ˡ�ֻ���û�ָ���� --with-example ���Ż�ִ�д��� $php_shtool path $EXAMPLE_CONFIG������ʹ���û���ǰ�� PATH ���������Ʋ� example-config ��λ�á�������Σ���һ�����Ǽ����ѡ�� EXAMPLE_PATH �Ƿ��������ļ����Ƿ��ִ�У����Ƿ�ִ�гɹ�����ɹ�������� AC_MSG_RESULT()�������� AC_MSG_CHECKING() ��ʼ������С����򣬵��� AC_MSG_ERROR()����ӡ��������Ϣ�������ж�ִ�� configure��

��������ִ�м��� example-config ��ȷ��һЩվ���ض���������Ϣ����һ�����õ��� PHP_CHECK_LIBRARY()������ PHP ����ϵͳ�ṩ��һ���꣬��װ�� autoconf �� AC_CHECK_LIB() ������PHP_CHECK_LIBRARY() ���Ա��롢���Ӻ�ִ�г����ڵ�һ������ָ���Ŀ��е����ɵڶ�������ָ���ķ��ţ�ʹ�õ���������������ַ�����Ϊ���������ѡ�������Գɹ��ˣ������е����������������Ľű����˽ű��� example-config ���ṩ��ԭʼ��ѡ���ַ�����ȡ��ͷ�ļ�·�������ļ�·���Ϳ����ƣ����� PHP ����ϵͳ���������ʧ�ܣ��ű������е��ĸ������еĽű�����ʱ���� AC_MSG_ERROR() ���жϳ���ִ�С�

���� --enable-example-debug ѡ��

���� --enable-example-debug �ܼ򵥡�ֻ�򵥵ؼ������ʵֵ��������ɹ�������� AC_DEFINE() ʹ C ���Ժ�ָ�� USE_EXAMPLE_DEBUG ��������չ��Դ���롣�����������Ǹ� config.h ��ע���ַ�����ͨ���ɷ��ĵ����ա�

���� --with-example-extra=DIR ѡ��

���ڴ�������˵���� --with-example-extra=DIR ѡ��������ļٶ���"����"���ܲ���������ٶ��� example-config ������Ҳû��Ĭ�ϵ�����·������ˣ��û���Ҫ������Ŀ�֮ǰ�ṩ���ó����е㲻����ʵ�е���չ������������ý�����˵���Ե����á�

���뿪ʼ������֪�ķ�ʽ����� PHP_EXAMPLE_EXTRA ����ʵֵ��������ṩ��Ϊ����ʽ���򲻻�������������û�Ҳ�����������Ĺ��ܡ�������ṩ��Ϊδ�ṩ�����Ŀ϶���ʽ������� AC_MSG_ERROR() ��ֹ������һ�����ٴε��� PHP_CHECK_LIBRARY()����һ�Σ���Ϊû���ṩԤ�������ѡ�PHP_ADD_INCLUDE() �� PHP_ADD_LIBRARY_WITH_PATH() ���ڹ������⹦�������ͷ�ļ�·�������ļ�·���Ϳ��־��Ҳ���� AC_DEFINE() ��ָʾ������Ķ��⹦�ܴ����ǿ��õģ����ñ����������Ժ�Ĵ��룬�ж����Դ����Ҫ������������ʧ�ܣ����������Ϥ�� AC_MSG_ERROR()����һ�ֲ�ͬ�Ĵ���ʧ�ܵķ�ʽ�Ǹ���Ϊ���� AC_MSG_WARNING()�����磺

AC_MSG_WARNING([example-extra lib not found. example will be built without extra functionality.])

�����У�configure ���ӡһ�ξ�����Ϣ�����Ǵ����Ҽ������������ַ�ʽ����ʧ��������չ������Ա�����ʱ������

���߹���ϵͳҪ��ʲô

���������ͷ�ļ����ض��Ŀ⣬����ȫ��ѡ�����뼰�궨�壬����һ����Ҫ����������߹���ϵͳȥ������չ����ͱ����õ����ļ���Ϊ������Щ����Ҫ���� PHP_NEW_EXTENSION() �ꡣ��һ����������չ�����ƣ��Ͱ�������Ŀ¼ͬ�����ڶ�����������Ϊ��չ��һ���ֵ�����Դ�ļ����б��μ� PHP_ADD_BUILD_DIR() �Ի�ȡ������Ŀ¼��Դ�ļ���ӵ��������̵������Ϣ���������������� $ext_shared�� ��Ϊ�� --with-example[=FILE] ������ PHP_ARG_WITH()ʱ���� configure ����������ֵ�����ĸ�����ָ��һ��"SAPI ��"��������ר����Ҫ CGI �� CLI SAPI ����չ�����������Ӧ���ա����������ָ���˹���ʱҪ���� CFLAGS �ı�־�б�������������һ������ֵ��Ϊ "yes" ʱ��ǿ��������չʹ�� $CXX ���� $CC ���������������Ժ�����в������ǿ�ѡ�ġ���󣬵��� PHP_SUBST() ��������չ�Ĺ��������μ� ��չ��� FAQ �Ի�ȡ�����йؽ��ù���ʽ�¹�����չ����Ϣ��

counter ��չ�� config.m4 �ļ�

��ǰ��д�� counter ��չ��һ���������������򵥵� config.m4 �ļ�������ʹ�úܶ๹��ϵͳ�����ԡ��Բ�ʹ���ⲿ�Ļ�󶨵Ŀ����չ��˵������һ���ȽϺõIJ�����ʽ��

Example #3 counter �� config.m4 �ļ�

dnl
$
Id$
dnl config.m4 for extension counter

PHP_ARG_ENABLE(counter, for counter support,
[  --enable-counter            Include counter support])

dnl Check whether the extension is enabled at all
if test "$PHP_COUNTER" != "no"; then
  dnl Finally, tell the build system about the extension and what files are needed
  PHP_NEW_EXTENSION(counter, counter.c counter_util.c, $ext_shared)
  PHP_SUBST(COUNTER_SHARED_LIBADD)
fi