diff options
Diffstat (limited to 'ext/ext_skel')
-rwxr-xr-x | ext/ext_skel | 284 |
1 files changed, 284 insertions, 0 deletions
diff --git a/ext/ext_skel b/ext/ext_skel new file mode 100755 index 0000000000..3abf341bdf --- /dev/null +++ b/ext/ext_skel @@ -0,0 +1,284 @@ +#!/bin/sh + +givup() { + echo $* + exit 1 +} + +usage() { +echo "$0 --extname=module [--proto=file] [--stubs=file] [--xml[=file]]" +echo " [--skel=dir] [--full-xml] [--no-help]" +echo "" +echo " --extname=module module is the name of your extension" +echo " --proto=file file contains prototypes of functions to create" +echo " --stubs=file generate only function stubs in file" +echo " --xml generate xml documentation to be added to phpdoc-cvs" +echo " --skel=dir path to the skeleton directory" +echo " --full-xml generate xml documentation for a self-contained extension" +echo " (not yet implemented)" +echo " --no-help don't try to be nice and create comments in the code" +echo " and helper functions to test if the module compiled" +exit 1 +} + +if test $# = 0; then + usage +fi + +while test $# -gt 0; do + case "$1" in + -*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;; + *) optarg= ;; + esac + + case $1 in + --extname=?*) + extname=$optarg + EXTNAME=`echo $extname | tr "[:lower:]" "[:upper:]"` + ;; + --proto=?*) + proto=$optarg + ;; + --stubs=*) + stubs=yes + stubfile=$optarg + ;; + --xml) + xml="yes" + ;; + --xml=?*) + xml=$optarg + ;; + --full-xml) + full_xml="yes" + ;; + --no-help) + no_help="yes" + ;; + --skel=?*) + skel_dir=$optarg + ;; + *) + usage + ;; + esac + shift +done + +if test -d "$extname" ; then + givup "Directory $extname already exists." +fi + +if test -z "$skel_dir"; then + skel_dir="skeleton" +fi + +## convert skel_dir to full path +skel_dir=`cd $skel_dir && pwd` + +test -d $skel_dir || givup "directory $skel_dir does not exist or is not directory" + +if echo '\c' | grep -s c >/dev/null 2>&1 +then + ECHO_N="echo -n" + ECHO_C="" +else + ECHO_N="echo" + ECHO_C='\c' +fi + +if test -z "$stubs"; then + echo "Creating directory $extname" + stubfile=$extname"/function_stubs" + mkdir $extname || givup "Cannot create directory $extname" +fi + +if test -n "$proto"; then + 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 +fi + +if test -z "$stubs"; then + cd $extname + chmod 755 . + +$ECHO_N "Creating basic files:$ECHO_C" + +$ECHO_N " config.m4$ECHO_C" +cat >config.m4 <<eof +dnl \$Id\$ +dnl config.m4 for extension $extname + +dnl Comments in this file start with the string 'dnl'. +dnl Remove where necessary. This file will not work +dnl without editing. + +dnl If your extension references something external, use with: + +dnl PHP_ARG_WITH($extname, for $extname support, +dnl Make sure that the comment is aligned: +dnl [ --with-$extname Include $extname support]) + +dnl Otherwise use enable: + +dnl PHP_ARG_ENABLE($extname, whether to enable $extname support, +dnl Make sure that the comment is aligned: +dnl [ --enable-$extname Enable $extname support]) + +if test "\$PHP_$EXTNAME" != "no"; then + dnl Write more examples of tests here... + + dnl # --with-$extname -> check with-path + dnl SEARCH_PATH="/usr/local /usr" # you might want to change this + dnl SEARCH_FOR="/include/$extname.h" # you most likely want to change this + dnl if test -r \$PHP_$EXTNAME/\$SEARCH_FOR; then # path given as parameter + dnl ${EXTNAME}_DIR=\$PHP_$EXTNAME + dnl else # search default path list + dnl AC_MSG_CHECKING([for $extname files in default path]) + dnl for i in \$SEARCH_PATH ; do + dnl if test -r \$i/\$SEARCH_FOR; then + dnl ${EXTNAME}_DIR=\$i + dnl AC_MSG_RESULT(found in \$i) + dnl fi + dnl done + dnl fi + dnl + dnl if test -z "\$${EXTNAME}_DIR"; then + dnl AC_MSG_RESULT([not found]) + dnl AC_MSG_ERROR([Please reinstall the $extname distribution]) + dnl fi + + dnl # --with-$extname -> add include path + dnl PHP_ADD_INCLUDE(\$${EXTNAME}_DIR/include) + + dnl # --with-$extname -> check for lib and symbol presence + dnl LIBNAME=$extname # you may want to change this + dnl LIBSYMBOL=$extname # you most likely want to change this + + dnl PHP_CHECK_LIBRARY(\$LIBNAME,\$LIBSYMBOL, + dnl [ + dnl PHP_ADD_LIBRARY_WITH_PATH(\$LIBNAME, \$${EXTNAME}_DIR/lib, ${EXTNAME}_SHARED_LIBADD) + dnl AC_DEFINE(HAVE_${EXTNAME}LIB,1,[ ]) + dnl ],[ + dnl AC_MSG_ERROR([wrong $extname lib version or lib not found]) + dnl ],[ + dnl -L\$${EXTNAME}_DIR/lib -lm -ldl + dnl ]) + dnl + dnl PHP_SUBST(${EXTNAME}_SHARED_LIBADD) + + PHP_NEW_EXTENSION($extname, $extname.c, \$ext_shared) +fi +eof + + +$ECHO_N " .cvsignore$ECHO_C" +cat >.cvsignore <<eof +.deps +*.lo +*.la +eof + +$ECHO_N " $extname.c$ECHO_C" +echo "s/extname/$extname/g" > sedscript +echo "s/EXTNAME/$EXTNAME/g" >> sedscript +echo '/__function_entries_here__/r function_entries' >> sedscript +echo '/__function_stubs_here__/r function_stubs' >> sedscript +echo '/__header_here__/r ../../header' >> sedscript +echo '/__footer_here__/r ../../footer' >> sedscript +echo '/__function_entries_here__/D' >> sedscript +echo '/__function_stubs_here__/D' >> sedscript +echo '/__header_here__/D' >> sedscript +echo '/__footer_here__/D' >> sedscript +if [ ! -z "$no_help" ]; then + echo "/confirm_$extname_compiled/D" >> sedscript + echo '/Remove the following/,/^\*\//D' >> sedscript + echo 's/[[:space:]]\/\*.\+\*\///' >> sedscript + echo 's/^\/\*.*\*\/$//' >> sedscript + echo '/^[[:space:]]*\/\*/,/^[[:space:]]*\*\//D' >> sedscript +fi + +sed -f sedscript < $skel_dir/skeleton.c > $extname.c + + +$ECHO_N " php_$extname.h$ECHO_C" +echo "s/extname/$extname/g" > sedscript +echo "s/EXTNAME/$EXTNAME/g" >> sedscript +echo '/__function_declarations_here__/r function_declarations' >> sedscript +echo '/__header_here__/r ../../header' >> sedscript +echo '/__footer_here__/r ../../footer' >> sedscript +echo '/__function_declarations_here__/D' >> sedscript +echo '/__header_here__/D' >> sedscript +echo '/__footer_here__/D' >> sedscript +if [ ! -z "$no_help" ]; then + echo "/confirm_$extname_compiled/D" >> sedscript + echo 's/[[:space:]]\/\*.\+\*\///' >> sedscript + echo 's/^\/\*.*\*\/$//' >> sedscript + echo '/^[[:space:]]*\/\*/,/^[[:space:]]*\*\//D' >> sedscript +fi +sed -f sedscript <$skel_dir/php_skeleton.h > php_$extname.h + +$ECHO_N " CREDITS$ECHO_C" +echo "s/extname/$extname/g" > sedscript +sed -f sedscript <$skel_dir/CREDITS > CREDITS + +$ECHO_N " EXPERIMENTAL$ECHO_C" +echo "s/extname/$extname/g" > sedscript +sed -f sedscript <$skel_dir/EXPERIMENTAL > EXPERIMENTAL + +$ECHO_N " tests/001.phpt$ECHO_C" +mkdir tests || givup "Cannot create tests directory" +chmod 755 tests +sed -f sedscript <$skel_dir/tests/001.phpt > tests/001.phpt + +if test -z "$stubs" && test -z "$no_help"; then + $ECHO_N " $extname.php$ECHO_C" + sed \ + -e "s/extname/$extname/g" \ + <$skel_dir/skeleton.php \ + > $extname.php +fi + +rm sedscript + +if test -n "$proto"; then + if test -z "$stubs"; then + rm function_entries + rm function_declarations + rm function_stubs + fi + if test -f function_warning; then + rm function_warning + warning=" +NOTE! Because some arguments to functions were resources, the code generated +cannot yet be compiled without editing. Please consider this to be step 4.5 +in the instructions above. +" + fi +fi + +find . -type f | xargs chmod 644 +find . -type d | xargs chmod 755 +fi + +echo " [done]." + +if test -z "$no_help" && test -z "$stubs"; then + cat <<eof + +To use your new extension, you will have to execute the following steps: + +1. $ cd .. +2. $ vi ext/$extname/config.m4 +3. $ ./buildconf +4. $ ./configure --[with|enable]-$extname +5. $ make +6. $ ./php -f ext/$extname/$extname.php +7. $ vi ext/$extname/$extname.c +8. $ make + +Repeat steps 3-6 until you are satisfied with ext/$extname/config.m4 and +step 6 confirms that your module is compiled into PHP. Then, start writing +code and repeat the last two steps as often as necessary. +$warning +eof +fi |