Build py C extension for runtime.
Project: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/repo Commit: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/commit/bebd2447 Tree: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/tree/bebd2447 Diff: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/diff/bebd2447 Branch: refs/heads/master Commit: bebd2447680dc23be903dfb8000158725699014d Parents: 49361b7 Author: Marvin Humphrey <[email protected]> Authored: Tue Jan 19 20:44:50 2016 -0800 Committer: Marvin Humphrey <[email protected]> Committed: Sat Feb 6 10:23:21 2016 -0800 ---------------------------------------------------------------------- runtime/python/setup.py | 67 +++++++++++++++++++++++++-- runtime/python/src/clownfish/__init__.py | 3 ++ 2 files changed, 66 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/bebd2447/runtime/python/setup.py ---------------------------------------------------------------------- diff --git a/runtime/python/setup.py b/runtime/python/setup.py index fdaa593..dbc41f5 100644 --- a/runtime/python/setup.py +++ b/runtime/python/setup.py @@ -13,7 +13,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -from distutils.core import setup +from distutils.core import setup, Extension from distutils.command.build import build as _build from distutils.command.clean import clean as _clean from distutils.cmd import Command as _Command @@ -21,16 +21,25 @@ from distutils.dep_util import newer_group import distutils.ccompiler import os import glob +import platform import shutil import subprocess import sysconfig import sys import unittest +def ext_build_dir(base): + """Returns the build directory for compiled extensions""" + pattern = "lib.{platform}-{version[0]}.{version[1]}" + dirname = pattern.format(platform=sysconfig.get_platform(), + version=sys.version_info) + return os.path.join(base, 'build', dirname) + # Get a compiler object and and strings representing the compiler type and # CFLAGS. Add the Python headers include dir to CFLAGS. compiler = distutils.ccompiler.new_compiler() cflags = sysconfig.get_config_var('CFLAGS') +cflags = cflags + " -I" + sysconfig.get_path('include') compiler_type = distutils.ccompiler.get_default_compiler() # There's no public way to get a string representing the compiler executable @@ -48,12 +57,20 @@ CHARMONIZER_C = os.path.join(COMMON_SOURCE_DIR, 'charmonizer.c') CHARMONIZER_EXE_NAME = compiler.executable_filename('charmonizer') CHARMONIZER_EXE_PATH = os.path.join(os.curdir, CHARMONIZER_EXE_NAME) CHARMONY_H_PATH = 'charmony.h' - -c_filepaths = [] +LIBCLOWNFISH_NAME = 'libclownfish.a' # TODO portability +LIBCLOWNFISH_PATH = os.path.abspath(os.path.join(os.curdir, LIBCLOWNFISH_NAME)) +AUTOGEN_INCLUDE = os.path.join('autogen', 'include') +CFC_DIR = os.path.join(BASE_DIR, 'compiler', 'python') +CFC_BUILD_DIR = ext_build_dir(os.path.join(CFC_DIR)) +PY_BINDING_DIR = os.path.abspath(os.curdir) +BINDING_FILE = '_clownfish.c' + +c_filepaths = [BINDING_FILE] paths_to_clean = [ CHARMONIZER_EXE_PATH, CHARMONY_H_PATH, '_charm*', + BINDING_FILE, ] def _quotify(text): @@ -97,6 +114,35 @@ class charmony(_Command): print(" ".join(command)) subprocess.check_call(command) +class libclownfish(_Command): + description = "Build the Clownfish runtime core as a static archive." + user_options = [] + def initialize_options(self): + pass + def finalize_options(self): + pass + + def run(self): + self.run_command('charmony') + self.run_cfc() + subprocess.check_call([make_command, '-j', 'static']) + + def run_cfc(self): + sys.path.append(CFC_DIR) + sys.path.append(CFC_BUILD_DIR) + import cfc + hierarchy = cfc.model.Hierarchy(dest="autogen") + hierarchy.add_source_dir(CORE_SOURCE_DIR) + hierarchy.build() + header = "Autogenerated by setup.py" + core_binding = cfc.binding.BindCore(hierarchy=hierarchy, header=header) + modified = core_binding.write_all_modified() + if modified: + py_binding = cfc.binding.Python(hierarchy=hierarchy) + py_binding.set_header(header) + py_binding.write_bindings(parcel="Clownfish", dest=PY_BINDING_DIR) + hierarchy.write_log() + class my_clean(_clean): def run(self): _clean.run(self) @@ -113,6 +159,7 @@ class my_clean(_clean): class my_build(_build): def run(self): self.run_command('charmony') + self.run_command('libclownfish') _build.run(self) class test(_Command): @@ -142,6 +189,16 @@ class test(_Command): # restore sys.path sys.path = orig_sys_path +clownfish_extension = Extension('clownfish._clownfish', + include_dirs = [ + CORE_SOURCE_DIR, + AUTOGEN_INCLUDE, + CFEXT_DIR, + os.curdir, + ], + extra_link_args = [LIBCLOWNFISH_PATH], + sources = c_filepaths) + setup(name = 'clownfish', version = '0.4.0', description = 'Clownfish runtime', @@ -154,7 +211,9 @@ setup(name = 'clownfish', 'build': my_build, 'clean': my_clean, 'charmony': charmony, + 'libclownfish': libclownfish, 'test': test, }, - package_dir={'': 'src'},) + package_dir={'': 'src'}, + ext_modules = [clownfish_extension]) http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/bebd2447/runtime/python/src/clownfish/__init__.py ---------------------------------------------------------------------- diff --git a/runtime/python/src/clownfish/__init__.py b/runtime/python/src/clownfish/__init__.py index 09697dc..5c3afae 100644 --- a/runtime/python/src/clownfish/__init__.py +++ b/runtime/python/src/clownfish/__init__.py @@ -13,3 +13,6 @@ # See the License for the specific language governing permissions and # limitations under the License. +import clownfish._clownfish +from clownfish._clownfish import * +
