From 776424e99113a3ffc6679c583093e2892304a7fd Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Fri, 17 Oct 2014 00:48:20 -0700 Subject: [PATCH] Add samba.ensure_third_party_module() function, loading external python modules from third_party/ if the system doesn't provide them. Signed-off-by: Jelmer Vernooij Reviewed-by: Jeremy Allison --- python/samba/__init__.py | 35 ++++++++++++++++++++++++++++++----- third_party/wscript_build | 27 +++++++++++++++++++++++++++ wscript_build | 3 +-- 3 files changed, 58 insertions(+), 7 deletions(-) create mode 100644 third_party/wscript_build diff --git a/python/samba/__init__.py b/python/samba/__init__.py index cd2a309fc0a..0cbdec7800c 100644 --- a/python/samba/__init__.py +++ b/python/samba/__init__.py @@ -314,7 +314,8 @@ def valid_netbios_name(name): return True -def import_bundled_package(modulename, location): +def import_bundled_package(modulename, location, source_tree_container, + namespace): """Import the bundled version of a package. :note: This should only be called if the system version of the package @@ -322,14 +323,35 @@ def import_bundled_package(modulename, location): :param modulename: Module name to import :param location: Location to add to sys.path (can be relative to - ${srcdir}/lib) + ${srcdir}/${source_tree_container}) + :param source_tree_container: Directory under source root that + contains the bundled third party modules. + :param namespace: Namespace to import module from, when not in source tree """ if in_source_tree(): - sys.path.insert(0, os.path.join(source_tree_topdir(), "lib", location)) + extra_path = os.path.join(source_tree_topdir(), source_tree_container, + location) + if not extra_path in sys.path: + sys.path.insert(0, extra_path) sys.modules[modulename] = __import__(modulename) else: sys.modules[modulename] = __import__( - "samba.external.%s" % modulename, fromlist=["samba.external"]) + "%s.%s" % (namespace, modulename), fromlist=[namespace]) + + +def ensure_third_party_module(modulename, location): + """Add a location to sys.path if a third party dependency can't be found. + + :param modulename: Module name to import + :param location: Location to add to sys.path (can be relative to + ${srcdir}/third_party) + """ + try: + __import__(modulename) + except ImportError: + import_bundled_package(modulename, location, + source_tree_container="third_party", + namespace="samba.third_party") def ensure_external_module(modulename, location): @@ -339,10 +361,13 @@ def ensure_external_module(modulename, location): :param location: Location to add to sys.path (can be relative to ${srcdir}/lib) """ + # This is deprecated - please use ensure_third_party_module for + # new modules instead, and put them in third_party/. try: __import__(modulename) except ImportError: - import_bundled_package(modulename, location) + import_bundled_package(modulename, location, + source_tree_container="lib", namespace="samba.external") def dn_from_dns_name(dnsdomain): diff --git a/third_party/wscript_build b/third_party/wscript_build new file mode 100644 index 00000000000..d8b9aae0154 --- /dev/null +++ b/third_party/wscript_build @@ -0,0 +1,27 @@ +#!/usr/bin/env python + +import os + +# work out what python external libraries we need to install +external_libs = { + } + +list = [] + +for module, package in external_libs.items(): + try: + __import__(module) + except ImportError: + list.append(package) + +for e in list: + bld.INSTALL_WILDCARD('${PYTHONARCHDIR}/samba/third_party', e + '/**/*', flat=False, + exclude='*.pyc', trim_path=os.path.dirname(e)) + +bld.SAMBA_GENERATOR('third_party_init_py', + rule='touch ${TGT}', + target='empty_file') + +bld.INSTALL_FILES('${PYTHONARCHDIR}/samba/third_party', 'empty_file', destname='__init__.py') +bld.RECURSE('zlib') +bld.RECURSE('popt') diff --git a/wscript_build b/wscript_build index d7dea5466ea..e74841e96a1 100644 --- a/wscript_build +++ b/wscript_build @@ -74,8 +74,7 @@ bld.RECURSE('lib/socket_wrapper') bld.RECURSE('lib/nss_wrapper') bld.RECURSE('lib/uid_wrapper') if bld.CHECK_FOR_THIRD_PARTY(): - bld.RECURSE('third_party/zlib') - bld.RECURSE('third_party/popt') + bld.RECURSE('third_party') bld.RECURSE('source4/lib/stream') bld.RECURSE('lib/afs') bld.RECURSE('lib/util') -- 2.11.4.GIT