Commit 4350d7f2 authored by Robert Bradshaw's avatar Robert Bradshaw

Allow embed option to take function name.

parent 4e6da5ac
...@@ -34,7 +34,7 @@ Options: ...@@ -34,7 +34,7 @@ Options:
-a, --annotate Produce a colorized HTML version of the source. -a, --annotate Produce a colorized HTML version of the source.
--line-directives Produce #line directives pointing to the .pyx source --line-directives Produce #line directives pointing to the .pyx source
--cplus Output a C++ rather than C file. --cplus Output a C++ rather than C file.
--embed Generate a main() function that embeds the Python interpreter. --embed[=<method_name>] Generate a main() function that embeds the Python interpreter.
-2 Compile based on Python-2 syntax and code semantics. -2 Compile based on Python-2 syntax and code semantics.
-3 Compile based on Python-3 syntax and code semantics. -3 Compile based on Python-3 syntax and code semantics.
--fast-fail Abort the compilation on the first error --fast-fail Abort the compilation on the first error
...@@ -84,8 +84,12 @@ def parse_command_line(args): ...@@ -84,8 +84,12 @@ def parse_command_line(args):
options.use_listing_file = 1 options.use_listing_file = 1
elif option in ("-+", "--cplus"): elif option in ("-+", "--cplus"):
options.cplus = 1 options.cplus = 1
elif option == "--embed": elif option.startswith("--embed"):
Options.embed = True ix = option.find('=')
if ix == -1:
Options.embed = "main"
else:
Options.embed = option[ix+1:]
elif option.startswith("-I"): elif option.startswith("-I"):
options.include_path.append(get_param(option)) options.include_path.append(get_param(option))
elif option == "--include-dir": elif option == "--include-dir":
......
...@@ -1897,7 +1897,16 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode): ...@@ -1897,7 +1897,16 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
def generate_main_method(self, env, code): def generate_main_method(self, env, code):
module_is_main = "%s%s" % (Naming.module_is_main, self.full_module_name.replace('.', '__')) module_is_main = "%s%s" % (Naming.module_is_main, self.full_module_name.replace('.', '__'))
code.globalstate.use_utility_code(main_method.specialize(module_name=env.module_name, module_is_main=module_is_main)) if Options.embed == "main":
wmain = "wmain"
else:
wmain = Options.embed
code.globalstate.use_utility_code(
main_method.specialize(
module_name = env.module_name,
module_is_main = module_is_main,
main_method = Options.embed,
wmain_method = wmain))
def generate_pymoduledef_struct(self, env, code): def generate_pymoduledef_struct(self, env, code):
if env.doc: if env.doc:
...@@ -2646,9 +2655,9 @@ impl = """ ...@@ -2646,9 +2655,9 @@ impl = """
#endif #endif
#if PY_MAJOR_VERSION < 3 #if PY_MAJOR_VERSION < 3
int main(int argc, char** argv) { int %(main_method)s(int argc, char** argv) {
#elif defined(WIN32) || defined(MS_WINDOWS) #elif defined(WIN32) || defined(MS_WINDOWS)
int wmain(int argc, wchar_t **argv) { int %(wmain_method)s(int argc, wchar_t **argv) {
#else #else
static int __Pyx_main(int argc, wchar_t **argv) { static int __Pyx_main(int argc, wchar_t **argv) {
#endif #endif
...@@ -2665,9 +2674,13 @@ static int __Pyx_main(int argc, wchar_t **argv) { ...@@ -2665,9 +2674,13 @@ static int __Pyx_main(int argc, wchar_t **argv) {
m = fpgetmask(); m = fpgetmask();
fpsetmask(m & ~FP_X_OFL); fpsetmask(m & ~FP_X_OFL);
#endif #endif
Py_SetProgramName(argv[0]); if (argc) {
Py_SetProgramName(argv[0]);
}
Py_Initialize(); Py_Initialize();
PySys_SetArgv(argc, argv); if (argc) {
PySys_SetArgv(argc, argv);
}
%(module_is_main)s = 1; %(module_is_main)s = 1;
#if PY_MAJOR_VERSION < 3 #if PY_MAJOR_VERSION < 3
init%(module_name)s(); init%(module_name)s();
...@@ -2794,33 +2807,38 @@ oom: ...@@ -2794,33 +2807,38 @@ oom:
} }
int int
main(int argc, char **argv) %(main_method)s(int argc, char **argv)
{ {
wchar_t **argv_copy = (wchar_t **)malloc(sizeof(wchar_t*)*argc); if (!argc) {
/* We need a second copies, as Python might modify the first one. */ return __Pyx_main(0, NULL);
wchar_t **argv_copy2 = (wchar_t **)malloc(sizeof(wchar_t*)*argc); }
int i, res; else {
char *oldloc; wchar_t **argv_copy = (wchar_t **)malloc(sizeof(wchar_t*)*argc);
if (!argv_copy || !argv_copy2) { /* We need a second copies, as Python might modify the first one. */
fprintf(stderr, "out of memory\\n"); wchar_t **argv_copy2 = (wchar_t **)malloc(sizeof(wchar_t*)*argc);
return 1; int i, res;
} char *oldloc;
oldloc = strdup(setlocale(LC_ALL, NULL)); if (!argv_copy || !argv_copy2) {
setlocale(LC_ALL, ""); fprintf(stderr, "out of memory\\n");
for (i = 0; i < argc; i++) { return 1;
argv_copy2[i] = argv_copy[i] = __Pyx_char2wchar(argv[i]); }
if (!argv_copy[i]) oldloc = strdup(setlocale(LC_ALL, NULL));
return 1; setlocale(LC_ALL, "");
} for (i = 0; i < argc; i++) {
setlocale(LC_ALL, oldloc); argv_copy2[i] = argv_copy[i] = __Pyx_char2wchar(argv[i]);
free(oldloc); if (!argv_copy[i])
res = __Pyx_main(argc, argv_copy); return 1;
for (i = 0; i < argc; i++) { }
free(argv_copy2[i]); setlocale(LC_ALL, oldloc);
} free(oldloc);
free(argv_copy); res = __Pyx_main(argc, argv_copy);
free(argv_copy2); for (i = 0; i < argc; i++) {
return res; free(argv_copy2[i]);
}
free(argv_copy);
free(argv_copy2);
return res;
}
} }
#endif #endif
""") """)
......
...@@ -44,9 +44,9 @@ lookup_module_cpdef = 0 ...@@ -44,9 +44,9 @@ lookup_module_cpdef = 0
init_local_none = 1 init_local_none = 1
# Whether or not to embed the Python interpreter, for use in making a # Whether or not to embed the Python interpreter, for use in making a
# standalone executable. This will provide a main() method which simply # standalone executable or calling from external libraries.
# executes the body of this module. # This will provide a method which simply executes the body of this module.
embed = False embed = None
# Disables function redefinition, allowing all functions to be declared at # Disables function redefinition, allowing all functions to be declared at
# module creation time. For legacy code only. # module creation time. For legacy code only.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment