123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332 |
- #!/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-svn"
- 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/\$PHP_LIBDIR, ${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/\$PHP_LIBDIR -lm
- dnl ])
- dnl
- dnl PHP_SUBST(${EXTNAME}_SHARED_LIBADD)
- PHP_NEW_EXTENSION($extname, $extname.c, \$ext_shared)
- fi
- eof
- $ECHO_N " config.w32$ECHO_C"
- cat >config.w32 <<eof
- // \$Id\$
- // vim:ft=javascript
- // If your extension references something external, use ARG_WITH
- // ARG_WITH("$extname", "for $extname support", "no");
- // Otherwise, use ARG_ENABLE
- // ARG_ENABLE("$extname", "enable $extname support", "no");
- if (PHP_$EXTNAME != "no") {
- EXTENSION("$extname", "$extname.c");
- }
- eof
- $ECHO_N " .gitignore$ECHO_C"
- cat >.gitignore <<eof
- .deps
- *.lo
- *.la
- .libs
- acinclude.m4
- aclocal.m4
- autom4te.cache
- build
- config.guess
- config.h
- config.h.in
- config.log
- config.nice
- config.status
- config.sub
- configure
- configure.in
- include
- install-sh
- libtool
- ltmain.sh
- Makefile
- Makefile.fragments
- Makefile.global
- Makefile.objects
- missing
- mkinstalldirs
- modules
- run-tests.php
- tests/*/*.diff
- tests/*/*.out
- tests/*/*.php
- tests/*/*.exp
- tests/*/*.log
- tests/*/*.sh
- 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. $ ./sapi/cli/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
|