BASH   70

ext skel

Guest on 26th May 2022 02:49:14 PM

  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

Raw Paste


Login or Register to edit or fork this paste. It's free.