diff --git a/sapi/cli/cli.h b/sapi/cli/cli.h index 85b55af3845d8..cfeb9e8d07e16 100644 --- a/sapi/cli/cli.h +++ b/sapi/cli/cli.h @@ -26,6 +26,8 @@ #endif +extern PHP_CLI_API int do_php_cli(int argc, char *argv[]); + extern PHP_CLI_API ssize_t sapi_cli_single_write(const char *str, size_t str_length); typedef struct { diff --git a/sapi/cli/php_cli.c b/sapi/cli/php_cli.c index d1781eab671c9..ca5a8c1ddccc2 100644 --- a/sapi/cli/php_cli.c +++ b/sapi/cli/php_cli.c @@ -1179,18 +1179,10 @@ static int do_cli(int argc, char **argv) /* {{{ */ } /* }}} */ -/* {{{ main */ -#ifdef PHP_CLI_WIN32_NO_CONSOLE -int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) -#else -int main(int argc, char *argv[]) -#endif +/* {{{ do_php_cli */ +PHP_CLI_API int do_php_cli(int argc, char *argv[]) { #if defined(PHP_WIN32) -# ifdef PHP_CLI_WIN32_NO_CONSOLE - int argc = __argc; - char **argv = __argv; -# endif int num_args; wchar_t **argv_wide; char **argv_save = argv; @@ -1393,6 +1385,22 @@ int main(int argc, char *argv[]) * exiting. */ cleanup_ps_args(argv); - exit(exit_status); + return exit_status; +} +/* }}} */ + +/* {{{ main */ +#ifndef PHP_EMBED_SAPI +# ifdef PHP_CLI_WIN32_NO_CONSOLE +int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) +{ + exit(do_php_cli(__argc, __argv)); } +# else +int main(int argc, char *argv[]) +{ + exit(do_php_cli(argc, argv)); +} +# endif +#endif /* PHP_EMBED_SAPI */ /* }}} */ diff --git a/sapi/embed/Makefile.frag b/sapi/embed/Makefile.frag new file mode 100644 index 0000000000000..eeb0345098feb --- /dev/null +++ b/sapi/embed/Makefile.frag @@ -0,0 +1,18 @@ +# Redirect cli source objects to sapi/embed/cli, so the version without main() doesn't conflict with cli sapis version with main() +EMBED_CLI_SRCDIR = $(top_srcdir)/sapi/cli +EMBED_CLI_CC = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(COMMON_FLAGS) $(CFLAGS_CLEAN) $(EXTRA_CFLAGS) -Isapi/cli/ -I$(EMBED_CLI_SRCDIR) -DPHP_EMBED_SAPI -DZEND_ENABLE_STATIC_TSRMLS_CACHE=1 + +sapi/embed/cli/php_cli.lo: $(EMBED_CLI_SRCDIR)/php_cli.c + $(EMBED_CLI_CC) -c $< -o $@ + +sapi/embed/cli/php_http_parser.lo: $(EMBED_CLI_SRCDIR)/php_http_parser.c + $(EMBED_CLI_CC) -c $< -o $@ + +sapi/embed/cli/php_cli_server.lo: $(EMBED_CLI_SRCDIR)/php_cli_server.c + $(EMBED_CLI_CC) -c $< -o $@ + +sapi/embed/cli/ps_title.lo: $(EMBED_CLI_SRCDIR)/ps_title.c + $(EMBED_CLI_CC) -c $< -o $@ + +sapi/embed/cli/php_cli_process_title.lo: $(EMBED_CLI_SRCDIR)/php_cli_process_title.c + $(EMBED_CLI_CC) -c $< -o $@ diff --git a/sapi/embed/config.m4 b/sapi/embed/config.m4 index 2bb5ed4df4da4..57e5dc7bd0c01 100644 --- a/sapi/embed/config.m4 +++ b/sapi/embed/config.m4 @@ -32,7 +32,14 @@ if test "$PHP_EMBED" != "no"; then [$PHP_EMBED_TYPE], [php_embed.c], [-DZEND_ENABLE_STATIC_TSRMLS_CACHE=1]) + + dnl Include CLI sources in embed SAPI so do_php_cli() is available + PHP_ADD_BUILD_DIR([sapi/embed/cli]) + PHP_ADD_MAKEFILE_FRAGMENT([$abs_srcdir/sapi/embed/Makefile.frag]) + PHP_SAPI_OBJS="$PHP_SAPI_OBJS sapi/embed/cli/php_cli.lo sapi/embed/cli/php_http_parser.lo sapi/embed/cli/php_cli_server.lo sapi/embed/cli/ps_title.lo sapi/embed/cli/php_cli_process_title.lo" + PHP_INSTALL_HEADERS([sapi/embed], [php_embed.h]) + PHP_INSTALL_HEADERS([sapi/cli], [cli.h]) ]) else AC_MSG_RESULT([no]) diff --git a/sapi/embed/config.w32 b/sapi/embed/config.w32 index 394982126cadb..44c12938f5aef 100644 --- a/sapi/embed/config.w32 +++ b/sapi/embed/config.w32 @@ -6,5 +6,9 @@ var PHP_EMBED_PGO = false; if (PHP_EMBED != "no") { SAPI('embed', 'php_embed.c', 'php' + PHP_VERSION + 'embed.lib', '/DZEND_ENABLE_STATIC_TSRMLS_CACHE=1'); + ADD_SOURCES("sapi/cli", "php_cli.c php_http_parser.c php_cli_server.c ps_title.c php_cli_process_title.c", "embed", "/DPHP_EMBED_SAPI"); + ADD_FLAG("LIBS_EMBED", "ws2_32.lib"); + ADD_FLAG("LIBS_EMBED", "shell32.lib"); PHP_INSTALL_HEADERS("sapi/embed", "php_embed.h"); + PHP_INSTALL_HEADERS("sapi/cli", "cli.h"); } diff --git a/sapi/embed/php_embed.h b/sapi/embed/php_embed.h index 3a4844629dea3..78acc04bd2b7f 100644 --- a/sapi/embed/php_embed.h +++ b/sapi/embed/php_embed.h @@ -49,6 +49,9 @@ BEGIN_EXTERN_C() EMBED_SAPI_API int php_embed_init(int argc, char **argv); EMBED_SAPI_API void php_embed_shutdown(void); extern EMBED_SAPI_API sapi_module_struct php_embed_module; + +#define HAVE_EMBED_CLI 1 +EMBED_SAPI_API int do_php_cli(int argc, char *argv[]); END_EXTERN_C()