File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / php / ext / ext_skel
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 23:47:53 2012 UTC (12 years, 5 months ago) by misho
Branches: php, MAIN
CVS tags: v5_4_3elwix, v5_4_29p0, v5_4_20p0, v5_4_20, v5_4_17p0, v5_4_17, v5_3_10, HEAD
php

    1: #!/bin/sh
    2: 
    3: givup() {
    4: 	echo $*
    5: 	exit 1
    6: }
    7: 
    8: usage() {
    9: echo "$0 --extname=module [--proto=file] [--stubs=file] [--xml[=file]]"
   10: echo "           [--skel=dir] [--full-xml] [--no-help]"
   11: echo ""
   12: echo "  --extname=module   module is the name of your extension"
   13: echo "  --proto=file       file contains prototypes of functions to create"
   14: echo "  --stubs=file       generate only function stubs in file"
   15: echo "  --xml              generate xml documentation to be added to phpdoc-cvs"
   16: echo "  --skel=dir         path to the skeleton directory"
   17: echo "  --full-xml         generate xml documentation for a self-contained extension"
   18: echo "                     (not yet implemented)"
   19: echo "  --no-help          don't try to be nice and create comments in the code"
   20: echo "                     and helper functions to test if the module compiled"
   21: exit 1
   22: }
   23: 
   24: if test $# = 0; then
   25:   usage
   26: fi
   27: 
   28: while test $# -gt 0; do
   29:   case "$1" in
   30:   -*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
   31:   *) optarg= ;;
   32:   esac
   33: 
   34:   case $1 in
   35:     --extname=?*)
   36: 	extname=$optarg
   37: 	EXTNAME=`echo $extname | tr "[:lower:]" "[:upper:]"`
   38: 	;;
   39:     --proto=?*)
   40: 	proto=$optarg
   41: 	;;
   42:     --stubs=*)
   43: 	stubs=yes
   44: 	stubfile=$optarg
   45: 	;;
   46:     --xml)
   47: 	xml="yes"
   48: 	;;
   49:     --xml=?*)
   50: 	xml=$optarg
   51: 	;;
   52:     --full-xml)
   53: 	full_xml="yes"
   54: 	;;
   55:     --no-help)
   56: 	no_help="yes"
   57: 	;;
   58:     --skel=?*)
   59: 	skel_dir=$optarg
   60: 	;;
   61:     *)
   62: 	usage
   63: 	;;
   64:   esac
   65:   shift
   66: done
   67: 
   68: if test -d "$extname" ; then
   69:   givup "Directory $extname already exists."
   70: fi
   71: 
   72: if test -z "$skel_dir"; then
   73:   skel_dir="skeleton"
   74: fi
   75: 
   76: ## convert skel_dir to full path
   77: skel_dir=`cd $skel_dir && pwd`
   78: 
   79: test -d $skel_dir || givup "directory $skel_dir does not exist or is not directory"
   80: 
   81: if echo '\c' | grep -s c >/dev/null 2>&1
   82: then
   83:     ECHO_N="echo -n"
   84:     ECHO_C=""
   85: else
   86:     ECHO_N="echo"
   87:     ECHO_C='\c'
   88: fi
   89: 
   90: if test -z "$stubs"; then
   91:   echo "Creating directory $extname"
   92:   stubfile=$extname"/function_stubs"
   93:   mkdir $extname || givup "Cannot create directory $extname"
   94: fi
   95: 
   96: if test -n "$proto"; then
   97:   cat $proto | awk -v extname=$extname -v stubs=$stubs -v stubfile=$stubfile -v xml=$xml -v full_xml=$full_xml -v i_know_what_to_do_shut_up_i_dont_need_your_help_mode=$no_help -f $skel_dir/create_stubs
   98: fi
   99: 
  100: if test -z "$stubs"; then
  101:   cd $extname
  102:   chmod 755 .
  103: 
  104: $ECHO_N "Creating basic files:$ECHO_C"
  105: 
  106: $ECHO_N " config.m4$ECHO_C"
  107: cat >config.m4 <<eof
  108: dnl \$Id\$
  109: dnl config.m4 for extension $extname
  110: 
  111: dnl Comments in this file start with the string 'dnl'.
  112: dnl Remove where necessary. This file will not work
  113: dnl without editing.
  114: 
  115: dnl If your extension references something external, use with:
  116: 
  117: dnl PHP_ARG_WITH($extname, for $extname support,
  118: dnl Make sure that the comment is aligned:
  119: dnl [  --with-$extname             Include $extname support])
  120: 
  121: dnl Otherwise use enable:
  122: 
  123: dnl PHP_ARG_ENABLE($extname, whether to enable $extname support,
  124: dnl Make sure that the comment is aligned:
  125: dnl [  --enable-$extname           Enable $extname support])
  126: 
  127: if test "\$PHP_$EXTNAME" != "no"; then
  128:   dnl Write more examples of tests here...
  129: 
  130:   dnl # --with-$extname -> check with-path
  131:   dnl SEARCH_PATH="/usr/local /usr"     # you might want to change this
  132:   dnl SEARCH_FOR="/include/$extname.h"  # you most likely want to change this
  133:   dnl if test -r \$PHP_$EXTNAME/\$SEARCH_FOR; then # path given as parameter
  134:   dnl   ${EXTNAME}_DIR=\$PHP_$EXTNAME
  135:   dnl else # search default path list
  136:   dnl   AC_MSG_CHECKING([for $extname files in default path])
  137:   dnl   for i in \$SEARCH_PATH ; do
  138:   dnl     if test -r \$i/\$SEARCH_FOR; then
  139:   dnl       ${EXTNAME}_DIR=\$i
  140:   dnl       AC_MSG_RESULT(found in \$i)
  141:   dnl     fi
  142:   dnl   done
  143:   dnl fi
  144:   dnl
  145:   dnl if test -z "\$${EXTNAME}_DIR"; then
  146:   dnl   AC_MSG_RESULT([not found])
  147:   dnl   AC_MSG_ERROR([Please reinstall the $extname distribution])
  148:   dnl fi
  149: 
  150:   dnl # --with-$extname -> add include path
  151:   dnl PHP_ADD_INCLUDE(\$${EXTNAME}_DIR/include)
  152: 
  153:   dnl # --with-$extname -> check for lib and symbol presence
  154:   dnl LIBNAME=$extname # you may want to change this
  155:   dnl LIBSYMBOL=$extname # you most likely want to change this 
  156: 
  157:   dnl PHP_CHECK_LIBRARY(\$LIBNAME,\$LIBSYMBOL,
  158:   dnl [
  159:   dnl   PHP_ADD_LIBRARY_WITH_PATH(\$LIBNAME, \$${EXTNAME}_DIR/lib, ${EXTNAME}_SHARED_LIBADD)
  160:   dnl   AC_DEFINE(HAVE_${EXTNAME}LIB,1,[ ])
  161:   dnl ],[
  162:   dnl   AC_MSG_ERROR([wrong $extname lib version or lib not found])
  163:   dnl ],[
  164:   dnl   -L\$${EXTNAME}_DIR/lib -lm
  165:   dnl ])
  166:   dnl
  167:   dnl PHP_SUBST(${EXTNAME}_SHARED_LIBADD)
  168: 
  169:   PHP_NEW_EXTENSION($extname, $extname.c, \$ext_shared)
  170: fi
  171: eof
  172: 
  173: $ECHO_N " config.w32$ECHO_C"
  174: cat >config.w32 <<eof
  175: // \$Id\$
  176: // vim:ft=javascript
  177: 
  178: // If your extension references something external, use ARG_WITH
  179: // ARG_WITH("$extname", "for $extname support", "no");
  180: 
  181: // Otherwise, use ARG_ENABLE
  182: // ARG_ENABLE("$extname", "enable $extname support", "no");
  183: 
  184: if (PHP_$EXTNAME != "no") {
  185: 	EXTENSION("$extname", "$extname.c");
  186: }
  187: 
  188: eof
  189: 
  190: $ECHO_N " .svnignore$ECHO_C"
  191: cat >.svnignore <<eof
  192: .deps
  193: *.lo
  194: *.la
  195: eof
  196: 
  197: $ECHO_N " $extname.c$ECHO_C"
  198: echo "s/extname/$extname/g" > sedscript
  199: echo "s/EXTNAME/$EXTNAME/g"  >> sedscript
  200: echo '/__function_entries_here__/r function_entries'  >> sedscript
  201: echo '/__function_stubs_here__/r function_stubs'  >> sedscript
  202: echo '/__header_here__/r ../../header'  >> sedscript
  203: echo '/__footer_here__/r ../../footer'  >> sedscript
  204: echo '/__function_entries_here__/D'  >> sedscript
  205: echo '/__function_stubs_here__/D'  >> sedscript
  206: echo '/__header_here__/D'  >> sedscript
  207: echo '/__footer_here__/D'  >> sedscript
  208: if [ ! -z "$no_help" ]; then
  209:     echo "/confirm_$extname_compiled/D" >> sedscript
  210:     echo '/Remove the following/,/^\*\//D' >> sedscript
  211:     echo 's/[[:space:]]\/\*.\+\*\///' >> sedscript
  212:     echo 's/^\/\*.*\*\/$//' >> sedscript
  213:     echo '/^[[:space:]]*\/\*/,/^[[:space:]]*\*\//D' >> sedscript
  214: fi
  215: 
  216: sed -f sedscript < $skel_dir/skeleton.c > $extname.c
  217: 
  218: 
  219: $ECHO_N " php_$extname.h$ECHO_C"
  220: echo "s/extname/$extname/g" > sedscript
  221: echo "s/EXTNAME/$EXTNAME/g" >> sedscript
  222: echo '/__function_declarations_here__/r function_declarations' >> sedscript
  223: echo '/__header_here__/r ../../header'  >> sedscript
  224: echo '/__footer_here__/r ../../footer'  >> sedscript
  225: echo '/__function_declarations_here__/D' >> sedscript
  226: echo '/__header_here__/D'  >> sedscript
  227: echo '/__footer_here__/D'  >> sedscript
  228: if [ ! -z "$no_help" ]; then
  229:     echo "/confirm_$extname_compiled/D" >> sedscript
  230:     echo 's/[[:space:]]\/\*.\+\*\///' >> sedscript
  231:     echo 's/^\/\*.*\*\/$//' >> sedscript
  232:     echo '/^[[:space:]]*\/\*/,/^[[:space:]]*\*\//D' >> sedscript
  233: fi
  234: sed -f sedscript <$skel_dir/php_skeleton.h > php_$extname.h
  235: 
  236: $ECHO_N " CREDITS$ECHO_C"
  237: echo "s/extname/$extname/g" > sedscript
  238: sed -f sedscript <$skel_dir/CREDITS > CREDITS
  239: 
  240: $ECHO_N " EXPERIMENTAL$ECHO_C"
  241: echo "s/extname/$extname/g" > sedscript
  242: sed -f sedscript <$skel_dir/EXPERIMENTAL > EXPERIMENTAL
  243: 
  244: $ECHO_N " tests/001.phpt$ECHO_C"
  245: mkdir tests || givup "Cannot create tests directory"
  246: chmod 755 tests
  247: sed -f sedscript <$skel_dir/tests/001.phpt > tests/001.phpt
  248: 
  249: if test -z "$stubs" && test -z "$no_help"; then
  250:   $ECHO_N " $extname.php$ECHO_C"
  251:   sed \
  252:     -e "s/extname/$extname/g" \
  253:     <$skel_dir/skeleton.php \
  254:     > $extname.php
  255: fi
  256: 
  257: rm sedscript
  258: 
  259: if test -n "$proto"; then
  260:   if test -z "$stubs"; then
  261:     rm function_entries
  262:     rm function_declarations
  263:     rm function_stubs
  264:   fi
  265:   if test -f function_warning; then
  266:     rm function_warning
  267:     warning="
  268: NOTE! Because some arguments to functions were resources, the code generated
  269: cannot yet be compiled without editing. Please consider this to be step 4.5
  270: in the instructions above. 
  271: "
  272:   fi
  273: fi
  274: 
  275: find . -type f | xargs chmod 644 
  276: find . -type d | xargs chmod 755
  277: fi
  278: 
  279: echo " [done]."
  280: 
  281: if test -z "$no_help" && test -z "$stubs"; then
  282:   cat <<eof
  283: 
  284: To use your new extension, you will have to execute the following steps:
  285: 
  286: 1.  $ cd ..
  287: 2.  $ vi ext/$extname/config.m4
  288: 3.  $ ./buildconf
  289: 4.  $ ./configure --[with|enable]-$extname
  290: 5.  $ make
  291: 6.  $ ./php -f ext/$extname/$extname.php
  292: 7.  $ vi ext/$extname/$extname.c
  293: 8.  $ make
  294: 
  295: Repeat steps 3-6 until you are satisfied with ext/$extname/config.m4 and
  296: step 6 confirms that your module is compiled into PHP. Then, start writing
  297: code and repeat the last two steps as often as necessary.
  298: $warning
  299: eof
  300: fi

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>