xref: /PHP-7.0/ext/ext_skel (revision e1fcb9ea)
1#!/bin/sh
2
3givup() {
4	echo $*
5	exit 1
6}
7
8usage() {
9echo "$0 --extname=module [--proto=file] [--stubs=file] [--xml[=file]]"
10echo "           [--skel=dir] [--full-xml] [--no-help]"
11echo ""
12echo "  --extname=module   module is the name of your extension"
13echo "  --proto=file       file contains prototypes of functions to create"
14echo "  --stubs=file       generate only function stubs in file"
15echo "  --xml              generate xml documentation to be added to phpdoc-svn"
16echo "  --skel=dir         path to the skeleton directory"
17echo "  --full-xml         generate xml documentation for a self-contained extension"
18echo "                     (not yet implemented)"
19echo "  --no-help          don't try to be nice and create comments in the code"
20echo "                     and helper functions to test if the module compiled"
21exit 1
22}
23
24if test $# = 0; then
25  usage
26fi
27
28while 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
66done
67
68if test -d "$extname" ; then
69  givup "Directory $extname already exists."
70fi
71
72if test -z "$skel_dir"; then
73  skel_dir="skeleton"
74fi
75
76## convert skel_dir to full path
77skel_dir=`cd $skel_dir && pwd`
78
79test -d $skel_dir || givup "directory $skel_dir does not exist or is not directory"
80
81if echo '\c' | grep -s c >/dev/null 2>&1
82then
83    ECHO_N="echo -n"
84    ECHO_C=""
85else
86    ECHO_N="echo"
87    ECHO_C='\c'
88fi
89
90if test -z "$stubs"; then
91  echo "Creating directory $extname"
92  stubfile=$extname"/function_stubs"
93  mkdir $extname || givup "Cannot create directory $extname"
94fi
95
96if 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
98fi
99
100if 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"
107cat >config.m4 <<eof
108dnl \$Id\$
109dnl config.m4 for extension $extname
110
111dnl Comments in this file start with the string 'dnl'.
112dnl Remove where necessary. This file will not work
113dnl without editing.
114
115dnl If your extension references something external, use with:
116
117dnl PHP_ARG_WITH($extname, for $extname support,
118dnl Make sure that the comment is aligned:
119dnl [  --with-$extname             Include $extname support])
120
121dnl Otherwise use enable:
122
123dnl PHP_ARG_ENABLE($extname, whether to enable $extname support,
124dnl Make sure that the comment is aligned:
125dnl [  --enable-$extname           Enable $extname support])
126
127if 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/\$PHP_LIBDIR, ${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/\$PHP_LIBDIR -lm
165  dnl ])
166  dnl
167  dnl PHP_SUBST(${EXTNAME}_SHARED_LIBADD)
168
169  PHP_NEW_EXTENSION($extname, $extname.c, \$ext_shared,, -DZEND_ENABLE_STATIC_TSRMLS_CACHE=1)
170fi
171eof
172
173$ECHO_N " config.w32$ECHO_C"
174cat >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
184if (PHP_$EXTNAME != "no") {
185	EXTENSION("$extname", "$extname.c", PHP_EXTNAME_SHARED, "/DZEND_ENABLE_STATIC_TSRMLS_CACHE=1");
186}
187
188eof
189
190$ECHO_N " .gitignore$ECHO_C"
191cat >.gitignore <<eof
192.deps
193*.lo
194*.la
195.libs
196acinclude.m4
197aclocal.m4
198autom4te.cache
199build
200config.guess
201config.h
202config.h.in
203config.log
204config.nice
205config.status
206config.sub
207configure
208configure.in
209include
210install-sh
211libtool
212ltmain.sh
213Makefile
214Makefile.fragments
215Makefile.global
216Makefile.objects
217missing
218mkinstalldirs
219modules
220run-tests.php
221tests/*/*.diff
222tests/*/*.out
223tests/*/*.php
224tests/*/*.exp
225tests/*/*.log
226tests/*/*.sh
227eof
228
229$ECHO_N " $extname.c$ECHO_C"
230echo "s/extname/$extname/g" > sedscript
231echo "s/EXTNAME/$EXTNAME/g"  >> sedscript
232echo '/__function_entries_here__/r function_entries'  >> sedscript
233echo '/__function_stubs_here__/r function_stubs'  >> sedscript
234echo '/__header_here__/r ../../header'  >> sedscript
235echo '/__footer_here__/r ../../footer'  >> sedscript
236echo '/__function_entries_here__/D'  >> sedscript
237echo '/__function_stubs_here__/D'  >> sedscript
238echo '/__header_here__/D'  >> sedscript
239echo '/__footer_here__/D'  >> sedscript
240if [ ! -z "$no_help" ]; then
241    echo "/confirm_$extname_compiled/D" >> sedscript
242    echo '/Remove the following/,/^\*\//D' >> sedscript
243    echo 's/[[:space:]]\/\*.\+\*\///' >> sedscript
244    echo 's/^\/\*.*\*\/$//' >> sedscript
245    echo '/^[[:space:]]*\/\*/,/^[[:space:]]*\*\//D' >> sedscript
246fi
247
248sed -f sedscript < $skel_dir/skeleton.c > $extname.c
249
250
251$ECHO_N " php_$extname.h$ECHO_C"
252echo "s/extname/$extname/g" > sedscript
253echo "s/EXTNAME/$EXTNAME/g" >> sedscript
254echo '/__function_declarations_here__/r function_declarations' >> sedscript
255echo '/__header_here__/r ../../header'  >> sedscript
256echo '/__footer_here__/r ../../footer'  >> sedscript
257echo '/__function_declarations_here__/D' >> sedscript
258echo '/__header_here__/D'  >> sedscript
259echo '/__footer_here__/D'  >> sedscript
260if [ ! -z "$no_help" ]; then
261    echo "/confirm_$extname_compiled/D" >> sedscript
262    echo 's/[[:space:]]\/\*.\+\*\///' >> sedscript
263    echo 's/^\/\*.*\*\/$//' >> sedscript
264    echo '/^[[:space:]]*\/\*/,/^[[:space:]]*\*\//D' >> sedscript
265fi
266sed -f sedscript <$skel_dir/php_skeleton.h > php_$extname.h
267
268$ECHO_N " CREDITS$ECHO_C"
269echo "s/extname/$extname/g" > sedscript
270sed -f sedscript <$skel_dir/CREDITS > CREDITS
271
272$ECHO_N " EXPERIMENTAL$ECHO_C"
273echo "s/extname/$extname/g" > sedscript
274sed -f sedscript <$skel_dir/EXPERIMENTAL > EXPERIMENTAL
275
276$ECHO_N " tests/001.phpt$ECHO_C"
277mkdir tests || givup "Cannot create tests directory"
278chmod 755 tests
279sed -f sedscript <$skel_dir/tests/001.phpt > tests/001.phpt
280
281if test -z "$stubs" && test -z "$no_help"; then
282  $ECHO_N " $extname.php$ECHO_C"
283  sed \
284    -e "s/extname/$extname/g" \
285    <$skel_dir/skeleton.php \
286    > $extname.php
287fi
288
289rm sedscript
290
291if test -n "$proto"; then
292  if test -z "$stubs"; then
293    rm function_entries
294    rm function_declarations
295    rm function_stubs
296  fi
297  if test -f function_warning; then
298    rm function_warning
299    warning="
300NOTE! Because some arguments to functions were resources, the code generated
301cannot yet be compiled without editing. Please consider this to be step 4.5
302in the instructions above.
303"
304  fi
305fi
306
307find . -type f | xargs chmod 644
308find . -type d | xargs chmod 755
309fi
310
311echo " [done]."
312
313if test -z "$no_help" && test -z "$stubs"; then
314  cat <<eof
315
316To use your new extension, you will have to execute the following steps:
317
3181.  $ cd ..
3192.  $ vi ext/$extname/config.m4
3203.  $ ./buildconf
3214.  $ ./configure --[with|enable]-$extname
3225.  $ make
3236.  $ ./sapi/cli/php -f ext/$extname/$extname.php
3247.  $ vi ext/$extname/$extname.c
3258.  $ make
326
327Repeat steps 3-6 until you are satisfied with ext/$extname/config.m4 and
328step 6 confirms that your module is compiled into PHP. Then, start writing
329code and repeat the last two steps as often as necessary.
330$warning
331eof
332fi
333