diff --git a/.travis.yml b/.travis.yml index 728367f785..64cc557d5b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,6 +11,8 @@ matrix: before_install: - export CC=gcc-4.7 - export CXX=g++-4.7 + - compiler: clang + env: PYTHONV=python3 FLAGS=--no-python SKIP_TESTS=1 addons: apt: sources: @@ -42,8 +44,8 @@ install: - $PYTHONV -m pip install pytest script: - $PYTHONV makepanda/makepanda.py --everything --git-commit $TRAVIS_COMMIT $FLAGS --threads 4 - - LD_LIBRARY_PATH=built/lib PYTHONPATH=built $PYTHONV makepanda/test_imports.py - - LD_LIBRARY_PATH=built/lib PYTHONPATH=built $PYTHONV -m pytest -v tests + - test -n "$SKIP_TESTS" || LD_LIBRARY_PATH=built/lib PYTHONPATH=built $PYTHONV makepanda/test_imports.py + - test -n "$SKIP_TESTS" || LD_LIBRARY_PATH=built/lib PYTHONPATH=built $PYTHONV -m pytest -v tests notifications: irc: channels: diff --git a/dtool/src/dtoolbase/dtoolbase.h b/dtool/src/dtoolbase/dtoolbase.h index 2f8e7ca05d..66142427cc 100644 --- a/dtool/src/dtoolbase/dtoolbase.h +++ b/dtool/src/dtoolbase/dtoolbase.h @@ -138,12 +138,10 @@ #endif #endif -#ifdef HAVE_PYTHON // Instead of including the Python headers, which will implicitly add a linker // flag to link in Python, we'll just excerpt the forward declaration of // PyObject. typedef struct _object PyObject; -#endif #ifndef HAVE_EIGEN // If we don't have the Eigen library, don't define LINMATH_ALIGN. diff --git a/dtool/src/dtoolbase/typeHandle.cxx b/dtool/src/dtoolbase/typeHandle.cxx index 15fac6b60f..c72c3f9d99 100644 --- a/dtool/src/dtoolbase/typeHandle.cxx +++ b/dtool/src/dtoolbase/typeHandle.cxx @@ -153,6 +153,21 @@ deallocate_array(void *ptr) { PANDA_FREE_ARRAY(ptr); } +#ifdef HAVE_PYTHON +/** + * Returns the internal void pointer that is stored for interrogate's benefit. + */ +PyObject *TypeHandle:: +get_python_type() const { + TypeRegistryNode *rnode = TypeRegistry::ptr()->look_up(*this, nullptr); + if (rnode != nullptr) { + return rnode->get_python_type(); + } else { + return nullptr; + } +} +#endif + /** * Return the Index of the BEst fit Classs from a set */ diff --git a/dtool/src/dtoolbase/typeHandle.h b/dtool/src/dtoolbase/typeHandle.h index 97dc445443..094d4abf4a 100644 --- a/dtool/src/dtoolbase/typeHandle.h +++ b/dtool/src/dtoolbase/typeHandle.h @@ -138,6 +138,10 @@ PUBLISHED: MAKE_SEQ_PROPERTY(child_classes, get_num_child_classes, get_child_class); public: +#ifdef HAVE_PYTHON + PyObject *get_python_type() const; +#endif + void *allocate_array(size_t size) RETURNS_ALIGNED(MEMORY_HOOK_ALIGNMENT); void *reallocate_array(void *ptr, size_t size) RETURNS_ALIGNED(MEMORY_HOOK_ALIGNMENT); void deallocate_array(void *ptr); diff --git a/dtool/src/dtoolbase/typeHandle_ext.cxx b/dtool/src/dtoolbase/typeHandle_ext.cxx index 2064e42844..c52b04aabd 100644 --- a/dtool/src/dtoolbase/typeHandle_ext.cxx +++ b/dtool/src/dtoolbase/typeHandle_ext.cxx @@ -22,7 +22,8 @@ */ TypeHandle Extension:: make(PyTypeObject *tp) { - if (!PyType_IsSubtype(tp, &Dtool_DTOOL_SUPER_BASE._PyType)) { + Dtool_PyTypedObject *super_base = Dtool_GetSuperBase(); + if (!PyType_IsSubtype(tp, (PyTypeObject *)super_base)) { PyErr_SetString(PyExc_TypeError, "a Panda type is required"); return TypeHandle::none(); } diff --git a/dtool/src/dtoolbase/typeRegistry.cxx b/dtool/src/dtoolbase/typeRegistry.cxx index 23cdb5ebfb..360dfcd9e4 100644 --- a/dtool/src/dtoolbase/typeRegistry.cxx +++ b/dtool/src/dtoolbase/typeRegistry.cxx @@ -207,6 +207,24 @@ record_alternate_name(TypeHandle type, const string &name) { _lock->unlock(); } +#ifdef HAVE_PYTHON +/** + * Records the given Python type pointer in the type registry for the benefit + * of interrogate. + */ +void TypeRegistry:: +record_python_type(TypeHandle type, PyObject *python_type) { + _lock->lock(); + + TypeRegistryNode *rnode = look_up(type, nullptr); + if (rnode != nullptr) { + rnode->_python_type = python_type; + } + + _lock->unlock(); +} +#endif + /** * Looks for a previously-registered type of the given name. Returns its * TypeHandle if it exists, or TypeHandle::none() if there is no such type. diff --git a/dtool/src/dtoolbase/typeRegistry.h b/dtool/src/dtoolbase/typeRegistry.h index dc7df60541..43b1b8e41f 100644 --- a/dtool/src/dtoolbase/typeRegistry.h +++ b/dtool/src/dtoolbase/typeRegistry.h @@ -45,6 +45,9 @@ PUBLISHED: void record_derivation(TypeHandle child, TypeHandle parent); void record_alternate_name(TypeHandle type, const std::string &name); +#ifdef HAVE_PYTHON + void record_python_type(TypeHandle type, PyObject *python_type); +#endif TypeHandle find_type(const std::string &name) const; TypeHandle find_type_by_id(int id) const; diff --git a/dtool/src/dtoolbase/typeRegistryNode.I b/dtool/src/dtoolbase/typeRegistryNode.I index 4328a47d79..1556e63847 100644 --- a/dtool/src/dtoolbase/typeRegistryNode.I +++ b/dtool/src/dtoolbase/typeRegistryNode.I @@ -11,6 +11,19 @@ * @date 2001-08-06 */ +/** + * Returns the Python type object associated with this node. + */ +INLINE PyObject *TypeRegistryNode:: +get_python_type() const { + if (_python_type != nullptr || _parent_classes.empty()) { + return _python_type; + } else { + // Recurse through parent classes. + return r_get_python_type(); + } +} + /** * */ diff --git a/dtool/src/dtoolbase/typeRegistryNode.cxx b/dtool/src/dtoolbase/typeRegistryNode.cxx index f809ddcc0b..19b4629236 100644 --- a/dtool/src/dtoolbase/typeRegistryNode.cxx +++ b/dtool/src/dtoolbase/typeRegistryNode.cxx @@ -308,6 +308,29 @@ r_build_subtrees(TypeRegistryNode *top, int bit_count, } } +/** + * Recurses through the parent nodes to find the best Python type object to + * represent objects of this type. + */ +PyObject *TypeRegistryNode:: +r_get_python_type() const { + Classes::const_iterator ni; + for (ni = _parent_classes.begin(); ni != _parent_classes.end(); ++ni) { + const TypeRegistryNode *parent = *ni; + if (parent->_python_type != nullptr) { + return parent->_python_type; + + } else if (!parent->_parent_classes.empty()) { + PyObject *py_type = parent->r_get_python_type(); + if (py_type != nullptr) { + return py_type; + } + } + } + + return nullptr; +} + /** * A recursive function to double-check the result of is_derived_from(). This * is the slow, examine-the-whole-graph approach, as opposed to the clever and diff --git a/dtool/src/dtoolbase/typeRegistryNode.h b/dtool/src/dtoolbase/typeRegistryNode.h index dd888cbf59..7dd7f387cc 100644 --- a/dtool/src/dtoolbase/typeRegistryNode.h +++ b/dtool/src/dtoolbase/typeRegistryNode.h @@ -37,6 +37,8 @@ public: static TypeHandle get_parent_towards(const TypeRegistryNode *child, const TypeRegistryNode *base); + INLINE PyObject *get_python_type() const; + void clear_subtree(); void define_subtree(); @@ -46,6 +48,7 @@ public: typedef std::vector Classes; Classes _parent_classes; Classes _child_classes; + PyObject *_python_type = nullptr; AtomicAdjust::Integer _memory_usage[TypeHandle::MC_limit]; @@ -77,6 +80,8 @@ private: void r_build_subtrees(TypeRegistryNode *top, int bit_count, SubtreeMaskType bits); + PyObject *r_get_python_type() const; + static bool check_derived_from(const TypeRegistryNode *child, const TypeRegistryNode *base); diff --git a/dtool/src/interrogate/interfaceMakerPythonNative.cxx b/dtool/src/interrogate/interfaceMakerPythonNative.cxx index 8d2b0f2288..c0316ee5c4 100644 --- a/dtool/src/interrogate/interfaceMakerPythonNative.cxx +++ b/dtool/src/interrogate/interfaceMakerPythonNative.cxx @@ -821,10 +821,54 @@ write_prototypes(ostream &out_code, ostream *out_h) { } } + out_code << "/**\n"; + out_code << " * Declarations for exported classes\n"; + out_code << " */\n"; + + out_code << "static const Dtool_TypeDef exports[] = {\n"; + + for (oi = _objects.begin(); oi != _objects.end(); ++oi) { + Object *object = (*oi).second; + + if (object->_itype.is_class() || object->_itype.is_struct()) { + CPPType *type = object->_itype._cpptype; + + if (isExportThisRun(type) && is_cpp_type_legal(type)) { + string class_name = type->get_local_name(&parser); + string safe_name = make_safe_name(class_name); + + out_code << " {\"" << class_name << "\", &Dtool_" << safe_name << "},\n"; + } + } + } + + out_code << " {nullptr, nullptr},\n"; + out_code << "};\n\n"; + out_code << "/**\n"; out_code << " * Extern declarations for imported classes\n"; out_code << " */\n"; + // Write out a table of the externally imported types that will be filled in + // upon module initialization. + if (!_external_imports.empty()) { + out_code << "#ifndef LINK_ALL_STATIC\n"; + out_code << "static Dtool_TypeDef imports[] = {\n"; + + int idx = 0; + for (CPPType *type : _external_imports) { + string class_name = type->get_local_name(&parser); + string safe_name = make_safe_name(class_name); + + out_code << " {\"" << class_name << "\", nullptr},\n"; + out_code << "#define Dtool_Ptr_" << safe_name << " (imports[" << idx << "].type)\n"; + ++idx; + } + out_code << " {nullptr, nullptr},\n"; + out_code << "};\n"; + out_code << "#endif\n\n"; + } + for (CPPType *type : _external_imports) { string class_name = type->get_local_name(&parser); string safe_name = make_safe_name(class_name); @@ -834,7 +878,9 @@ write_prototypes(ostream &out_code, ostream *out_h) { out_code << "#ifndef LINK_ALL_STATIC\n"; // out_code << "IMPORT_THIS struct Dtool_PyTypedObject Dtool_" << // safe_name << ";\n"; - out_code << "static struct Dtool_PyTypedObject *Dtool_Ptr_" << safe_name << ";\n"; + //if (has_get_class_type_function(type)) { + // out_code << "static struct Dtool_PyTypedObject *Dtool_Ptr_" << safe_name << ";\n"; + //} // out_code << "#define Dtool_Ptr_" << safe_name << " &Dtool_" << // safe_name << "\n"; out_code << "IMPORT_THIS void // Dtool_PyModuleClassInit_" << safe_name << "(PyObject *module);\n"; @@ -1258,36 +1304,36 @@ write_module_support(ostream &out, ostream *out_h, InterrogateModuleDef *def) { Objects::iterator oi; - out << "void Dtool_" << def->library_name << "_RegisterTypes() {\n"; + out << "void Dtool_" << def->library_name << "_RegisterTypes() {\n" + " TypeRegistry *registry = TypeRegistry::ptr();\n" + " nassertv(registry != nullptr);\n"; + for (oi = _objects.begin(); oi != _objects.end(); ++oi) { Object *object = (*oi).second; - if (object->_itype.is_class() || - object->_itype.is_struct()) { - if (is_cpp_type_legal(object->_itype._cpptype) && - isExportThisRun(object->_itype._cpptype)) { - string class_name = make_safe_name(object->_itype.get_scoped_name()); - bool is_typed = has_get_class_type_function(object->_itype._cpptype); + if (object->_itype.is_class() || object->_itype.is_struct()) { + CPPType *type = object->_itype._cpptype; + if (is_cpp_type_legal(type) && isExportThisRun(type)) { + string class_name = object->_itype.get_scoped_name(); + string safe_name = make_safe_name(class_name); + bool is_typed = has_get_class_type_function(type); if (is_typed) { - if (has_init_type_function(object->_itype._cpptype)) { + out << " {\n"; + if (has_init_type_function(type)) { // Call the init_type function. This isn't necessary for all // types as many of them are automatically initialized at static // init type, but for some extension classes it's useful. - out << " " << object->_itype._cpptype->get_local_name(&parser) + out << " " << type->get_local_name(&parser) << "::init_type();\n"; } - out << " Dtool_" << class_name << "._type = " - << object->_itype._cpptype->get_local_name(&parser) - << "::get_class_type();\n" - << " RegisterRuntimeTypedClass(Dtool_" << class_name << ");\n"; - + out << " TypeHandle handle = " << type->get_local_name(&parser) + << "::get_class_type();\n"; + out << " Dtool_" << safe_name << "._type = handle;\n"; + out << " registry->record_python_type(handle, " + "(PyObject *)&Dtool_" << safe_name << ");\n"; + out << " }\n"; } else { - out << "#ifndef LINK_ALL_STATIC\n" - << " RegisterNamedClass(\"" << object->_itype.get_scoped_name() - << "\", Dtool_" << class_name << ");\n" - << "#endif\n"; - - if (IsPandaTypedObject(object->_itype._cpptype->as_struct_type())) { + if (IsPandaTypedObject(type->as_struct_type())) { nout << object->_itype.get_scoped_name() << " derives from TypedObject, " << "but does not define a get_class_type() function.\n"; } @@ -1297,23 +1343,6 @@ write_module_support(ostream &out, ostream *out_h, InterrogateModuleDef *def) { } out << "}\n\n"; - out << "void Dtool_" << def->library_name << "_ResolveExternals() {\n"; - out << "#ifndef LINK_ALL_STATIC\n"; - out << " // Resolve externally imported types.\n"; - - for (CPPType *type : _external_imports) { - string class_name = type->get_local_name(&parser); - string safe_name = make_safe_name(class_name); - - if (has_get_class_type_function(type)) { - out << " Dtool_Ptr_" << safe_name << " = LookupRuntimeTypedClass(" << class_name << "::get_class_type());\n"; - } else { - out << " Dtool_Ptr_" << safe_name << " = LookupNamedClass(\"" << class_name << "\");\n"; - } - } - out << "#endif\n"; - out << "}\n\n"; - out << "void Dtool_" << def->library_name << "_BuildInstants(PyObject *module) {\n"; out << " (void) module;\n"; @@ -1466,9 +1495,14 @@ write_module_support(ostream &out, ostream *out_h, InterrogateModuleDef *def) { out << " {nullptr, nullptr, 0, nullptr}\n" << "};\n\n"; - out << "struct LibraryDef " << def->library_name << "_moddef = {python_simple_funcs};\n"; + out << "extern const struct LibraryDef " << def->library_name << "_moddef = {python_simple_funcs, exports, "; + if (_external_imports.empty()) { + out << "nullptr};\n"; + } else { + out << "imports};\n"; + } if (out_h != nullptr) { - *out_h << "extern struct LibraryDef " << def->library_name << "_moddef;\n"; + *out_h << "extern const struct LibraryDef " << def->library_name << "_moddef;\n"; } } @@ -3063,7 +3097,7 @@ write_module_class(ostream &out, Object *obj) { out << " Dtool_" << ClassName << "._PyType.tp_bases = PyTuple_Pack(" << bases.size() << baseargs << ");\n"; } else { - out << " Dtool_" << ClassName << "._PyType.tp_base = (PyTypeObject *)&Dtool_DTOOL_SUPER_BASE;\n"; + out << " Dtool_" << ClassName << "._PyType.tp_base = (PyTypeObject *)Dtool_GetSuperBase();\n"; } int num_nested = obj->_itype.number_of_nested_types(); diff --git a/dtool/src/interrogate/interrogate.cxx b/dtool/src/interrogate/interrogate.cxx index 964d38020c..ef06833324 100644 --- a/dtool/src/interrogate/interrogate.cxx +++ b/dtool/src/interrogate/interrogate.cxx @@ -19,7 +19,6 @@ #include "pnotify.h" #include "panda_getopt_long.h" #include "preprocess_argv.h" -#include "pystub.h" #include using std::cerr; @@ -309,8 +308,6 @@ predefine_macro(CPPParser& parser, const string& inoption) { int main(int argc, char **argv) { - pystub(); - preprocess_argv(argc, argv); string command_line; int i; diff --git a/dtool/src/interrogate/interrogate_module.cxx b/dtool/src/interrogate/interrogate_module.cxx index 5c5cc9d9ab..6f7bc4bfeb 100644 --- a/dtool/src/interrogate/interrogate_module.cxx +++ b/dtool/src/interrogate/interrogate_module.cxx @@ -19,7 +19,6 @@ #include "interrogate_interface.h" #include "interrogate_request.h" #include "load_dso.h" -#include "pystub.h" #include "pnotify.h" #include "panda_getopt_long.h" #include "preprocess_argv.h" @@ -30,6 +29,9 @@ using std::cerr; using std::string; +// This contains a big source string determined at compile time. +extern const char interrogate_preamble_python_native[]; + Filename output_code_filename; string module_name; string library_name; @@ -286,9 +288,8 @@ int write_python_table_native(std::ostream &out) { vector_string::const_iterator ii; for (ii = libraries.begin(); ii != libraries.end(); ++ii) { printf("Referencing Library %s\n", (*ii).c_str()); - out << "extern LibraryDef " << *ii << "_moddef;\n"; + out << "extern const struct LibraryDef " << *ii << "_moddef;\n"; out << "extern void Dtool_" << *ii << "_RegisterTypes();\n"; - out << "extern void Dtool_" << *ii << "_ResolveExternals();\n"; out << "extern void Dtool_" << *ii << "_BuildInstants(PyObject *module);\n"; } @@ -339,12 +340,9 @@ int write_python_table_native(std::ostream &out) { for (ii = libraries.begin(); ii != libraries.end(); ii++) { out << " Dtool_" << *ii << "_RegisterTypes();\n"; } - for (ii = libraries.begin(); ii != libraries.end(); ii++) { - out << " Dtool_" << *ii << "_ResolveExternals();\n"; - } out << "\n"; - out << " LibraryDef *defs[] = {"; + out << " const LibraryDef *defs[] = {"; for(ii = libraries.begin(); ii != libraries.end(); ii++) { out << "&" << *ii << "_moddef, "; } @@ -386,12 +384,9 @@ int write_python_table_native(std::ostream &out) { for (ii = libraries.begin(); ii != libraries.end(); ii++) { out << " Dtool_" << *ii << "_RegisterTypes();\n"; } - for (ii = libraries.begin(); ii != libraries.end(); ii++) { - out << " Dtool_" << *ii << "_ResolveExternals();\n"; - } out << "\n"; - out << " LibraryDef *defs[] = {"; + out << " const LibraryDef *defs[] = {"; for(ii = libraries.begin(); ii != libraries.end(); ii++) { out << "&" << *ii << "_moddef, "; } @@ -545,8 +540,6 @@ int main(int argc, char *argv[]) { extern int optind; int flag; - pystub(); - preprocess_argv(argc, argv); flag = getopt_long_only(argc, argv, short_options, long_options, nullptr); while (flag != EOF) { @@ -642,8 +635,10 @@ int main(int argc, char *argv[]) { if (build_python_native_wrappers) { write_python_table_native(output_code); - } + // Output the support code. + output_code << interrogate_preamble_python_native << "\n"; + } } } diff --git a/dtool/src/interrogate/parse_file.cxx b/dtool/src/interrogate/parse_file.cxx index aa903407d1..0b8ff924ec 100644 --- a/dtool/src/interrogate/parse_file.cxx +++ b/dtool/src/interrogate/parse_file.cxx @@ -22,7 +22,6 @@ #include "cppGlobals.h" #include "panda_getopt_long.h" #include "preprocess_argv.h" -#include "pystub.h" #include using std::cerr; @@ -206,8 +205,6 @@ show_nested_types(const string &str) { int main(int argc, char **argv) { - pystub(); - extern char *optarg; extern int optind; const char *optstr = "I:S:D:o:l:vp"; diff --git a/dtool/src/interrogatedb/dtool_super_base.cxx b/dtool/src/interrogatedb/dtool_super_base.cxx index 9170af9d4f..01dcdef077 100644 --- a/dtool/src/interrogatedb/dtool_super_base.cxx +++ b/dtool/src/interrogatedb/dtool_super_base.cxx @@ -15,120 +15,132 @@ #ifdef HAVE_PYTHON -class EmptyClass { -}; -Define_Module_Class_Private(dtoolconfig, DTOOL_SUPER_BASE, EmptyClass, DTOOL_SUPER_BASE111); - static PyObject *GetSuperBase(PyObject *self) { - Py_INCREF((PyTypeObject *)&Dtool_DTOOL_SUPER_BASE); // order is important .. this is used for static functions - return (PyObject *) &Dtool_DTOOL_SUPER_BASE; + Dtool_PyTypedObject *super_base = Dtool_GetSuperBase(); + Py_XINCREF((PyTypeObject *)super_base); // order is important .. this is used for static functions + return (PyObject *)super_base; }; -PyMethodDef Dtool_Methods_DTOOL_SUPER_BASE[] = { - { "DtoolGetSuperBase", (PyCFunction) &GetSuperBase, METH_NOARGS, "Will Return SUPERbase Class"}, - { nullptr, nullptr, 0, nullptr } -}; - -EXPCL_INTERROGATEDB void Dtool_PyModuleClassInit_DTOOL_SUPER_BASE(PyObject *module) { - static bool initdone = false; - if (!initdone) { - - initdone = true; - Dtool_DTOOL_SUPER_BASE._PyType.tp_dict = PyDict_New(); - PyDict_SetItemString(Dtool_DTOOL_SUPER_BASE._PyType.tp_dict, "DtoolClassDict", Dtool_DTOOL_SUPER_BASE._PyType.tp_dict); - - if (PyType_Ready((PyTypeObject *)&Dtool_DTOOL_SUPER_BASE) < 0) { - PyErr_SetString(PyExc_TypeError, "PyType_Ready(Dtool_DTOOL_SUPER_BASE)"); - return; - } - Py_INCREF((PyTypeObject *)&Dtool_DTOOL_SUPER_BASE); - - PyDict_SetItemString(Dtool_DTOOL_SUPER_BASE._PyType.tp_dict, "DtoolGetSuperBase", PyCFunction_New(&Dtool_Methods_DTOOL_SUPER_BASE[0], (PyObject *)&Dtool_DTOOL_SUPER_BASE)); - } - +static void Dtool_PyModuleClassInit_DTOOL_SUPER_BASE(PyObject *module) { if (module != nullptr) { - Py_INCREF((PyTypeObject *)&Dtool_DTOOL_SUPER_BASE); - PyModule_AddObject(module, "DTOOL_SUPER_BASE", (PyObject *)&Dtool_DTOOL_SUPER_BASE); + Dtool_PyTypedObject *super_base = Dtool_GetSuperBase(); + Py_INCREF((PyTypeObject *)&super_base); + PyModule_AddObject(module, "DTOOL_SUPER_BASE", (PyObject *)&super_base); } } -inline void *Dtool_DowncastInterface_DTOOL_SUPER_BASE(void *from_this, Dtool_PyTypedObject *from_type) { +static void *Dtool_DowncastInterface_DTOOL_SUPER_BASE(void *from_this, Dtool_PyTypedObject *from_type) { return nullptr; } -inline void *Dtool_UpcastInterface_DTOOL_SUPER_BASE(PyObject *self, Dtool_PyTypedObject *requested_type) { +static void *Dtool_UpcastInterface_DTOOL_SUPER_BASE(PyObject *self, Dtool_PyTypedObject *requested_type) { return nullptr; } -int Dtool_Init_DTOOL_SUPER_BASE(PyObject *self, PyObject *args, PyObject *kwds) { +static int Dtool_Init_DTOOL_SUPER_BASE(PyObject *self, PyObject *args, PyObject *kwds) { assert(self != nullptr); PyErr_Format(PyExc_TypeError, "cannot init constant class %s", Py_TYPE(self)->tp_name); return -1; } -EXPORT_THIS Dtool_PyTypedObject Dtool_DTOOL_SUPER_BASE = { - { - PyVarObject_HEAD_INIT(nullptr, 0) - "dtoolconfig.DTOOL_SUPER_BASE", - sizeof(Dtool_PyInstDef), - 0, // tp_itemsize - &Dtool_FreeInstance_DTOOL_SUPER_BASE, - nullptr, // tp_print - nullptr, // tp_getattr - nullptr, // tp_setattr +static void Dtool_FreeInstance_DTOOL_SUPER_BASE(PyObject *self) { + Py_TYPE(self)->tp_free(self); +} + +/** + * Returns a pointer to the DTOOL_SUPER_BASE class that is the base class of + * all Panda types. This pointer is shared by all modules. + */ +Dtool_PyTypedObject *Dtool_GetSuperBase() { + Dtool_TypeMap *type_map = Dtool_GetGlobalTypeMap(); + auto it = type_map->find("DTOOL_SUPER_BASE"); + if (it != type_map->end()) { + return it->second; + } + + static PyMethodDef methods[] = { + { "DtoolGetSuperBase", (PyCFunction)&GetSuperBase, METH_NOARGS, "Will Return SUPERbase Class"}, + { nullptr, nullptr, 0, nullptr } + }; + + static Dtool_PyTypedObject super_base_type = { + { + PyVarObject_HEAD_INIT(nullptr, 0) + "dtoolconfig.DTOOL_SUPER_BASE", + sizeof(Dtool_PyInstDef), + 0, // tp_itemsize + &Dtool_FreeInstance_DTOOL_SUPER_BASE, + nullptr, // tp_print + nullptr, // tp_getattr + nullptr, // tp_setattr #if PY_MAJOR_VERSION >= 3 - nullptr, // tp_compare + nullptr, // tp_compare #else - &DtoolInstance_ComparePointers, + &DtoolInstance_ComparePointers, #endif - nullptr, // tp_repr - nullptr, // tp_as_number - nullptr, // tp_as_sequence - nullptr, // tp_as_mapping - &DtoolInstance_HashPointer, - nullptr, // tp_call - nullptr, // tp_str - PyObject_GenericGetAttr, - PyObject_GenericSetAttr, - nullptr, // tp_as_buffer - (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_CHECKTYPES), - nullptr, // tp_doc - nullptr, // tp_traverse - nullptr, // tp_clear + nullptr, // tp_repr + nullptr, // tp_as_number + nullptr, // tp_as_sequence + nullptr, // tp_as_mapping + &DtoolInstance_HashPointer, + nullptr, // tp_call + nullptr, // tp_str + PyObject_GenericGetAttr, + PyObject_GenericSetAttr, + nullptr, // tp_as_buffer + (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_CHECKTYPES), + nullptr, // tp_doc + nullptr, // tp_traverse + nullptr, // tp_clear #if PY_MAJOR_VERSION >= 3 - &DtoolInstance_RichComparePointers, + &DtoolInstance_RichComparePointers, #else - nullptr, // tp_richcompare + nullptr, // tp_richcompare #endif - 0, // tp_weaklistoffset - nullptr, // tp_iter - nullptr, // tp_iternext - Dtool_Methods_DTOOL_SUPER_BASE, - standard_type_members, - nullptr, // tp_getset - nullptr, // tp_base - nullptr, // tp_dict - nullptr, // tp_descr_get - nullptr, // tp_descr_set - 0, // tp_dictoffset - Dtool_Init_DTOOL_SUPER_BASE, - PyType_GenericAlloc, - Dtool_new_DTOOL_SUPER_BASE, - PyObject_Del, - nullptr, // tp_is_gc - nullptr, // tp_bases - nullptr, // tp_mro - nullptr, // tp_cache - nullptr, // tp_subclasses - nullptr, // tp_weaklist - nullptr, // tp_del - }, - TypeHandle::none(), - Dtool_PyModuleClassInit_DTOOL_SUPER_BASE, - Dtool_UpcastInterface_DTOOL_SUPER_BASE, - Dtool_DowncastInterface_DTOOL_SUPER_BASE, - nullptr, - nullptr, -}; + 0, // tp_weaklistoffset + nullptr, // tp_iter + nullptr, // tp_iternext + methods, + standard_type_members, + nullptr, // tp_getset + nullptr, // tp_base + nullptr, // tp_dict + nullptr, // tp_descr_get + nullptr, // tp_descr_set + 0, // tp_dictoffset + Dtool_Init_DTOOL_SUPER_BASE, + PyType_GenericAlloc, + nullptr, // tp_new + PyObject_Del, + nullptr, // tp_is_gc + nullptr, // tp_bases + nullptr, // tp_mro + nullptr, // tp_cache + nullptr, // tp_subclasses + nullptr, // tp_weaklist + nullptr, // tp_del + }, + TypeHandle::none(), + Dtool_PyModuleClassInit_DTOOL_SUPER_BASE, + Dtool_UpcastInterface_DTOOL_SUPER_BASE, + Dtool_DowncastInterface_DTOOL_SUPER_BASE, + nullptr, + nullptr, + }; + + super_base_type._PyType.tp_dict = PyDict_New(); + PyDict_SetItemString(super_base_type._PyType.tp_dict, "DtoolClassDict", super_base_type._PyType.tp_dict); + + if (PyType_Ready((PyTypeObject *)&super_base_type) < 0) { + PyErr_SetString(PyExc_TypeError, "PyType_Ready(Dtool_DTOOL_SUPER_BASE)"); + return nullptr; + } + Py_INCREF((PyTypeObject *)&super_base_type); + + PyDict_SetItemString(super_base_type._PyType.tp_dict, "DtoolGetSuperBase", PyCFunction_New(&methods[0], (PyObject *)&super_base_type)); + + (*type_map)["DTOOL_SUPER_BASE"] = &super_base_type; + return &super_base_type; +} #endif // HAVE_PYTHON diff --git a/dtool/src/interrogatedb/p3interrogatedb_composite1.cxx b/dtool/src/interrogatedb/p3interrogatedb_composite1.cxx index d663e9e0e5..4e54cee5a9 100644 --- a/dtool/src/interrogatedb/p3interrogatedb_composite1.cxx +++ b/dtool/src/interrogatedb/p3interrogatedb_composite1.cxx @@ -1,5 +1,4 @@ #include "config_interrogatedb.cxx" -#include "dtool_super_base.cxx" #include "indexRemapper.cxx" #include "interrogateComponent.cxx" #include "interrogateDatabase.cxx" diff --git a/dtool/src/interrogatedb/p3interrogatedb_composite2.cxx b/dtool/src/interrogatedb/p3interrogatedb_composite2.cxx index fda72f2ce8..41453e5f3e 100644 --- a/dtool/src/interrogatedb/p3interrogatedb_composite2.cxx +++ b/dtool/src/interrogatedb/p3interrogatedb_composite2.cxx @@ -4,6 +4,3 @@ #include "interrogate_datafile.cxx" #include "interrogate_interface.cxx" #include "interrogate_request.cxx" -#include "py_panda.cxx" -#include "py_compat.cxx" -#include "py_wrappers.cxx" diff --git a/dtool/src/interrogatedb/py_compat.cxx b/dtool/src/interrogatedb/py_compat.cxx index 0c1383f983..722bc8300b 100644 --- a/dtool/src/interrogatedb/py_compat.cxx +++ b/dtool/src/interrogatedb/py_compat.cxx @@ -1,11 +1,4 @@ /** - * 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 py_compat.cxx * @author rdb * @date 2017-12-03 diff --git a/dtool/src/interrogatedb/py_compat.h b/dtool/src/interrogatedb/py_compat.h index f87c73cf3d..fbe49a5287 100644 --- a/dtool/src/interrogatedb/py_compat.h +++ b/dtool/src/interrogatedb/py_compat.h @@ -1,11 +1,4 @@ /** - * 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 py_compat.h * @author rdb * @date 2017-12-02 @@ -106,7 +99,7 @@ typedef int Py_ssize_t; // PyInt_FromSize_t automatically picks the right type. # define PyLongOrInt_AS_LONG PyInt_AsLong -EXPCL_INTERROGATEDB size_t PyLongOrInt_AsSize_t(PyObject *); +size_t PyLongOrInt_AsSize_t(PyObject *); #endif // Which character to use in PyArg_ParseTuple et al for a byte string. diff --git a/dtool/src/interrogatedb/py_panda.I b/dtool/src/interrogatedb/py_panda.I index 69f8961463..12f20f1f1e 100644 --- a/dtool/src/interrogatedb/py_panda.I +++ b/dtool/src/interrogatedb/py_panda.I @@ -1,11 +1,4 @@ /** - * 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 py_panda.I * @author rdb * @date 2016-06-06 @@ -26,7 +19,7 @@ template INLINE bool DtoolInstance_GetPointer(PyObject *self, T *&into) { if (DtoolInstance_Check(self)) { - Dtool_PyTypedObject *target_class = Dtool_RuntimeTypeDtoolType(get_type_handle(T).get_index()); + Dtool_PyTypedObject *target_class = (Dtool_PyTypedObject *)get_type_handle(T).get_python_type(); if (target_class != nullptr) { if (_IS_FINAL(T)) { if (DtoolInstance_TYPE(self) == target_class) { @@ -116,32 +109,44 @@ INLINE long Dtool_EnumValue_AsLong(PyObject *value) { */ template INLINE PyObject * DTool_CreatePyInstance(const T *obj, bool memory_rules) { - Dtool_PyTypedObject *known_class = Dtool_RuntimeTypeDtoolType(get_type_handle(T).get_index()); + Dtool_PyTypedObject *known_class = (Dtool_PyTypedObject *)get_type_handle(T).get_python_type(); nassertr(known_class != nullptr, nullptr); return DTool_CreatePyInstance((void*) obj, *known_class, memory_rules, true); } template INLINE PyObject * DTool_CreatePyInstance(T *obj, bool memory_rules) { - Dtool_PyTypedObject *known_class = Dtool_RuntimeTypeDtoolType(get_type_handle(T).get_index()); + Dtool_PyTypedObject *known_class = (Dtool_PyTypedObject *)get_type_handle(T).get_python_type(); nassertr(known_class != nullptr, nullptr); return DTool_CreatePyInstance((void*) obj, *known_class, memory_rules, false); } template INLINE PyObject * DTool_CreatePyInstanceTyped(const T *obj, bool memory_rules) { - Dtool_PyTypedObject *known_class = Dtool_RuntimeTypeDtoolType(get_type_handle(T).get_index()); + Dtool_PyTypedObject *known_class = (Dtool_PyTypedObject *)get_type_handle(T).get_python_type(); nassertr(known_class != nullptr, nullptr); return DTool_CreatePyInstanceTyped((void*) obj, *known_class, memory_rules, true, obj->get_type().get_index()); } template INLINE PyObject * DTool_CreatePyInstanceTyped(T *obj, bool memory_rules) { - Dtool_PyTypedObject *known_class = Dtool_RuntimeTypeDtoolType(get_type_handle(T).get_index()); + Dtool_PyTypedObject *known_class = (Dtool_PyTypedObject *)get_type_handle(T).get_python_type(); nassertr(known_class != nullptr, nullptr); return DTool_CreatePyInstanceTyped((void*) obj, *known_class, memory_rules, false, obj->get_type().get_index()); } +/** + * Finishes initializing the Dtool_PyInstDef. + */ +INLINE int +DTool_PyInit_Finalize(PyObject *self, void *local_this, Dtool_PyTypedObject *type, bool memory_rules, bool is_const) { + ((Dtool_PyInstDef *)self)->_My_Type = type; + ((Dtool_PyInstDef *)self)->_ptr_to_object = local_this; + ((Dtool_PyInstDef *)self)->_memory_rules = memory_rules; + ((Dtool_PyInstDef *)self)->_is_const = is_const; + return 0; +} + /** * Checks that the tuple is empty. */ diff --git a/dtool/src/interrogatedb/py_panda.cxx b/dtool/src/interrogatedb/py_panda.cxx index 0d99d85ea5..234a41b873 100644 --- a/dtool/src/interrogatedb/py_panda.cxx +++ b/dtool/src/interrogatedb/py_panda.cxx @@ -1,11 +1,4 @@ /** - * 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 py_panda.cxx * @author drose * @date 2005-07-04 @@ -29,10 +22,6 @@ PyMemberDef standard_type_members[] = { {nullptr} /* Sentinel */ }; -static RuntimeTypeMap runtime_type_map; -static RuntimeTypeSet runtime_type_set; -static NamedTypeMap named_type_map; - /** */ @@ -431,7 +420,7 @@ PyObject *DTool_CreatePyInstanceTyped(void *local_this_in, Dtool_PyTypedObject & // IF the class is possibly a run time typed object if (type_index > 0) { // get best fit class... - Dtool_PyTypedObject *target_class = Dtool_RuntimeTypeDtoolType(type_index); + Dtool_PyTypedObject *target_class = (Dtool_PyTypedObject *)TypeHandle::from_index(type_index).get_python_type(); if (target_class != nullptr) { // cast to the type... void *new_local_this = target_class->_Dtool_DowncastInterface(local_this_in, &known_class_type); @@ -484,132 +473,26 @@ PyObject *DTool_CreatePyInstance(void *local_this, Dtool_PyTypedObject &in_class return (PyObject *)self; } -// Th Finalizer for simple instances.. -int DTool_PyInit_Finalize(PyObject *self, void *local_this, Dtool_PyTypedObject *type, bool memory_rules, bool is_const) { - // lets put some code in here that checks to see the memory is properly - // configured.. prior to my call .. - - ((Dtool_PyInstDef *)self)->_My_Type = type; - ((Dtool_PyInstDef *)self)->_ptr_to_object = local_this; - ((Dtool_PyInstDef *)self)->_memory_rules = memory_rules; - ((Dtool_PyInstDef *)self)->_is_const = is_const; - return 0; -} - -// A helper function to glue method definition together .. that can not be -// done at code generation time because of multiple generation passes in -// interrogate.. -void Dtool_Accum_MethDefs(PyMethodDef in[], MethodDefmap &themap) { - for (; in->ml_name != nullptr; in++) { - if (themap.find(in->ml_name) == themap.end()) { - themap[in->ml_name] = in; - } - } -} - -// ** HACK ** alert.. Need to keep a runtime type dictionary ... that is -// forward declared of typed object. We rely on the fact that typed objects -// are uniquly defined by an integer. -void -RegisterNamedClass(const string &name, Dtool_PyTypedObject &otype) { - std::pair result = - named_type_map.insert(NamedTypeMap::value_type(name, &otype)); - - if (!result.second) { - // There was already a class with this name in the dictionary. - interrogatedb_cat.warning() - << "Double definition for class " << name << "\n"; - } -} - -void -RegisterRuntimeTypedClass(Dtool_PyTypedObject &otype) { - int type_index = otype._type.get_index(); - - if (type_index == 0) { - interrogatedb_cat.warning() - << "Class " << otype._PyType.tp_name - << " has a zero TypeHandle value; check that init_type() is called.\n"; - - } else if (type_index < 0 || type_index >= TypeRegistry::ptr()->get_num_typehandles()) { - interrogatedb_cat.warning() - << "Class " << otype._PyType.tp_name - << " has an illegal TypeHandle value; check that init_type() is called.\n"; - +/** + * Returns a borrowed reference to the global type dictionary. + */ +Dtool_TypeMap *Dtool_GetGlobalTypeMap() { + PyObject *capsule = PySys_GetObject((char *)"_interrogate_types"); + if (capsule != nullptr) { + return (Dtool_TypeMap *)PyCapsule_GetPointer(capsule, nullptr); } else { - std::pair result = - runtime_type_map.insert(RuntimeTypeMap::value_type(type_index, &otype)); - if (!result.second) { - // There was already an entry in the dictionary for type_index. - Dtool_PyTypedObject *other_type = (*result.first).second; - interrogatedb_cat.warning() - << "Classes " << otype._PyType.tp_name - << " and " << other_type->_PyType.tp_name - << " share the same TypeHandle value (" << type_index - << "); check class definitions.\n"; - - } else { - runtime_type_set.insert(type_index); - } + Dtool_TypeMap *type_map = new Dtool_TypeMap; + capsule = PyCapsule_New((void *)type_map, nullptr, nullptr); + PySys_SetObject((char *)"_interrogate_types", capsule); + Py_DECREF(capsule); + return type_map; } } -Dtool_PyTypedObject * -LookupNamedClass(const string &name) { - NamedTypeMap::const_iterator it; - it = named_type_map.find(name); - - if (it == named_type_map.end()) { - // Find a type named like this in the type registry. - TypeHandle handle = TypeRegistry::ptr()->find_type(name); - if (handle.get_index() > 0) { - RuntimeTypeMap::const_iterator it2; - it2 = runtime_type_map.find(handle.get_index()); - if (it2 != runtime_type_map.end()) { - return it2->second; - } - } - - interrogatedb_cat.error() - << "Attempt to use type " << name << " which has not yet been defined!\n"; - return nullptr; - } else { - return it->second; - } -} - -Dtool_PyTypedObject * -LookupRuntimeTypedClass(TypeHandle handle) { - RuntimeTypeMap::const_iterator it; - it = runtime_type_map.find(handle.get_index()); - - if (it == runtime_type_map.end()) { - interrogatedb_cat.error() - << "Attempt to use type " << handle << " which has not yet been defined!\n"; - return nullptr; - } else { - return it->second; - } -} - -Dtool_PyTypedObject *Dtool_RuntimeTypeDtoolType(int type) { - RuntimeTypeMap::iterator di = runtime_type_map.find(type); - if (di != runtime_type_map.end()) { - return di->second; - } else { - int type2 = get_best_parent_from_Set(type, runtime_type_set); - di = runtime_type_map.find(type2); - if (di != runtime_type_map.end()) { - return di->second; - } - } - return nullptr; -} - #if PY_MAJOR_VERSION >= 3 -PyObject *Dtool_PyModuleInitHelper(LibraryDef *defs[], PyModuleDef *module_def) { +PyObject *Dtool_PyModuleInitHelper(const LibraryDef *defs[], PyModuleDef *module_def) { #else -PyObject *Dtool_PyModuleInitHelper(LibraryDef *defs[], const char *modulename) { +PyObject *Dtool_PyModuleInitHelper(const LibraryDef *defs[], const char *modulename) { #endif // Check the version so we can print a helpful error if it doesn't match. string version = Py_GetVersion(); @@ -627,55 +510,46 @@ PyObject *Dtool_PyModuleInitHelper(LibraryDef *defs[], const char *modulename) { return nullptr; } - // Initialize the types we define in py_panda. - static bool dtool_inited = false; - if (!dtool_inited) { - dtool_inited = true; - - if (PyType_Ready(&Dtool_SequenceWrapper_Type) < 0) { - return Dtool_Raise_TypeError("PyType_Ready(Dtool_SequenceWrapper)"); - } - - if (PyType_Ready(&Dtool_MutableSequenceWrapper_Type) < 0) { - return Dtool_Raise_TypeError("PyType_Ready(Dtool_MutableSequenceWrapper)"); - } - - if (PyType_Ready(&Dtool_MappingWrapper_Type) < 0) { - return Dtool_Raise_TypeError("PyType_Ready(Dtool_MappingWrapper)"); - } - - if (PyType_Ready(&Dtool_MutableMappingWrapper_Type) < 0) { - return Dtool_Raise_TypeError("PyType_Ready(Dtool_MutableMappingWrapper)"); - } - - if (PyType_Ready(&Dtool_MappingWrapper_Keys_Type) < 0) { - return Dtool_Raise_TypeError("PyType_Ready(Dtool_MappingWrapper_Keys)"); - } - - if (PyType_Ready(&Dtool_MappingWrapper_Values_Type) < 0) { - return Dtool_Raise_TypeError("PyType_Ready(Dtool_MappingWrapper_Values)"); - } - - if (PyType_Ready(&Dtool_MappingWrapper_Items_Type) < 0) { - return Dtool_Raise_TypeError("PyType_Ready(Dtool_MappingWrapper_Items)"); - } - - if (PyType_Ready(&Dtool_GeneratorWrapper_Type) < 0) { - return Dtool_Raise_TypeError("PyType_Ready(Dtool_GeneratorWrapper)"); - } - - if (PyType_Ready(&Dtool_StaticProperty_Type) < 0) { - return Dtool_Raise_TypeError("PyType_Ready(Dtool_StaticProperty_Type)"); - } - - // Initialize the base class of everything. - Dtool_PyModuleClassInit_DTOOL_SUPER_BASE(nullptr); - } + Dtool_TypeMap *type_map = Dtool_GetGlobalTypeMap(); // the module level function inits.... MethodDefmap functions; - for (int xx = 0; defs[xx] != nullptr; xx++) { - Dtool_Accum_MethDefs(defs[xx]->_methods, functions); + for (size_t i = 0; defs[i] != nullptr; i++) { + const LibraryDef &def = *defs[i]; + + // Accumulate method definitions. + for (PyMethodDef *meth = def._methods; meth->ml_name != nullptr; meth++) { + if (functions.find(meth->ml_name) == functions.end()) { + functions[meth->ml_name] = meth; + } + } + + // Define exported types. + const Dtool_TypeDef *types = def._types; + if (types != nullptr) { + while (types->name != nullptr) { + (*type_map)[std::string(types->name)] = types->type; + ++types; + } + } + } + + // Resolve external types, in a second pass. + for (size_t i = 0; defs[i] != nullptr; i++) { + const LibraryDef &def = *defs[i]; + + Dtool_TypeDef *types = def._external_types; + if (types != nullptr) { + while (types->name != nullptr) { + auto it = type_map->find(std::string(types->name)); + if (it != type_map->end()) { + types->type = it->second; + } else { + return PyErr_Format(PyExc_NameError, "name '%s' is not defined", types->name); + } + ++types; + } + } } PyMethodDef *newdef = new PyMethodDef[functions.size() + 1]; @@ -801,7 +675,7 @@ PyObject *Dtool_BorrowThisReference(PyObject *self, PyObject *args) { // We do expose a dictionay for dtool classes .. this should be removed at // some point.. -EXPCL_INTERROGATEDB PyObject *Dtool_AddToDictionary(PyObject *self1, PyObject *args) { +PyObject *Dtool_AddToDictionary(PyObject *self1, PyObject *args) { PyObject *self; PyObject *subject; PyObject *key; diff --git a/dtool/src/interrogatedb/py_panda.h b/dtool/src/interrogatedb/py_panda.h index 7916147e4d..34693e8b90 100644 --- a/dtool/src/interrogatedb/py_panda.h +++ b/dtool/src/interrogatedb/py_panda.h @@ -1,11 +1,4 @@ /** - * 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 py_panda.h */ @@ -43,9 +36,6 @@ using namespace std; #endif struct Dtool_PyTypedObject; -typedef std::map RuntimeTypeMap; -typedef std::set RuntimeTypeSet; -typedef std::map NamedTypeMap; // used to stamp dtool instance.. #define PY_PANDA_SIGNATURE 0xbeaf @@ -78,7 +68,7 @@ struct Dtool_PyInstDef { }; // A Offset Dictionary Defining How to read the Above Object.. -extern EXPCL_INTERROGATEDB PyMemberDef standard_type_members[]; +extern PyMemberDef standard_type_members[]; // The Class Definition Structor For a Dtool python type. struct Dtool_PyTypedObject { @@ -190,25 +180,21 @@ static void Dtool_FreeInstance_##CLASS_NAME(PyObject *self) {\ // forward declared of typed object. We rely on the fact that typed objects // are uniquly defined by an integer. -EXPCL_INTERROGATEDB void RegisterNamedClass(const std::string &name, Dtool_PyTypedObject &otype); -EXPCL_INTERROGATEDB void RegisterRuntimeTypedClass(Dtool_PyTypedObject &otype); +typedef std::map Dtool_TypeMap; -EXPCL_INTERROGATEDB Dtool_PyTypedObject *LookupNamedClass(const std::string &name); -EXPCL_INTERROGATEDB Dtool_PyTypedObject *LookupRuntimeTypedClass(TypeHandle handle); - -EXPCL_INTERROGATEDB Dtool_PyTypedObject *Dtool_RuntimeTypeDtoolType(int type); +Dtool_TypeMap *Dtool_GetGlobalTypeMap(); /** */ -EXPCL_INTERROGATEDB void DTOOL_Call_ExtractThisPointerForType(PyObject *self, Dtool_PyTypedObject *classdef, void **answer); +void DTOOL_Call_ExtractThisPointerForType(PyObject *self, Dtool_PyTypedObject *classdef, void **answer); -EXPCL_INTERROGATEDB void *DTOOL_Call_GetPointerThisClass(PyObject *self, Dtool_PyTypedObject *classdef, int param, const std::string &function_name, bool const_ok, bool report_errors); +void *DTOOL_Call_GetPointerThisClass(PyObject *self, Dtool_PyTypedObject *classdef, int param, const std::string &function_name, bool const_ok, bool report_errors); -EXPCL_INTERROGATEDB bool Dtool_Call_ExtractThisPointer(PyObject *self, Dtool_PyTypedObject &classdef, void **answer); +bool Dtool_Call_ExtractThisPointer(PyObject *self, Dtool_PyTypedObject &classdef, void **answer); -EXPCL_INTERROGATEDB bool Dtool_Call_ExtractThisPointer_NonConst(PyObject *self, Dtool_PyTypedObject &classdef, - void **answer, const char *method_name); +bool Dtool_Call_ExtractThisPointer_NonConst(PyObject *self, Dtool_PyTypedObject &classdef, + void **answer, const char *method_name); template INLINE bool DtoolInstance_GetPointer(PyObject *self, T *&into); template INLINE bool DtoolInstance_GetPointer(PyObject *self, T *&into, Dtool_PyTypedObject &classdef); @@ -218,7 +204,7 @@ INLINE int DtoolInstance_ComparePointers(PyObject *v1, PyObject *v2); INLINE PyObject *DtoolInstance_RichComparePointers(PyObject *v1, PyObject *v2, int op); // Functions related to error reporting. -EXPCL_INTERROGATEDB bool _Dtool_CheckErrorOccurred(); +bool _Dtool_CheckErrorOccurred(); #ifdef NDEBUG #define Dtool_CheckErrorOccurred() (UNLIKELY(_PyErr_OCCURRED() != nullptr)) @@ -226,12 +212,12 @@ EXPCL_INTERROGATEDB bool _Dtool_CheckErrorOccurred(); #define Dtool_CheckErrorOccurred() (UNLIKELY(_Dtool_CheckErrorOccurred())) #endif -EXPCL_INTERROGATEDB PyObject *Dtool_Raise_AssertionError(); -EXPCL_INTERROGATEDB PyObject *Dtool_Raise_TypeError(const char *message); -EXPCL_INTERROGATEDB PyObject *Dtool_Raise_ArgTypeError(PyObject *obj, int param, const char *function_name, const char *type_name); -EXPCL_INTERROGATEDB PyObject *Dtool_Raise_AttributeError(PyObject *obj, const char *attribute); +PyObject *Dtool_Raise_AssertionError(); +PyObject *Dtool_Raise_TypeError(const char *message); +PyObject *Dtool_Raise_ArgTypeError(PyObject *obj, int param, const char *function_name, const char *type_name); +PyObject *Dtool_Raise_AttributeError(PyObject *obj, const char *attribute); -EXPCL_INTERROGATEDB PyObject *_Dtool_Raise_BadArgumentsError(); +PyObject *_Dtool_Raise_BadArgumentsError(); #ifdef NDEBUG // Define it to a function that just prints a generic message. #define Dtool_Raise_BadArgumentsError(x) _Dtool_Raise_BadArgumentsError() @@ -243,9 +229,9 @@ EXPCL_INTERROGATEDB PyObject *_Dtool_Raise_BadArgumentsError(); // These functions are similar to Dtool_WrapValue, except that they also // contain code for checking assertions and exceptions when compiling with // NDEBUG mode on. -EXPCL_INTERROGATEDB PyObject *_Dtool_Return_None(); -EXPCL_INTERROGATEDB PyObject *Dtool_Return_Bool(bool value); -EXPCL_INTERROGATEDB PyObject *_Dtool_Return(PyObject *value); +PyObject *_Dtool_Return_None(); +PyObject *Dtool_Return_Bool(bool value); +PyObject *_Dtool_Return(PyObject *value); #ifdef NDEBUG #define Dtool_Return_None() (LIKELY(_PyErr_OCCURRED() == nullptr) ? (Py_INCREF(Py_None), Py_None) : nullptr) @@ -258,19 +244,19 @@ EXPCL_INTERROGATEDB PyObject *_Dtool_Return(PyObject *value); /** * Wrapper around Python 3.4's enum library, which does not have a C API. */ -EXPCL_INTERROGATEDB PyTypeObject *Dtool_EnumType_Create(const char *name, PyObject *names, +PyTypeObject *Dtool_EnumType_Create(const char *name, PyObject *names, const char *module = nullptr); -EXPCL_INTERROGATEDB INLINE long Dtool_EnumValue_AsLong(PyObject *value); +INLINE long Dtool_EnumValue_AsLong(PyObject *value); /** */ -EXPCL_INTERROGATEDB PyObject *DTool_CreatePyInstanceTyped(void *local_this_in, Dtool_PyTypedObject &known_class_type, bool memory_rules, bool is_const, int RunTimeType); +PyObject *DTool_CreatePyInstanceTyped(void *local_this_in, Dtool_PyTypedObject &known_class_type, bool memory_rules, bool is_const, int RunTimeType); // DTool_CreatePyInstance .. wrapper function to finalize the existance of a // general dtool py instance.. -EXPCL_INTERROGATEDB PyObject *DTool_CreatePyInstance(void *local_this, Dtool_PyTypedObject &in_classdef, bool memory_rules, bool is_const); +PyObject *DTool_CreatePyInstance(void *local_this, Dtool_PyTypedObject &in_classdef, bool memory_rules, bool is_const); // These template methods allow use when the Dtool_PyTypedObject is not known. // They require a get_class_type() to be defined for the class. @@ -314,43 +300,49 @@ Define_Dtool_FreeInstanceRef(CLASS_NAME,CNAME)\ Define_Dtool_Class(MODULE_NAME,CLASS_NAME,PUBLIC_NAME) // The finalizer for simple instances. -EXPCL_INTERROGATEDB int DTool_PyInit_Finalize(PyObject *self, void *This, Dtool_PyTypedObject *type, bool memory_rules, bool is_const); +INLINE int DTool_PyInit_Finalize(PyObject *self, void *This, Dtool_PyTypedObject *type, bool memory_rules, bool is_const); // A heler function to glu methed definition together .. that can not be done // at code generation time becouse of multiple generation passes in // interigate.. typedef std::map MethodDefmap; -EXPCL_INTERROGATEDB void Dtool_Accum_MethDefs(PyMethodDef in[], MethodDefmap &themap); - // We need a way to runtime merge compile units into a python "Module" .. this // is done with the fallowing structors and code.. along with the support of // interigate_module + +struct Dtool_TypeDef { + const char *const name; + Dtool_PyTypedObject *type; +}; + struct LibraryDef { - PyMethodDef *_methods; + PyMethodDef *const _methods; + const Dtool_TypeDef *const _types; + Dtool_TypeDef *const _external_types; }; #if PY_MAJOR_VERSION >= 3 -EXPCL_INTERROGATEDB PyObject *Dtool_PyModuleInitHelper(LibraryDef *defs[], PyModuleDef *module_def); +PyObject *Dtool_PyModuleInitHelper(const LibraryDef *defs[], PyModuleDef *module_def); #else -EXPCL_INTERROGATEDB PyObject *Dtool_PyModuleInitHelper(LibraryDef *defs[], const char *modulename); +PyObject *Dtool_PyModuleInitHelper(const LibraryDef *defs[], const char *modulename); #endif // HACK.... Be carefull Dtool_BorrowThisReference This function can be used to // grab the "THIS" pointer from an object and use it Required to support fom // historical inharatence in the for of "is this instance of".. -EXPCL_INTERROGATEDB PyObject *Dtool_BorrowThisReference(PyObject *self, PyObject *args); +PyObject *Dtool_BorrowThisReference(PyObject *self, PyObject *args); #define DTOOL_PyObject_HashPointer DtoolInstance_HashPointer #define DTOOL_PyObject_ComparePointers DtoolInstance_ComparePointers -EXPCL_INTERROGATEDB PyObject * +PyObject * copy_from_make_copy(PyObject *self, PyObject *noargs); -EXPCL_INTERROGATEDB PyObject * +PyObject * copy_from_copy_constructor(PyObject *self, PyObject *noargs); -EXPCL_INTERROGATEDB PyObject * +PyObject * map_deepcopy_to_copy(PyObject *self, PyObject *args); /** @@ -359,13 +351,13 @@ map_deepcopy_to_copy(PyObject *self, PyObject *args); */ ALWAYS_INLINE bool Dtool_CheckNoArgs(PyObject *args); ALWAYS_INLINE bool Dtool_CheckNoArgs(PyObject *args, PyObject *kwds); -EXPCL_INTERROGATEDB bool Dtool_ExtractArg(PyObject **result, PyObject *args, +bool Dtool_ExtractArg(PyObject **result, PyObject *args, PyObject *kwds, const char *keyword); -EXPCL_INTERROGATEDB bool Dtool_ExtractArg(PyObject **result, PyObject *args, +bool Dtool_ExtractArg(PyObject **result, PyObject *args, PyObject *kwds); -EXPCL_INTERROGATEDB bool Dtool_ExtractOptionalArg(PyObject **result, PyObject *args, +bool Dtool_ExtractOptionalArg(PyObject **result, PyObject *args, PyObject *kwds, const char *keyword); -EXPCL_INTERROGATEDB bool Dtool_ExtractOptionalArg(PyObject **result, PyObject *args, +bool Dtool_ExtractOptionalArg(PyObject **result, PyObject *args, PyObject *kwds); /** @@ -401,10 +393,7 @@ ALWAYS_INLINE PyObject *Dtool_WrapValue(Py_buffer *value); template ALWAYS_INLINE PyObject *Dtool_WrapValue(const std::pair &value); -EXPCL_INTERROGATEDB extern struct Dtool_PyTypedObject Dtool_DTOOL_SUPER_BASE; -EXPCL_INTERROGATEDB extern void Dtool_PyModuleClassInit_DTOOL_SUPER_BASE(PyObject *module); - -#define Dtool_Ptr_DTOOL_SUPER_BASE (&Dtool_DTOOL_SUPER_BASE) +Dtool_PyTypedObject *Dtool_GetSuperBase(); #include "py_panda.I" diff --git a/dtool/src/interrogatedb/py_wrappers.cxx b/dtool/src/interrogatedb/py_wrappers.cxx index 71a5a38ffd..0b8a751cad 100644 --- a/dtool/src/interrogatedb/py_wrappers.cxx +++ b/dtool/src/interrogatedb/py_wrappers.cxx @@ -1,11 +1,4 @@ /** - * 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 py_wrappers.cxx * @author rdb * @date 2017-11-26 @@ -494,6 +487,24 @@ static PyObject *Dtool_MappingWrapper_get(PyObject *self, PyObject *args) { } } +/** + * This is returned by mapping.keys(). + */ +static PyObject *Dtool_MappingWrapper_Keys_repr(PyObject *self) { + Dtool_WrapperBase *wrap = (Dtool_WrapperBase *)self; + nassertr(wrap, nullptr); + + PyObject *repr = PyObject_Repr(wrap->_self); + PyObject *result; +#if PY_MAJOR_VERSION >= 3 + result = PyUnicode_FromFormat("<%s.keys() of %s>", wrap->_name, PyUnicode_AsUTF8(repr)); +#else + result = PyString_FromFormat("<%s.keys() of %s>", wrap->_name, PyString_AS_STRING(repr)); +#endif + Py_DECREF(repr); + return result; +} + /** * Implementation of property.keys(...) that returns a view of all the keys. */ @@ -510,14 +521,81 @@ static PyObject *Dtool_MappingWrapper_keys(PyObject *self, PyObject *) { return PyErr_NoMemory(); } - // If the collections.abc module is loaded, register this as a subclass. + static PySequenceMethods seq_methods = { + Dtool_SequenceWrapper_length, + nullptr, // sq_concat + nullptr, // sq_repeat + Dtool_SequenceWrapper_getitem, + nullptr, // sq_slice + nullptr, // sq_ass_item + nullptr, // sq_ass_slice + Dtool_SequenceWrapper_contains, + nullptr, // sq_inplace_concat + nullptr, // sq_inplace_repeat + }; + + static PyTypeObject wrapper_type = { + PyVarObject_HEAD_INIT(nullptr, 0) + "sequence wrapper", + sizeof(Dtool_SequenceWrapper), + 0, // tp_itemsize + Dtool_WrapperBase_dealloc, + nullptr, // tp_print + nullptr, // tp_getattr + nullptr, // tp_setattr + nullptr, // tp_compare + Dtool_MappingWrapper_Keys_repr, + nullptr, // tp_as_number + &seq_methods, + nullptr, // tp_as_mapping + nullptr, // tp_hash + nullptr, // tp_call + nullptr, // tp_str + PyObject_GenericGetAttr, + PyObject_GenericSetAttr, + nullptr, // tp_as_buffer + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES, + nullptr, // tp_doc + nullptr, // tp_traverse + nullptr, // tp_clear + nullptr, // tp_richcompare + 0, // tp_weaklistoffset + PySeqIter_New, + nullptr, // tp_iternext + nullptr, // tp_methods + nullptr, // tp_members + nullptr, // tp_getset + nullptr, // tp_base + nullptr, // tp_dict + nullptr, // tp_descr_get + nullptr, // tp_descr_set + 0, // tp_dictoffset + nullptr, // tp_init + PyType_GenericAlloc, + nullptr, // tp_new + PyObject_Del, + nullptr, // tp_is_gc + nullptr, // tp_bases + nullptr, // tp_mro + nullptr, // tp_cache + nullptr, // tp_subclasses + nullptr, // tp_weaklist + nullptr, // tp_del + }; + static bool registered = false; if (!registered) { registered = true; - _register_collection((PyTypeObject *)&Dtool_MappingWrapper_Keys_Type, "MappingView"); + + if (PyType_Ready(&wrapper_type) < 0) { + return nullptr; + } + + // If the collections.abc module is loaded, register this as a subclass. + _register_collection((PyTypeObject *)&wrapper_type, "MappingView"); } - (void)PyObject_INIT(keys, &Dtool_MappingWrapper_Keys_Type); + (void)PyObject_INIT(keys, &wrapper_type); Py_XINCREF(wrap->_base._self); keys->_base._self = wrap->_base._self; keys->_base._name = wrap->_base._name; @@ -528,6 +606,38 @@ static PyObject *Dtool_MappingWrapper_keys(PyObject *self, PyObject *) { return (PyObject *)keys; } +/** + * This is returned by mapping.values(). + */ +static PyObject *Dtool_MappingWrapper_Values_repr(PyObject *self) { + Dtool_WrapperBase *wrap = (Dtool_WrapperBase *)self; + nassertr(wrap, nullptr); + + PyObject *repr = PyObject_Repr(wrap->_self); + PyObject *result; +#if PY_MAJOR_VERSION >= 3 + result = PyUnicode_FromFormat("<%s.values() of %s>", wrap->_name, PyUnicode_AsUTF8(repr)); +#else + result = PyString_FromFormat("<%s.values() of %s>", wrap->_name, PyString_AS_STRING(repr)); +#endif + Py_DECREF(repr); + return result; +} + +static PyObject *Dtool_MappingWrapper_Values_getitem(PyObject *self, Py_ssize_t index) { + Dtool_MappingWrapper *wrap = (Dtool_MappingWrapper *)self; + nassertr(wrap, nullptr); + nassertr(wrap->_keys._getitem_func, nullptr); + + PyObject *key = wrap->_keys._getitem_func(wrap->_base._self, index); + if (key != nullptr) { + PyObject *value = wrap->_getitem_func(wrap->_base._self, key); + Py_DECREF(key); + return value; + } + return nullptr; +} + /** * Implementation of property.values(...) that returns a view of the values. */ @@ -545,14 +655,81 @@ static PyObject *Dtool_MappingWrapper_values(PyObject *self, PyObject *) { return PyErr_NoMemory(); } - // If the collections.abc module is loaded, register this as a subclass. + static PySequenceMethods seq_methods = { + Dtool_SequenceWrapper_length, + nullptr, // sq_concat + nullptr, // sq_repeat + Dtool_MappingWrapper_Values_getitem, + nullptr, // sq_slice + nullptr, // sq_ass_item + nullptr, // sq_ass_slice + Dtool_MappingWrapper_contains, + nullptr, // sq_inplace_concat + nullptr, // sq_inplace_repeat + }; + + static PyTypeObject wrapper_type = { + PyVarObject_HEAD_INIT(nullptr, 0) + "sequence wrapper", + sizeof(Dtool_MappingWrapper), + 0, // tp_itemsize + Dtool_WrapperBase_dealloc, + nullptr, // tp_print + nullptr, // tp_getattr + nullptr, // tp_setattr + nullptr, // tp_compare + Dtool_MappingWrapper_Values_repr, + nullptr, // tp_as_number + &seq_methods, + nullptr, // tp_as_mapping + nullptr, // tp_hash + nullptr, // tp_call + nullptr, // tp_str + PyObject_GenericGetAttr, + PyObject_GenericSetAttr, + nullptr, // tp_as_buffer + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES, + nullptr, // tp_doc + nullptr, // tp_traverse + nullptr, // tp_clear + nullptr, // tp_richcompare + 0, // tp_weaklistoffset + PySeqIter_New, + nullptr, // tp_iternext + nullptr, // tp_methods + nullptr, // tp_members + nullptr, // tp_getset + nullptr, // tp_base + nullptr, // tp_dict + nullptr, // tp_descr_get + nullptr, // tp_descr_set + 0, // tp_dictoffset + nullptr, // tp_init + PyType_GenericAlloc, + nullptr, // tp_new + PyObject_Del, + nullptr, // tp_is_gc + nullptr, // tp_bases + nullptr, // tp_mro + nullptr, // tp_cache + nullptr, // tp_subclasses + nullptr, // tp_weaklist + nullptr, // tp_del + }; + static bool registered = false; if (!registered) { registered = true; - _register_collection((PyTypeObject *)&Dtool_MappingWrapper_Values_Type, "ValuesView"); + + if (PyType_Ready(&wrapper_type) < 0) { + return nullptr; + } + + // If the collections.abc module is loaded, register this as a subclass. + _register_collection((PyTypeObject *)&wrapper_type, "ValuesView"); } - (void)PyObject_INIT(values, &Dtool_MappingWrapper_Values_Type); + (void)PyObject_INIT(values, &wrapper_type); Py_XINCREF(wrap->_base._self); values->_base._self = wrap->_base._self; values->_base._name = wrap->_base._name; @@ -563,6 +740,45 @@ static PyObject *Dtool_MappingWrapper_values(PyObject *self, PyObject *) { return (PyObject *)values; } +/** + * This is returned by mapping.items(). + */ +static PyObject *Dtool_MappingWrapper_Items_repr(PyObject *self) { + Dtool_WrapperBase *wrap = (Dtool_WrapperBase *)self; + nassertr(wrap, nullptr); + + PyObject *repr = PyObject_Repr(wrap->_self); + PyObject *result; +#if PY_MAJOR_VERSION >= 3 + result = PyUnicode_FromFormat("<%s.items() of %s>", wrap->_name, PyUnicode_AsUTF8(repr)); +#else + result = PyString_FromFormat("<%s.items() of %s>", wrap->_name, PyString_AS_STRING(repr)); +#endif + Py_DECREF(repr); + return result; +} + +static PyObject *Dtool_MappingWrapper_Items_getitem(PyObject *self, Py_ssize_t index) { + Dtool_MappingWrapper *wrap = (Dtool_MappingWrapper *)self; + nassertr(wrap, nullptr); + nassertr(wrap->_keys._getitem_func, nullptr); + + PyObject *key = wrap->_keys._getitem_func(wrap->_base._self, index); + if (key != nullptr) { + PyObject *value = wrap->_getitem_func(wrap->_base._self, key); + if (value != nullptr) { + // PyTuple_SET_ITEM steals the reference. + PyObject *item = PyTuple_New(2); + PyTuple_SET_ITEM(item, 0, key); + PyTuple_SET_ITEM(item, 1, value); + return item; + } else { + Py_DECREF(key); + } + } + return nullptr; +} + /** * Implementation of property.items(...) that returns an iterable yielding a * `(key, value)` tuple for every item. @@ -581,14 +797,81 @@ static PyObject *Dtool_MappingWrapper_items(PyObject *self, PyObject *) { return PyErr_NoMemory(); } - // If the collections.abc module is loaded, register this as a subclass. + static PySequenceMethods seq_methods = { + Dtool_SequenceWrapper_length, + nullptr, // sq_concat + nullptr, // sq_repeat + Dtool_MappingWrapper_Items_getitem, + nullptr, // sq_slice + nullptr, // sq_ass_item + nullptr, // sq_ass_slice + Dtool_MappingWrapper_contains, + nullptr, // sq_inplace_concat + nullptr, // sq_inplace_repeat + }; + + static PyTypeObject wrapper_type = { + PyVarObject_HEAD_INIT(nullptr, 0) + "sequence wrapper", + sizeof(Dtool_MappingWrapper), + 0, // tp_itemsize + Dtool_WrapperBase_dealloc, + nullptr, // tp_print + nullptr, // tp_getattr + nullptr, // tp_setattr + nullptr, // tp_compare + Dtool_MappingWrapper_Items_repr, + nullptr, // tp_as_number + &seq_methods, + nullptr, // tp_as_mapping + nullptr, // tp_hash + nullptr, // tp_call + nullptr, // tp_str + PyObject_GenericGetAttr, + PyObject_GenericSetAttr, + nullptr, // tp_as_buffer + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES, + nullptr, // tp_doc + nullptr, // tp_traverse + nullptr, // tp_clear + nullptr, // tp_richcompare + 0, // tp_weaklistoffset + PySeqIter_New, + nullptr, // tp_iternext + nullptr, // tp_methods + nullptr, // tp_members + nullptr, // tp_getset + nullptr, // tp_base + nullptr, // tp_dict + nullptr, // tp_descr_get + nullptr, // tp_descr_set + 0, // tp_dictoffset + nullptr, // tp_init + PyType_GenericAlloc, + nullptr, // tp_new + PyObject_Del, + nullptr, // tp_is_gc + nullptr, // tp_bases + nullptr, // tp_mro + nullptr, // tp_cache + nullptr, // tp_subclasses + nullptr, // tp_weaklist + nullptr, // tp_del + }; + static bool registered = false; if (!registered) { registered = true; - _register_collection((PyTypeObject *)&Dtool_MappingWrapper_Items_Type, "MappingView"); + + if (PyType_Ready(&wrapper_type) < 0) { + return nullptr; + } + + // If the collections.abc module is loaded, register this as a subclass. + _register_collection((PyTypeObject *)&wrapper_type, "MappingView"); } - (void)PyObject_INIT(items, &Dtool_MappingWrapper_Items_Type); + (void)PyObject_INIT(items, &wrapper_type); Py_XINCREF(wrap->_base._self); items->_base._self = wrap->_base._self; items->_base._name = wrap->_base._name; @@ -792,566 +1075,6 @@ static PyObject *Dtool_MutableMappingWrapper_update(PyObject *self, PyObject *ar return Py_None; } -/** - * This variant defines only a sequence interface. - */ -static PySequenceMethods Dtool_SequenceWrapper_SequenceMethods = { - Dtool_SequenceWrapper_length, - nullptr, // sq_concat - nullptr, // sq_repeat - Dtool_SequenceWrapper_getitem, - nullptr, // sq_slice - nullptr, // sq_ass_item - nullptr, // sq_ass_slice - Dtool_SequenceWrapper_contains, - nullptr, // sq_inplace_concat - nullptr, // sq_inplace_repeat -}; - -static PyMethodDef Dtool_SequenceWrapper_Methods[] = { - {"index", &Dtool_SequenceWrapper_index, METH_O, nullptr}, - {"count", &Dtool_SequenceWrapper_count, METH_O, nullptr}, - {nullptr, nullptr, 0, nullptr} -}; - -PyTypeObject Dtool_SequenceWrapper_Type = { - PyVarObject_HEAD_INIT(nullptr, 0) - "sequence wrapper", - sizeof(Dtool_SequenceWrapper), - 0, // tp_itemsize - Dtool_WrapperBase_dealloc, - nullptr, // tp_print - nullptr, // tp_getattr - nullptr, // tp_setattr - nullptr, // tp_compare - Dtool_SequenceWrapper_repr, - nullptr, // tp_as_number - &Dtool_SequenceWrapper_SequenceMethods, - nullptr, // tp_as_mapping - nullptr, // tp_hash - nullptr, // tp_call - nullptr, // tp_str - PyObject_GenericGetAttr, - PyObject_GenericSetAttr, - nullptr, // tp_as_buffer - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES, - nullptr, // tp_doc - nullptr, // tp_traverse - nullptr, // tp_clear - nullptr, // tp_richcompare - 0, // tp_weaklistoffset - PySeqIter_New, - nullptr, // tp_iternext - Dtool_SequenceWrapper_Methods, - nullptr, // tp_members - nullptr, // tp_getset - nullptr, // tp_base - nullptr, // tp_dict - nullptr, // tp_descr_get - nullptr, // tp_descr_set - 0, // tp_dictoffset - nullptr, // tp_init - PyType_GenericAlloc, - nullptr, // tp_new - PyObject_Del, - nullptr, // tp_is_gc - nullptr, // tp_bases - nullptr, // tp_mro - nullptr, // tp_cache - nullptr, // tp_subclasses - nullptr, // tp_weaklist - nullptr, // tp_del -}; - -/** - * This is a variant on SequenceWrapper that also has an insert() method. - */ -static PySequenceMethods Dtool_MutableSequenceWrapper_SequenceMethods = { - Dtool_SequenceWrapper_length, - nullptr, // sq_concat - nullptr, // sq_repeat - Dtool_SequenceWrapper_getitem, - nullptr, // sq_slice - Dtool_MutableSequenceWrapper_setitem, - nullptr, // sq_ass_slice - Dtool_SequenceWrapper_contains, - Dtool_MutableSequenceWrapper_extend, - nullptr, // sq_inplace_repeat -}; - -static PyMethodDef Dtool_MutableSequenceWrapper_Methods[] = { - {"index", &Dtool_SequenceWrapper_index, METH_O, nullptr}, - {"count", &Dtool_SequenceWrapper_count, METH_O, nullptr}, - {"clear", &Dtool_MutableSequenceWrapper_clear, METH_NOARGS, nullptr}, - {"pop", &Dtool_MutableSequenceWrapper_pop, METH_VARARGS, nullptr}, - {"remove", &Dtool_MutableSequenceWrapper_remove, METH_O, nullptr}, - {"append", &Dtool_MutableSequenceWrapper_append, METH_O, nullptr}, - {"insert", &Dtool_MutableSequenceWrapper_insert, METH_VARARGS, nullptr}, - {"extend", &Dtool_MutableSequenceWrapper_extend, METH_O, nullptr}, - {nullptr, nullptr, 0, nullptr} -}; - -PyTypeObject Dtool_MutableSequenceWrapper_Type = { - PyVarObject_HEAD_INIT(nullptr, 0) - "sequence wrapper", - sizeof(Dtool_MutableSequenceWrapper), - 0, // tp_itemsize - Dtool_WrapperBase_dealloc, - nullptr, // tp_print - nullptr, // tp_getattr - nullptr, // tp_setattr - nullptr, // tp_compare - Dtool_SequenceWrapper_repr, - nullptr, // tp_as_number - &Dtool_MutableSequenceWrapper_SequenceMethods, - nullptr, // tp_as_mapping - nullptr, // tp_hash - nullptr, // tp_call - nullptr, // tp_str - PyObject_GenericGetAttr, - PyObject_GenericSetAttr, - nullptr, // tp_as_buffer - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES, - nullptr, // tp_doc - nullptr, // tp_traverse - nullptr, // tp_clear - nullptr, // tp_richcompare - 0, // tp_weaklistoffset - PySeqIter_New, - nullptr, // tp_iternext - Dtool_MutableSequenceWrapper_Methods, - nullptr, // tp_members - nullptr, // tp_getset - nullptr, // tp_base - nullptr, // tp_dict - nullptr, // tp_descr_get - nullptr, // tp_descr_set - 0, // tp_dictoffset - nullptr, // tp_init - PyType_GenericAlloc, - nullptr, // tp_new - PyObject_Del, - nullptr, // tp_is_gc - nullptr, // tp_bases - nullptr, // tp_mro - nullptr, // tp_cache - nullptr, // tp_subclasses - nullptr, // tp_weaklist - nullptr, // tp_del -}; - -/** - * This variant defines only a mapping interface. - */ -static PySequenceMethods Dtool_MappingWrapper_SequenceMethods = { - Dtool_SequenceWrapper_length, - nullptr, // sq_concat - nullptr, // sq_repeat - nullptr, // sq_item - nullptr, // sq_slice - nullptr, // sq_ass_item - nullptr, // sq_ass_slice - Dtool_MappingWrapper_contains, - nullptr, // sq_inplace_concat - nullptr, // sq_inplace_repeat -}; - -static PyMappingMethods Dtool_MappingWrapper_MappingMethods = { - Dtool_SequenceWrapper_length, - Dtool_MappingWrapper_getitem, - nullptr, // mp_ass_subscript -}; - -static PyMethodDef Dtool_MappingWrapper_Methods[] = { - {"get", &Dtool_MappingWrapper_get, METH_VARARGS, nullptr}, - {"keys", &Dtool_MappingWrapper_keys, METH_NOARGS, nullptr}, - {"values", &Dtool_MappingWrapper_values, METH_NOARGS, nullptr}, - {"items", &Dtool_MappingWrapper_items, METH_NOARGS, nullptr}, - {nullptr, nullptr, 0, nullptr} -}; - -PyTypeObject Dtool_MappingWrapper_Type = { - PyVarObject_HEAD_INIT(nullptr, 0) - "mapping wrapper", - sizeof(Dtool_MappingWrapper), - 0, // tp_itemsize - Dtool_WrapperBase_dealloc, - nullptr, // tp_print - nullptr, // tp_getattr - nullptr, // tp_setattr - nullptr, // tp_compare - Dtool_WrapperBase_repr, - nullptr, // tp_as_number - &Dtool_MappingWrapper_SequenceMethods, - &Dtool_MappingWrapper_MappingMethods, - nullptr, // tp_hash - nullptr, // tp_call - nullptr, // tp_str - PyObject_GenericGetAttr, - PyObject_GenericSetAttr, - nullptr, // tp_as_buffer - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES, - nullptr, // tp_doc - nullptr, // tp_traverse - nullptr, // tp_clear - nullptr, // tp_richcompare - 0, // tp_weaklistoffset - Dtool_MappingWrapper_iter, - nullptr, // tp_iternext - Dtool_MappingWrapper_Methods, - nullptr, // tp_members - nullptr, // tp_getset - nullptr, // tp_base - nullptr, // tp_dict - nullptr, // tp_descr_get - nullptr, // tp_descr_set - 0, // tp_dictoffset - nullptr, // tp_init - PyType_GenericAlloc, - nullptr, // tp_new - PyObject_Del, - nullptr, // tp_is_gc - nullptr, // tp_bases - nullptr, // tp_mro - nullptr, // tp_cache - nullptr, // tp_subclasses - nullptr, // tp_weaklist - nullptr, // tp_del -}; - -/** - * This variant defines only a mutable mapping interface. - */ -static PyMappingMethods Dtool_MutableMappingWrapper_MappingMethods = { - Dtool_SequenceWrapper_length, - Dtool_MappingWrapper_getitem, - Dtool_MutableMappingWrapper_setitem, -}; - -static PyMethodDef Dtool_MutableMappingWrapper_Methods[] = { - {"get", &Dtool_MappingWrapper_get, METH_VARARGS, nullptr}, - {"pop", &Dtool_MutableMappingWrapper_pop, METH_VARARGS, nullptr}, - {"popitem", &Dtool_MutableMappingWrapper_popitem, METH_NOARGS, nullptr}, - {"clear", &Dtool_MutableMappingWrapper_clear, METH_VARARGS, nullptr}, - {"setdefault", &Dtool_MutableMappingWrapper_setdefault, METH_VARARGS, nullptr}, - {"update", (PyCFunction) &Dtool_MutableMappingWrapper_update, METH_VARARGS | METH_KEYWORDS, nullptr}, - {"keys", &Dtool_MappingWrapper_keys, METH_NOARGS, nullptr}, - {"values", &Dtool_MappingWrapper_values, METH_NOARGS, nullptr}, - {"items", &Dtool_MappingWrapper_items, METH_NOARGS, nullptr}, - {nullptr, nullptr, 0, nullptr} -}; - -PyTypeObject Dtool_MutableMappingWrapper_Type = { - PyVarObject_HEAD_INIT(nullptr, 0) - "mapping wrapper", - sizeof(Dtool_MappingWrapper), - 0, // tp_itemsize - Dtool_WrapperBase_dealloc, - nullptr, // tp_print - nullptr, // tp_getattr - nullptr, // tp_setattr - nullptr, // tp_compare - Dtool_WrapperBase_repr, - nullptr, // tp_as_number - &Dtool_MappingWrapper_SequenceMethods, - &Dtool_MutableMappingWrapper_MappingMethods, - nullptr, // tp_hash - nullptr, // tp_call - nullptr, // tp_str - PyObject_GenericGetAttr, - PyObject_GenericSetAttr, - nullptr, // tp_as_buffer - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES, - nullptr, // tp_doc - nullptr, // tp_traverse - nullptr, // tp_clear - nullptr, // tp_richcompare - 0, // tp_weaklistoffset - Dtool_MappingWrapper_iter, - nullptr, // tp_iternext - Dtool_MutableMappingWrapper_Methods, - nullptr, // tp_members - nullptr, // tp_getset - nullptr, // tp_base - nullptr, // tp_dict - nullptr, // tp_descr_get - nullptr, // tp_descr_set - 0, // tp_dictoffset - nullptr, // tp_init - PyType_GenericAlloc, - nullptr, // tp_new - PyObject_Del, - nullptr, // tp_is_gc - nullptr, // tp_bases - nullptr, // tp_mro - nullptr, // tp_cache - nullptr, // tp_subclasses - nullptr, // tp_weaklist - nullptr, // tp_del -}; - -/** - * This is returned by mapping.items(). - */ -static PyObject *Dtool_MappingWrapper_Items_repr(PyObject *self) { - Dtool_WrapperBase *wrap = (Dtool_WrapperBase *)self; - nassertr(wrap, nullptr); - - PyObject *repr = PyObject_Repr(wrap->_self); - PyObject *result; -#if PY_MAJOR_VERSION >= 3 - result = PyUnicode_FromFormat("<%s.items() of %s>", wrap->_name, PyUnicode_AsUTF8(repr)); -#else - result = PyString_FromFormat("<%s.items() of %s>", wrap->_name, PyString_AS_STRING(repr)); -#endif - Py_DECREF(repr); - return result; -} - -static PyObject *Dtool_MappingWrapper_Items_getitem(PyObject *self, Py_ssize_t index) { - Dtool_MappingWrapper *wrap = (Dtool_MappingWrapper *)self; - nassertr(wrap, nullptr); - nassertr(wrap->_keys._getitem_func, nullptr); - - PyObject *key = wrap->_keys._getitem_func(wrap->_base._self, index); - if (key != nullptr) { - PyObject *value = wrap->_getitem_func(wrap->_base._self, key); - if (value != nullptr) { - // PyTuple_SET_ITEM steals the reference. - PyObject *item = PyTuple_New(2); - PyTuple_SET_ITEM(item, 0, key); - PyTuple_SET_ITEM(item, 1, value); - return item; - } else { - Py_DECREF(key); - } - } - return nullptr; -} - -static PySequenceMethods Dtool_MappingWrapper_Items_SequenceMethods = { - Dtool_SequenceWrapper_length, - nullptr, // sq_concat - nullptr, // sq_repeat - Dtool_MappingWrapper_Items_getitem, - nullptr, // sq_slice - nullptr, // sq_ass_item - nullptr, // sq_ass_slice - Dtool_MappingWrapper_contains, - nullptr, // sq_inplace_concat - nullptr, // sq_inplace_repeat -}; - -PyTypeObject Dtool_MappingWrapper_Items_Type = { - PyVarObject_HEAD_INIT(nullptr, 0) - "sequence wrapper", - sizeof(Dtool_MappingWrapper), - 0, // tp_itemsize - Dtool_WrapperBase_dealloc, - nullptr, // tp_print - nullptr, // tp_getattr - nullptr, // tp_setattr - nullptr, // tp_compare - Dtool_MappingWrapper_Items_repr, - nullptr, // tp_as_number - &Dtool_MappingWrapper_Items_SequenceMethods, - nullptr, // tp_as_mapping - nullptr, // tp_hash - nullptr, // tp_call - nullptr, // tp_str - PyObject_GenericGetAttr, - PyObject_GenericSetAttr, - nullptr, // tp_as_buffer - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES, - nullptr, // tp_doc - nullptr, // tp_traverse - nullptr, // tp_clear - nullptr, // tp_richcompare - 0, // tp_weaklistoffset - PySeqIter_New, - nullptr, // tp_iternext - nullptr, // tp_methods - nullptr, // tp_members - nullptr, // tp_getset - nullptr, // tp_base - nullptr, // tp_dict - nullptr, // tp_descr_get - nullptr, // tp_descr_set - 0, // tp_dictoffset - nullptr, // tp_init - PyType_GenericAlloc, - nullptr, // tp_new - PyObject_Del, - nullptr, // tp_is_gc - nullptr, // tp_bases - nullptr, // tp_mro - nullptr, // tp_cache - nullptr, // tp_subclasses - nullptr, // tp_weaklist - nullptr, // tp_del -}; - -/** - * This is returned by mapping.keys(). - */ -static PyObject *Dtool_MappingWrapper_Keys_repr(PyObject *self) { - Dtool_WrapperBase *wrap = (Dtool_WrapperBase *)self; - nassertr(wrap, nullptr); - - PyObject *repr = PyObject_Repr(wrap->_self); - PyObject *result; -#if PY_MAJOR_VERSION >= 3 - result = PyUnicode_FromFormat("<%s.keys() of %s>", wrap->_name, PyUnicode_AsUTF8(repr)); -#else - result = PyString_FromFormat("<%s.keys() of %s>", wrap->_name, PyString_AS_STRING(repr)); -#endif - Py_DECREF(repr); - return result; -} - -PyTypeObject Dtool_MappingWrapper_Keys_Type = { - PyVarObject_HEAD_INIT(nullptr, 0) - "sequence wrapper", - sizeof(Dtool_SequenceWrapper), - 0, // tp_itemsize - Dtool_WrapperBase_dealloc, - nullptr, // tp_print - nullptr, // tp_getattr - nullptr, // tp_setattr - nullptr, // tp_compare - Dtool_MappingWrapper_Keys_repr, - nullptr, // tp_as_number - &Dtool_SequenceWrapper_SequenceMethods, - nullptr, // tp_as_mapping - nullptr, // tp_hash - nullptr, // tp_call - nullptr, // tp_str - PyObject_GenericGetAttr, - PyObject_GenericSetAttr, - nullptr, // tp_as_buffer - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES, - nullptr, // tp_doc - nullptr, // tp_traverse - nullptr, // tp_clear - nullptr, // tp_richcompare - 0, // tp_weaklistoffset - PySeqIter_New, - nullptr, // tp_iternext - nullptr, // tp_methods - nullptr, // tp_members - nullptr, // tp_getset - nullptr, // tp_base - nullptr, // tp_dict - nullptr, // tp_descr_get - nullptr, // tp_descr_set - 0, // tp_dictoffset - nullptr, // tp_init - PyType_GenericAlloc, - nullptr, // tp_new - PyObject_Del, - nullptr, // tp_is_gc - nullptr, // tp_bases - nullptr, // tp_mro - nullptr, // tp_cache - nullptr, // tp_subclasses - nullptr, // tp_weaklist - nullptr, // tp_del -}; - -/** - * This is returned by mapping.values(). - */ -static PyObject *Dtool_MappingWrapper_Values_repr(PyObject *self) { - Dtool_WrapperBase *wrap = (Dtool_WrapperBase *)self; - nassertr(wrap, nullptr); - - PyObject *repr = PyObject_Repr(wrap->_self); - PyObject *result; -#if PY_MAJOR_VERSION >= 3 - result = PyUnicode_FromFormat("<%s.values() of %s>", wrap->_name, PyUnicode_AsUTF8(repr)); -#else - result = PyString_FromFormat("<%s.values() of %s>", wrap->_name, PyString_AS_STRING(repr)); -#endif - Py_DECREF(repr); - return result; -} - -static PyObject *Dtool_MappingWrapper_Values_getitem(PyObject *self, Py_ssize_t index) { - Dtool_MappingWrapper *wrap = (Dtool_MappingWrapper *)self; - nassertr(wrap, nullptr); - nassertr(wrap->_keys._getitem_func, nullptr); - - PyObject *key = wrap->_keys._getitem_func(wrap->_base._self, index); - if (key != nullptr) { - PyObject *value = wrap->_getitem_func(wrap->_base._self, key); - Py_DECREF(key); - return value; - } - return nullptr; -} - -static PySequenceMethods Dtool_MappingWrapper_Values_SequenceMethods = { - Dtool_SequenceWrapper_length, - nullptr, // sq_concat - nullptr, // sq_repeat - Dtool_MappingWrapper_Values_getitem, - nullptr, // sq_slice - nullptr, // sq_ass_item - nullptr, // sq_ass_slice - Dtool_MappingWrapper_contains, - nullptr, // sq_inplace_concat - nullptr, // sq_inplace_repeat -}; - -PyTypeObject Dtool_MappingWrapper_Values_Type = { - PyVarObject_HEAD_INIT(nullptr, 0) - "sequence wrapper", - sizeof(Dtool_MappingWrapper), - 0, // tp_itemsize - Dtool_WrapperBase_dealloc, - nullptr, // tp_print - nullptr, // tp_getattr - nullptr, // tp_setattr - nullptr, // tp_compare - Dtool_MappingWrapper_Values_repr, - nullptr, // tp_as_number - &Dtool_MappingWrapper_Values_SequenceMethods, - nullptr, // tp_as_mapping - nullptr, // tp_hash - nullptr, // tp_call - nullptr, // tp_str - PyObject_GenericGetAttr, - PyObject_GenericSetAttr, - nullptr, // tp_as_buffer - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES, - nullptr, // tp_doc - nullptr, // tp_traverse - nullptr, // tp_clear - nullptr, // tp_richcompare - 0, // tp_weaklistoffset - PySeqIter_New, - nullptr, // tp_iternext - nullptr, // tp_methods - nullptr, // tp_members - nullptr, // tp_getset - nullptr, // tp_base - nullptr, // tp_dict - nullptr, // tp_descr_get - nullptr, // tp_descr_set - 0, // tp_dictoffset - nullptr, // tp_init - PyType_GenericAlloc, - nullptr, // tp_new - PyObject_Del, - nullptr, // tp_is_gc - nullptr, // tp_bases - nullptr, // tp_mro - nullptr, // tp_cache - nullptr, // tp_subclasses - nullptr, // tp_weaklist - nullptr, // tp_del -}; - /** * This variant defines only a generator interface. */ @@ -1362,55 +1085,6 @@ static PyObject *Dtool_GeneratorWrapper_iternext(PyObject *self) { return wrap->_iternext_func(wrap->_base._self); } -PyTypeObject Dtool_GeneratorWrapper_Type = { - PyVarObject_HEAD_INIT(nullptr, 0) - "generator wrapper", - sizeof(Dtool_GeneratorWrapper), - 0, // tp_itemsize - Dtool_WrapperBase_dealloc, - nullptr, // tp_print - nullptr, // tp_getattr - nullptr, // tp_setattr - nullptr, // tp_compare - nullptr, // tp_repr - nullptr, // tp_as_number - nullptr, // tp_as_sequence - nullptr, // tp_as_mapping - nullptr, // tp_hash - nullptr, // tp_call - nullptr, // tp_str - PyObject_GenericGetAttr, - PyObject_GenericSetAttr, - nullptr, // tp_as_buffer - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES, - nullptr, // tp_doc - nullptr, // tp_traverse - nullptr, // tp_clear - nullptr, // tp_richcompare - 0, // tp_weaklistoffset - PyObject_SelfIter, - Dtool_GeneratorWrapper_iternext, - nullptr, // tp_methods - nullptr, // tp_members - nullptr, // tp_getset - nullptr, // tp_base - nullptr, // tp_dict - nullptr, // tp_descr_get - nullptr, // tp_descr_set - 0, // tp_dictoffset - nullptr, // tp_init - PyType_GenericAlloc, - nullptr, // tp_new - PyObject_Del, - nullptr, // tp_is_gc - nullptr, // tp_bases - nullptr, // tp_mro - nullptr, // tp_cache - nullptr, // tp_subclasses - nullptr, // tp_weaklist - nullptr, // tp_del -}; - /** * This is a variant of the Python getset mechanism that permits static * properties. @@ -1479,55 +1153,6 @@ Dtool_StaticProperty_set(PyGetSetDescrObject *descr, PyObject *obj, PyObject *va } } -PyTypeObject Dtool_StaticProperty_Type = { - PyVarObject_HEAD_INIT(&PyType_Type, 0) - "getset_descriptor", - sizeof(PyGetSetDescrObject), - 0, // tp_itemsize - (destructor)Dtool_StaticProperty_dealloc, - nullptr, // tp_print - nullptr, // tp_getattr - nullptr, // tp_setattr - nullptr, // tp_reserved - (reprfunc)Dtool_StaticProperty_repr, - nullptr, // tp_as_number - nullptr, // tp_as_sequence - nullptr, // tp_as_mapping - nullptr, // tp_hash - nullptr, // tp_call - nullptr, // tp_str - PyObject_GenericGetAttr, - nullptr, // tp_setattro - nullptr, // tp_as_buffer - Py_TPFLAGS_DEFAULT, - nullptr, // tp_doc - Dtool_StaticProperty_traverse, - nullptr, // tp_clear - nullptr, // tp_richcompare - 0, // tp_weaklistoffset - nullptr, // tp_iter - nullptr, // tp_iternext - nullptr, // tp_methods - nullptr, // tp_members - nullptr, // tp_getset - nullptr, // tp_base - nullptr, // tp_dict - (descrgetfunc)Dtool_StaticProperty_get, - (descrsetfunc)Dtool_StaticProperty_set, - 0, // tp_dictoffset - nullptr, // tp_init - nullptr, // tp_alloc - nullptr, // tp_new - nullptr, // tp_del - nullptr, // tp_is_gc - nullptr, // tp_bases - nullptr, // tp_mro - nullptr, // tp_cache - nullptr, // tp_subclasses - nullptr, // tp_weaklist - nullptr, // tp_del -}; - /** * This wraps around a property that exposes a sequence interface. */ @@ -1537,14 +1162,87 @@ Dtool_SequenceWrapper *Dtool_NewSequenceWrapper(PyObject *self, const char *name return (Dtool_SequenceWrapper *)PyErr_NoMemory(); } - // If the collections.abc module is loaded, register this as a subclass. + static PySequenceMethods seq_methods = { + Dtool_SequenceWrapper_length, + nullptr, // sq_concat + nullptr, // sq_repeat + Dtool_SequenceWrapper_getitem, + nullptr, // sq_slice + nullptr, // sq_ass_item + nullptr, // sq_ass_slice + Dtool_SequenceWrapper_contains, + nullptr, // sq_inplace_concat + nullptr, // sq_inplace_repeat + }; + + static PyMethodDef methods[] = { + {"index", &Dtool_SequenceWrapper_index, METH_O, nullptr}, + {"count", &Dtool_SequenceWrapper_count, METH_O, nullptr}, + {nullptr, nullptr, 0, nullptr} + }; + + static PyTypeObject wrapper_type = { + PyVarObject_HEAD_INIT(nullptr, 0) + "sequence wrapper", + sizeof(Dtool_SequenceWrapper), + 0, // tp_itemsize + Dtool_WrapperBase_dealloc, + nullptr, // tp_print + nullptr, // tp_getattr + nullptr, // tp_setattr + nullptr, // tp_compare + Dtool_SequenceWrapper_repr, + nullptr, // tp_as_number + &seq_methods, + nullptr, // tp_as_mapping + nullptr, // tp_hash + nullptr, // tp_call + nullptr, // tp_str + PyObject_GenericGetAttr, + PyObject_GenericSetAttr, + nullptr, // tp_as_buffer + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES, + nullptr, // tp_doc + nullptr, // tp_traverse + nullptr, // tp_clear + nullptr, // tp_richcompare + 0, // tp_weaklistoffset + PySeqIter_New, + nullptr, // tp_iternext + methods, + nullptr, // tp_members + nullptr, // tp_getset + nullptr, // tp_base + nullptr, // tp_dict + nullptr, // tp_descr_get + nullptr, // tp_descr_set + 0, // tp_dictoffset + nullptr, // tp_init + PyType_GenericAlloc, + nullptr, // tp_new + PyObject_Del, + nullptr, // tp_is_gc + nullptr, // tp_bases + nullptr, // tp_mro + nullptr, // tp_cache + nullptr, // tp_subclasses + nullptr, // tp_weaklist + nullptr, // tp_del + }; + static bool registered = false; if (!registered) { registered = true; - _register_collection((PyTypeObject *)&Dtool_MutableSequenceWrapper_Type, "Sequence"); + + if (PyType_Ready(&wrapper_type) < 0) { + return nullptr; + } + + // If the collections.abc module is loaded, register this as a subclass. + _register_collection((PyTypeObject *)&wrapper_type, "Sequence"); } - (void)PyObject_INIT(wrap, &Dtool_SequenceWrapper_Type); + (void)PyObject_INIT(wrap, &wrapper_type); Py_XINCREF(self); wrap->_base._self = self; wrap->_base._name = name; @@ -1562,14 +1260,93 @@ Dtool_MutableSequenceWrapper *Dtool_NewMutableSequenceWrapper(PyObject *self, co return (Dtool_MutableSequenceWrapper *)PyErr_NoMemory(); } - // If the collections.abc module is loaded, register this as a subclass. + static PySequenceMethods seq_methods = { + Dtool_SequenceWrapper_length, + nullptr, // sq_concat + nullptr, // sq_repeat + Dtool_SequenceWrapper_getitem, + nullptr, // sq_slice + Dtool_MutableSequenceWrapper_setitem, + nullptr, // sq_ass_slice + Dtool_SequenceWrapper_contains, + Dtool_MutableSequenceWrapper_extend, + nullptr, // sq_inplace_repeat + }; + + static PyMethodDef methods[] = { + {"index", &Dtool_SequenceWrapper_index, METH_O, nullptr}, + {"count", &Dtool_SequenceWrapper_count, METH_O, nullptr}, + {"clear", &Dtool_MutableSequenceWrapper_clear, METH_NOARGS, nullptr}, + {"pop", &Dtool_MutableSequenceWrapper_pop, METH_VARARGS, nullptr}, + {"remove", &Dtool_MutableSequenceWrapper_remove, METH_O, nullptr}, + {"append", &Dtool_MutableSequenceWrapper_append, METH_O, nullptr}, + {"insert", &Dtool_MutableSequenceWrapper_insert, METH_VARARGS, nullptr}, + {"extend", &Dtool_MutableSequenceWrapper_extend, METH_O, nullptr}, + {nullptr, nullptr, 0, nullptr} + }; + + static PyTypeObject wrapper_type = { + PyVarObject_HEAD_INIT(nullptr, 0) + "sequence wrapper", + sizeof(Dtool_MutableSequenceWrapper), + 0, // tp_itemsize + Dtool_WrapperBase_dealloc, + nullptr, // tp_print + nullptr, // tp_getattr + nullptr, // tp_setattr + nullptr, // tp_compare + Dtool_SequenceWrapper_repr, + nullptr, // tp_as_number + &seq_methods, + nullptr, // tp_as_mapping + nullptr, // tp_hash + nullptr, // tp_call + nullptr, // tp_str + PyObject_GenericGetAttr, + PyObject_GenericSetAttr, + nullptr, // tp_as_buffer + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES, + nullptr, // tp_doc + nullptr, // tp_traverse + nullptr, // tp_clear + nullptr, // tp_richcompare + 0, // tp_weaklistoffset + PySeqIter_New, + nullptr, // tp_iternext + methods, + nullptr, // tp_members + nullptr, // tp_getset + nullptr, // tp_base + nullptr, // tp_dict + nullptr, // tp_descr_get + nullptr, // tp_descr_set + 0, // tp_dictoffset + nullptr, // tp_init + PyType_GenericAlloc, + nullptr, // tp_new + PyObject_Del, + nullptr, // tp_is_gc + nullptr, // tp_bases + nullptr, // tp_mro + nullptr, // tp_cache + nullptr, // tp_subclasses + nullptr, // tp_weaklist + nullptr, // tp_del + }; + static bool registered = false; if (!registered) { registered = true; - _register_collection((PyTypeObject *)&Dtool_MutableSequenceWrapper_Type, "MutableSequence"); + + if (PyType_Ready(&wrapper_type) < 0) { + return nullptr; + } + + // If the collections.abc module is loaded, register this as a subclass. + _register_collection((PyTypeObject *)&wrapper_type, "MutableSequence"); } - (void)PyObject_INIT(wrap, &Dtool_MutableSequenceWrapper_Type); + (void)PyObject_INIT(wrap, &wrapper_type); Py_XINCREF(self); wrap->_base._self = self; wrap->_base._name = name; @@ -1589,14 +1366,95 @@ Dtool_MappingWrapper *Dtool_NewMappingWrapper(PyObject *self, const char *name) return (Dtool_MappingWrapper *)PyErr_NoMemory(); } - // If the collections.abc module is loaded, register this as a subclass. + static PySequenceMethods seq_methods = { + Dtool_SequenceWrapper_length, + nullptr, // sq_concat + nullptr, // sq_repeat + nullptr, // sq_item + nullptr, // sq_slice + nullptr, // sq_ass_item + nullptr, // sq_ass_slice + Dtool_MappingWrapper_contains, + nullptr, // sq_inplace_concat + nullptr, // sq_inplace_repeat + }; + + static PyMappingMethods map_methods = { + Dtool_SequenceWrapper_length, + Dtool_MappingWrapper_getitem, + nullptr, // mp_ass_subscript + }; + + static PyMethodDef methods[] = { + {"get", &Dtool_MappingWrapper_get, METH_VARARGS, nullptr}, + {"keys", &Dtool_MappingWrapper_keys, METH_NOARGS, nullptr}, + {"values", &Dtool_MappingWrapper_values, METH_NOARGS, nullptr}, + {"items", &Dtool_MappingWrapper_items, METH_NOARGS, nullptr}, + {nullptr, nullptr, 0, nullptr} + }; + + static PyTypeObject wrapper_type = { + PyVarObject_HEAD_INIT(nullptr, 0) + "mapping wrapper", + sizeof(Dtool_MappingWrapper), + 0, // tp_itemsize + Dtool_WrapperBase_dealloc, + nullptr, // tp_print + nullptr, // tp_getattr + nullptr, // tp_setattr + nullptr, // tp_compare + Dtool_WrapperBase_repr, + nullptr, // tp_as_number + &seq_methods, + &map_methods, + nullptr, // tp_hash + nullptr, // tp_call + nullptr, // tp_str + PyObject_GenericGetAttr, + PyObject_GenericSetAttr, + nullptr, // tp_as_buffer + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES, + nullptr, // tp_doc + nullptr, // tp_traverse + nullptr, // tp_clear + nullptr, // tp_richcompare + 0, // tp_weaklistoffset + Dtool_MappingWrapper_iter, + nullptr, // tp_iternext + methods, + nullptr, // tp_members + nullptr, // tp_getset + nullptr, // tp_base + nullptr, // tp_dict + nullptr, // tp_descr_get + nullptr, // tp_descr_set + 0, // tp_dictoffset + nullptr, // tp_init + PyType_GenericAlloc, + nullptr, // tp_new + PyObject_Del, + nullptr, // tp_is_gc + nullptr, // tp_bases + nullptr, // tp_mro + nullptr, // tp_cache + nullptr, // tp_subclasses + nullptr, // tp_weaklist + nullptr, // tp_del + }; + static bool registered = false; if (!registered) { registered = true; - _register_collection((PyTypeObject *)&Dtool_MappingWrapper_Type, "Mapping"); + + if (PyType_Ready(&wrapper_type) < 0) { + return nullptr; + } + + // If the collections.abc module is loaded, register this as a subclass. + _register_collection((PyTypeObject *)&wrapper_type, "Mapping"); } - (void)PyObject_INIT(wrap, &Dtool_MappingWrapper_Type); + (void)PyObject_INIT(wrap, &wrapper_type); Py_XINCREF(self); wrap->_base._self = self; wrap->_base._name = name; @@ -1616,14 +1474,100 @@ Dtool_MappingWrapper *Dtool_NewMutableMappingWrapper(PyObject *self, const char return (Dtool_MappingWrapper *)PyErr_NoMemory(); } - // If the collections.abc module is loaded, register this as a subclass. + static PySequenceMethods seq_methods = { + Dtool_SequenceWrapper_length, + nullptr, // sq_concat + nullptr, // sq_repeat + nullptr, // sq_item + nullptr, // sq_slice + nullptr, // sq_ass_item + nullptr, // sq_ass_slice + Dtool_MappingWrapper_contains, + nullptr, // sq_inplace_concat + nullptr, // sq_inplace_repeat + }; + + static PyMappingMethods map_methods = { + Dtool_SequenceWrapper_length, + Dtool_MappingWrapper_getitem, + Dtool_MutableMappingWrapper_setitem, + }; + + static PyMethodDef methods[] = { + {"get", &Dtool_MappingWrapper_get, METH_VARARGS, nullptr}, + {"pop", &Dtool_MutableMappingWrapper_pop, METH_VARARGS, nullptr}, + {"popitem", &Dtool_MutableMappingWrapper_popitem, METH_NOARGS, nullptr}, + {"clear", &Dtool_MutableMappingWrapper_clear, METH_VARARGS, nullptr}, + {"setdefault", &Dtool_MutableMappingWrapper_setdefault, METH_VARARGS, nullptr}, + {"update", (PyCFunction) &Dtool_MutableMappingWrapper_update, METH_VARARGS | METH_KEYWORDS, nullptr}, + {"keys", &Dtool_MappingWrapper_keys, METH_NOARGS, nullptr}, + {"values", &Dtool_MappingWrapper_values, METH_NOARGS, nullptr}, + {"items", &Dtool_MappingWrapper_items, METH_NOARGS, nullptr}, + {nullptr, nullptr, 0, nullptr} + }; + + static PyTypeObject wrapper_type = { + PyVarObject_HEAD_INIT(nullptr, 0) + "mapping wrapper", + sizeof(Dtool_MappingWrapper), + 0, // tp_itemsize + Dtool_WrapperBase_dealloc, + nullptr, // tp_print + nullptr, // tp_getattr + nullptr, // tp_setattr + nullptr, // tp_compare + Dtool_WrapperBase_repr, + nullptr, // tp_as_number + &seq_methods, + &map_methods, + nullptr, // tp_hash + nullptr, // tp_call + nullptr, // tp_str + PyObject_GenericGetAttr, + PyObject_GenericSetAttr, + nullptr, // tp_as_buffer + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES, + nullptr, // tp_doc + nullptr, // tp_traverse + nullptr, // tp_clear + nullptr, // tp_richcompare + 0, // tp_weaklistoffset + Dtool_MappingWrapper_iter, + nullptr, // tp_iternext + methods, + nullptr, // tp_members + nullptr, // tp_getset + nullptr, // tp_base + nullptr, // tp_dict + nullptr, // tp_descr_get + nullptr, // tp_descr_set + 0, // tp_dictoffset + nullptr, // tp_init + PyType_GenericAlloc, + nullptr, // tp_new + PyObject_Del, + nullptr, // tp_is_gc + nullptr, // tp_bases + nullptr, // tp_mro + nullptr, // tp_cache + nullptr, // tp_subclasses + nullptr, // tp_weaklist + nullptr, // tp_del + }; + static bool registered = false; if (!registered) { registered = true; - _register_collection((PyTypeObject *)&Dtool_MutableMappingWrapper_Type, "MutableMapping"); + + if (PyType_Ready(&wrapper_type) < 0) { + return nullptr; + } + + // If the collections.abc module is loaded, register this as a subclass. + _register_collection((PyTypeObject *)&wrapper_type, "MutableMapping"); } - (void)PyObject_INIT(wrap, &Dtool_MutableMappingWrapper_Type); + (void)PyObject_INIT(wrap, &wrapper_type); Py_XINCREF(self); wrap->_base._self = self; wrap->_base._name = name; @@ -1634,14 +1578,135 @@ Dtool_MappingWrapper *Dtool_NewMutableMappingWrapper(PyObject *self, const char return wrap; } +/** + * Creates a generator that invokes a given function with the given self arg. + */ +PyObject * +Dtool_NewGenerator(PyObject *self, iternextfunc gen_next) { + static PyTypeObject wrapper_type = { + PyVarObject_HEAD_INIT(nullptr, 0) + "generator wrapper", + sizeof(Dtool_GeneratorWrapper), + 0, // tp_itemsize + Dtool_WrapperBase_dealloc, + nullptr, // tp_print + nullptr, // tp_getattr + nullptr, // tp_setattr + nullptr, // tp_compare + nullptr, // tp_repr + nullptr, // tp_as_number + nullptr, // tp_as_sequence + nullptr, // tp_as_mapping + nullptr, // tp_hash + nullptr, // tp_call + nullptr, // tp_str + PyObject_GenericGetAttr, + PyObject_GenericSetAttr, + nullptr, // tp_as_buffer + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES, + nullptr, // tp_doc + nullptr, // tp_traverse + nullptr, // tp_clear + nullptr, // tp_richcompare + 0, // tp_weaklistoffset + PyObject_SelfIter, + Dtool_GeneratorWrapper_iternext, + nullptr, // tp_methods + nullptr, // tp_members + nullptr, // tp_getset + nullptr, // tp_base + nullptr, // tp_dict + nullptr, // tp_descr_get + nullptr, // tp_descr_set + 0, // tp_dictoffset + nullptr, // tp_init + PyType_GenericAlloc, + nullptr, // tp_new + PyObject_Del, + nullptr, // tp_is_gc + nullptr, // tp_bases + nullptr, // tp_mro + nullptr, // tp_cache + nullptr, // tp_subclasses + nullptr, // tp_weaklist + nullptr, // tp_del + }; + + if (PyType_Ready(&wrapper_type) < 0) { + return nullptr; + } + + Dtool_GeneratorWrapper *gen; + gen = (Dtool_GeneratorWrapper *)PyType_GenericAlloc(&wrapper_type, 0); + if (gen != nullptr) { + Py_INCREF(self); + gen->_base._self = self; + gen->_iternext_func = gen_next; + } + return (PyObject *)gen; +} + /** * This is a variant of the Python getset mechanism that permits static * properties. */ PyObject * Dtool_NewStaticProperty(PyTypeObject *type, const PyGetSetDef *getset) { + static PyTypeObject wrapper_type = { + PyVarObject_HEAD_INIT(&PyType_Type, 0) + "getset_descriptor", + sizeof(PyGetSetDescrObject), + 0, // tp_itemsize + (destructor)Dtool_StaticProperty_dealloc, + nullptr, // tp_print + nullptr, // tp_getattr + nullptr, // tp_setattr + nullptr, // tp_reserved + (reprfunc)Dtool_StaticProperty_repr, + nullptr, // tp_as_number + nullptr, // tp_as_sequence + nullptr, // tp_as_mapping + nullptr, // tp_hash + nullptr, // tp_call + nullptr, // tp_str + PyObject_GenericGetAttr, + nullptr, // tp_setattro + nullptr, // tp_as_buffer + Py_TPFLAGS_DEFAULT, + nullptr, // tp_doc + Dtool_StaticProperty_traverse, + nullptr, // tp_clear + nullptr, // tp_richcompare + 0, // tp_weaklistoffset + nullptr, // tp_iter + nullptr, // tp_iternext + nullptr, // tp_methods + nullptr, // tp_members + nullptr, // tp_getset + nullptr, // tp_base + nullptr, // tp_dict + (descrgetfunc)Dtool_StaticProperty_get, + (descrsetfunc)Dtool_StaticProperty_set, + 0, // tp_dictoffset + nullptr, // tp_init + nullptr, // tp_alloc + nullptr, // tp_new + nullptr, // tp_del + nullptr, // tp_is_gc + nullptr, // tp_bases + nullptr, // tp_mro + nullptr, // tp_cache + nullptr, // tp_subclasses + nullptr, // tp_weaklist + nullptr, // tp_del + }; + + if (PyType_Ready(&wrapper_type) < 0) { + return nullptr; + } + PyGetSetDescrObject *descr; - descr = (PyGetSetDescrObject *)PyType_GenericAlloc(&Dtool_StaticProperty_Type, 0); + descr = (PyGetSetDescrObject *)PyType_GenericAlloc(&wrapper_type, 0); if (descr != nullptr) { Py_XINCREF(type); descr->d_getset = (PyGetSetDef *)getset; diff --git a/dtool/src/interrogatedb/py_wrappers.h b/dtool/src/interrogatedb/py_wrappers.h index 7bf2c2e19f..96375d3598 100644 --- a/dtool/src/interrogatedb/py_wrappers.h +++ b/dtool/src/interrogatedb/py_wrappers.h @@ -1,11 +1,4 @@ /** - * 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 py_wrappers.h * @author rdb * @date 2017-11-26 @@ -56,22 +49,12 @@ struct Dtool_GeneratorWrapper { iternextfunc _iternext_func; }; -EXPCL_INTERROGATEDB extern PyTypeObject Dtool_SequenceWrapper_Type; -EXPCL_INTERROGATEDB extern PyTypeObject Dtool_MutableSequenceWrapper_Type; -EXPCL_INTERROGATEDB extern PyTypeObject Dtool_MappingWrapper_Type; -EXPCL_INTERROGATEDB extern PyTypeObject Dtool_MutableMappingWrapper_Type; -EXPCL_INTERROGATEDB extern PyTypeObject Dtool_MappingWrapper_Items_Type; -EXPCL_INTERROGATEDB extern PyTypeObject Dtool_MappingWrapper_Keys_Type; -EXPCL_INTERROGATEDB extern PyTypeObject Dtool_MappingWrapper_Values_Type; -EXPCL_INTERROGATEDB extern PyTypeObject Dtool_GeneratorWrapper_Type; -EXPCL_INTERROGATEDB extern PyTypeObject Dtool_StaticProperty_Type; - -EXPCL_INTERROGATEDB Dtool_SequenceWrapper *Dtool_NewSequenceWrapper(PyObject *self, const char *name); -EXPCL_INTERROGATEDB Dtool_MutableSequenceWrapper *Dtool_NewMutableSequenceWrapper(PyObject *self, const char *name); -EXPCL_INTERROGATEDB Dtool_MappingWrapper *Dtool_NewMappingWrapper(PyObject *self, const char *name); -EXPCL_INTERROGATEDB Dtool_MappingWrapper *Dtool_NewMutableMappingWrapper(PyObject *self, const char *name); -EXPCL_INTERROGATEDB PyObject *Dtool_NewGenerator(PyObject *self, const char *name, iternextfunc func); -EXPCL_INTERROGATEDB PyObject *Dtool_NewStaticProperty(PyTypeObject *obj, const PyGetSetDef *getset); +Dtool_SequenceWrapper *Dtool_NewSequenceWrapper(PyObject *self, const char *name); +Dtool_MutableSequenceWrapper *Dtool_NewMutableSequenceWrapper(PyObject *self, const char *name); +Dtool_MappingWrapper *Dtool_NewMappingWrapper(PyObject *self, const char *name); +Dtool_MappingWrapper *Dtool_NewMutableMappingWrapper(PyObject *self, const char *name); +PyObject *Dtool_NewGenerator(PyObject *self, iternextfunc func); +PyObject *Dtool_NewStaticProperty(PyTypeObject *obj, const PyGetSetDef *getset); #endif // HAVE_PYTHON diff --git a/dtool/src/pystub/pystub.cxx b/dtool/src/pystub/pystub.cxx index b2e9d4d62f..299da8fa0f 100644 --- a/dtool/src/pystub/pystub.cxx +++ b/dtool/src/pystub/pystub.cxx @@ -27,6 +27,8 @@ extern "C" { EXPCL_PYSTUB int PyCFunction_New(...); EXPCL_PYSTUB int PyCFunction_NewEx(...); EXPCL_PYSTUB int PyCallable_Check(...); + EXPCL_PYSTUB int PyCapsule_GetPointer(...); + EXPCL_PYSTUB int PyCapsule_New(...); EXPCL_PYSTUB int PyDict_DelItem(...); EXPCL_PYSTUB int PyDict_DelItemString(...); EXPCL_PYSTUB int PyDict_GetItem(...); @@ -133,6 +135,7 @@ extern "C" { EXPCL_PYSTUB int PyString_InternInPlace(...); EXPCL_PYSTUB int PyString_Size(...); EXPCL_PYSTUB int PySys_GetObject(...); + EXPCL_PYSTUB int PySys_SetObject(...); EXPCL_PYSTUB int PyThreadState_Clear(...); EXPCL_PYSTUB int PyThreadState_Delete(...); EXPCL_PYSTUB int PyThreadState_Get(...); @@ -216,6 +219,7 @@ extern "C" { EXPCL_PYSTUB extern void *PyExc_ImportError; EXPCL_PYSTUB extern void *PyExc_IndexError; EXPCL_PYSTUB extern void *PyExc_KeyError; + EXPCL_PYSTUB extern void *PyExc_NameError; EXPCL_PYSTUB extern void *PyExc_OSError; EXPCL_PYSTUB extern void *PyExc_OverflowError; EXPCL_PYSTUB extern void *PyExc_RuntimeError; @@ -257,6 +261,8 @@ int PyBytes_Size(...) { return 0; } int PyCFunction_New(...) { return 0; }; int PyCFunction_NewEx(...) { return 0; }; int PyCallable_Check(...) { return 0; } +int PyCapsule_GetPointer(...) { return 0; } +int PyCapsule_New(...) { return 0; } int PyDict_DelItem(...) { return 0; } int PyDict_DelItemString(...) { return 0; } int PyDict_GetItem(...) { return 0; } @@ -363,6 +369,7 @@ int PyString_FromStringAndSize(...) { return 0; } int PyString_InternFromString(...) { return 0; } int PyString_InternInPlace(...) { return 0; } int PySys_GetObject(...) { return 0; } +int PySys_SetObject(...) { return 0; } int PyThreadState_Clear(...) { return 0; } int PyThreadState_Delete(...) { return 0; } int PyThreadState_Get(...) { return 0; } @@ -452,6 +459,7 @@ void *PyExc_FutureWarning = nullptr; void *PyExc_ImportError = nullptr; void *PyExc_IndexError = nullptr; void *PyExc_KeyError = nullptr; +void *PyExc_NameError = nullptr; void *PyExc_OSError = nullptr; void *PyExc_OverflowError = nullptr; void *PyExc_RuntimeError = nullptr; diff --git a/dtool/src/test_interrogate/test_interrogate.cxx b/dtool/src/test_interrogate/test_interrogate.cxx index 590b8ac873..426de102de 100644 --- a/dtool/src/test_interrogate/test_interrogate.cxx +++ b/dtool/src/test_interrogate/test_interrogate.cxx @@ -17,7 +17,6 @@ #include "interrogate_request.h" #include "load_dso.h" #include "filename.h" -#include "pystub.h" #include "panda_getopt.h" #include "preprocess_argv.h" @@ -526,8 +525,6 @@ main(int argc, char **argv) { extern int optind; const char *optstr = "p:ftqh"; - pystub(); - bool all_functions = false; bool all_types = false; bool quick_load = false; diff --git a/makepanda/installer.nsi b/makepanda/installer.nsi index 27eb7efc1c..c880b10a14 100644 --- a/makepanda/installer.nsi +++ b/makepanda/installer.nsi @@ -329,13 +329,24 @@ SectionGroup "Python support" SetOutPath $INSTDIR\panda3d File /r "${BUILT}\panda3d\*.py" - File /r /x bullet.pyd /x ode.pyd /x physx.pyd /x rocket.pyd "${BUILT}\panda3d\*.pyd" + File /nonfatal /r "${BUILT}\panda3d\core${EXT_SUFFIX}" + File /nonfatal /r "${BUILT}\panda3d\ai${EXT_SUFFIX}" + File /nonfatal /r "${BUILT}\panda3d\awesomium${EXT_SUFFIX}" + File /nonfatal /r "${BUILT}\panda3d\direct${EXT_SUFFIX}" + File /nonfatal /r "${BUILT}\panda3d\egg${EXT_SUFFIX}" + File /nonfatal /r "${BUILT}\panda3d\fx${EXT_SUFFIX}" + File /nonfatal /r "${BUILT}\panda3d\interrogatedb${EXT_SUFFIX}" + File /nonfatal /r "${BUILT}\panda3d\physics${EXT_SUFFIX}" + File /nonfatal /r "${BUILT}\panda3d\_rplight${EXT_SUFFIX}" + File /nonfatal /r "${BUILT}\panda3d\skel${EXT_SUFFIX}" + File /nonfatal /r "${BUILT}\panda3d\vision${EXT_SUFFIX}" + File /nonfatal /r "${BUILT}\panda3d\vrpn${EXT_SUFFIX}" !ifdef HAVE_BULLET SectionGetFlags ${SecBullet} $R0 IntOp $R0 $R0 & ${SF_SELECTED} StrCmp $R0 ${SF_SELECTED} 0 SkipBulletPyd - File /nonfatal /r "${BUILT}\panda3d\bullet.pyd" + File /nonfatal /r "${BUILT}\panda3d\bullet${EXT_SUFFIX}" SkipBulletPyd: !endif @@ -343,7 +354,7 @@ SectionGroup "Python support" SectionGetFlags ${SecODE} $R0 IntOp $R0 $R0 & ${SF_SELECTED} StrCmp $R0 ${SF_SELECTED} 0 SkipODEPyd - File /nonfatal /r "${BUILT}\panda3d\ode.pyd" + File /nonfatal /r "${BUILT}\panda3d\ode${EXT_SUFFIX}" SkipODEPyd: !endif @@ -351,7 +362,7 @@ SectionGroup "Python support" SectionGetFlags ${SecPhysX} $R0 IntOp $R0 $R0 & ${SF_SELECTED} StrCmp $R0 ${SF_SELECTED} 0 SkipPhysXPyd - File /nonfatal /r "${BUILT}\panda3d\physx.pyd" + File /nonfatal /r "${BUILT}\panda3d\physx${EXT_SUFFIX}" SkipPhysXPyd: !endif @@ -359,7 +370,7 @@ SectionGroup "Python support" SectionGetFlags ${SecRocket} $R0 IntOp $R0 $R0 & ${SF_SELECTED} StrCmp $R0 ${SF_SELECTED} 0 SkipRocketPyd - File /nonfatal /r "${BUILT}\panda3d\rocket.pyd" + File /nonfatal /r "${BUILT}\panda3d\rocket${EXT_SUFFIX}" SkipRocketPyd: !endif diff --git a/makepanda/installpanda.py b/makepanda/installpanda.py index c7c6291f66..9456f63167 100644 --- a/makepanda/installpanda.py +++ b/makepanda/installpanda.py @@ -175,6 +175,7 @@ def InstallPanda(destdir="", prefix="/usr", outputdir="built", libdir=GetLibDir( oscmd("mkdir -m 0755 -p "+destdir+prefix+"/share/applications") oscmd("mkdir -m 0755 -p "+destdir+libdir+"/panda3d") oscmd("mkdir -m 0755 -p "+destdir+PPATH) + oscmd("mkdir -m 0755 -p "+destdir+PPATH+"/panda3d") if (sys.platform.startswith("freebsd")): oscmd("mkdir -m 0755 -p "+destdir+prefix+"/etc") @@ -194,13 +195,17 @@ def InstallPanda(destdir="", prefix="/usr", outputdir="built", libdir=GetLibDir( oscmd("cp -R "+outputdir+"/include "+destdir+prefix+"/include/panda3d") oscmd("cp -R "+outputdir+"/pandac "+destdir+prefix+"/share/panda3d/") - oscmd("cp -R "+outputdir+"/panda3d "+destdir+PPATH+"/") oscmd("cp -R "+outputdir+"/models "+destdir+prefix+"/share/panda3d/") if os.path.isdir("samples"): oscmd("cp -R samples "+destdir+prefix+"/share/panda3d/") if os.path.isdir(outputdir+"/direct"): oscmd("cp -R "+outputdir+"/direct "+destdir+prefix+"/share/panda3d/") if os.path.isdir(outputdir+"/Pmw"): oscmd("cp -R "+outputdir+"/Pmw "+destdir+prefix+"/share/panda3d/") if os.path.isdir(outputdir+"/plugins"): oscmd("cp -R "+outputdir+"/plugins "+destdir+prefix+"/share/panda3d/") + suffix = GetExtensionSuffix() + for base in os.listdir(outputdir + "/panda3d"): + if base.endswith(".py") or (base.endswith(suffix) and '.' not in base[:-len(suffix)]): + oscmd("cp "+outputdir+"/panda3d/"+base+" "+destdir+PPATH+"/panda3d/"+base) + WriteMimeFile(destdir+prefix+"/share/mime-info/panda3d.mime", MIME_INFO) WriteKeysFile(destdir+prefix+"/share/mime-info/panda3d.keys", MIME_INFO) WriteMimeXMLFile(destdir+prefix+"/share/mime/packages/panda3d.xml", MIME_INFO) diff --git a/makepanda/makepanda.py b/makepanda/makepanda.py index 6356f24e98..2e325b7470 100755 --- a/makepanda/makepanda.py +++ b/makepanda/makepanda.py @@ -1512,7 +1512,6 @@ def CompileFlex(wobj,wsrc,opts): def CompileIgate(woutd,wsrc,opts): outbase = os.path.basename(woutd)[:-3] woutc = GetOutputDir()+"/tmp/"+outbase+"_igate.cxx" - wobj = FindLocation(outbase + "_igate.obj", []) srcdir = GetValueOption(opts, "SRCDIR:") module = GetValueOption(opts, "IMOD:") library = GetValueOption(opts, "ILIB:") @@ -1521,7 +1520,7 @@ def CompileIgate(woutd,wsrc,opts): WriteFile(woutc, "") WriteFile(woutd, "") ConditionalWriteFile(woutd, "") - return (wobj, woutc, opts) + return if not CrossCompiling(): # If we're compiling for this platform, we can use the one we've built. @@ -1588,8 +1587,6 @@ def CompileIgate(woutd,wsrc,opts): cmd += ' ' + BracketNameWithQuotes(os.path.basename(x)) oscmd(cmd) - return (wobj, woutc, opts) - ######################################################################## ## ## CompileImod @@ -2262,9 +2259,7 @@ def CompileAnything(target, inputs, opts, progress = None): return CompileLink(target, inputs, opts) elif (origsuffix==".in"): ProgressOutput(progress, "Building Interrogate database", target) - args = CompileIgate(target, inputs, opts) - ProgressOutput(progress, "Building C++ object", args[0]) - return CompileCxx(*args) + return CompileIgate(target, inputs, opts) elif (origsuffix==".plugin" and GetTarget() == "darwin"): ProgressOutput(progress, "Building plugin bundle", target) return CompileBundle(target, inputs, opts) @@ -3539,25 +3534,22 @@ TargetAdd('libp3dtoolconfig.dll', opts=['ADVAPI', 'OPENSSL', 'WINGDI', 'WINUSER' # DIRECTORY: dtool/src/interrogatedb/ # -OPTS=['DIR:dtool/src/interrogatedb', 'BUILDING:INTERROGATEDB', 'PYTHON'] +OPTS=['DIR:dtool/src/interrogatedb', 'BUILDING:INTERROGATEDB'] TargetAdd('p3interrogatedb_composite1.obj', opts=OPTS, input='p3interrogatedb_composite1.cxx') TargetAdd('p3interrogatedb_composite2.obj', opts=OPTS, input='p3interrogatedb_composite2.cxx') TargetAdd('libp3interrogatedb.dll', input='p3interrogatedb_composite1.obj') TargetAdd('libp3interrogatedb.dll', input='p3interrogatedb_composite2.obj') TargetAdd('libp3interrogatedb.dll', input='libp3dtool.dll') TargetAdd('libp3interrogatedb.dll', input='libp3dtoolconfig.dll') -TargetAdd('libp3interrogatedb.dll', opts=['PYTHON']) -if not PkgSkip("PYTHON"): - # This used to be called dtoolconfig.pyd, but it just contains the interrogatedb - # stuff, so it has been renamed appropriately. - OPTS=['DIR:dtool/metalibs/dtoolconfig', 'PYTHON'] - TargetAdd('interrogatedb_pydtool.obj', opts=OPTS, input="pydtool.cxx") - TargetAdd('interrogatedb.pyd', input='interrogatedb_pydtool.obj') - TargetAdd('interrogatedb.pyd', input='libp3dtool.dll') - TargetAdd('interrogatedb.pyd', input='libp3dtoolconfig.dll') - TargetAdd('interrogatedb.pyd', input='libp3interrogatedb.dll') - TargetAdd('interrogatedb.pyd', opts=['PYTHON']) +# This used to be called dtoolconfig.pyd, but it just contains the interrogatedb +# stuff, so it has been renamed appropriately. +OPTS=['DIR:dtool/metalibs/dtoolconfig'] +PyTargetAdd('interrogatedb_pydtool.obj', opts=OPTS, input="pydtool.cxx") +PyTargetAdd('interrogatedb.pyd', input='interrogatedb_pydtool.obj') +PyTargetAdd('interrogatedb.pyd', input='libp3dtool.dll') +PyTargetAdd('interrogatedb.pyd', input='libp3dtoolconfig.dll') +PyTargetAdd('interrogatedb.pyd', input='libp3interrogatedb.dll') # # DIRECTORY: dtool/src/pystub/ @@ -3583,15 +3575,21 @@ if (not RUNTIME): TargetAdd('interrogate.exe', input='libp3cppParser.ilb') TargetAdd('interrogate.exe', input=COMMON_DTOOL_LIBS) TargetAdd('interrogate.exe', input='libp3interrogatedb.dll') - TargetAdd('interrogate.exe', input='libp3pystub.lib') TargetAdd('interrogate.exe', opts=['ADVAPI', 'OPENSSL', 'WINSHELL', 'WINGDI', 'WINUSER']) + preamble = WriteEmbeddedStringFile('interrogate_preamble_python_native', inputs=[ + 'dtool/src/interrogatedb/py_panda.cxx', + 'dtool/src/interrogatedb/py_compat.cxx', + 'dtool/src/interrogatedb/py_wrappers.cxx', + 'dtool/src/interrogatedb/dtool_super_base.cxx', + ]) + TargetAdd('interrogate_module_preamble_python_native.obj', opts=OPTS, input=preamble) TargetAdd('interrogate_module_interrogate_module.obj', opts=OPTS, input='interrogate_module.cxx') TargetAdd('interrogate_module.exe', input='interrogate_module_interrogate_module.obj') + TargetAdd('interrogate_module.exe', input='interrogate_module_preamble_python_native.obj') TargetAdd('interrogate_module.exe', input='libp3cppParser.ilb') TargetAdd('interrogate_module.exe', input=COMMON_DTOOL_LIBS) TargetAdd('interrogate_module.exe', input='libp3interrogatedb.dll') - TargetAdd('interrogate_module.exe', input='libp3pystub.lib') TargetAdd('interrogate_module.exe', opts=['ADVAPI', 'OPENSSL', 'WINSHELL', 'WINGDI', 'WINUSER']) if (not RTDIST): @@ -3600,7 +3598,6 @@ if (not RUNTIME): TargetAdd('parse_file.exe', input='libp3cppParser.ilb') TargetAdd('parse_file.exe', input=COMMON_DTOOL_LIBS) TargetAdd('parse_file.exe', input='libp3interrogatedb.dll') - TargetAdd('parse_file.exe', input='libp3pystub.lib') TargetAdd('parse_file.exe', opts=['ADVAPI', 'OPENSSL', 'WINSHELL', 'WINGDI', 'WINUSER']) # @@ -3624,14 +3621,13 @@ if (not RTDIST and not RUNTIME): TargetAdd('test_interrogate.exe', input='test_interrogate_test_interrogate.obj') TargetAdd('test_interrogate.exe', input='libp3interrogatedb.dll') TargetAdd('test_interrogate.exe', input=COMMON_DTOOL_LIBS) - TargetAdd('test_interrogate.exe', input='libp3pystub.lib') TargetAdd('test_interrogate.exe', opts=['ADVAPI', 'OPENSSL', 'WINSHELL', 'WINGDI', 'WINUSER']) # # DIRECTORY: dtool/src/dtoolbase/ # -OPTS=['DIR:dtool/src/dtoolbase', 'PYTHON'] +OPTS=['DIR:dtool/src/dtoolbase'] IGATEFILES=GetDirectoryContents('dtool/src/dtoolbase', ["*_composite*.cxx"]) IGATEFILES += [ "typeHandle.h", @@ -3642,14 +3638,13 @@ IGATEFILES += [ ] TargetAdd('libp3dtoolbase.in', opts=OPTS, input=IGATEFILES) TargetAdd('libp3dtoolbase.in', opts=['IMOD:panda3d.core', 'ILIB:libp3dtoolbase', 'SRCDIR:dtool/src/dtoolbase']) -TargetAdd('libp3dtoolbase_igate.obj', input='libp3dtoolbase.in', opts=["DEPENDENCYONLY"]) -TargetAdd('p3dtoolbase_typeHandle_ext.obj', opts=OPTS, input='typeHandle_ext.cxx') +PyTargetAdd('p3dtoolbase_typeHandle_ext.obj', opts=OPTS, input='typeHandle_ext.cxx') # # DIRECTORY: dtool/src/dtoolutil/ # -OPTS=['DIR:dtool/src/dtoolutil', 'PYTHON'] +OPTS=['DIR:dtool/src/dtoolutil'] IGATEFILES=GetDirectoryContents('dtool/src/dtoolutil', ["*_composite*.cxx"]) IGATEFILES += [ "config_dtoolutil.h", @@ -3667,19 +3662,17 @@ IGATEFILES += [ ] TargetAdd('libp3dtoolutil.in', opts=OPTS, input=IGATEFILES) TargetAdd('libp3dtoolutil.in', opts=['IMOD:panda3d.core', 'ILIB:libp3dtoolutil', 'SRCDIR:dtool/src/dtoolutil']) -TargetAdd('libp3dtoolutil_igate.obj', input='libp3dtoolutil.in', opts=["DEPENDENCYONLY"]) -TargetAdd('p3dtoolutil_ext_composite.obj', opts=OPTS, input='p3dtoolutil_ext_composite.cxx') +PyTargetAdd('p3dtoolutil_ext_composite.obj', opts=OPTS, input='p3dtoolutil_ext_composite.cxx') # # DIRECTORY: dtool/src/prc/ # -OPTS=['DIR:dtool/src/prc', 'PYTHON'] +OPTS=['DIR:dtool/src/prc'] IGATEFILES=GetDirectoryContents('dtool/src/prc', ["*.h", "*_composite*.cxx"]) TargetAdd('libp3prc.in', opts=OPTS, input=IGATEFILES) TargetAdd('libp3prc.in', opts=['IMOD:panda3d.core', 'ILIB:libp3prc', 'SRCDIR:dtool/src/prc']) -TargetAdd('libp3prc_igate.obj', input='libp3prc.in', opts=["DEPENDENCYONLY"]) -TargetAdd('p3prc_ext_composite.obj', opts=OPTS, input='p3prc_ext_composite.cxx') +PyTargetAdd('p3prc_ext_composite.obj', opts=OPTS, input='p3prc_ext_composite.cxx') # # DIRECTORY: panda/src/pandabase/ @@ -3696,12 +3689,11 @@ OPTS=['DIR:panda/src/express', 'BUILDING:PANDAEXPRESS', 'OPENSSL', 'ZLIB'] TargetAdd('p3express_composite1.obj', opts=OPTS, input='p3express_composite1.cxx') TargetAdd('p3express_composite2.obj', opts=OPTS, input='p3express_composite2.cxx') -OPTS=['DIR:panda/src/express', 'OPENSSL', 'ZLIB', 'PYTHON'] +OPTS=['DIR:panda/src/express', 'OPENSSL', 'ZLIB'] IGATEFILES=GetDirectoryContents('panda/src/express', ["*.h", "*_composite*.cxx"]) TargetAdd('libp3express.in', opts=OPTS, input=IGATEFILES) TargetAdd('libp3express.in', opts=['IMOD:panda3d.core', 'ILIB:libp3express', 'SRCDIR:panda/src/express']) -TargetAdd('libp3express_igate.obj', input='libp3express.in', opts=["DEPENDENCYONLY"]) -TargetAdd('p3express_ext_composite.obj', opts=OPTS, input='p3express_ext_composite.cxx') +PyTargetAdd('p3express_ext_composite.obj', opts=OPTS, input='p3express_ext_composite.cxx') # # DIRECTORY: panda/src/downloader/ @@ -3711,12 +3703,11 @@ OPTS=['DIR:panda/src/downloader', 'BUILDING:PANDAEXPRESS', 'OPENSSL', 'ZLIB'] TargetAdd('p3downloader_composite1.obj', opts=OPTS, input='p3downloader_composite1.cxx') TargetAdd('p3downloader_composite2.obj', opts=OPTS, input='p3downloader_composite2.cxx') -OPTS=['DIR:panda/src/downloader', 'OPENSSL', 'ZLIB', 'PYTHON'] +OPTS=['DIR:panda/src/downloader', 'OPENSSL', 'ZLIB'] IGATEFILES=GetDirectoryContents('panda/src/downloader', ["*.h", "*_composite*.cxx"]) TargetAdd('libp3downloader.in', opts=OPTS, input=IGATEFILES) TargetAdd('libp3downloader.in', opts=['IMOD:panda3d.core', 'ILIB:libp3downloader', 'SRCDIR:panda/src/downloader']) -TargetAdd('libp3downloader_igate.obj', input='libp3downloader.in', opts=["DEPENDENCYONLY"]) -TargetAdd('p3downloader_stringStream_ext.obj', opts=OPTS, input='stringStream_ext.cxx') +PyTargetAdd('p3downloader_stringStream_ext.obj', opts=OPTS, input='stringStream_ext.cxx') # # DIRECTORY: panda/metalibs/pandaexpress/ @@ -3743,12 +3734,11 @@ if (not RUNTIME): TargetAdd('p3pipeline_composite2.obj', opts=OPTS, input='p3pipeline_composite2.cxx') TargetAdd('p3pipeline_contextSwitch.obj', opts=OPTS, input='contextSwitch.c') - OPTS=['DIR:panda/src/pipeline', 'PYTHON'] + OPTS=['DIR:panda/src/pipeline'] IGATEFILES=GetDirectoryContents('panda/src/pipeline', ["*.h", "*_composite*.cxx"]) TargetAdd('libp3pipeline.in', opts=OPTS, input=IGATEFILES) TargetAdd('libp3pipeline.in', opts=['IMOD:panda3d.core', 'ILIB:libp3pipeline', 'SRCDIR:panda/src/pipeline']) - TargetAdd('libp3pipeline_igate.obj', input='libp3pipeline.in', opts=["DEPENDENCYONLY"]) - TargetAdd('p3pipeline_pythonThread.obj', opts=OPTS, input='pythonThread.cxx') + PyTargetAdd('p3pipeline_pythonThread.obj', opts=OPTS, input='pythonThread.cxx') # # DIRECTORY: panda/src/linmath/ @@ -3759,7 +3749,7 @@ if (not RUNTIME): TargetAdd('p3linmath_composite1.obj', opts=OPTS, input='p3linmath_composite1.cxx') TargetAdd('p3linmath_composite2.obj', opts=OPTS, input='p3linmath_composite2.cxx') - OPTS=['DIR:panda/src/linmath', 'PYTHON'] + OPTS=['DIR:panda/src/linmath'] IGATEFILES=GetDirectoryContents('panda/src/linmath', ["*.h", "*_composite*.cxx"]) for ifile in IGATEFILES[:]: if "_src." in ifile: @@ -3769,7 +3759,6 @@ if (not RUNTIME): IGATEFILES.remove('cast_to_float.h') TargetAdd('libp3linmath.in', opts=OPTS, input=IGATEFILES) TargetAdd('libp3linmath.in', opts=['IMOD:panda3d.core', 'ILIB:libp3linmath', 'SRCDIR:panda/src/linmath']) - TargetAdd('libp3linmath_igate.obj', input='libp3linmath.in', opts=["DEPENDENCYONLY"]) # # DIRECTORY: panda/src/putil/ @@ -3780,14 +3769,13 @@ if (not RUNTIME): TargetAdd('p3putil_composite1.obj', opts=OPTS, input='p3putil_composite1.cxx') TargetAdd('p3putil_composite2.obj', opts=OPTS, input='p3putil_composite2.cxx') - OPTS=['DIR:panda/src/putil', 'ZLIB', 'PYTHON'] + OPTS=['DIR:panda/src/putil', 'ZLIB'] IGATEFILES=GetDirectoryContents('panda/src/putil', ["*.h", "*_composite*.cxx"]) IGATEFILES.remove("test_bam.h") IGATEFILES.remove("config_util.h") TargetAdd('libp3putil.in', opts=OPTS, input=IGATEFILES) TargetAdd('libp3putil.in', opts=['IMOD:panda3d.core', 'ILIB:libp3putil', 'SRCDIR:panda/src/putil']) - TargetAdd('libp3putil_igate.obj', input='libp3putil.in', opts=["DEPENDENCYONLY"]) - TargetAdd('p3putil_ext_composite.obj', opts=OPTS, input='p3putil_ext_composite.cxx') + PyTargetAdd('p3putil_ext_composite.obj', opts=OPTS, input='p3putil_ext_composite.cxx') # # DIRECTORY: panda/src/audio/ @@ -3797,11 +3785,10 @@ if (not RUNTIME): OPTS=['DIR:panda/src/audio', 'BUILDING:PANDA'] TargetAdd('p3audio_composite1.obj', opts=OPTS, input='p3audio_composite1.cxx') - OPTS=['DIR:panda/src/audio', 'PYTHON'] + OPTS=['DIR:panda/src/audio'] IGATEFILES=["audio.h"] TargetAdd('libp3audio.in', opts=OPTS, input=IGATEFILES) TargetAdd('libp3audio.in', opts=['IMOD:panda3d.core', 'ILIB:libp3audio', 'SRCDIR:panda/src/audio']) - TargetAdd('libp3audio_igate.obj', input='libp3audio.in', opts=["DEPENDENCYONLY"]) # # DIRECTORY: panda/src/event/ @@ -3812,13 +3799,12 @@ if (not RUNTIME): TargetAdd('p3event_composite1.obj', opts=OPTS, input='p3event_composite1.cxx') TargetAdd('p3event_composite2.obj', opts=OPTS, input='p3event_composite2.cxx') - OPTS=['DIR:panda/src/event', 'PYTHON'] - TargetAdd('p3event_asyncFuture_ext.obj', opts=OPTS, input='asyncFuture_ext.cxx') - TargetAdd('p3event_pythonTask.obj', opts=OPTS, input='pythonTask.cxx') + OPTS=['DIR:panda/src/event'] + PyTargetAdd('p3event_asyncFuture_ext.obj', opts=OPTS, input='asyncFuture_ext.cxx') + PyTargetAdd('p3event_pythonTask.obj', opts=OPTS, input='pythonTask.cxx') IGATEFILES=GetDirectoryContents('panda/src/event', ["*.h", "*_composite*.cxx"]) TargetAdd('libp3event.in', opts=OPTS, input=IGATEFILES) TargetAdd('libp3event.in', opts=['IMOD:panda3d.core', 'ILIB:libp3event', 'SRCDIR:panda/src/event']) - TargetAdd('libp3event_igate.obj', input='libp3event.in', opts=["DEPENDENCYONLY"]) # # DIRECTORY: panda/src/mathutil/ @@ -3829,14 +3815,13 @@ if (not RUNTIME): TargetAdd('p3mathutil_composite1.obj', opts=OPTS, input='p3mathutil_composite1.cxx') TargetAdd('p3mathutil_composite2.obj', opts=OPTS, input='p3mathutil_composite2.cxx') - OPTS=['DIR:panda/src/mathutil', 'FFTW', 'PYTHON'] + OPTS=['DIR:panda/src/mathutil', 'FFTW'] IGATEFILES=GetDirectoryContents('panda/src/mathutil', ["*.h", "*_composite*.cxx"]) for ifile in IGATEFILES[:]: if "_src." in ifile: IGATEFILES.remove(ifile) TargetAdd('libp3mathutil.in', opts=OPTS, input=IGATEFILES) TargetAdd('libp3mathutil.in', opts=['IMOD:panda3d.core', 'ILIB:libp3mathutil', 'SRCDIR:panda/src/mathutil']) - TargetAdd('libp3mathutil_igate.obj', input='libp3mathutil.in', opts=["DEPENDENCYONLY"]) # # DIRECTORY: panda/src/gsgbase/ @@ -3846,11 +3831,10 @@ if (not RUNTIME): OPTS=['DIR:panda/src/gsgbase', 'BUILDING:PANDA'] TargetAdd('p3gsgbase_composite1.obj', opts=OPTS, input='p3gsgbase_composite1.cxx') - OPTS=['DIR:panda/src/gsgbase', 'PYTHON'] + OPTS=['DIR:panda/src/gsgbase'] IGATEFILES=GetDirectoryContents('panda/src/gsgbase', ["*.h", "*_composite*.cxx"]) TargetAdd('libp3gsgbase.in', opts=OPTS, input=IGATEFILES) TargetAdd('libp3gsgbase.in', opts=['IMOD:panda3d.core', 'ILIB:libp3gsgbase', 'SRCDIR:panda/src/gsgbase']) - TargetAdd('libp3gsgbase_igate.obj', input='libp3gsgbase.in', opts=["DEPENDENCYONLY"]) # # DIRECTORY: panda/src/pnmimage/ @@ -3862,12 +3846,11 @@ if (not RUNTIME): TargetAdd('p3pnmimage_composite2.obj', opts=OPTS, input='p3pnmimage_composite2.cxx') TargetAdd('p3pnmimage_convert_srgb_sse2.obj', opts=OPTS+['SSE2'], input='convert_srgb_sse2.cxx') - OPTS=['DIR:panda/src/pnmimage', 'ZLIB', 'PYTHON'] + OPTS=['DIR:panda/src/pnmimage', 'ZLIB'] IGATEFILES=GetDirectoryContents('panda/src/pnmimage', ["*.h", "*_composite*.cxx"]) TargetAdd('libp3pnmimage.in', opts=OPTS, input=IGATEFILES) TargetAdd('libp3pnmimage.in', opts=['IMOD:panda3d.core', 'ILIB:libp3pnmimage', 'SRCDIR:panda/src/pnmimage']) - TargetAdd('libp3pnmimage_igate.obj', input='libp3pnmimage.in', opts=["DEPENDENCYONLY"]) - TargetAdd('p3pnmimage_pfmFile_ext.obj', opts=OPTS, input='pfmFile_ext.cxx') + PyTargetAdd('p3pnmimage_pfmFile_ext.obj', opts=OPTS, input='pfmFile_ext.cxx') # # DIRECTORY: panda/src/nativenet/ @@ -3877,11 +3860,10 @@ if (not RUNTIME): OPTS=['DIR:panda/src/nativenet', 'OPENSSL', 'BUILDING:PANDA'] TargetAdd('p3nativenet_composite1.obj', opts=OPTS, input='p3nativenet_composite1.cxx') - OPTS=['DIR:panda/src/nativenet', 'OPENSSL', 'PYTHON'] + OPTS=['DIR:panda/src/nativenet', 'OPENSSL'] IGATEFILES=GetDirectoryContents('panda/src/nativenet', ["*.h", "*_composite*.cxx"]) TargetAdd('libp3nativenet.in', opts=OPTS, input=IGATEFILES) TargetAdd('libp3nativenet.in', opts=['IMOD:panda3d.core', 'ILIB:libp3nativenet', 'SRCDIR:panda/src/nativenet']) - TargetAdd('libp3nativenet_igate.obj', input='libp3nativenet.in', opts=["DEPENDENCYONLY"]) # # DIRECTORY: panda/src/net/ @@ -3892,12 +3874,11 @@ if (not RUNTIME): TargetAdd('p3net_composite1.obj', opts=OPTS, input='p3net_composite1.cxx') TargetAdd('p3net_composite2.obj', opts=OPTS, input='p3net_composite2.cxx') - OPTS=['DIR:panda/src/net', 'PYTHON'] + OPTS=['DIR:panda/src/net'] IGATEFILES=GetDirectoryContents('panda/src/net', ["*.h", "*_composite*.cxx"]) IGATEFILES.remove("datagram_ui.h") TargetAdd('libp3net.in', opts=OPTS, input=IGATEFILES) TargetAdd('libp3net.in', opts=['IMOD:panda3d.core', 'ILIB:libp3net', 'SRCDIR:panda/src/net']) - TargetAdd('libp3net_igate.obj', input='libp3net.in', opts=["DEPENDENCYONLY"]) # # DIRECTORY: panda/src/pstatclient/ @@ -3908,12 +3889,11 @@ if (not RUNTIME): TargetAdd('p3pstatclient_composite1.obj', opts=OPTS, input='p3pstatclient_composite1.cxx') TargetAdd('p3pstatclient_composite2.obj', opts=OPTS, input='p3pstatclient_composite2.cxx') - OPTS=['DIR:panda/src/pstatclient', 'PYTHON'] + OPTS=['DIR:panda/src/pstatclient'] IGATEFILES=GetDirectoryContents('panda/src/pstatclient', ["*.h", "*_composite*.cxx"]) IGATEFILES.remove("config_pstats.h") TargetAdd('libp3pstatclient.in', opts=OPTS, input=IGATEFILES) TargetAdd('libp3pstatclient.in', opts=['IMOD:panda3d.core', 'ILIB:libp3pstatclient', 'SRCDIR:panda/src/pstatclient']) - TargetAdd('libp3pstatclient_igate.obj', input='libp3pstatclient.in', opts=["DEPENDENCYONLY"]) # # DIRECTORY: panda/src/gobj/ @@ -3924,13 +3904,12 @@ if (not RUNTIME): TargetAdd('p3gobj_composite1.obj', opts=OPTS, input='p3gobj_composite1.cxx') TargetAdd('p3gobj_composite2.obj', opts=OPTS+['BIGOBJ'], input='p3gobj_composite2.cxx') - OPTS=['DIR:panda/src/gobj', 'NVIDIACG', 'ZLIB', 'SQUISH', 'PYTHON'] + OPTS=['DIR:panda/src/gobj', 'NVIDIACG', 'ZLIB', 'SQUISH'] IGATEFILES=GetDirectoryContents('panda/src/gobj', ["*.h", "*_composite*.cxx"]) if ("cgfx_states.h" in IGATEFILES): IGATEFILES.remove("cgfx_states.h") TargetAdd('libp3gobj.in', opts=OPTS, input=IGATEFILES) TargetAdd('libp3gobj.in', opts=['IMOD:panda3d.core', 'ILIB:libp3gobj', 'SRCDIR:panda/src/gobj']) - TargetAdd('libp3gobj_igate.obj', input='libp3gobj.in', opts=["DEPENDENCYONLY"]) - TargetAdd('p3gobj_ext_composite.obj', opts=OPTS, input='p3gobj_ext_composite.cxx') + PyTargetAdd('p3gobj_ext_composite.obj', opts=OPTS, input='p3gobj_ext_composite.cxx') # # DIRECTORY: panda/src/pgraphnodes/ @@ -3941,11 +3920,10 @@ if (not RUNTIME): TargetAdd('p3pgraphnodes_composite1.obj', opts=OPTS, input='p3pgraphnodes_composite1.cxx') TargetAdd('p3pgraphnodes_composite2.obj', opts=OPTS, input='p3pgraphnodes_composite2.cxx') - OPTS=['DIR:panda/src/pgraphnodes', 'PYTHON'] + OPTS=['DIR:panda/src/pgraphnodes'] IGATEFILES=GetDirectoryContents('panda/src/pgraphnodes', ["*.h", "*_composite*.cxx"]) TargetAdd('libp3pgraphnodes.in', opts=OPTS, input=IGATEFILES) TargetAdd('libp3pgraphnodes.in', opts=['IMOD:panda3d.core', 'ILIB:libp3pgraphnodes', 'SRCDIR:panda/src/pgraphnodes']) - TargetAdd('libp3pgraphnodes_igate.obj', input='libp3pgraphnodes.in', opts=["DEPENDENCYONLY"]) # # DIRECTORY: panda/src/pgraph/ @@ -3959,12 +3937,11 @@ if (not RUNTIME): TargetAdd('p3pgraph_composite3.obj', opts=OPTS, input='p3pgraph_composite3.cxx') TargetAdd('p3pgraph_composite4.obj', opts=OPTS, input='p3pgraph_composite4.cxx') - OPTS=['DIR:panda/src/pgraph', 'PYTHON'] + OPTS=['DIR:panda/src/pgraph'] IGATEFILES=GetDirectoryContents('panda/src/pgraph', ["*.h", "nodePath.cxx", "*_composite*.cxx"]) TargetAdd('libp3pgraph.in', opts=OPTS, input=IGATEFILES) TargetAdd('libp3pgraph.in', opts=['IMOD:panda3d.core', 'ILIB:libp3pgraph', 'SRCDIR:panda/src/pgraph']) - TargetAdd('libp3pgraph_igate.obj', input='libp3pgraph.in', opts=["DEPENDENCYONLY","BIGOBJ"]) - TargetAdd('p3pgraph_ext_composite.obj', opts=OPTS, input='p3pgraph_ext_composite.cxx') + PyTargetAdd('p3pgraph_ext_composite.obj', opts=OPTS, input='p3pgraph_ext_composite.cxx') # # DIRECTORY: panda/src/cull/ @@ -3975,11 +3952,10 @@ if (not RUNTIME): TargetAdd('p3cull_composite1.obj', opts=OPTS, input='p3cull_composite1.cxx') TargetAdd('p3cull_composite2.obj', opts=OPTS, input='p3cull_composite2.cxx') - OPTS=['DIR:panda/src/cull', 'PYTHON'] + OPTS=['DIR:panda/src/cull'] IGATEFILES=GetDirectoryContents('panda/src/cull', ["*.h", "*_composite*.cxx"]) TargetAdd('libp3cull.in', opts=OPTS, input=IGATEFILES) TargetAdd('libp3cull.in', opts=['IMOD:panda3d.core', 'ILIB:libp3cull', 'SRCDIR:panda/src/cull']) - TargetAdd('libp3cull_igate.obj', input='libp3cull.in', opts=["DEPENDENCYONLY"]) # # DIRECTORY: panda/src/display/ @@ -3991,15 +3967,14 @@ if (not RUNTIME): TargetAdd('p3display_composite1.obj', opts=OPTS, input='p3display_composite1.cxx') TargetAdd('p3display_composite2.obj', opts=OPTS, input='p3display_composite2.cxx') - OPTS=['DIR:panda/src/display', 'PYTHON'] + OPTS=['DIR:panda/src/display'] IGATEFILES=GetDirectoryContents('panda/src/display', ["*.h", "*_composite*.cxx"]) IGATEFILES.remove("renderBuffer.h") TargetAdd('libp3display.in', opts=OPTS, input=IGATEFILES) TargetAdd('libp3display.in', opts=['IMOD:panda3d.core', 'ILIB:libp3display', 'SRCDIR:panda/src/display']) - TargetAdd('libp3display_igate.obj', input='libp3display.in', opts=["DEPENDENCYONLY"]) - TargetAdd('p3display_graphicsStateGuardian_ext.obj', opts=OPTS, input='graphicsStateGuardian_ext.cxx') - TargetAdd('p3display_graphicsWindow_ext.obj', opts=OPTS, input='graphicsWindow_ext.cxx') - TargetAdd('p3display_pythonGraphicsWindowProc.obj', opts=OPTS, input='pythonGraphicsWindowProc.cxx') + PyTargetAdd('p3display_graphicsStateGuardian_ext.obj', opts=OPTS, input='graphicsStateGuardian_ext.cxx') + PyTargetAdd('p3display_graphicsWindow_ext.obj', opts=OPTS, input='graphicsWindow_ext.cxx') + PyTargetAdd('p3display_pythonGraphicsWindowProc.obj', opts=OPTS, input='pythonGraphicsWindowProc.cxx') if RTDIST and GetTarget() == 'darwin': OPTS=['DIR:panda/src/display'] @@ -4015,13 +3990,12 @@ if (not RUNTIME): TargetAdd('p3chan_composite1.obj', opts=OPTS, input='p3chan_composite1.cxx') TargetAdd('p3chan_composite2.obj', opts=OPTS, input='p3chan_composite2.cxx') - OPTS=['DIR:panda/src/chan', 'PYTHON'] + OPTS=['DIR:panda/src/chan'] IGATEFILES=GetDirectoryContents('panda/src/chan', ["*.h", "*_composite*.cxx"]) IGATEFILES.remove('movingPart.h') IGATEFILES.remove('animChannelFixed.h') TargetAdd('libp3chan.in', opts=OPTS, input=IGATEFILES) TargetAdd('libp3chan.in', opts=['IMOD:panda3d.core', 'ILIB:libp3chan', 'SRCDIR:panda/src/chan']) - TargetAdd('libp3chan_igate.obj', input='libp3chan.in', opts=["DEPENDENCYONLY"]) # DIRECTORY: panda/src/char/ @@ -4032,11 +4006,10 @@ if (not RUNTIME): TargetAdd('p3char_composite1.obj', opts=OPTS, input='p3char_composite1.cxx') TargetAdd('p3char_composite2.obj', opts=OPTS, input='p3char_composite2.cxx') - OPTS=['DIR:panda/src/char', 'PYTHON'] + OPTS=['DIR:panda/src/char'] IGATEFILES=GetDirectoryContents('panda/src/char', ["*.h", "*_composite*.cxx"]) TargetAdd('libp3char.in', opts=OPTS, input=IGATEFILES) TargetAdd('libp3char.in', opts=['IMOD:panda3d.core', 'ILIB:libp3char', 'SRCDIR:panda/src/char']) - TargetAdd('libp3char_igate.obj', input='libp3char.in', opts=["DEPENDENCYONLY"]) # # DIRECTORY: panda/src/dgraph/ @@ -4047,11 +4020,10 @@ if (not RUNTIME): TargetAdd('p3dgraph_composite1.obj', opts=OPTS, input='p3dgraph_composite1.cxx') TargetAdd('p3dgraph_composite2.obj', opts=OPTS, input='p3dgraph_composite2.cxx') - OPTS=['DIR:panda/src/dgraph', 'PYTHON'] + OPTS=['DIR:panda/src/dgraph'] IGATEFILES=GetDirectoryContents('panda/src/dgraph', ["*.h", "*_composite*.cxx"]) TargetAdd('libp3dgraph.in', opts=OPTS, input=IGATEFILES) TargetAdd('libp3dgraph.in', opts=['IMOD:panda3d.core', 'ILIB:libp3dgraph', 'SRCDIR:panda/src/dgraph']) - TargetAdd('libp3dgraph_igate.obj', input='libp3dgraph.in', opts=["DEPENDENCYONLY"]) # # DIRECTORY: panda/src/device/ @@ -4062,11 +4034,10 @@ if (not RUNTIME): TargetAdd('p3device_composite1.obj', opts=OPTS, input='p3device_composite1.cxx') TargetAdd('p3device_composite2.obj', opts=OPTS, input='p3device_composite2.cxx') - OPTS=['DIR:panda/src/device', 'PYTHON'] + OPTS=['DIR:panda/src/device'] IGATEFILES=GetDirectoryContents('panda/src/device', ["*.h", "*_composite*.cxx"]) TargetAdd('libp3device.in', opts=OPTS, input=IGATEFILES) TargetAdd('libp3device.in', opts=['IMOD:panda3d.core', 'ILIB:libp3device', 'SRCDIR:panda/src/device']) - TargetAdd('libp3device_igate.obj', input='libp3device.in', opts=["DEPENDENCYONLY"]) # # DIRECTORY: panda/src/pnmtext/ @@ -4076,11 +4047,10 @@ if (PkgSkip("FREETYPE")==0 and not RUNTIME): OPTS=['DIR:panda/src/pnmtext', 'BUILDING:PANDA', 'FREETYPE'] TargetAdd('p3pnmtext_composite1.obj', opts=OPTS, input='p3pnmtext_composite1.cxx') - OPTS=['DIR:panda/src/pnmtext', 'FREETYPE', 'PYTHON'] + OPTS=['DIR:panda/src/pnmtext', 'FREETYPE'] IGATEFILES=GetDirectoryContents('panda/src/pnmtext', ["*.h", "*_composite*.cxx"]) TargetAdd('libp3pnmtext.in', opts=OPTS, input=IGATEFILES) TargetAdd('libp3pnmtext.in', opts=['IMOD:panda3d.core', 'ILIB:libp3pnmtext', 'SRCDIR:panda/src/pnmtext']) - TargetAdd('libp3pnmtext_igate.obj', input='libp3pnmtext.in', opts=["DEPENDENCYONLY"]) # # DIRECTORY: panda/src/text/ @@ -4094,11 +4064,10 @@ if (not RUNTIME): TargetAdd('p3text_composite1.obj', opts=OPTS, input='p3text_composite1.cxx') TargetAdd('p3text_composite2.obj', opts=OPTS, input='p3text_composite2.cxx') - OPTS=['DIR:panda/src/text', 'ZLIB', 'FREETYPE', 'PYTHON'] + OPTS=['DIR:panda/src/text', 'ZLIB', 'FREETYPE'] IGATEFILES=GetDirectoryContents('panda/src/text', ["*.h", "*_composite*.cxx"]) TargetAdd('libp3text.in', opts=OPTS, input=IGATEFILES) TargetAdd('libp3text.in', opts=['IMOD:panda3d.core', 'ILIB:libp3text', 'SRCDIR:panda/src/text']) - TargetAdd('libp3text_igate.obj', input='libp3text.in', opts=["DEPENDENCYONLY"]) # # DIRECTORY: panda/src/movies/ @@ -4108,11 +4077,10 @@ if (not RUNTIME): OPTS=['DIR:panda/src/movies', 'BUILDING:PANDA', 'VORBIS', 'OPUS'] TargetAdd('p3movies_composite1.obj', opts=OPTS, input='p3movies_composite1.cxx') - OPTS=['DIR:panda/src/movies', 'VORBIS', 'OPUS', 'PYTHON'] + OPTS=['DIR:panda/src/movies', 'VORBIS', 'OPUS'] IGATEFILES=GetDirectoryContents('panda/src/movies', ["*.h", "*_composite*.cxx"]) TargetAdd('libp3movies.in', opts=OPTS, input=IGATEFILES) TargetAdd('libp3movies.in', opts=['IMOD:panda3d.core', 'ILIB:libp3movies', 'SRCDIR:panda/src/movies']) - TargetAdd('libp3movies_igate.obj', input='libp3movies.in', opts=["DEPENDENCYONLY"]) # # DIRECTORY: panda/src/grutil/ @@ -4124,12 +4092,11 @@ if (not RUNTIME): TargetAdd('p3grutil_composite1.obj', opts=OPTS, input='p3grutil_composite1.cxx') TargetAdd('p3grutil_composite2.obj', opts=OPTS, input='p3grutil_composite2.cxx') - OPTS=['DIR:panda/src/grutil', 'PYTHON'] + OPTS=['DIR:panda/src/grutil'] IGATEFILES=GetDirectoryContents('panda/src/grutil', ["*.h", "*_composite*.cxx"]) if 'convexHull.h' in IGATEFILES: IGATEFILES.remove('convexHull.h') TargetAdd('libp3grutil.in', opts=OPTS, input=IGATEFILES) TargetAdd('libp3grutil.in', opts=['IMOD:panda3d.core', 'ILIB:libp3grutil', 'SRCDIR:panda/src/grutil']) - TargetAdd('libp3grutil_igate.obj', input='libp3grutil.in', opts=["DEPENDENCYONLY"]) # # DIRECTORY: panda/src/tform/ @@ -4140,11 +4107,10 @@ if (not RUNTIME): TargetAdd('p3tform_composite1.obj', opts=OPTS, input='p3tform_composite1.cxx') TargetAdd('p3tform_composite2.obj', opts=OPTS, input='p3tform_composite2.cxx') - OPTS=['DIR:panda/src/tform', 'PYTHON'] + OPTS=['DIR:panda/src/tform'] IGATEFILES=GetDirectoryContents('panda/src/tform', ["*.h", "*_composite*.cxx"]) TargetAdd('libp3tform.in', opts=OPTS, input=IGATEFILES) TargetAdd('libp3tform.in', opts=['IMOD:panda3d.core', 'ILIB:libp3tform', 'SRCDIR:panda/src/tform']) - TargetAdd('libp3tform_igate.obj', input='libp3tform.in', opts=["DEPENDENCYONLY"]) # # DIRECTORY: panda/src/collide/ @@ -4155,11 +4121,10 @@ if (not RUNTIME): TargetAdd('p3collide_composite1.obj', opts=OPTS, input='p3collide_composite1.cxx') TargetAdd('p3collide_composite2.obj', opts=OPTS, input='p3collide_composite2.cxx') - OPTS=['DIR:panda/src/collide', 'PYTHON'] + OPTS=['DIR:panda/src/collide'] IGATEFILES=GetDirectoryContents('panda/src/collide', ["*.h", "*_composite*.cxx"]) TargetAdd('libp3collide.in', opts=OPTS, input=IGATEFILES) TargetAdd('libp3collide.in', opts=['IMOD:panda3d.core', 'ILIB:libp3collide', 'SRCDIR:panda/src/collide']) - TargetAdd('libp3collide_igate.obj', input='libp3collide.in', opts=["DEPENDENCYONLY"]) # # DIRECTORY: panda/src/parametrics/ @@ -4170,11 +4135,10 @@ if (not RUNTIME): TargetAdd('p3parametrics_composite1.obj', opts=OPTS, input='p3parametrics_composite1.cxx') TargetAdd('p3parametrics_composite2.obj', opts=OPTS, input='p3parametrics_composite2.cxx') - OPTS=['DIR:panda/src/parametrics', 'PYTHON'] + OPTS=['DIR:panda/src/parametrics'] IGATEFILES=GetDirectoryContents('panda/src/parametrics', ["*.h", "*_composite*.cxx"]) TargetAdd('libp3parametrics.in', opts=OPTS, input=IGATEFILES) TargetAdd('libp3parametrics.in', opts=['IMOD:panda3d.core', 'ILIB:libp3parametrics', 'SRCDIR:panda/src/parametrics']) - TargetAdd('libp3parametrics_igate.obj', input='libp3parametrics.in', opts=["DEPENDENCYONLY"]) # # DIRECTORY: panda/src/pgui/ @@ -4185,11 +4149,10 @@ if (not RUNTIME): TargetAdd('p3pgui_composite1.obj', opts=OPTS, input='p3pgui_composite1.cxx') TargetAdd('p3pgui_composite2.obj', opts=OPTS, input='p3pgui_composite2.cxx') - OPTS=['DIR:panda/src/pgui', 'PYTHON'] + OPTS=['DIR:panda/src/pgui'] IGATEFILES=GetDirectoryContents('panda/src/pgui', ["*.h", "*_composite*.cxx"]) TargetAdd('libp3pgui.in', opts=OPTS, input=IGATEFILES) TargetAdd('libp3pgui.in', opts=['IMOD:panda3d.core', 'ILIB:libp3pgui', 'SRCDIR:panda/src/pgui']) - TargetAdd('libp3pgui_igate.obj', input='libp3pgui.in', opts=["DEPENDENCYONLY"]) # # DIRECTORY: panda/src/pnmimagetypes/ @@ -4209,11 +4172,10 @@ if (not RUNTIME): TargetAdd('p3recorder_composite1.obj', opts=OPTS, input='p3recorder_composite1.cxx') TargetAdd('p3recorder_composite2.obj', opts=OPTS, input='p3recorder_composite2.cxx') - OPTS=['DIR:panda/src/recorder', 'PYTHON'] + OPTS=['DIR:panda/src/recorder'] IGATEFILES=GetDirectoryContents('panda/src/recorder', ["*.h", "*_composite*.cxx"]) TargetAdd('libp3recorder.in', opts=OPTS, input=IGATEFILES) TargetAdd('libp3recorder.in', opts=['IMOD:panda3d.core', 'ILIB:libp3recorder', 'SRCDIR:panda/src/recorder']) - TargetAdd('libp3recorder_igate.obj', input='libp3recorder.in', opts=["DEPENDENCYONLY"]) # # DIRECTORY: panda/src/dxml/ @@ -4229,11 +4191,10 @@ if (not RUNTIME): OPTS=['DIR:panda/src/dxml', 'BUILDING:PANDA', 'TINYXML'] TargetAdd('p3dxml_composite1.obj', opts=OPTS, input='p3dxml_composite1.cxx') - OPTS=['DIR:panda/src/dxml', 'TINYXML', 'PYTHON'] + OPTS=['DIR:panda/src/dxml', 'TINYXML'] IGATEFILES=GetDirectoryContents('panda/src/dxml', ["*.h", "p3dxml_composite1.cxx"]) TargetAdd('libp3dxml.in', opts=OPTS, input=IGATEFILES) TargetAdd('libp3dxml.in', opts=['IMOD:panda3d.core', 'ILIB:libp3dxml', 'SRCDIR:panda/src/dxml']) - TargetAdd('libp3dxml_igate.obj', input='libp3dxml.in', opts=["DEPENDENCYONLY"]) # # DIRECTORY: panda/metalibs/panda/ @@ -4320,110 +4281,109 @@ if (not RUNTIME): TargetAdd('libpanda.dll', dep='dtool_have_freetype.dat') TargetAdd('libpanda.dll', opts=OPTS) - TargetAdd('core_module.obj', input='libp3dtoolbase.in') - TargetAdd('core_module.obj', input='libp3dtoolutil.in') - TargetAdd('core_module.obj', input='libp3prc.in') + PyTargetAdd('core_module.obj', input='libp3dtoolbase.in') + PyTargetAdd('core_module.obj', input='libp3dtoolutil.in') + PyTargetAdd('core_module.obj', input='libp3prc.in') - TargetAdd('core_module.obj', input='libp3downloader.in') - TargetAdd('core_module.obj', input='libp3express.in') + PyTargetAdd('core_module.obj', input='libp3downloader.in') + PyTargetAdd('core_module.obj', input='libp3express.in') - TargetAdd('core_module.obj', input='libp3recorder.in') - TargetAdd('core_module.obj', input='libp3pgraphnodes.in') - TargetAdd('core_module.obj', input='libp3pgraph.in') - TargetAdd('core_module.obj', input='libp3cull.in') - TargetAdd('core_module.obj', input='libp3grutil.in') - TargetAdd('core_module.obj', input='libp3chan.in') - TargetAdd('core_module.obj', input='libp3pstatclient.in') - TargetAdd('core_module.obj', input='libp3char.in') - TargetAdd('core_module.obj', input='libp3collide.in') - TargetAdd('core_module.obj', input='libp3device.in') - TargetAdd('core_module.obj', input='libp3dgraph.in') - TargetAdd('core_module.obj', input='libp3display.in') - TargetAdd('core_module.obj', input='libp3pipeline.in') - TargetAdd('core_module.obj', input='libp3event.in') - TargetAdd('core_module.obj', input='libp3gobj.in') - TargetAdd('core_module.obj', input='libp3gsgbase.in') - TargetAdd('core_module.obj', input='libp3linmath.in') - TargetAdd('core_module.obj', input='libp3mathutil.in') - TargetAdd('core_module.obj', input='libp3parametrics.in') - TargetAdd('core_module.obj', input='libp3pnmimage.in') - TargetAdd('core_module.obj', input='libp3text.in') - TargetAdd('core_module.obj', input='libp3tform.in') - TargetAdd('core_module.obj', input='libp3putil.in') - TargetAdd('core_module.obj', input='libp3audio.in') - TargetAdd('core_module.obj', input='libp3nativenet.in') - TargetAdd('core_module.obj', input='libp3net.in') - TargetAdd('core_module.obj', input='libp3pgui.in') - TargetAdd('core_module.obj', input='libp3movies.in') - TargetAdd('core_module.obj', input='libp3dxml.in') + PyTargetAdd('core_module.obj', input='libp3recorder.in') + PyTargetAdd('core_module.obj', input='libp3pgraphnodes.in') + PyTargetAdd('core_module.obj', input='libp3pgraph.in') + PyTargetAdd('core_module.obj', input='libp3cull.in') + PyTargetAdd('core_module.obj', input='libp3grutil.in') + PyTargetAdd('core_module.obj', input='libp3chan.in') + PyTargetAdd('core_module.obj', input='libp3pstatclient.in') + PyTargetAdd('core_module.obj', input='libp3char.in') + PyTargetAdd('core_module.obj', input='libp3collide.in') + PyTargetAdd('core_module.obj', input='libp3device.in') + PyTargetAdd('core_module.obj', input='libp3dgraph.in') + PyTargetAdd('core_module.obj', input='libp3display.in') + PyTargetAdd('core_module.obj', input='libp3pipeline.in') + PyTargetAdd('core_module.obj', input='libp3event.in') + PyTargetAdd('core_module.obj', input='libp3gobj.in') + PyTargetAdd('core_module.obj', input='libp3gsgbase.in') + PyTargetAdd('core_module.obj', input='libp3linmath.in') + PyTargetAdd('core_module.obj', input='libp3mathutil.in') + PyTargetAdd('core_module.obj', input='libp3parametrics.in') + PyTargetAdd('core_module.obj', input='libp3pnmimage.in') + PyTargetAdd('core_module.obj', input='libp3text.in') + PyTargetAdd('core_module.obj', input='libp3tform.in') + PyTargetAdd('core_module.obj', input='libp3putil.in') + PyTargetAdd('core_module.obj', input='libp3audio.in') + PyTargetAdd('core_module.obj', input='libp3nativenet.in') + PyTargetAdd('core_module.obj', input='libp3net.in') + PyTargetAdd('core_module.obj', input='libp3pgui.in') + PyTargetAdd('core_module.obj', input='libp3movies.in') + PyTargetAdd('core_module.obj', input='libp3dxml.in') if PkgSkip("FREETYPE")==0: - TargetAdd('core_module.obj', input='libp3pnmtext.in') + PyTargetAdd('core_module.obj', input='libp3pnmtext.in') - TargetAdd('core_module.obj', opts=['PYTHON']) - TargetAdd('core_module.obj', opts=['IMOD:panda3d.core', 'ILIB:core']) + PyTargetAdd('core_module.obj', opts=['IMOD:panda3d.core', 'ILIB:core']) - TargetAdd('core.pyd', input='libp3dtoolbase_igate.obj') - TargetAdd('core.pyd', input='p3dtoolbase_typeHandle_ext.obj') - TargetAdd('core.pyd', input='libp3dtoolutil_igate.obj') - TargetAdd('core.pyd', input='p3dtoolutil_ext_composite.obj') - TargetAdd('core.pyd', input='libp3prc_igate.obj') - TargetAdd('core.pyd', input='p3prc_ext_composite.obj') + PyTargetAdd('core.pyd', input='libp3dtoolbase_igate.obj') + PyTargetAdd('core.pyd', input='p3dtoolbase_typeHandle_ext.obj') + PyTargetAdd('core.pyd', input='libp3dtoolutil_igate.obj') + PyTargetAdd('core.pyd', input='p3dtoolutil_ext_composite.obj') + PyTargetAdd('core.pyd', input='libp3prc_igate.obj') + PyTargetAdd('core.pyd', input='p3prc_ext_composite.obj') - TargetAdd('core.pyd', input='libp3downloader_igate.obj') - TargetAdd('core.pyd', input='p3downloader_stringStream_ext.obj') - TargetAdd('core.pyd', input='p3express_ext_composite.obj') - TargetAdd('core.pyd', input='libp3express_igate.obj') + PyTargetAdd('core.pyd', input='libp3downloader_igate.obj') + PyTargetAdd('core.pyd', input='p3downloader_stringStream_ext.obj') + PyTargetAdd('core.pyd', input='p3express_ext_composite.obj') + PyTargetAdd('core.pyd', input='libp3express_igate.obj') - TargetAdd('core.pyd', input='libp3recorder_igate.obj') - TargetAdd('core.pyd', input='libp3pgraphnodes_igate.obj') - TargetAdd('core.pyd', input='libp3pgraph_igate.obj') - TargetAdd('core.pyd', input='libp3movies_igate.obj') - TargetAdd('core.pyd', input='libp3grutil_igate.obj') - TargetAdd('core.pyd', input='libp3chan_igate.obj') - TargetAdd('core.pyd', input='libp3pstatclient_igate.obj') - TargetAdd('core.pyd', input='libp3char_igate.obj') - TargetAdd('core.pyd', input='libp3collide_igate.obj') - TargetAdd('core.pyd', input='libp3device_igate.obj') - TargetAdd('core.pyd', input='libp3dgraph_igate.obj') - TargetAdd('core.pyd', input='libp3display_igate.obj') - TargetAdd('core.pyd', input='libp3pipeline_igate.obj') - TargetAdd('core.pyd', input='libp3event_igate.obj') - TargetAdd('core.pyd', input='libp3gobj_igate.obj') - TargetAdd('core.pyd', input='libp3gsgbase_igate.obj') - TargetAdd('core.pyd', input='libp3linmath_igate.obj') - TargetAdd('core.pyd', input='libp3mathutil_igate.obj') - TargetAdd('core.pyd', input='libp3parametrics_igate.obj') - TargetAdd('core.pyd', input='libp3pnmimage_igate.obj') - TargetAdd('core.pyd', input='libp3text_igate.obj') - TargetAdd('core.pyd', input='libp3tform_igate.obj') - TargetAdd('core.pyd', input='libp3putil_igate.obj') - TargetAdd('core.pyd', input='libp3audio_igate.obj') - TargetAdd('core.pyd', input='libp3pgui_igate.obj') - TargetAdd('core.pyd', input='libp3net_igate.obj') - TargetAdd('core.pyd', input='libp3nativenet_igate.obj') - TargetAdd('core.pyd', input='libp3dxml_igate.obj') + PyTargetAdd('core.pyd', input='libp3recorder_igate.obj') + PyTargetAdd('core.pyd', input='libp3pgraphnodes_igate.obj') + PyTargetAdd('core.pyd', input='libp3pgraph_igate.obj') + PyTargetAdd('core.pyd', input='libp3movies_igate.obj') + PyTargetAdd('core.pyd', input='libp3grutil_igate.obj') + PyTargetAdd('core.pyd', input='libp3chan_igate.obj') + PyTargetAdd('core.pyd', input='libp3pstatclient_igate.obj') + PyTargetAdd('core.pyd', input='libp3char_igate.obj') + PyTargetAdd('core.pyd', input='libp3collide_igate.obj') + PyTargetAdd('core.pyd', input='libp3device_igate.obj') + PyTargetAdd('core.pyd', input='libp3dgraph_igate.obj') + PyTargetAdd('core.pyd', input='libp3display_igate.obj') + PyTargetAdd('core.pyd', input='libp3pipeline_igate.obj') + PyTargetAdd('core.pyd', input='libp3event_igate.obj') + PyTargetAdd('core.pyd', input='libp3gobj_igate.obj') + PyTargetAdd('core.pyd', input='libp3gsgbase_igate.obj') + PyTargetAdd('core.pyd', input='libp3linmath_igate.obj') + PyTargetAdd('core.pyd', input='libp3mathutil_igate.obj') + PyTargetAdd('core.pyd', input='libp3parametrics_igate.obj') + PyTargetAdd('core.pyd', input='libp3pnmimage_igate.obj') + PyTargetAdd('core.pyd', input='libp3text_igate.obj') + PyTargetAdd('core.pyd', input='libp3tform_igate.obj') + PyTargetAdd('core.pyd', input='libp3putil_igate.obj') + PyTargetAdd('core.pyd', input='libp3audio_igate.obj') + PyTargetAdd('core.pyd', input='libp3pgui_igate.obj') + PyTargetAdd('core.pyd', input='libp3net_igate.obj') + PyTargetAdd('core.pyd', input='libp3nativenet_igate.obj') + PyTargetAdd('core.pyd', input='libp3dxml_igate.obj') if PkgSkip("FREETYPE")==0: - TargetAdd('core.pyd', input="libp3pnmtext_igate.obj") + PyTargetAdd('core.pyd', input="libp3pnmtext_igate.obj") - TargetAdd('core.pyd', input='p3pipeline_pythonThread.obj') - TargetAdd('core.pyd', input='p3putil_ext_composite.obj') - TargetAdd('core.pyd', input='p3pnmimage_pfmFile_ext.obj') - TargetAdd('core.pyd', input='p3event_asyncFuture_ext.obj') - TargetAdd('core.pyd', input='p3event_pythonTask.obj') - TargetAdd('core.pyd', input='p3gobj_ext_composite.obj') - TargetAdd('core.pyd', input='p3pgraph_ext_composite.obj') - TargetAdd('core.pyd', input='p3display_graphicsStateGuardian_ext.obj') - TargetAdd('core.pyd', input='p3display_graphicsWindow_ext.obj') - TargetAdd('core.pyd', input='p3display_pythonGraphicsWindowProc.obj') + PyTargetAdd('core.pyd', input='p3pipeline_pythonThread.obj') + PyTargetAdd('core.pyd', input='p3putil_ext_composite.obj') + PyTargetAdd('core.pyd', input='p3pnmimage_pfmFile_ext.obj') + PyTargetAdd('core.pyd', input='p3event_asyncFuture_ext.obj') + PyTargetAdd('core.pyd', input='p3event_pythonTask.obj') + PyTargetAdd('core.pyd', input='p3gobj_ext_composite.obj') + PyTargetAdd('core.pyd', input='p3pgraph_ext_composite.obj') + PyTargetAdd('core.pyd', input='p3display_graphicsStateGuardian_ext.obj') + PyTargetAdd('core.pyd', input='p3display_graphicsWindow_ext.obj') + PyTargetAdd('core.pyd', input='p3display_pythonGraphicsWindowProc.obj') - TargetAdd('core.pyd', input='core_module.obj') + PyTargetAdd('core.pyd', input='core_module.obj') if not GetLinkAllStatic() and GetTarget() != 'emscripten': - TargetAdd('core.pyd', input='libp3tinyxml.ilb') - TargetAdd('core.pyd', input='libp3interrogatedb.dll') - TargetAdd('core.pyd', input=COMMON_PANDA_LIBS) - TargetAdd('core.pyd', opts=['PYTHON', 'WINSOCK2']) + PyTargetAdd('core.pyd', input='libp3tinyxml.ilb') + PyTargetAdd('core.pyd', input='libp3interrogatedb.dll') + PyTargetAdd('core.pyd', input=COMMON_PANDA_LIBS) + PyTargetAdd('core.pyd', opts=['WINSOCK2']) # # DIRECTORY: panda/src/vision/ @@ -4449,22 +4409,21 @@ if (PkgSkip("VISION") == 0) and (not RUNTIME): TargetAdd('libp3vision.dll', input=COMMON_PANDA_LIBS) TargetAdd('libp3vision.dll', opts=OPTS) - OPTS=['DIR:panda/src/vision', 'ARTOOLKIT', 'OPENCV', 'DX9', 'DIRECTCAM', 'JPEG', 'EXCEPTIONS', 'PYTHON'] + OPTS=['DIR:panda/src/vision', 'ARTOOLKIT', 'OPENCV', 'DX9', 'DIRECTCAM', 'JPEG', 'EXCEPTIONS'] IGATEFILES=GetDirectoryContents('panda/src/vision', ["*.h", "*_composite*.cxx"]) TargetAdd('libp3vision.in', opts=OPTS, input=IGATEFILES) TargetAdd('libp3vision.in', opts=['IMOD:panda3d.vision', 'ILIB:libp3vision', 'SRCDIR:panda/src/vision']) - TargetAdd('libp3vision_igate.obj', input='libp3vision.in', opts=["DEPENDENCYONLY"]) - TargetAdd('vision_module.obj', input='libp3vision.in') - TargetAdd('vision_module.obj', opts=OPTS) - TargetAdd('vision_module.obj', opts=['IMOD:panda3d.vision', 'ILIB:vision', 'IMPORT:panda3d.core']) - TargetAdd('vision.pyd', input='vision_module.obj') - TargetAdd('vision.pyd', input='libp3vision_igate.obj') - TargetAdd('vision.pyd', input='libp3vision.dll') - TargetAdd('vision.pyd', input='libp3interrogatedb.dll') - TargetAdd('vision.pyd', input=COMMON_PANDA_LIBS) - TargetAdd('vision.pyd', opts=['PYTHON']) + PyTargetAdd('vision_module.obj', input='libp3vision.in') + PyTargetAdd('vision_module.obj', opts=OPTS) + PyTargetAdd('vision_module.obj', opts=['IMOD:panda3d.vision', 'ILIB:vision', 'IMPORT:panda3d.core']) + + PyTargetAdd('vision.pyd', input='vision_module.obj') + PyTargetAdd('vision.pyd', input='libp3vision_igate.obj') + PyTargetAdd('vision.pyd', input='libp3vision.dll') + PyTargetAdd('vision.pyd', input='libp3interrogatedb.dll') + PyTargetAdd('vision.pyd', input=COMMON_PANDA_LIBS) # # DIRECTORY: panda/src/rocket/ @@ -4478,25 +4437,25 @@ if (PkgSkip("ROCKET") == 0) and (not RUNTIME): TargetAdd('libp3rocket.dll', input=COMMON_PANDA_LIBS) TargetAdd('libp3rocket.dll', opts=OPTS) - OPTS=['DIR:panda/src/rocket', 'ROCKET', 'RTTI', 'EXCEPTIONS', 'PYTHON'] + OPTS=['DIR:panda/src/rocket', 'ROCKET', 'RTTI', 'EXCEPTIONS'] IGATEFILES=GetDirectoryContents('panda/src/rocket', ["rocketInputHandler.h", "rocketInputHandler.cxx", "rocketRegion.h", "rocketRegion.cxx", "rocketRegion_ext.h"]) TargetAdd('libp3rocket.in', opts=OPTS, input=IGATEFILES) TargetAdd('libp3rocket.in', opts=['IMOD:panda3d.rocket', 'ILIB:libp3rocket', 'SRCDIR:panda/src/rocket']) - TargetAdd('libp3rocket_igate.obj', input='libp3rocket.in', opts=["DEPENDENCYONLY"]) - TargetAdd('p3rocket_rocketRegion_ext.obj', opts=OPTS, input='rocketRegion_ext.cxx') - TargetAdd('rocket_module.obj', input='libp3rocket.in') - TargetAdd('rocket_module.obj', opts=OPTS) - TargetAdd('rocket_module.obj', opts=['IMOD:panda3d.rocket', 'ILIB:rocket', 'IMPORT:panda3d.core']) + PyTargetAdd('p3rocket_rocketRegion_ext.obj', opts=OPTS, input='rocketRegion_ext.cxx') - TargetAdd('rocket.pyd', input='rocket_module.obj') - TargetAdd('rocket.pyd', input='libp3rocket_igate.obj') - TargetAdd('rocket.pyd', input='p3rocket_rocketRegion_ext.obj') - TargetAdd('rocket.pyd', input='libp3rocket.dll') - TargetAdd('rocket.pyd', input='libp3interrogatedb.dll') - TargetAdd('rocket.pyd', input=COMMON_PANDA_LIBS) - TargetAdd('rocket.pyd', opts=['PYTHON', 'ROCKET']) + PyTargetAdd('rocket_module.obj', input='libp3rocket.in') + PyTargetAdd('rocket_module.obj', opts=OPTS) + PyTargetAdd('rocket_module.obj', opts=['IMOD:panda3d.rocket', 'ILIB:rocket', 'IMPORT:panda3d.core']) + + PyTargetAdd('rocket.pyd', input='rocket_module.obj') + PyTargetAdd('rocket.pyd', input='libp3rocket_igate.obj') + PyTargetAdd('rocket.pyd', input='p3rocket_rocketRegion_ext.obj') + PyTargetAdd('rocket.pyd', input='libp3rocket.dll') + PyTargetAdd('rocket.pyd', input='libp3interrogatedb.dll') + PyTargetAdd('rocket.pyd', input=COMMON_PANDA_LIBS) + PyTargetAdd('rocket.pyd', opts=['ROCKET']) # # DIRECTORY: panda/src/p3awesomium @@ -4508,22 +4467,21 @@ if PkgSkip("AWESOMIUM") == 0 and not RUNTIME: TargetAdd('libp3awesomium.dll', input=COMMON_PANDA_LIBS) TargetAdd('libp3awesomium.dll', opts=OPTS) - OPTS=['DIR:panda/src/awesomium', 'AWESOMIUM', 'PYTHON'] + OPTS=['DIR:panda/src/awesomium', 'AWESOMIUM'] IGATEFILES=GetDirectoryContents('panda/src/awesomium', ["*.h", "*_composite1.cxx"]) TargetAdd('libp3awesomium.in', opts=OPTS, input=IGATEFILES) TargetAdd('libp3awesomium.in', opts=['IMOD:panda3d.awesomium', 'ILIB:libp3awesomium', 'SRCDIR:panda/src/awesomium']) - TargetAdd('libp3awesomium_igate.obj', input='libp3awesomium.in', opts=["DEPENDENCYONLY"]) - TargetAdd('awesomium_module.obj', input='libp3awesomium.in') - TargetAdd('awesomium_module.obj', opts=OPTS) - TargetAdd('awesomium_module.obj', opts=['IMOD:panda3d.awesomium', 'ILIB:awesomium', 'IMPORT:panda3d.core']) - TargetAdd('awesomium.pyd', input='awesomium_module.obj') - TargetAdd('awesomium.pyd', input='libp3awesomium_igate.obj') - TargetAdd('awesomium.pyd', input='libp3awesomium.dll') - TargetAdd('awesomium.pyd', input='libp3interrogatedb.dll') - TargetAdd('awesomium.pyd', input=COMMON_PANDA_LIBS) - TargetAdd('awesomium.pyd', opts=['PYTHON']) + PyTargetAdd('awesomium_module.obj', input='libp3awesomium.in') + PyTargetAdd('awesomium_module.obj', opts=OPTS) + PyTargetAdd('awesomium_module.obj', opts=['IMOD:panda3d.awesomium', 'ILIB:awesomium', 'IMPORT:panda3d.core']) + + PyTargetAdd('awesomium.pyd', input='awesomium_module.obj') + PyTargetAdd('awesomium.pyd', input='libp3awesomium_igate.obj') + PyTargetAdd('awesomium.pyd', input='libp3awesomium.dll') + PyTargetAdd('awesomium.pyd', input='libp3interrogatedb.dll') + PyTargetAdd('awesomium.pyd', input=COMMON_PANDA_LIBS) # # DIRECTORY: panda/src/p3skel @@ -4533,11 +4491,10 @@ if (PkgSkip('SKEL')==0) and (not RUNTIME): OPTS=['DIR:panda/src/skel', 'BUILDING:PANDASKEL', 'ADVAPI'] TargetAdd('p3skel_composite1.obj', opts=OPTS, input='p3skel_composite1.cxx') - OPTS=['DIR:panda/src/skel', 'ADVAPI', 'PYTHON'] + OPTS=['DIR:panda/src/skel', 'ADVAPI'] IGATEFILES=GetDirectoryContents("panda/src/skel", ["*.h", "*_composite*.cxx"]) TargetAdd('libp3skel.in', opts=OPTS, input=IGATEFILES) TargetAdd('libp3skel.in', opts=['IMOD:panda3d.skel', 'ILIB:libp3skel', 'SRCDIR:panda/src/skel']) - TargetAdd('libp3skel_igate.obj', input='libp3skel.in', opts=["DEPENDENCYONLY"]) # # DIRECTORY: panda/src/p3skel @@ -4549,17 +4506,14 @@ if (PkgSkip('SKEL')==0) and (not RUNTIME): TargetAdd('libpandaskel.dll', input=COMMON_PANDA_LIBS) TargetAdd('libpandaskel.dll', opts=OPTS) - OPTS=['PYTHON'] - TargetAdd('skel_module.obj', input='libp3skel.in') - TargetAdd('skel_module.obj', opts=OPTS) - TargetAdd('skel_module.obj', opts=['IMOD:panda3d.skel', 'ILIB:skel', 'IMPORT:panda3d.core']) + PyTargetAdd('skel_module.obj', input='libp3skel.in') + PyTargetAdd('skel_module.obj', opts=['IMOD:panda3d.skel', 'ILIB:skel', 'IMPORT:panda3d.core']) - TargetAdd('skel.pyd', input='skel_module.obj') - TargetAdd('skel.pyd', input='libp3skel_igate.obj') - TargetAdd('skel.pyd', input='libpandaskel.dll') - TargetAdd('skel.pyd', input='libp3interrogatedb.dll') - TargetAdd('skel.pyd', input=COMMON_PANDA_LIBS) - TargetAdd('skel.pyd', opts=['PYTHON']) + PyTargetAdd('skel.pyd', input='skel_module.obj') + PyTargetAdd('skel.pyd', input='libp3skel_igate.obj') + PyTargetAdd('skel.pyd', input='libpandaskel.dll') + PyTargetAdd('skel.pyd', input='libp3interrogatedb.dll') + PyTargetAdd('skel.pyd', input=COMMON_PANDA_LIBS) # # DIRECTORY: panda/src/distort/ @@ -4569,11 +4523,10 @@ if (PkgSkip('PANDAFX')==0) and (not RUNTIME): OPTS=['DIR:panda/src/distort', 'BUILDING:PANDAFX'] TargetAdd('p3distort_composite1.obj', opts=OPTS, input='p3distort_composite1.cxx') - OPTS=['DIR:panda/metalibs/pandafx', 'DIR:panda/src/distort', 'NVIDIACG', 'PYTHON'] + OPTS=['DIR:panda/metalibs/pandafx', 'DIR:panda/src/distort', 'NVIDIACG'] IGATEFILES=GetDirectoryContents('panda/src/distort', ["*.h", "*_composite*.cxx"]) TargetAdd('libp3distort.in', opts=OPTS, input=IGATEFILES) TargetAdd('libp3distort.in', opts=['IMOD:panda3d.fx', 'ILIB:libp3distort', 'SRCDIR:panda/src/distort']) - TargetAdd('libp3distort_igate.obj', input='libp3distort.in', opts=["DEPENDENCYONLY"]) # # DIRECTORY: panda/metalibs/pandafx/ @@ -4588,17 +4541,16 @@ if (PkgSkip('PANDAFX')==0) and (not RUNTIME): TargetAdd('libpandafx.dll', input=COMMON_PANDA_LIBS) TargetAdd('libpandafx.dll', opts=['ADVAPI', 'NVIDIACG']) - OPTS=['DIR:panda/metalibs/pandafx', 'DIR:panda/src/distort', 'NVIDIACG', 'PYTHON'] - TargetAdd('fx_module.obj', input='libp3distort.in') - TargetAdd('fx_module.obj', opts=OPTS) - TargetAdd('fx_module.obj', opts=['IMOD:panda3d.fx', 'ILIB:fx', 'IMPORT:panda3d.core']) + OPTS=['DIR:panda/metalibs/pandafx', 'DIR:panda/src/distort', 'NVIDIACG'] + PyTargetAdd('fx_module.obj', input='libp3distort.in') + PyTargetAdd('fx_module.obj', opts=OPTS) + PyTargetAdd('fx_module.obj', opts=['IMOD:panda3d.fx', 'ILIB:fx', 'IMPORT:panda3d.core']) - TargetAdd('fx.pyd', input='fx_module.obj') - TargetAdd('fx.pyd', input='libp3distort_igate.obj') - TargetAdd('fx.pyd', input='libpandafx.dll') - TargetAdd('fx.pyd', input='libp3interrogatedb.dll') - TargetAdd('fx.pyd', input=COMMON_PANDA_LIBS) - TargetAdd('fx.pyd', opts=['PYTHON']) + PyTargetAdd('fx.pyd', input='fx_module.obj') + PyTargetAdd('fx.pyd', input='libp3distort_igate.obj') + PyTargetAdd('fx.pyd', input='libpandafx.dll') + PyTargetAdd('fx.pyd', input='libp3interrogatedb.dll') + PyTargetAdd('fx.pyd', input=COMMON_PANDA_LIBS) # # DIRECTORY: panda/src/vrpn/ @@ -4611,22 +4563,21 @@ if (PkgSkip("VRPN")==0 and not RUNTIME): TargetAdd('libp3vrpn.dll', input=COMMON_PANDA_LIBS) TargetAdd('libp3vrpn.dll', opts=['VRPN']) - OPTS=['DIR:panda/src/vrpn', 'VRPN', 'PYTHON'] + OPTS=['DIR:panda/src/vrpn', 'VRPN'] IGATEFILES=GetDirectoryContents('panda/src/vrpn', ["*.h", "*_composite*.cxx"]) TargetAdd('libp3vrpn.in', opts=OPTS, input=IGATEFILES) TargetAdd('libp3vrpn.in', opts=['IMOD:panda3d.vrpn', 'ILIB:libp3vrpn', 'SRCDIR:panda/src/vrpn']) - TargetAdd('libp3vrpn_igate.obj', input='libp3vrpn.in', opts=["DEPENDENCYONLY"]) - TargetAdd('vrpn_module.obj', input='libp3vrpn.in') - TargetAdd('vrpn_module.obj', opts=OPTS) - TargetAdd('vrpn_module.obj', opts=['IMOD:panda3d.vrpn', 'ILIB:vrpn', 'IMPORT:panda3d.core']) - TargetAdd('vrpn.pyd', input='vrpn_module.obj') - TargetAdd('vrpn.pyd', input='libp3vrpn_igate.obj') - TargetAdd('vrpn.pyd', input='libp3vrpn.dll') - TargetAdd('vrpn.pyd', input='libp3interrogatedb.dll') - TargetAdd('vrpn.pyd', input=COMMON_PANDA_LIBS) - TargetAdd('vrpn.pyd', opts=['PYTHON']) + PyTargetAdd('vrpn_module.obj', input='libp3vrpn.in') + PyTargetAdd('vrpn_module.obj', opts=OPTS) + PyTargetAdd('vrpn_module.obj', opts=['IMOD:panda3d.vrpn', 'ILIB:vrpn', 'IMPORT:panda3d.core']) + + PyTargetAdd('vrpn.pyd', input='vrpn_module.obj') + PyTargetAdd('vrpn.pyd', input='libp3vrpn_igate.obj') + PyTargetAdd('vrpn.pyd', input='libp3vrpn.dll') + PyTargetAdd('vrpn.pyd', input='libp3interrogatedb.dll') + PyTargetAdd('vrpn.pyd', input=COMMON_PANDA_LIBS) # # DIRECTORY: panda/src/ffmpeg @@ -4776,13 +4727,12 @@ if not RUNTIME and not PkgSkip("EGG"): TargetAdd('p3egg_composite1.obj', opts=OPTS, input='p3egg_composite1.cxx') TargetAdd('p3egg_composite2.obj', opts=OPTS, input='p3egg_composite2.cxx') - OPTS=['DIR:panda/src/egg', 'ZLIB', 'PYTHON'] + OPTS=['DIR:panda/src/egg', 'ZLIB'] IGATEFILES=GetDirectoryContents('panda/src/egg', ["*.h", "*_composite*.cxx"]) if "parser.h" in IGATEFILES: IGATEFILES.remove("parser.h") TargetAdd('libp3egg.in', opts=OPTS, input=IGATEFILES) TargetAdd('libp3egg.in', opts=['IMOD:panda3d.egg', 'ILIB:libp3egg', 'SRCDIR:panda/src/egg']) - TargetAdd('libp3egg_igate.obj', input='libp3egg.in', opts=["DEPENDENCYONLY"]) - TargetAdd('p3egg_eggGroupNode_ext.obj', opts=OPTS, input='eggGroupNode_ext.cxx') + PyTargetAdd('p3egg_eggGroupNode_ext.obj', opts=OPTS, input='eggGroupNode_ext.cxx') # # DIRECTORY: panda/src/egg2pg/ @@ -4793,11 +4743,10 @@ if not RUNTIME and not PkgSkip("EGG"): TargetAdd('p3egg2pg_composite1.obj', opts=OPTS, input='p3egg2pg_composite1.cxx') TargetAdd('p3egg2pg_composite2.obj', opts=OPTS, input='p3egg2pg_composite2.cxx') - OPTS=['DIR:panda/src/egg2pg', 'PYTHON'] + OPTS=['DIR:panda/src/egg2pg'] IGATEFILES=['load_egg_file.h'] TargetAdd('libp3egg2pg.in', opts=OPTS, input=IGATEFILES) TargetAdd('libp3egg2pg.in', opts=['IMOD:panda3d.egg', 'ILIB:libp3egg2pg', 'SRCDIR:panda/src/egg2pg']) - TargetAdd('libp3egg2pg_igate.obj', input='libp3egg2pg.in', opts=["DEPENDENCYONLY"]) # # DIRECTORY: panda/src/framework/ @@ -4866,20 +4815,19 @@ if not RUNTIME and not PkgSkip("EGG"): TargetAdd('libpandaegg.dll', input=COMMON_PANDA_LIBS) TargetAdd('libpandaegg.dll', opts=['ADVAPI']) - OPTS=['DIR:panda/metalibs/pandaegg', 'DIR:panda/src/egg', 'PYTHON'] - TargetAdd('egg_module.obj', input='libp3egg2pg.in') - TargetAdd('egg_module.obj', input='libp3egg.in') - TargetAdd('egg_module.obj', opts=OPTS) - TargetAdd('egg_module.obj', opts=['IMOD:panda3d.egg', 'ILIB:egg', 'IMPORT:panda3d.core']) + OPTS=['DIR:panda/metalibs/pandaegg', 'DIR:panda/src/egg'] + PyTargetAdd('egg_module.obj', input='libp3egg2pg.in') + PyTargetAdd('egg_module.obj', input='libp3egg.in') + PyTargetAdd('egg_module.obj', opts=OPTS) + PyTargetAdd('egg_module.obj', opts=['IMOD:panda3d.egg', 'ILIB:egg', 'IMPORT:panda3d.core']) - TargetAdd('egg.pyd', input='egg_module.obj') - TargetAdd('egg.pyd', input='p3egg_eggGroupNode_ext.obj') - TargetAdd('egg.pyd', input='libp3egg_igate.obj') - TargetAdd('egg.pyd', input='libp3egg2pg_igate.obj') - TargetAdd('egg.pyd', input='libpandaegg.dll') - TargetAdd('egg.pyd', input='libp3interrogatedb.dll') - TargetAdd('egg.pyd', input=COMMON_PANDA_LIBS) - TargetAdd('egg.pyd', opts=['PYTHON']) + PyTargetAdd('egg.pyd', input='egg_module.obj') + PyTargetAdd('egg.pyd', input='p3egg_eggGroupNode_ext.obj') + PyTargetAdd('egg.pyd', input='libp3egg_igate.obj') + PyTargetAdd('egg.pyd', input='libp3egg2pg_igate.obj') + PyTargetAdd('egg.pyd', input='libpandaegg.dll') + PyTargetAdd('egg.pyd', input='libp3interrogatedb.dll') + PyTargetAdd('egg.pyd', input=COMMON_PANDA_LIBS) # # DIRECTORY: panda/src/x11display/ @@ -5003,20 +4951,19 @@ if (PkgSkip("EGL")==0 and PkgSkip("GLES2")==0 and PkgSkip("X11")==0 and not RUNT # DIRECTORY: panda/src/ode/ # if (PkgSkip("ODE")==0 and not RUNTIME): - OPTS=['DIR:panda/src/ode', 'BUILDING:PANDAODE', 'ODE', 'PYTHON'] + OPTS=['DIR:panda/src/ode', 'BUILDING:PANDAODE', 'ODE'] TargetAdd('p3ode_composite1.obj', opts=OPTS, input='p3ode_composite1.cxx') TargetAdd('p3ode_composite2.obj', opts=OPTS, input='p3ode_composite2.cxx') TargetAdd('p3ode_composite3.obj', opts=OPTS, input='p3ode_composite3.cxx') - OPTS=['DIR:panda/src/ode', 'ODE', 'PYTHON'] + OPTS=['DIR:panda/src/ode', 'ODE'] IGATEFILES=GetDirectoryContents('panda/src/ode', ["*.h", "*_composite*.cxx"]) IGATEFILES.remove("odeConvexGeom.h") IGATEFILES.remove("odeHeightFieldGeom.h") IGATEFILES.remove("odeHelperStructs.h") TargetAdd('libpandaode.in', opts=OPTS, input=IGATEFILES) TargetAdd('libpandaode.in', opts=['IMOD:panda3d.ode', 'ILIB:libpandaode', 'SRCDIR:panda/src/ode']) - TargetAdd('libpandaode_igate.obj', input='libpandaode.in', opts=["DEPENDENCYONLY"]) - TargetAdd('p3ode_ext_composite.obj', opts=OPTS, input='p3ode_ext_composite.cxx') + PyTargetAdd('p3ode_ext_composite.obj', opts=OPTS, input='p3ode_ext_composite.cxx') # # DIRECTORY: panda/metalibs/pandaode/ @@ -5032,18 +4979,18 @@ if (PkgSkip("ODE")==0 and not RUNTIME): TargetAdd('libpandaode.dll', input=COMMON_PANDA_LIBS) TargetAdd('libpandaode.dll', opts=['WINUSER', 'ODE']) - OPTS=['DIR:panda/metalibs/pandaode', 'ODE', 'PYTHON'] - TargetAdd('ode_module.obj', input='libpandaode.in') - TargetAdd('ode_module.obj', opts=OPTS) - TargetAdd('ode_module.obj', opts=['IMOD:panda3d.ode', 'ILIB:ode', 'IMPORT:panda3d.core']) + OPTS=['DIR:panda/metalibs/pandaode', 'ODE'] + PyTargetAdd('ode_module.obj', input='libpandaode.in') + PyTargetAdd('ode_module.obj', opts=OPTS) + PyTargetAdd('ode_module.obj', opts=['IMOD:panda3d.ode', 'ILIB:ode', 'IMPORT:panda3d.core']) - TargetAdd('ode.pyd', input='ode_module.obj') - TargetAdd('ode.pyd', input='libpandaode_igate.obj') - TargetAdd('ode.pyd', input='p3ode_ext_composite.obj') - TargetAdd('ode.pyd', input='libpandaode.dll') - TargetAdd('ode.pyd', input='libp3interrogatedb.dll') - TargetAdd('ode.pyd', input=COMMON_PANDA_LIBS) - TargetAdd('ode.pyd', opts=['PYTHON', 'WINUSER', 'ODE']) + PyTargetAdd('ode.pyd', input='ode_module.obj') + PyTargetAdd('ode.pyd', input='libpandaode_igate.obj') + PyTargetAdd('ode.pyd', input='p3ode_ext_composite.obj') + PyTargetAdd('ode.pyd', input='libpandaode.dll') + PyTargetAdd('ode.pyd', input='libp3interrogatedb.dll') + PyTargetAdd('ode.pyd', input=COMMON_PANDA_LIBS) + PyTargetAdd('ode.pyd', opts=['WINUSER', 'ODE']) # # DIRECTORY: panda/src/bullet/ @@ -5052,11 +4999,10 @@ if (PkgSkip("BULLET")==0 and not RUNTIME): OPTS=['DIR:panda/src/bullet', 'BUILDING:PANDABULLET', 'BULLET'] TargetAdd('p3bullet_composite.obj', opts=OPTS, input='p3bullet_composite.cxx') - OPTS=['DIR:panda/src/bullet', 'BULLET', 'PYTHON'] + OPTS=['DIR:panda/src/bullet', 'BULLET'] IGATEFILES=GetDirectoryContents('panda/src/bullet', ["*.h", "*_composite*.cxx"]) TargetAdd('libpandabullet.in', opts=OPTS, input=IGATEFILES) TargetAdd('libpandabullet.in', opts=['IMOD:panda3d.bullet', 'ILIB:libpandabullet', 'SRCDIR:panda/src/bullet']) - TargetAdd('libpandabullet_igate.obj', input='libpandabullet.in', opts=["DEPENDENCYONLY"]) # # DIRECTORY: panda/metalibs/pandabullet/ @@ -5070,56 +5016,55 @@ if (PkgSkip("BULLET")==0 and not RUNTIME): TargetAdd('libpandabullet.dll', input=COMMON_PANDA_LIBS) TargetAdd('libpandabullet.dll', opts=['WINUSER', 'BULLET']) - OPTS=['DIR:panda/metalibs/pandabullet', 'BULLET', 'PYTHON'] - TargetAdd('bullet_module.obj', input='libpandabullet.in') - TargetAdd('bullet_module.obj', opts=OPTS) - TargetAdd('bullet_module.obj', opts=['IMOD:panda3d.bullet', 'ILIB:bullet', 'IMPORT:panda3d.core']) + OPTS=['DIR:panda/metalibs/pandabullet', 'BULLET'] + PyTargetAdd('bullet_module.obj', input='libpandabullet.in') + PyTargetAdd('bullet_module.obj', opts=OPTS) + PyTargetAdd('bullet_module.obj', opts=['IMOD:panda3d.bullet', 'ILIB:bullet', 'IMPORT:panda3d.core']) - TargetAdd('bullet.pyd', input='bullet_module.obj') - TargetAdd('bullet.pyd', input='libpandabullet_igate.obj') - TargetAdd('bullet.pyd', input='libpandabullet.dll') - TargetAdd('bullet.pyd', input='libp3interrogatedb.dll') - TargetAdd('bullet.pyd', input=COMMON_PANDA_LIBS) - TargetAdd('bullet.pyd', opts=['PYTHON', 'WINUSER', 'BULLET']) + PyTargetAdd('bullet.pyd', input='bullet_module.obj') + PyTargetAdd('bullet.pyd', input='libpandabullet_igate.obj') + PyTargetAdd('bullet.pyd', input='libpandabullet.dll') + PyTargetAdd('bullet.pyd', input='libp3interrogatedb.dll') + PyTargetAdd('bullet.pyd', input=COMMON_PANDA_LIBS) + PyTargetAdd('bullet.pyd', opts=['WINUSER', 'BULLET']) # # DIRECTORY: panda/src/physx/ # if (PkgSkip("PHYSX")==0): - OPTS=['DIR:panda/src/physx', 'BUILDING:PANDAPHYSX', 'PHYSX', 'NOARCH:PPC', 'PYTHON'] + OPTS=['DIR:panda/src/physx', 'BUILDING:PANDAPHYSX', 'PHYSX', 'NOARCH:PPC'] TargetAdd('p3physx_composite.obj', opts=OPTS, input='p3physx_composite.cxx') - OPTS=['DIR:panda/src/physx', 'PHYSX', 'NOARCH:PPC', 'PYTHON'] + OPTS=['DIR:panda/src/physx', 'PHYSX', 'NOARCH:PPC'] IGATEFILES=GetDirectoryContents('panda/src/physx', ["*.h", "*_composite*.cxx"]) TargetAdd('libpandaphysx.in', opts=OPTS, input=IGATEFILES) TargetAdd('libpandaphysx.in', opts=['IMOD:panda3d.physx', 'ILIB:libpandaphysx', 'SRCDIR:panda/src/physx']) - TargetAdd('libpandaphysx_igate.obj', input='libpandaphysx.in', opts=["DEPENDENCYONLY"]) # # DIRECTORY: panda/metalibs/pandaphysx/ # if (PkgSkip("PHYSX")==0): - OPTS=['DIR:panda/metalibs/pandaphysx', 'BUILDING:PANDAPHYSX', 'PHYSX', 'NOARCH:PPC'] + OPTS=['DIR:panda/metalibs/pandaphysx', 'BUILDING:PANDAPHYSX', 'PHYSX', 'NOARCH:PPC', 'PYTHON'] TargetAdd('pandaphysx_pandaphysx.obj', opts=OPTS, input='pandaphysx.cxx') TargetAdd('libpandaphysx.dll', input='pandaphysx_pandaphysx.obj') TargetAdd('libpandaphysx.dll', input='p3physx_composite.obj') TargetAdd('libpandaphysx.dll', input=COMMON_PANDA_LIBS) - TargetAdd('libpandaphysx.dll', opts=['WINUSER', 'PHYSX', 'NOARCH:PPC', 'PYTHON']) + TargetAdd('libpandaphysx.dll', opts=['WINUSER', 'PHYSX', 'NOARCH:PPC']) - OPTS=['DIR:panda/metalibs/pandaphysx', 'PHYSX', 'NOARCH:PPC', 'PYTHON'] - TargetAdd('physx_module.obj', input='libpandaphysx.in') - TargetAdd('physx_module.obj', opts=OPTS) - TargetAdd('physx_module.obj', opts=['IMOD:panda3d.physx', 'ILIB:physx', 'IMPORT:panda3d.core']) + OPTS=['DIR:panda/metalibs/pandaphysx', 'PHYSX', 'NOARCH:PPC'] + PyTargetAdd('physx_module.obj', input='libpandaphysx.in') + PyTargetAdd('physx_module.obj', opts=OPTS) + PyTargetAdd('physx_module.obj', opts=['IMOD:panda3d.physx', 'ILIB:physx', 'IMPORT:panda3d.core']) - TargetAdd('physx.pyd', input='physx_module.obj') - TargetAdd('physx.pyd', input='libpandaphysx_igate.obj') - TargetAdd('physx.pyd', input='libpandaphysx.dll') - TargetAdd('physx.pyd', input='libp3interrogatedb.dll') - TargetAdd('physx.pyd', input=COMMON_PANDA_LIBS) - TargetAdd('physx.pyd', opts=['PYTHON', 'WINUSER', 'PHYSX', 'NOARCH:PPC']) + PyTargetAdd('physx.pyd', input='physx_module.obj') + PyTargetAdd('physx.pyd', input='libpandaphysx_igate.obj') + PyTargetAdd('physx.pyd', input='libpandaphysx.dll') + PyTargetAdd('physx.pyd', input='libp3interrogatedb.dll') + PyTargetAdd('physx.pyd', input=COMMON_PANDA_LIBS) + PyTargetAdd('physx.pyd', opts=['WINUSER', 'PHYSX', 'NOARCH:PPC']) # # DIRECTORY: panda/src/physics/ @@ -5130,12 +5075,11 @@ if (PkgSkip("PANDAPHYSICS")==0) and (not RUNTIME): TargetAdd('p3physics_composite1.obj', opts=OPTS, input='p3physics_composite1.cxx') TargetAdd('p3physics_composite2.obj', opts=OPTS, input='p3physics_composite2.cxx') - OPTS=['DIR:panda/src/physics', 'PYTHON'] + OPTS=['DIR:panda/src/physics'] IGATEFILES=GetDirectoryContents('panda/src/physics', ["*.h", "*_composite*.cxx"]) IGATEFILES.remove("forces.h") TargetAdd('libp3physics.in', opts=OPTS, input=IGATEFILES) TargetAdd('libp3physics.in', opts=['IMOD:panda3d.physics', 'ILIB:libp3physics', 'SRCDIR:panda/src/physics']) - TargetAdd('libp3physics_igate.obj', input='libp3physics.in', opts=["DEPENDENCYONLY"]) # # DIRECTORY: panda/src/particlesystem/ @@ -5146,7 +5090,7 @@ if (PkgSkip("PANDAPHYSICS")==0) and (PkgSkip("PANDAPARTICLESYSTEM")==0) and (not TargetAdd('p3particlesystem_composite1.obj', opts=OPTS, input='p3particlesystem_composite1.cxx') TargetAdd('p3particlesystem_composite2.obj', opts=OPTS, input='p3particlesystem_composite2.cxx') - OPTS=['DIR:panda/src/particlesystem', 'PYTHON'] + OPTS=['DIR:panda/src/particlesystem'] IGATEFILES=GetDirectoryContents('panda/src/particlesystem', ["*.h", "*_composite*.cxx"]) IGATEFILES.remove('orientedParticle.h') IGATEFILES.remove('orientedParticleFactory.h') @@ -5155,7 +5099,6 @@ if (PkgSkip("PANDAPHYSICS")==0) and (PkgSkip("PANDAPARTICLESYSTEM")==0) and (not IGATEFILES.remove('particles.h') TargetAdd('libp3particlesystem.in', opts=OPTS, input=IGATEFILES) TargetAdd('libp3particlesystem.in', opts=['IMOD:panda3d.physics', 'ILIB:libp3particlesystem', 'SRCDIR:panda/src/particlesystem']) - TargetAdd('libp3particlesystem_igate.obj', input='libp3particlesystem.in', opts=["DEPENDENCYONLY"]) # # DIRECTORY: panda/metalibs/pandaphysics/ @@ -5173,38 +5116,37 @@ if (PkgSkip("PANDAPHYSICS")==0) and (not RUNTIME): TargetAdd('libpandaphysics.dll', input=COMMON_PANDA_LIBS) TargetAdd('libpandaphysics.dll', opts=['ADVAPI']) - OPTS=['DIR:panda/metalibs/pandaphysics', 'PYTHON'] - TargetAdd('physics_module.obj', input='libp3physics.in') + OPTS=['DIR:panda/metalibs/pandaphysics'] + PyTargetAdd('physics_module.obj', input='libp3physics.in') if (PkgSkip("PANDAPARTICLESYSTEM")==0): - TargetAdd('physics_module.obj', input='libp3particlesystem.in') - TargetAdd('physics_module.obj', opts=OPTS) - TargetAdd('physics_module.obj', opts=['IMOD:panda3d.physics', 'ILIB:physics', 'IMPORT:panda3d.core']) + PyTargetAdd('physics_module.obj', input='libp3particlesystem.in') + PyTargetAdd('physics_module.obj', opts=OPTS) + PyTargetAdd('physics_module.obj', opts=['IMOD:panda3d.physics', 'ILIB:physics', 'IMPORT:panda3d.core']) - TargetAdd('physics.pyd', input='physics_module.obj') - TargetAdd('physics.pyd', input='libp3physics_igate.obj') + PyTargetAdd('physics.pyd', input='physics_module.obj') + PyTargetAdd('physics.pyd', input='libp3physics_igate.obj') if (PkgSkip("PANDAPARTICLESYSTEM")==0): - TargetAdd('physics.pyd', input='libp3particlesystem_igate.obj') - TargetAdd('physics.pyd', input='libpandaphysics.dll') - TargetAdd('physics.pyd', input='libp3interrogatedb.dll') - TargetAdd('physics.pyd', input=COMMON_PANDA_LIBS) - TargetAdd('physics.pyd', opts=['PYTHON']) + PyTargetAdd('physics.pyd', input='libp3particlesystem_igate.obj') + PyTargetAdd('physics.pyd', input='libpandaphysics.dll') + PyTargetAdd('physics.pyd', input='libp3interrogatedb.dll') + PyTargetAdd('physics.pyd', input=COMMON_PANDA_LIBS) # # DIRECTORY: panda/src/speedtree/ # if (PkgSkip("SPEEDTREE")==0): - OPTS=['DIR:panda/src/speedtree', 'BUILDING:PANDASPEEDTREE', 'SPEEDTREE', 'PYTHON'] + OPTS=['DIR:panda/src/speedtree', 'BUILDING:PANDASPEEDTREE', 'SPEEDTREE'] TargetAdd('pandaspeedtree_composite1.obj', opts=OPTS, input='pandaspeedtree_composite1.cxx') IGATEFILES=GetDirectoryContents('panda/src/speedtree', ["*.h", "*_composite*.cxx"]) TargetAdd('libpandaspeedtree.in', opts=OPTS, input=IGATEFILES) TargetAdd('libpandaspeedtree.in', opts=['IMOD:libpandaspeedtree', 'ILIB:libpandaspeedtree', 'SRCDIR:panda/src/speedtree']) - TargetAdd('libpandaspeedtree_igate.obj', input='libpandaspeedtree.in', opts=["DEPENDENCYONLY"]) - TargetAdd('libpandaspeedtree_module.obj', input='libpandaspeedtree.in') - TargetAdd('libpandaspeedtree_module.obj', opts=OPTS) - TargetAdd('libpandaspeedtree_module.obj', opts=['IMOD:libpandaspeedtree', 'ILIB:libpandaspeedtree']) + + PyTargetAdd('libpandaspeedtree_module.obj', input='libpandaspeedtree.in') + PyTargetAdd('libpandaspeedtree_module.obj', opts=OPTS) + PyTargetAdd('libpandaspeedtree_module.obj', opts=['IMOD:libpandaspeedtree', 'ILIB:libpandaspeedtree']) TargetAdd('libpandaspeedtree.dll', input='pandaspeedtree_composite1.obj') - TargetAdd('libpandaspeedtree.dll', input='libpandaspeedtree_igate.obj') + PyTargetAdd('libpandaspeedtree.dll', input='libpandaspeedtree_igate.obj') TargetAdd('libpandaspeedtree.dll', input='libpandaspeedtree_module.obj') TargetAdd('libpandaspeedtree.dll', input=COMMON_PANDA_LIBS) TargetAdd('libpandaspeedtree.dll', opts=['SPEEDTREE']) @@ -5267,7 +5209,7 @@ if (not RUNTIME and GetTarget() == 'android'): TargetAdd('libppython.dll', input='libp3framework.dll') TargetAdd('libppython.dll', input='libp3android.dll') TargetAdd('libppython.dll', input=COMMON_PANDA_LIBS) - TargetAdd('libppython.dll', opts=['MODULE', 'ANDROID', 'PYTHON']) + TargetAdd('libppython.dll', opts=['MODULE', 'ANDROID']) # # DIRECTORY: panda/src/androiddisplay/ @@ -5324,7 +5266,7 @@ if (not RUNTIME and (GetTarget() in ('windows', 'darwin') or PkgSkip("X11")==0) # if (PkgSkip("DIRECT")==0): - OPTS=['DIR:direct/src/directbase', 'PYTHON'] + OPTS=['DIR:direct/src/directbase'] TargetAdd('p3directbase_directbase.obj', opts=OPTS+['BUILDING:DIRECT'], input='directbase.cxx') # @@ -5332,21 +5274,20 @@ if (PkgSkip("DIRECT")==0): # if (PkgSkip("DIRECT")==0): - OPTS=['DIR:direct/src/dcparser', 'BUILDING:DIRECT_DCPARSER', 'WITHINPANDA', 'BISONPREFIX_dcyy', 'PYTHON'] + OPTS=['DIR:direct/src/dcparser', 'BUILDING:DIRECT_DCPARSER', 'WITHINPANDA', 'BISONPREFIX_dcyy'] CreateFile(GetOutputDir()+"/include/dcParser.h") - TargetAdd('p3dcparser_dcParser.obj', opts=OPTS, input='dcParser.yxx') - TargetAdd('dcParser.h', input='p3dcparser_dcParser.obj', opts=['DEPENDENCYONLY']) - TargetAdd('p3dcparser_dcLexer.obj', opts=OPTS, input='dcLexer.lxx') - TargetAdd('p3dcparser_composite1.obj', opts=OPTS, input='p3dcparser_composite1.cxx') - TargetAdd('p3dcparser_composite2.obj', opts=OPTS, input='p3dcparser_composite2.cxx') + PyTargetAdd('p3dcparser_dcParser.obj', opts=OPTS, input='dcParser.yxx') + #TargetAdd('dcParser.h', input='p3dcparser_dcParser.obj', opts=['DEPENDENCYONLY']) + PyTargetAdd('p3dcparser_dcLexer.obj', opts=OPTS, input='dcLexer.lxx') + PyTargetAdd('p3dcparser_composite1.obj', opts=OPTS, input='p3dcparser_composite1.cxx') + PyTargetAdd('p3dcparser_composite2.obj', opts=OPTS, input='p3dcparser_composite2.cxx') - OPTS=['DIR:direct/src/dcparser', 'WITHINPANDA', 'PYTHON'] + OPTS=['DIR:direct/src/dcparser', 'WITHINPANDA'] IGATEFILES=GetDirectoryContents('direct/src/dcparser', ["*.h", "*_composite*.cxx"]) if "dcParser.h" in IGATEFILES: IGATEFILES.remove("dcParser.h") if "dcmsgtypes.h" in IGATEFILES: IGATEFILES.remove('dcmsgtypes.h') TargetAdd('libp3dcparser.in', opts=OPTS, input=IGATEFILES) TargetAdd('libp3dcparser.in', opts=['IMOD:panda3d.direct', 'ILIB:libp3dcparser', 'SRCDIR:direct/src/dcparser']) - TargetAdd('libp3dcparser_igate.obj', input='libp3dcparser.in', opts=["DEPENDENCYONLY"]) # # DIRECTORY: direct/src/deadrec/ @@ -5356,27 +5297,25 @@ if (PkgSkip("DIRECT")==0): OPTS=['DIR:direct/src/deadrec', 'BUILDING:DIRECT'] TargetAdd('p3deadrec_composite1.obj', opts=OPTS, input='p3deadrec_composite1.cxx') - OPTS=['DIR:direct/src/deadrec', 'PYTHON'] + OPTS=['DIR:direct/src/deadrec'] IGATEFILES=GetDirectoryContents('direct/src/deadrec', ["*.h", "*_composite*.cxx"]) TargetAdd('libp3deadrec.in', opts=OPTS, input=IGATEFILES) TargetAdd('libp3deadrec.in', opts=['IMOD:panda3d.direct', 'ILIB:libp3deadrec', 'SRCDIR:direct/src/deadrec']) - TargetAdd('libp3deadrec_igate.obj', input='libp3deadrec.in', opts=["DEPENDENCYONLY"]) # # DIRECTORY: direct/src/distributed/ # if (PkgSkip("DIRECT")==0): - OPTS=['DIR:direct/src/distributed', 'DIR:direct/src/dcparser', 'WITHINPANDA', 'BUILDING:DIRECT', 'OPENSSL', 'PYTHON'] + OPTS=['DIR:direct/src/distributed', 'DIR:direct/src/dcparser', 'WITHINPANDA', 'BUILDING:DIRECT', 'OPENSSL'] TargetAdd('p3distributed_config_distributed.obj', opts=OPTS, input='config_distributed.cxx') - TargetAdd('p3distributed_cConnectionRepository.obj', opts=OPTS, input='cConnectionRepository.cxx') - TargetAdd('p3distributed_cDistributedSmoothNodeBase.obj', opts=OPTS, input='cDistributedSmoothNodeBase.cxx') + PyTargetAdd('p3distributed_cConnectionRepository.obj', opts=OPTS, input='cConnectionRepository.cxx') + PyTargetAdd('p3distributed_cDistributedSmoothNodeBase.obj', opts=OPTS, input='cDistributedSmoothNodeBase.cxx') - OPTS=['DIR:direct/src/distributed', 'WITHINPANDA', 'OPENSSL', 'PYTHON'] + OPTS=['DIR:direct/src/distributed', 'WITHINPANDA', 'OPENSSL'] IGATEFILES=GetDirectoryContents('direct/src/distributed', ["*.h", "*.cxx"]) TargetAdd('libp3distributed.in', opts=OPTS, input=IGATEFILES) TargetAdd('libp3distributed.in', opts=['IMOD:panda3d.direct', 'ILIB:libp3distributed', 'SRCDIR:direct/src/distributed']) - TargetAdd('libp3distributed_igate.obj', input='libp3distributed.in', opts=["DEPENDENCYONLY"]) # # DIRECTORY: direct/src/interval/ @@ -5386,11 +5325,10 @@ if (PkgSkip("DIRECT")==0): OPTS=['DIR:direct/src/interval', 'BUILDING:DIRECT'] TargetAdd('p3interval_composite1.obj', opts=OPTS, input='p3interval_composite1.cxx') - OPTS=['DIR:direct/src/interval', 'PYTHON'] + OPTS=['DIR:direct/src/interval'] IGATEFILES=GetDirectoryContents('direct/src/interval', ["*.h", "*_composite*.cxx"]) TargetAdd('libp3interval.in', opts=OPTS, input=IGATEFILES) TargetAdd('libp3interval.in', opts=['IMOD:panda3d.direct', 'ILIB:libp3interval', 'SRCDIR:direct/src/interval']) - TargetAdd('libp3interval_igate.obj', input='libp3interval.in', opts=["DEPENDENCYONLY"]) # # DIRECTORY: direct/src/showbase/ @@ -5402,11 +5340,10 @@ if (PkgSkip("DIRECT")==0): if GetTarget() == 'darwin': TargetAdd('p3showbase_showBase_assist.obj', opts=OPTS, input='showBase_assist.mm') - OPTS=['DIR:direct/src/showbase', 'PYTHON'] + OPTS=['DIR:direct/src/showbase'] IGATEFILES=GetDirectoryContents('direct/src/showbase', ["*.h", "showBase.cxx"]) TargetAdd('libp3showbase.in', opts=OPTS, input=IGATEFILES) TargetAdd('libp3showbase.in', opts=['IMOD:panda3d.direct', 'ILIB:libp3showbase', 'SRCDIR:direct/src/showbase']) - TargetAdd('libp3showbase_igate.obj', input='libp3showbase.in', opts=["DEPENDENCYONLY"]) # # DIRECTORY: direct/src/motiontrail/ @@ -5417,11 +5354,10 @@ if (PkgSkip("DIRECT")==0): TargetAdd('p3motiontrail_cMotionTrail.obj', opts=OPTS, input='cMotionTrail.cxx') TargetAdd('p3motiontrail_config_motiontrail.obj', opts=OPTS, input='config_motiontrail.cxx') - OPTS=['DIR:direct/src/motiontrail', 'PYTHON'] + OPTS=['DIR:direct/src/motiontrail'] IGATEFILES=GetDirectoryContents('direct/src/motiontrail', ["*.h", "cMotionTrail.cxx"]) TargetAdd('libp3motiontrail.in', opts=OPTS, input=IGATEFILES) TargetAdd('libp3motiontrail.in', opts=['IMOD:panda3d.direct', 'ILIB:libp3motiontrail', 'SRCDIR:direct/src/motiontrail']) - TargetAdd('libp3motiontrail_igate.obj', input='libp3motiontrail.in', opts=["DEPENDENCYONLY"]) # # DIRECTORY: direct/metalibs/direct/ @@ -5439,56 +5375,54 @@ if (PkgSkip("DIRECT")==0): TargetAdd('libp3direct.dll', input=COMMON_PANDA_LIBS) TargetAdd('libp3direct.dll', opts=['ADVAPI', 'OPENSSL', 'WINUSER', 'WINGDI']) - OPTS=['PYTHON'] - TargetAdd('direct_module.obj', input='libp3dcparser.in') - TargetAdd('direct_module.obj', input='libp3showbase.in') - TargetAdd('direct_module.obj', input='libp3deadrec.in') - TargetAdd('direct_module.obj', input='libp3interval.in') - TargetAdd('direct_module.obj', input='libp3distributed.in') - TargetAdd('direct_module.obj', input='libp3motiontrail.in') - TargetAdd('direct_module.obj', opts=OPTS) - TargetAdd('direct_module.obj', opts=['IMOD:panda3d.direct', 'ILIB:direct', 'IMPORT:panda3d.core']) + PyTargetAdd('direct_module.obj', input='libp3dcparser.in') + PyTargetAdd('direct_module.obj', input='libp3showbase.in') + PyTargetAdd('direct_module.obj', input='libp3deadrec.in') + PyTargetAdd('direct_module.obj', input='libp3interval.in') + PyTargetAdd('direct_module.obj', input='libp3distributed.in') + PyTargetAdd('direct_module.obj', input='libp3motiontrail.in') + PyTargetAdd('direct_module.obj', opts=['IMOD:panda3d.direct', 'ILIB:direct', 'IMPORT:panda3d.core']) - TargetAdd('direct.pyd', input='libp3dcparser_igate.obj') - TargetAdd('direct.pyd', input='libp3showbase_igate.obj') - TargetAdd('direct.pyd', input='libp3deadrec_igate.obj') - TargetAdd('direct.pyd', input='libp3interval_igate.obj') - TargetAdd('direct.pyd', input='libp3distributed_igate.obj') - TargetAdd('direct.pyd', input='libp3motiontrail_igate.obj') + PyTargetAdd('direct.pyd', input='libp3dcparser_igate.obj') + PyTargetAdd('direct.pyd', input='libp3showbase_igate.obj') + PyTargetAdd('direct.pyd', input='libp3deadrec_igate.obj') + PyTargetAdd('direct.pyd', input='libp3interval_igate.obj') + PyTargetAdd('direct.pyd', input='libp3distributed_igate.obj') + PyTargetAdd('direct.pyd', input='libp3motiontrail_igate.obj') # These are part of direct.pyd, not libp3direct.dll, because they rely on # the Python libraries. If a C++ user needs these modules, we can move them # back and filter out the Python-specific code. - TargetAdd('direct.pyd', input='p3dcparser_composite1.obj') - TargetAdd('direct.pyd', input='p3dcparser_composite2.obj') - TargetAdd('direct.pyd', input='p3dcparser_dcParser.obj') - TargetAdd('direct.pyd', input='p3dcparser_dcLexer.obj') - TargetAdd('direct.pyd', input='p3distributed_config_distributed.obj') - TargetAdd('direct.pyd', input='p3distributed_cConnectionRepository.obj') - TargetAdd('direct.pyd', input='p3distributed_cDistributedSmoothNodeBase.obj') + PyTargetAdd('direct.pyd', input='p3dcparser_composite1.obj') + PyTargetAdd('direct.pyd', input='p3dcparser_composite2.obj') + PyTargetAdd('direct.pyd', input='p3dcparser_dcParser.obj') + PyTargetAdd('direct.pyd', input='p3dcparser_dcLexer.obj') + PyTargetAdd('direct.pyd', input='p3distributed_config_distributed.obj') + PyTargetAdd('direct.pyd', input='p3distributed_cConnectionRepository.obj') + PyTargetAdd('direct.pyd', input='p3distributed_cDistributedSmoothNodeBase.obj') - TargetAdd('direct.pyd', input='direct_module.obj') - TargetAdd('direct.pyd', input='libp3direct.dll') - TargetAdd('direct.pyd', input='libp3interrogatedb.dll') - TargetAdd('direct.pyd', input=COMMON_PANDA_LIBS) - TargetAdd('direct.pyd', opts=['PYTHON', 'OPENSSL', 'WINUSER', 'WINGDI', 'WINSOCK2']) + PyTargetAdd('direct.pyd', input='direct_module.obj') + PyTargetAdd('direct.pyd', input='libp3direct.dll') + PyTargetAdd('direct.pyd', input='libp3interrogatedb.dll') + PyTargetAdd('direct.pyd', input=COMMON_PANDA_LIBS) + PyTargetAdd('direct.pyd', opts=['OPENSSL', 'WINUSER', 'WINGDI', 'WINSOCK2']) # # DIRECTORY: direct/src/dcparse/ # if (PkgSkip("PYTHON")==0 and PkgSkip("DIRECT")==0 and not RTDIST and not RUNTIME): - OPTS=['DIR:direct/src/dcparse', 'DIR:direct/src/dcparser', 'WITHINPANDA', 'ADVAPI', 'PYTHON'] - TargetAdd('dcparse_dcparse.obj', opts=OPTS, input='dcparse.cxx') - TargetAdd('p3dcparse.exe', input='p3dcparser_composite1.obj') - TargetAdd('p3dcparse.exe', input='p3dcparser_composite2.obj') - TargetAdd('p3dcparse.exe', input='p3dcparser_dcParser.obj') - TargetAdd('p3dcparse.exe', input='p3dcparser_dcLexer.obj') - TargetAdd('p3dcparse.exe', input='dcparse_dcparse.obj') - TargetAdd('p3dcparse.exe', input='libp3direct.dll') - TargetAdd('p3dcparse.exe', input=COMMON_PANDA_LIBS) - TargetAdd('p3dcparse.exe', input='libp3pystub.lib') - TargetAdd('p3dcparse.exe', opts=['ADVAPI', 'PYTHON']) + OPTS=['DIR:direct/src/dcparse', 'DIR:direct/src/dcparser', 'WITHINPANDA', 'ADVAPI'] + PyTargetAdd('dcparse_dcparse.obj', opts=OPTS, input='dcparse.cxx') + PyTargetAdd('p3dcparse.exe', input='p3dcparser_composite1.obj') + PyTargetAdd('p3dcparse.exe', input='p3dcparser_composite2.obj') + PyTargetAdd('p3dcparse.exe', input='p3dcparser_dcParser.obj') + PyTargetAdd('p3dcparse.exe', input='p3dcparser_dcLexer.obj') + PyTargetAdd('p3dcparse.exe', input='dcparse_dcparse.obj') + PyTargetAdd('p3dcparse.exe', input='libp3direct.dll') + PyTargetAdd('p3dcparse.exe', input=COMMON_PANDA_LIBS) + PyTargetAdd('p3dcparse.exe', input='libp3pystub.lib') + PyTargetAdd('p3dcparse.exe', opts=['ADVAPI']) # # DIRECTORY: direct/src/plugin/ @@ -5537,7 +5471,7 @@ if (RTDIST or RUNTIME): if (PkgSkip("PYTHON")==0 and RTDIST): # Freeze VFSImporter and its dependency modules into p3dpython. # Mark panda3d.core as a dependency to make sure to build that first. - TargetAdd('p3dpython_frozen.obj', input='VFSImporter.py', opts=['DIR:direct/src/showbase', 'FREEZE_STARTUP', 'PYTHON']) + TargetAdd('p3dpython_frozen.obj', input='VFSImporter.py', opts=['DIR:direct/src/showbase', 'FREEZE_STARTUP']) TargetAdd('p3dpython_frozen.obj', dep='core.pyd') OPTS += ['PYTHON'] @@ -5569,7 +5503,7 @@ if (RTDIST or RUNTIME): TargetAdd('p3dpythonw.exe', input=COMMON_PANDA_LIBS) TargetAdd('p3dpythonw.exe', input='libp3tinyxml.ilb') TargetAdd('p3dpythonw.exe', input='libp3interrogatedb.dll') - TargetAdd('p3dpythonw.exe', opts=['SUBSYSTEM:WINDOWS', 'PYTHON', 'WINUSER']) + TargetAdd('p3dpythonw.exe', opts=['SUBSYSTEM:WINDOWS', 'WINUSER']) if (PkgSkip("OPENSSL")==0 and RTDIST and False): OPTS=['DIR:direct/src/plugin', 'DIR:panda/src/express', 'OPENSSL'] @@ -6439,7 +6373,6 @@ if not PkgSkip("PANDATOOL") and not PkgSkip("EGG"): # TargetAdd('bin2c.exe', input='libp3progbase.lib') # TargetAdd('bin2c.exe', input='libp3pandatoolbase.lib') # TargetAdd('bin2c.exe', input=COMMON_PANDA_LIBS) -# TargetAdd('bin2c.exe', input='libp3pystub.lib') # TargetAdd('bin2c.exe', opts=['ADVAPI']) # @@ -6660,45 +6593,41 @@ if (PkgSkip("CONTRIB")==0 and not RUNTIME): TargetAdd('libpandaai.dll', input='p3ai_composite1.obj') TargetAdd('libpandaai.dll', input=COMMON_PANDA_LIBS) - OPTS=['DIR:contrib/src/ai', 'PYTHON'] + OPTS=['DIR:contrib/src/ai'] IGATEFILES=GetDirectoryContents('contrib/src/ai', ["*.h", "*_composite*.cxx"]) TargetAdd('libpandaai.in', opts=OPTS, input=IGATEFILES) TargetAdd('libpandaai.in', opts=['IMOD:panda3d.ai', 'ILIB:libpandaai', 'SRCDIR:contrib/src/ai']) - TargetAdd('libpandaai_igate.obj', input='libpandaai.in', opts=["DEPENDENCYONLY"]) - TargetAdd('ai_module.obj', input='libpandaai.in') - TargetAdd('ai_module.obj', opts=OPTS) - TargetAdd('ai_module.obj', opts=['IMOD:panda3d.ai', 'ILIB:ai', 'IMPORT:panda3d.core']) + PyTargetAdd('ai_module.obj', input='libpandaai.in') + PyTargetAdd('ai_module.obj', opts=OPTS) + PyTargetAdd('ai_module.obj', opts=['IMOD:panda3d.ai', 'ILIB:ai', 'IMPORT:panda3d.core']) - TargetAdd('ai.pyd', input='ai_module.obj') - TargetAdd('ai.pyd', input='libpandaai_igate.obj') - TargetAdd('ai.pyd', input='libpandaai.dll') - TargetAdd('ai.pyd', input='libp3interrogatedb.dll') - TargetAdd('ai.pyd', input=COMMON_PANDA_LIBS) - TargetAdd('ai.pyd', opts=['PYTHON']) + PyTargetAdd('ai.pyd', input='ai_module.obj') + PyTargetAdd('ai.pyd', input='libpandaai_igate.obj') + PyTargetAdd('ai.pyd', input='libpandaai.dll') + PyTargetAdd('ai.pyd', input='libp3interrogatedb.dll') + PyTargetAdd('ai.pyd', input=COMMON_PANDA_LIBS) # # DIRECTORY: contrib/src/rplight/ # if not PkgSkip("CONTRIB") and not PkgSkip("PYTHON") and not RUNTIME: - OPTS=['DIR:contrib/src/rplight', 'BUILDING:RPLIGHT', 'PYTHON'] + OPTS=['DIR:contrib/src/rplight', 'BUILDING:RPLIGHT'] TargetAdd('p3rplight_composite1.obj', opts=OPTS, input='p3rplight_composite1.cxx') IGATEFILES=GetDirectoryContents('contrib/src/rplight', ["*.h", "*_composite*.cxx"]) TargetAdd('libp3rplight.in', opts=OPTS, input=IGATEFILES) TargetAdd('libp3rplight.in', opts=['IMOD:panda3d._rplight', 'ILIB:libp3rplight', 'SRCDIR:contrib/src/rplight']) - TargetAdd('libp3rplight_igate.obj', input='libp3rplight.in', opts=["DEPENDENCYONLY"]) - TargetAdd('rplight_module.obj', input='libp3rplight.in') - TargetAdd('rplight_module.obj', opts=OPTS) - TargetAdd('rplight_module.obj', opts=['IMOD:panda3d._rplight', 'ILIB:_rplight', 'IMPORT:panda3d.core']) + PyTargetAdd('rplight_module.obj', input='libp3rplight.in') + PyTargetAdd('rplight_module.obj', opts=OPTS) + PyTargetAdd('rplight_module.obj', opts=['IMOD:panda3d._rplight', 'ILIB:_rplight', 'IMPORT:panda3d.core']) - TargetAdd('_rplight.pyd', input='rplight_module.obj') - TargetAdd('_rplight.pyd', input='libp3rplight_igate.obj') - TargetAdd('_rplight.pyd', input='p3rplight_composite1.obj') - TargetAdd('_rplight.pyd', input='libp3interrogatedb.dll') - TargetAdd('_rplight.pyd', input=COMMON_PANDA_LIBS) - TargetAdd('_rplight.pyd', opts=['PYTHON']) + PyTargetAdd('_rplight.pyd', input='rplight_module.obj') + PyTargetAdd('_rplight.pyd', input='libp3rplight_igate.obj') + PyTargetAdd('_rplight.pyd', input='p3rplight_composite1.obj') + PyTargetAdd('_rplight.pyd', input='libp3interrogatedb.dll') + PyTargetAdd('_rplight.pyd', input=COMMON_PANDA_LIBS) # # DIRECTORY: pandatool/src/deploy-stub @@ -6996,6 +6925,7 @@ def MakeInstallerNSIS(file, title, installdir): 'SOURCE' : '..', 'PYVER' : SDK["PYTHONVERSION"][6:9], 'REGVIEW' : regview, + 'EXT_SUFFIX' : GetExtensionSuffix(), } if GetHost() == 'windows': @@ -7007,7 +6937,7 @@ def MakeInstallerNSIS(file, title, installdir): for item in nsis_defs.items(): cmd += ' -D%s="%s"' % item - cmd += ' "makepanda\installer.nsi"' + cmd += ' "makepanda\\installer.nsi"' oscmd(cmd) def MakeDebugSymbolArchive(zipname, dirname): @@ -7408,8 +7338,9 @@ def MakeInstallerOSX(): if ((base != "extensions") and (base != "extensions_native")): compileall.compile_dir("dstroot/pythoncode/Developer/Panda3D/direct/"+base) + suffix = GetExtensionSuffix() for base in os.listdir(GetOutputDir()+"/panda3d"): - if base.endswith('.py') or base.endswith('.so'): + if base.endswith('.py') or (base.endswith(suffix) and '.' not in base[:-len(suffix)]): libname = "dstroot/pythoncode/Developer/Panda3D/panda3d/" + base # We really need to specify -R in order not to follow symlinks # On OSX, just specifying -P is not enough to do that. @@ -7697,8 +7628,9 @@ def MakeInstallerAndroid(): if not base.endswith(suffix): continue modname = base[:-len(suffix)] - source = os.path.join(source_dir, base) - copy_library(source, "libpy.panda3d.{}.so".format(modname)) + if '.' not in modname: + source = os.path.join(source_dir, base) + copy_library(source, "libpy.panda3d.{}.so".format(modname)) # Same for standard Python modules. import _ctypes diff --git a/makepanda/makepandacore.py b/makepanda/makepandacore.py index 186fecd9ef..1d4c4a9e24 100644 --- a/makepanda/makepandacore.py +++ b/makepanda/makepandacore.py @@ -3190,6 +3190,48 @@ def WriteResourceFile(basename, **kwargs): ConditionalWriteFile(basename, GenerateResourceFile(**kwargs)) return basename + +def WriteEmbeddedStringFile(basename, inputs, string_name=None): + if os.path.splitext(basename)[1] not in SUFFIX_INC: + basename += '.cxx' + target = GetOutputDir() + "/tmp/" + basename + + if string_name is None: + string_name = os.path.basename(os.path.splitext(target)[0]) + string_name = string_name.replace('-', '_') + + data = bytearray() + for input in inputs: + fp = open(input, 'rb') + + # Insert a #line so that we get meaningful compile/assert errors when + # the result is inserted by interrogate_module into generated code. + if os.path.splitext(input)[1] in SUFFIX_INC: + line = '#line 1 "%s"\n' % (input) + data += bytearray(line.encode('ascii', 'replace')) + + data += bytearray(fp.read()) + fp.close() + + data.append(0) + + output = 'extern const char %s[] = {\n' % (string_name) + + i = 0 + for byte in data: + if i == 0: + output += ' ' + + output += ' 0x%02x,' % (byte) + i += 1 + if i >= 12: + output += '\n' + i = 0 + + output += '\n};\n' + ConditionalWriteFile(target, output) + return target + ######################################################################## ## ## FindLocation @@ -3197,6 +3239,8 @@ def WriteResourceFile(basename, **kwargs): ######################################################################## ORIG_EXT = {} +PYABI_SPECIFIC = set() +WARNED_FILES = set() def GetOrigExt(x): return ORIG_EXT[x] @@ -3207,14 +3251,42 @@ def SetOrigExt(x, v): def GetExtensionSuffix(): if sys.version_info >= (3, 0): suffix = sysconfig.get_config_var('EXT_SUFFIX') - if suffix: + if suffix == '.so': + # On my FreeBSD system, this is not set correctly, but SOABI is. + soabi = sysconfig.get_config_var('SOABI') + if soabi: + return '.%s.so' % (soabi) + elif suffix: return suffix + target = GetTarget() if target == 'windows': return '.pyd' else: return '.so' +def GetPythonABI(): + soabi = sysconfig.get_config_var('SOABI') + if soabi: + return soabi + + soabi = 'cpython-%d%d' % (sys.version_info[:2]) + + debug_flag = sysconfig.get_config_var('Py_DEBUG') + if (debug_flag is None and hasattr(sys, 'gettotalrefcount')) or debug_flag: + soabi += 'd' + + malloc_flag = sysconfig.get_config_var('WITH_PYMALLOC') + if malloc_flag is None or malloc_flag: + soabi += 'm' + + if sys.version_info < (3, 3): + usize = sysconfig.get_config_var('Py_UNICODE_SIZE') + if (usize is None and sys.maxunicode == 0x10ffff) or usize == 4: + soabi += 'u' + + return soabi + def CalcLocation(fn, ipath): if fn.startswith("panda3d/") and fn.endswith(".py"): return OUTPUTDIR + "/" + fn @@ -3285,11 +3357,25 @@ def CalcLocation(fn, ipath): return fn -def FindLocation(fn, ipath): +def FindLocation(fn, ipath, pyabi=None): if (GetLinkAllStatic() and fn.endswith(".dll")): fn = fn[:-4] + ".lib" loc = CalcLocation(fn, ipath) base, ext = os.path.splitext(fn) + + # If this is a target created with PyTargetAdd, we need to make sure it + # it put in a Python-version-specific directory. + if loc in PYABI_SPECIFIC: + if loc.startswith(OUTPUTDIR + "/tmp"): + if pyabi is not None: + loc = OUTPUTDIR + "/tmp/" + pyabi + loc[len(OUTPUTDIR) + 4:] + else: + raise RuntimeError("%s is a Python-specific target, use PyTargetAdd instead of TargetAdd" % (fn)) + + elif ext != ".pyd" and loc not in WARNED_FILES: + WARNED_FILES.add(loc) + print("%sWARNING:%s file depends on Python but is not in an ABI-specific directory: %s%s%s" % (GetColor("red"), GetColor(), GetColor("green"), loc, GetColor())) + ORIG_EXT[loc] = ext return loc @@ -3335,6 +3421,11 @@ def FindLocation(fn, ipath): ## be inserted: bison generates an OBJ and a secondary header ## file, interrogate generates an IN and a secondary IGATE.OBJ. ## +## PyTargetAdd is a special version for targets that depend on Python. +## It will create a target for each Python version we are building with, +## ensuring that builds with different Python versions won't conflict +## when we build for multiple Python ABIs side-by-side. +## ######################################################################## class Target: @@ -3343,7 +3434,7 @@ class Target: TARGET_LIST = [] TARGET_TABLE = {} -def TargetAdd(target, dummy=0, opts=[], input=[], dep=[], ipath=None, winrc=None): +def TargetAdd(target, dummy=0, opts=[], input=[], dep=[], ipath=None, winrc=None, pyabi=None): if (dummy != 0): exit("Syntax error in TargetAdd "+target) if ipath is None: ipath = opts @@ -3351,11 +3442,10 @@ def TargetAdd(target, dummy=0, opts=[], input=[], dep=[], ipath=None, winrc=None if (type(input) == str): input = [input] if (type(dep) == str): dep = [dep] - if os.path.splitext(target)[1] == '.pyd' and PkgSkip("PYTHON"): - # It makes no sense to build Python modules with python disabled. - return + if target.endswith(".pyd") and not pyabi: + raise RuntimeError("Use PyTargetAdd to build .pyd targets") - full = FindLocation(target, [OUTPUTDIR + "/include"]) + full = FindLocation(target, [OUTPUTDIR + "/include"], pyabi=pyabi) if (full not in TARGET_TABLE): t = Target() @@ -3374,7 +3464,7 @@ def TargetAdd(target, dummy=0, opts=[], input=[], dep=[], ipath=None, winrc=None ipath = [OUTPUTDIR + "/tmp"] + GetListOption(ipath, "DIR:") + [OUTPUTDIR+"/include"] for x in input: - fullinput = FindLocation(x, ipath) + fullinput = FindLocation(x, ipath, pyabi=pyabi) t.inputs.append(fullinput) # Don't re-link a library or binary if just its dependency dlls have been altered. # This should work out fine in most cases, and often reduces recompilation time. @@ -3413,7 +3503,7 @@ def TargetAdd(target, dummy=0, opts=[], input=[], dep=[], ipath=None, winrc=None t.deps[fulln] = 1 for x in dep: - fulldep = FindLocation(x, ipath) + fulldep = FindLocation(x, ipath, pyabi=pyabi) t.deps[fulldep] = 1 if winrc and GetTarget() == 'windows': @@ -3434,3 +3524,32 @@ def TargetAdd(target, dummy=0, opts=[], input=[], dep=[], ipath=None, winrc=None if target.endswith(".pz") and not CrossCompiling(): t.deps[FindLocation("pzip.exe", [])] = 1 + + if target.endswith(".in"): + # Also add a target to compile the _igate.cxx file into an _igate.obj. + outbase = os.path.basename(target)[:-3] + woutc = OUTPUTDIR + "/tmp/" + outbase + "_igate.cxx" + CxxDependencyCache[woutc] = [] + PyTargetAdd(outbase + "_igate.obj", opts=opts+['PYTHON','BIGOBJ'], input=woutc, dep=target) + + +def PyTargetAdd(target, opts=[], **kwargs): + if PkgSkip("PYTHON"): + return + + if 'PYTHON' not in opts: + opts = opts + ['PYTHON'] + + abi = GetPythonABI() + + MakeDirectory(OUTPUTDIR + "/tmp/" + abi) + + # Mark this target as being a Python-specific target. + orig = CalcLocation(target, [OUTPUTDIR + "/include"]) + PYABI_SPECIFIC.add(orig) + + if orig.startswith(OUTPUTDIR + "/tmp/") and os.path.exists(orig): + print("Removing file %s" % (orig)) + os.unlink(orig) + + TargetAdd(target, opts=opts, pyabi=abi, **kwargs) diff --git a/makepanda/makewheel.py b/makepanda/makewheel.py index 2f4680ae69..41d751281a 100644 --- a/makepanda/makewheel.py +++ b/makepanda/makewheel.py @@ -560,26 +560,39 @@ def makewheel(version, output_dir, platform=None): __version__ = '{0}' """.format(version)) + # Copy the extension modules from the panda3d directory. + ext_suffix = GetExtensionSuffix() + + for file in os.listdir(panda3d_dir): + if file == '__init__.py': + pass + elif file.endswith('.py') or (file.endswith(ext_suffix) and '.' not in file[:-len(ext_suffix)]): + source_path = os.path.join(panda3d_dir, file) + + if file.endswith('.pyd') and platform.startswith('cygwin'): + # Rename it to .dll for cygwin Python to be able to load it. + target_path = 'panda3d/' + os.path.splitext(file)[0] + '.dll' + else: + target_path = 'panda3d/' + file + + whl.write_file(target_path, source_path) + + # And copy the extension modules from the Python installation into the + # deploy_libs directory, for use by deploy-ng. ext_suffix = '.pyd' if sys.platform in ('win32', 'cygwin') else '.so' + ext_mod_dir = get_python_ext_module_dir() - ext_mod_dirs = [ - (panda3d_dir, 'panda3d/'), - (get_python_ext_module_dir(), 'deploy_libs/'), - ] - for srcdir, targetdir in ext_mod_dirs: - for file in os.listdir(srcdir): - if file == '__init__.py': - pass - elif file.endswith(ext_suffix) or file.endswith('.py'): - source_path = os.path.join(srcdir, file) + for file in os.listdir(ext_mod_dir): + if file.endswith(ext_suffix): + source_path = os.path.join(ext_mod_dir, file) - if file.endswith('.pyd') and platform.startswith('cygwin'): - # Rename it to .dll for cygwin Python to be able to load it. - target_path = targetdir + os.path.splitext(file)[0] + '.dll' - else: - target_path = targetdir + file + if file.endswith('.pyd') and platform.startswith('cygwin'): + # Rename it to .dll for cygwin Python to be able to load it. + target_path = 'deploy_libs/' + os.path.splitext(file)[0] + '.dll' + else: + target_path = 'deploy_libs/' + file - whl.write_file(target_path, source_path) + whl.write_file(target_path, source_path) # Add plug-ins. for lib in PLUGIN_LIBS: diff --git a/panda/src/audiotraits/fmodAudioSound.cxx b/panda/src/audiotraits/fmodAudioSound.cxx index dd060844e9..d8560658a7 100644 --- a/panda/src/audiotraits/fmodAudioSound.cxx +++ b/panda/src/audiotraits/fmodAudioSound.cxx @@ -651,7 +651,7 @@ get_3d_max_distance() const { * a balance [pan] function what is the point? */ PN_stdfloat FmodAudioSound:: -get_speaker_mix(AudioManager::SpeakerId speaker) { +get_speaker_mix(int speaker) { ReMutexHolder holder(FmodAudioManager::_lock); if (_channel == 0) { return 0.0; diff --git a/panda/src/audiotraits/fmodAudioSound.h b/panda/src/audiotraits/fmodAudioSound.h index 40de00823d..922ee976b7 100644 --- a/panda/src/audiotraits/fmodAudioSound.h +++ b/panda/src/audiotraits/fmodAudioSound.h @@ -126,7 +126,7 @@ public: AudioSound::SoundStatus status() const; - virtual PN_stdfloat get_speaker_mix(AudioManager::SpeakerId speaker); + virtual PN_stdfloat get_speaker_mix(int speaker); virtual void set_speaker_mix(PN_stdfloat frontleft, PN_stdfloat frontright, PN_stdfloat center, PN_stdfloat sub, PN_stdfloat backleft, PN_stdfloat backright, PN_stdfloat sideleft, PN_stdfloat sideright); void set_active(bool active=true); diff --git a/panda/src/event/asyncFuture_ext.cxx b/panda/src/event/asyncFuture_ext.cxx index 00ee3516b1..5bf7cb3c94 100644 --- a/panda/src/event/asyncFuture_ext.cxx +++ b/panda/src/event/asyncFuture_ext.cxx @@ -168,14 +168,7 @@ static PyObject *gen_next(PyObject *self) { */ PyObject *Extension:: __await__(PyObject *self) { - Dtool_GeneratorWrapper *gen; - gen = (Dtool_GeneratorWrapper *)PyType_GenericAlloc(&Dtool_GeneratorWrapper_Type, 0); - if (gen != nullptr) { - Py_INCREF(self); - gen->_base._self = self; - gen->_iternext_func = &gen_next; - } - return (PyObject *)gen; + return Dtool_NewGenerator(self, &gen_next); } /** diff --git a/panda/src/glstuff/glShaderContext_src.cxx b/panda/src/glstuff/glShaderContext_src.cxx index 64a5e77553..b3a608d068 100644 --- a/panda/src/glstuff/glShaderContext_src.cxx +++ b/panda/src/glstuff/glShaderContext_src.cxx @@ -1145,6 +1145,78 @@ reflect_uniform(int i, char *name_buffer, GLsizei name_buflen) { } return; } + if (size > 4 && noprefix.substr(0, 4) == "Fog.") { + Shader::ShaderMatSpec bind; + bind._id = arg_id; + bind._func = Shader::SMF_first; + bind._arg[0] = nullptr; + bind._dep[0] = Shader::SSD_general | Shader::SSD_fog; + bind._part[1] = Shader::SMO_identity; + bind._arg[1] = nullptr; + bind._dep[1] = Shader::SSD_NONE; + + if (noprefix == "Fog.color") { + bind._part[0] = Shader::SMO_attr_fogcolor; + + if (param_type == GL_FLOAT_VEC3) { + bind._piece = Shader::SMP_row3x3; + } else if (param_type == GL_FLOAT_VEC4) { + bind._piece = Shader::SMP_row3; + } else { + GLCAT.error() + << "p3d_Fog.color should be vec3 or vec4\n"; + return; + } + + } else if (noprefix == "Fog.density") { + bind._part[0] = Shader::SMO_attr_fog; + + if (param_type == GL_FLOAT) { + bind._piece = Shader::SMP_row3x1; + } else { + GLCAT.error() + << "p3d_Fog.density should be float\n"; + return; + } + + } else if (noprefix == "Fog.start") { + bind._part[0] = Shader::SMO_attr_fog; + + if (param_type == GL_FLOAT) { + bind._piece = Shader::SMP_cell13; + } else { + GLCAT.error() + << "p3d_Fog.start should be float\n"; + return; + } + + } else if (noprefix == "Fog.end") { + bind._part[0] = Shader::SMO_attr_fog; + + if (param_type == GL_FLOAT) { + bind._piece = Shader::SMP_cell14; + } else { + GLCAT.error() + << "p3d_Fog.end should be float\n"; + return; + } + + } else if (noprefix == "Fog.scale") { + bind._part[0] = Shader::SMO_attr_fog; + + if (param_type == GL_FLOAT) { + bind._piece = Shader::SMP_cell15; + } else { + GLCAT.error() + << "p3d_Fog.scale should be float\n"; + return; + } + } + + _shader->_mat_spec.push_back(bind); + _shader->_mat_deps |= bind._dep[0]; + return; + } if (noprefix == "LightModel.ambient") { Shader::ShaderMatSpec bind; bind._id = arg_id; diff --git a/panda/src/gobj/internalName.h b/panda/src/gobj/internalName.h index 729ec15ab8..5e61e81916 100644 --- a/panda/src/gobj/internalName.h +++ b/panda/src/gobj/internalName.h @@ -96,11 +96,7 @@ PUBLISHED: #ifdef HAVE_PYTHON // These versions are exposed to Python, which have additional logic to map // from Python interned strings. -#if PY_MAJOR_VERSION >= 3 - EXTENSION(static PT(InternalName) make(PyUnicodeObject *str)); -#else - EXTENSION(static PT(InternalName) make(PyStringObject *str)); -#endif + EXTENSION(static PT(InternalName) make(PyObject *str)); #endif public: diff --git a/panda/src/gobj/internalName_ext.cxx b/panda/src/gobj/internalName_ext.cxx index f1cdf0a725..4821880677 100644 --- a/panda/src/gobj/internalName_ext.cxx +++ b/panda/src/gobj/internalName_ext.cxx @@ -24,7 +24,12 @@ using std::string; */ #if PY_MAJOR_VERSION >= 3 PT(InternalName) Extension:: -make(PyUnicodeObject *str) { +make(PyObject *str) { + if (!PyUnicode_Check(str)) { + Dtool_Raise_ArgTypeError(str, 0, "InternalName.make", "str"); + return nullptr; + } + if (!PyUnicode_CHECK_INTERNED(str)) { // Not an interned string; don't bother. Py_ssize_t len = 0; @@ -50,7 +55,12 @@ make(PyUnicodeObject *str) { #else PT(InternalName) Extension:: -make(PyStringObject *str) { +make(PyObject *str) { + if (!PyString_Check(str)) { + Dtool_Raise_ArgTypeError(str, 0, "InternalName.make", "str"); + return nullptr; + } + if (!PyString_CHECK_INTERNED(str)) { // Not an interned string; don't bother. string name(PyString_AS_STRING(str), PyString_GET_SIZE(str)); diff --git a/panda/src/gobj/internalName_ext.h b/panda/src/gobj/internalName_ext.h index 20016abd60..8637eae16e 100644 --- a/panda/src/gobj/internalName_ext.h +++ b/panda/src/gobj/internalName_ext.h @@ -29,11 +29,7 @@ template<> class Extension : public ExtensionBase { public: -#if PY_MAJOR_VERSION >= 3 - static PT(InternalName) make(PyUnicodeObject *str); -#else - static PT(InternalName) make(PyStringObject *str); -#endif + static PT(InternalName) make(PyObject *str); }; #endif // HAVE_PYTHON diff --git a/panda/src/ode/odeBody.I b/panda/src/ode/odeBody.I index ab241fb455..72ecafd754 100644 --- a/panda/src/ode/odeBody.I +++ b/panda/src/ode/odeBody.I @@ -89,12 +89,10 @@ set_data(void *data) { dBodySetData(_id, data); } -#ifndef HAVE_PYTHON -INLINE void* OdeBody:: +INLINE void *OdeBody:: get_data() const { return dBodyGetData(_id); } -#endif INLINE void OdeBody:: set_position(dReal x, dReal y, dReal z) { diff --git a/panda/src/ode/odeBody.cxx b/panda/src/ode/odeBody.cxx index 70ad46169d..3f8e5d671a 100644 --- a/panda/src/ode/odeBody.cxx +++ b/panda/src/ode/odeBody.cxx @@ -15,10 +15,6 @@ #include "odeBody.h" #include "odeJoint.h" -#ifdef HAVE_PYTHON -#include "py_panda.h" -#endif - TypeHandle OdeBody::_type_handle; OdeBody:: @@ -38,29 +34,14 @@ OdeBody:: void OdeBody:: destroy() { -#ifdef HAVE_PYTHON - Py_XDECREF((PyObject*) dBodyGetData(_id)); -#endif + if (_destroy_callback != nullptr) { + _destroy_callback(*this); + _destroy_callback = nullptr; + } nassertv(_id); dBodyDestroy(_id); } -#ifdef HAVE_PYTHON -void OdeBody:: -set_data(PyObject *data) { - Py_XDECREF((PyObject*) dBodyGetData(_id)); - Py_XINCREF(data); - dBodySetData(_id, data); -} - -PyObject* OdeBody:: -get_data() const { - PyObject* data = (PyObject*) dBodyGetData(_id); - Py_XINCREF(data); - return data; -} -#endif - OdeJoint OdeBody:: get_joint(int index) const { nassertr(_id != nullptr, OdeJoint(nullptr)); diff --git a/panda/src/ode/odeBody.h b/panda/src/ode/odeBody.h index 8e27dd8802..f1cd9dae68 100644 --- a/panda/src/ode/odeBody.h +++ b/panda/src/ode/odeBody.h @@ -51,9 +51,7 @@ PUBLISHED: INLINE void set_auto_disable_flag(int do_auto_disable); INLINE void set_auto_disable_defaults(); INLINE void set_data(void *data); -#ifdef HAVE_PYTHON - void set_data(PyObject *data); -#endif + EXTENSION(void set_data(PyObject *data)); INLINE void set_position(dReal x, dReal y, dReal z); INLINE void set_position(const LVecBase3f &pos); @@ -71,11 +69,10 @@ PUBLISHED: INLINE int get_auto_disable_steps() const; INLINE dReal get_auto_disable_time() const; INLINE int get_auto_disable_flag() const; -#ifdef HAVE_PYTHON - PyObject* get_data() const; -#else - INLINE void* get_data() const; +#ifndef CPPPARSER + INLINE void *get_data() const; #endif + EXTENSION(PyObject *get_data() const); INLINE LVecBase3f get_position() const; INLINE LMatrix3f get_rotation() const; @@ -150,6 +147,10 @@ PUBLISHED: private: dBodyID _id; +public: + typedef void (*DestroyCallback)(OdeBody &body); + DestroyCallback _destroy_callback = nullptr; + public: static TypeHandle get_class_type() { return _type_handle; diff --git a/panda/src/ode/odeBody_ext.I b/panda/src/ode/odeBody_ext.I index a26eba5b41..5535b900dd 100644 --- a/panda/src/ode/odeBody_ext.I +++ b/panda/src/ode/odeBody_ext.I @@ -13,6 +13,19 @@ #include "odeJoint_ext.h" +/** + * Returns the custom data associated with the OdeBody. + */ +INLINE PyObject *Extension:: +get_data() const { + PyObject *data = (PyObject *)_this->get_data(); + if (data == nullptr) { + data = Py_None; + } + Py_INCREF(data); + return data; +} + /** * Equivalent to get_joint().convert() */ diff --git a/panda/src/ode/odeBody_ext.cxx b/panda/src/ode/odeBody_ext.cxx new file mode 100644 index 0000000000..59361c5fa1 --- /dev/null +++ b/panda/src/ode/odeBody_ext.cxx @@ -0,0 +1,37 @@ +/** + * 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 odeBody_ext.cxx + * @author rdb + * @date 2018-11-06 + */ + +#include "odeBody_ext.h" + +static void destroy_callback(OdeBody &body) { + Py_XDECREF((PyObject *)body.get_data()); +} + +/** + * Sets custom data to be associated with the OdeBody. + */ +void Extension:: +set_data(PyObject *data) { + void *old_data = _this->get_data(); + + if (data != nullptr && data != Py_None) { + Py_INCREF(data); + _this->set_data((void *)data); + _this->_destroy_callback = &destroy_callback; + } else { + _this->set_data(nullptr); + _this->_destroy_callback = nullptr; + } + + Py_XDECREF((PyObject *)old_data); +} diff --git a/panda/src/ode/odeBody_ext.h b/panda/src/ode/odeBody_ext.h index 04c2244324..125c7fe509 100644 --- a/panda/src/ode/odeBody_ext.h +++ b/panda/src/ode/odeBody_ext.h @@ -30,6 +30,9 @@ template<> class Extension : public ExtensionBase { public: + void set_data(PyObject *); + INLINE PyObject *get_data() const; + INLINE PyObject *get_converted_joint(int i) const; }; diff --git a/panda/src/ode/p3ode_ext_composite.cxx b/panda/src/ode/p3ode_ext_composite.cxx index 02ebaec64c..ac054bdc49 100644 --- a/panda/src/ode/p3ode_ext_composite.cxx +++ b/panda/src/ode/p3ode_ext_composite.cxx @@ -1,3 +1,4 @@ +#include "odeBody_ext.cxx" #include "odeGeom_ext.cxx" #include "odeJoint_ext.cxx" #include "odeSpace_ext.cxx"