Taking a few comments into consideration, here's a new patch for adding C++ code-generating abilities to ext_skel. The new patch doesn't use a separate skeleton.cpp file. Instead, it adds some lines like
/* __begin_extern_c__ */ /* __end_extern_c__ */ to skeleton.c and lets ext_skel either replace them with the proper C++ stuff or get rid of it altogether. I didn't want to make the extname.c output any more complicated with #ifdef __cplusplus preprocessor nonsense, 'cause having extension first-timers asking why there's C++ stuff in their C file would suck. Another slight change to skeleton.c just gets rid of the string named "string" and replaces it with "str". This is just to get rid of any conflict that might come up if someone #includes the C++ string library in their extension, so they don't need to worry about C-string named "string" being confused with the C++ data type "string". Comments? J
Index: ext_skel =================================================================== RCS file: /repository/php4/ext/ext_skel,v retrieving revision 1.44 diff -u -3 -p -r1.44 ext_skel --- ext_skel 18 Nov 2002 15:55:07 -0000 1.44 +++ ext_skel 2 Dec 2002 15:08:10 -0000 @@ -7,7 +7,7 @@ givup() { usage() { echo "$0 --extname=module [--proto=file] [--stubs=file] [--xml[=file]]" -echo " [--skel=dir] [--full-xml] [--no-help]" +echo " [--skel=dir] [--full-xml] [--no-help] [--cpp]" echo "" echo " --extname=module module is the name of your extension" echo " --proto=file file contains prototypes of functions to create" @@ -18,6 +18,7 @@ echo " --full-xml generate xml 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" +echo " --cpp create a C++ extension" exit 1 } @@ -58,6 +59,9 @@ while test $# -gt 0; do --skel=?*) skel_dir=$optarg ;; + --cpp) + cpp="yes" + ;; *) usage ;; @@ -94,7 +98,7 @@ if test -z "$stubs"; then 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 + 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 -v cpp=$cpp -f $skel_dir/create_stubs fi if test -z "$stubs"; then @@ -165,11 +169,16 @@ if test "\$PHP_$EXTNAME" != "no"; then dnl ]) dnl dnl PHP_SUBST(${EXTNAME}_SHARED_LIBADD) +eof - PHP_NEW_EXTENSION($extname, $extname.c, \$ext_shared) +if test "$cpp" = "yes"; then + echo " PHP_REQUIRE_CXX()" >>config.m4 + echo " PHP_NEW_EXTENSION($extname, $extname.cpp, \$ext_shared)" >>config.m4 +else + echo " PHP_NEW_EXTENSION($extname, $extname.c, \$ext_shared)" >>config.m4 fi -eof +echo "fi" >>config.m4 $ECHO_N " .cvsignore$ECHO_C" cat >.cvsignore <<eof @@ -178,9 +187,22 @@ cat >.cvsignore <<eof *.la eof -$ECHO_N " $extname.c$ECHO_C" +if test "$cpp" = "yes"; then + $ECHO_N " $extname.cpp$ECHO_C" +else + $ECHO_N " $extname.c$ECHO_C" +fi echo "s/extname/$extname/g" > sedscript echo "s/EXTNAME/$EXTNAME/g" >> sedscript + +if test "$cpp" = "yes"; then + echo "s/\/\* __begin_extern_c__ \*\//extern \"C\" {/" >> sedscript + echo "s/\/\* __end_extern_c__ \*\//}/" >> sedscript +else + echo "s/\/\* __begin_extern_c__ \*\///" >> sedscript + echo "s/\/\* __end_extern_c__ \*\///" >> sedscript +fi + echo '/__function_entries_here__/r function_entries' >> sedscript echo '/__function_stubs_here__/r function_stubs' >> sedscript echo '/__header_here__/r ../../header' >> sedscript @@ -189,6 +211,7 @@ echo '/__function_entries_here__/D' >> 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 @@ -197,7 +220,11 @@ if [ ! -z "$no_help" ]; then echo '/^[[:space:]]*\/\*/,/^[[:space:]]*\*\//D' >> sedscript fi -sed -f sedscript < $skel_dir/skeleton.c > $extname.c +if test "$cpp" = "yes"; then + sed -f sedscript < $skel_dir/skeleton.c > $extname.cpp +else + sed -f sedscript < $skel_dir/skeleton.c > $extname.c +fi $ECHO_N " php_$extname.h$ECHO_C" @@ -273,7 +300,15 @@ To use your new extension, you will have 4. $ ./configure --[with|enable]-$extname 5. $ make 6. $ ./php -f ext/$extname/$extname.php -7. $ vi ext/$extname/$extname.c +eof + + if test "$cpp" = "yes"; then + echo "7. $ vi ext/$extname/$extname.cpp" + else + echo "7. $ vi ext/$extname/$extname.c" + fi + + cat <<eof 8. $ make Repeat steps 3-6 until you are satisfied with ext/$extname/config.m4 and Index: skeleton/skeleton.c =================================================================== RCS file: /repository/php4/ext/skeleton/skeleton.c,v retrieving revision 1.32 diff -u -3 -p -r1.32 skeleton.c --- skeleton/skeleton.c 2 Dec 2001 00:59:44 -0000 1.32 +++ skeleton/skeleton.c 2 Dec 2002 15:08:10 -0000 @@ -4,9 +4,12 @@ #include "config.h" #endif +/* __begin_extern_c__ */ #include "php.h" #include "php_ini.h" #include "ext/standard/info.h" +/* __end_extern_c__ */ + #include "php_extname.h" /* If you declare any globals in php_extname.h uncomment this: @@ -48,7 +51,9 @@ zend_module_entry extname_module_entry = /* }}} */ #ifdef COMPILE_DL_EXTNAME +/* __begin_extern_c__ */ ZEND_GET_MODULE(extname) +/* __end_extern_c__ */ #endif /* {{{ PHP_INI @@ -139,14 +144,14 @@ PHP_FUNCTION(confirm_extname_compiled) { char *arg = NULL; int arg_len, len; - char string[256]; + char str[256]; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &arg, &arg_len) == FAILURE) { return; } - len = sprintf(string, "Congratulations! You have successfully modified ext/%.78s/config.m4. Module %.78s is now compiled into PHP.", "extname", arg); - RETURN_STRINGL(string, len, 1); + len = sprintf(str, "Congratulations! You have successfully modified ext/%.78s/config.m4. Module %.78s is now compiled into PHP.", "extname", arg); + RETURN_STRINGL(str, len, 1); } /* }}} */ /* The previous line is meant for vim and emacs, so it can correctly fold and
-- PHP Development Mailing List <http://www.php.net/> To unsubscribe, visit: http://www.php.net/unsub.php