Move MAIN_DIR initialization code from interrogate to panda3d
Using the new -init flag, see panda3d/interrogate#3
This commit is contained in:
parent
ea1cbe47ac
commit
79d6727077
|
|
@ -283,7 +283,7 @@ endfunction(interrogate_sources)
|
||||||
|
|
||||||
#
|
#
|
||||||
# Function: add_python_module(module [lib1 [lib2 ...]] [LINK lib1 ...]
|
# Function: add_python_module(module [lib1 [lib2 ...]] [LINK lib1 ...]
|
||||||
# [IMPORT mod1 ...])
|
# [IMPORT mod1 ...] [INIT func1 ...])
|
||||||
# Uses interrogate to create a Python module. If the LINK keyword is specified,
|
# Uses interrogate to create a Python module. If the LINK keyword is specified,
|
||||||
# the Python module is linked against the specified libraries instead of those
|
# the Python module is linked against the specified libraries instead of those
|
||||||
# listed before. The IMPORT keyword makes the output module import another
|
# listed before. The IMPORT keyword makes the output module import another
|
||||||
|
|
@ -305,7 +305,7 @@ function(add_python_module module)
|
||||||
|
|
||||||
set(keyword)
|
set(keyword)
|
||||||
foreach(arg ${ARGN})
|
foreach(arg ${ARGN})
|
||||||
if(arg STREQUAL "LINK" OR arg STREQUAL "IMPORT" OR arg STREQUAL "COMPONENT")
|
if(arg STREQUAL "LINK" OR arg STREQUAL "IMPORT" OR arg STREQUAL "INIT" OR arg STREQUAL "COMPONENT")
|
||||||
set(keyword "${arg}")
|
set(keyword "${arg}")
|
||||||
|
|
||||||
elseif(keyword STREQUAL "LINK")
|
elseif(keyword STREQUAL "LINK")
|
||||||
|
|
@ -316,6 +316,10 @@ function(add_python_module module)
|
||||||
list(APPEND import_flags "-import" "${arg}")
|
list(APPEND import_flags "-import" "${arg}")
|
||||||
set(keyword)
|
set(keyword)
|
||||||
|
|
||||||
|
elseif(keyword STREQUAL "INIT")
|
||||||
|
list(APPEND import_flags "-init" "${arg}")
|
||||||
|
set(keyword)
|
||||||
|
|
||||||
elseif(keyword STREQUAL "COMPONENT")
|
elseif(keyword STREQUAL "COMPONENT")
|
||||||
set(component "${arg}")
|
set(component "${arg}")
|
||||||
set(keyword)
|
set(keyword)
|
||||||
|
|
|
||||||
|
|
@ -265,7 +265,7 @@ if(BUILD_INTERROGATE)
|
||||||
panda3d-interrogate
|
panda3d-interrogate
|
||||||
|
|
||||||
GIT_REPOSITORY https://github.com/panda3d/interrogate.git
|
GIT_REPOSITORY https://github.com/panda3d/interrogate.git
|
||||||
GIT_TAG 03418d6d7ddda7fb99abf27230aa42d1d8bd607e
|
GIT_TAG d2844d994fcc465a4e22b10001d3ac5c4012b814
|
||||||
|
|
||||||
PREFIX ${_interrogate_dir}
|
PREFIX ${_interrogate_dir}
|
||||||
CMAKE_ARGS
|
CMAKE_ARGS
|
||||||
|
|
|
||||||
|
|
@ -69,6 +69,8 @@ set(P3DTOOLUTIL_IGATEEXT
|
||||||
globPattern_ext.h
|
globPattern_ext.h
|
||||||
iostream_ext.cxx
|
iostream_ext.cxx
|
||||||
iostream_ext.h
|
iostream_ext.h
|
||||||
|
pyenv_init.cxx
|
||||||
|
pyenv_init.h
|
||||||
textEncoder_ext.cxx
|
textEncoder_ext.cxx
|
||||||
textEncoder_ext.h
|
textEncoder_ext.h
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
#include "filename_ext.cxx"
|
#include "filename_ext.cxx"
|
||||||
#include "globPattern_ext.cxx"
|
#include "globPattern_ext.cxx"
|
||||||
#include "iostream_ext.cxx"
|
#include "iostream_ext.cxx"
|
||||||
|
#include "pyenv_init.cxx"
|
||||||
#include "textEncoder_ext.cxx"
|
#include "textEncoder_ext.cxx"
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,80 @@
|
||||||
|
/**
|
||||||
|
* PANDA 3D SOFTWARE
|
||||||
|
* Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||||
|
*
|
||||||
|
* All use of this software is subject to the terms of the revised BSD
|
||||||
|
* license. You should have received a copy of this license along
|
||||||
|
* with this source code in a file named "LICENSE."
|
||||||
|
*
|
||||||
|
* @file pyenv_init.cxx
|
||||||
|
* @author rdb
|
||||||
|
* @date 2025-02-02
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "pyenv_init.h"
|
||||||
|
#include "py_panda.h"
|
||||||
|
#include "executionEnvironment.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called when panda3d.core is initialized, does some initialization specific
|
||||||
|
* to the Python environment.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
pyenv_init() {
|
||||||
|
// MAIN_DIR needs to be set very early; this seems like a convenient place
|
||||||
|
// to do that. Perhaps we'll find a better place for this in the future.
|
||||||
|
static bool initialized_main_dir = false;
|
||||||
|
if (!initialized_main_dir) {
|
||||||
|
/*if (interrogatedb_cat.is_debug()) {
|
||||||
|
// Good opportunity to print this out once, at startup.
|
||||||
|
interrogatedb_cat.debug()
|
||||||
|
<< "Python " << version << "\n";
|
||||||
|
}*/
|
||||||
|
|
||||||
|
if (!ExecutionEnvironment::has_environment_variable("MAIN_DIR")) {
|
||||||
|
// Grab the __main__ module and extract its __file__ attribute.
|
||||||
|
Filename main_dir;
|
||||||
|
PyObject *main_module = PyImport_ImportModule("__main__");
|
||||||
|
PyObject *file_attr = nullptr;
|
||||||
|
if (main_module != nullptr) {
|
||||||
|
file_attr = PyObject_GetAttrString(main_module, "__file__");
|
||||||
|
} else {
|
||||||
|
std::cerr << "Warning: unable to import __main__\n";
|
||||||
|
}
|
||||||
|
if (file_attr == nullptr) {
|
||||||
|
// Must be running in the interactive interpreter. Use the CWD.
|
||||||
|
main_dir = ExecutionEnvironment::get_cwd();
|
||||||
|
} else {
|
||||||
|
#if PY_MAJOR_VERSION >= 3
|
||||||
|
Py_ssize_t length;
|
||||||
|
wchar_t *buffer = PyUnicode_AsWideCharString(file_attr, &length);
|
||||||
|
if (buffer != nullptr) {
|
||||||
|
main_dir = Filename::from_os_specific_w(std::wstring(buffer, length));
|
||||||
|
main_dir.make_absolute();
|
||||||
|
main_dir = main_dir.get_dirname();
|
||||||
|
PyMem_Free(buffer);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
char *buffer;
|
||||||
|
Py_ssize_t length;
|
||||||
|
if (PyString_AsStringAndSize(file_attr, &buffer, &length) != -1) {
|
||||||
|
main_dir = Filename::from_os_specific(std::string(buffer, length));
|
||||||
|
main_dir.make_absolute();
|
||||||
|
main_dir = main_dir.get_dirname();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
else {
|
||||||
|
std::cerr << "Invalid string for __main__.__file__\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ExecutionEnvironment::shadow_environment_variable("MAIN_DIR", main_dir.to_os_specific());
|
||||||
|
PyErr_Clear();
|
||||||
|
}
|
||||||
|
initialized_main_dir = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Also, while we are at it, initialize the thread swap hook.
|
||||||
|
#if defined(HAVE_THREADS) && defined(SIMPLE_THREADS)
|
||||||
|
global_thread_state_swap = PyThreadState_Swap;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,14 @@
|
||||||
|
/**
|
||||||
|
* PANDA 3D SOFTWARE
|
||||||
|
* Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||||
|
*
|
||||||
|
* All use of this software is subject to the terms of the revised BSD
|
||||||
|
* license. You should have received a copy of this license along
|
||||||
|
* with this source code in a file named "LICENSE."
|
||||||
|
*
|
||||||
|
* @file pyenv_init.h
|
||||||
|
* @author rdb
|
||||||
|
* @date 2025-02-02
|
||||||
|
*/
|
||||||
|
|
||||||
|
extern "C" void pyenv_init();
|
||||||
|
|
@ -1651,6 +1651,9 @@ def CompileImod(wobj, wsrc, opts):
|
||||||
importmod = GetValueOption(opts, "IMPORT:")
|
importmod = GetValueOption(opts, "IMPORT:")
|
||||||
if importmod:
|
if importmod:
|
||||||
cmd += ' -import ' + importmod
|
cmd += ' -import ' + importmod
|
||||||
|
initfunc = GetValueOption(opts, "INIT:")
|
||||||
|
if initfunc:
|
||||||
|
cmd += ' -init ' + initfunc
|
||||||
for x in wsrc: cmd += ' ' + BracketNameWithQuotes(x)
|
for x in wsrc: cmd += ' ' + BracketNameWithQuotes(x)
|
||||||
oscmd(cmd)
|
oscmd(cmd)
|
||||||
CompileCxx(wobj,woutc,opts)
|
CompileCxx(wobj,woutc,opts)
|
||||||
|
|
@ -4168,7 +4171,7 @@ if GetTarget() != "emscripten":
|
||||||
if PkgSkip("FREETYPE")==0:
|
if PkgSkip("FREETYPE")==0:
|
||||||
PyTargetAdd('core_module.obj', input='libp3pnmtext.in')
|
PyTargetAdd('core_module.obj', input='libp3pnmtext.in')
|
||||||
|
|
||||||
PyTargetAdd('core_module.obj', opts=['IMOD:panda3d.core', 'ILIB:core'])
|
PyTargetAdd('core_module.obj', opts=['IMOD:panda3d.core', 'ILIB:core', 'INIT:pyenv_init'])
|
||||||
|
|
||||||
PyTargetAdd('core.pyd', input='libp3dtoolbase_igate.obj')
|
PyTargetAdd('core.pyd', input='libp3dtoolbase_igate.obj')
|
||||||
PyTargetAdd('core.pyd', input='p3dtoolbase_typeHandle_ext.obj')
|
PyTargetAdd('core.pyd', input='p3dtoolbase_typeHandle_ext.obj')
|
||||||
|
|
|
||||||
|
|
@ -589,8 +589,8 @@ def GetInterrogateDir():
|
||||||
return INTERROGATE_DIR
|
return INTERROGATE_DIR
|
||||||
|
|
||||||
dir = os.path.join(GetOutputDir(), "tmp", "interrogate")
|
dir = os.path.join(GetOutputDir(), "tmp", "interrogate")
|
||||||
if not os.path.isdir(os.path.join(dir, "panda3d_interrogate-0.4.0.dist-info")):
|
if not os.path.isdir(os.path.join(dir, "panda3d_interrogate-0.5.0.dist-info")):
|
||||||
oscmd("\"%s\" -m pip install --force-reinstall --upgrade -t \"%s\" panda3d-interrogate==0.4.0" % (sys.executable, dir))
|
oscmd("\"%s\" -m pip install --force-reinstall --upgrade -t \"%s\" panda3d-interrogate==0.5.0" % (sys.executable, dir))
|
||||||
|
|
||||||
INTERROGATE_DIR = dir
|
INTERROGATE_DIR = dir
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -107,7 +107,7 @@ if(HAVE_FREETYPE)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(INTERROGATE_PYTHON_INTERFACE)
|
if(INTERROGATE_PYTHON_INTERFACE)
|
||||||
add_python_module(panda3d.core ${CORE_MODULE_COMPONENTS} LINK panda)
|
add_python_module(panda3d.core ${CORE_MODULE_COMPONENTS} LINK panda INIT pyenv_init)
|
||||||
|
|
||||||
# Generate our __init__.py
|
# Generate our __init__.py
|
||||||
if(WIN32)
|
if(WIN32)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue