You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucy.apache.org by ma...@apache.org on 2016/02/09 18:11:19 UTC

[02/12] lucy-clownfish git commit: Move Python files under `src`.

Move Python files under `src`.

Moving the Python source directory into `src` means that the files are
no longer findable by python running in the python/ directory because
the current directory is on sys.path.  In later versions of Python, this
becomes an issue because the source dir (which does not contain any
shared objects) shadows the build directory (where shared objects get put).


Project: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/commit/47234c3d
Tree: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/tree/47234c3d
Diff: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/diff/47234c3d

Branch: refs/heads/master
Commit: 47234c3d8f223d05930e2cb72de1ad01c8c9ed32
Parents: c75ee92
Author: Marvin Humphrey <ma...@rectangular.com>
Authored: Mon Dec 29 19:18:51 2014 -0800
Committer: Marvin Humphrey <ma...@rectangular.com>
Committed: Sat Feb 6 09:58:12 2016 -0800

----------------------------------------------------------------------
 compiler/python/clownfish/_cfc.c              | 400 ---------------------
 compiler/python/clownfish/cfc/__init__.py     |  29 --
 compiler/python/setup.py                      |   5 +-
 compiler/python/src/clownfish/_cfc.c          | 400 +++++++++++++++++++++
 compiler/python/src/clownfish/cfc/__init__.py |  29 ++
 5 files changed, 432 insertions(+), 431 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/47234c3d/compiler/python/clownfish/_cfc.c
----------------------------------------------------------------------
diff --git a/compiler/python/clownfish/_cfc.c b/compiler/python/clownfish/_cfc.c
deleted file mode 100644
index 706943f..0000000
--- a/compiler/python/clownfish/_cfc.c
+++ /dev/null
@@ -1,400 +0,0 @@
-/* Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "Python.h"
-#include "CFC.h"
-
-typedef struct {
-    PyObject_HEAD
-    void *cfc_obj;
-} CFCPyWrapper;
-
-static PyModuleDef cfc_module_def = {
-    PyModuleDef_HEAD_INIT,
-    "clownfish._cfc",
-    "CFC: Clownfish compiler",
-    -1,
-    NULL, NULL, NULL, NULL, NULL
-};
-
-static PyModuleDef cfc_model_module_def = {
-    PyModuleDef_HEAD_INIT,
-    "clownfish.cfc.model",
-    "CFC classes which model language constructs",
-    -1,
-    NULL, NULL, NULL, NULL, NULL
-};
-
-static PyModuleDef cfc_binding_module_def = {
-    PyModuleDef_HEAD_INIT,
-    "clownfish.cfc.binding",
-    "CFC components which generate bindings",
-    -1,
-    NULL, NULL, NULL, NULL, NULL
-};
-
-static PyObject *cfc_module;
-static PyObject *cfc_model_module;
-static PyObject *cfc_binding_module;
-
-static PyObject*
-S_wrap_cfcbase(PyTypeObject *type, void *cfc_obj) {
-    if (cfc_obj == NULL) {
-        Py_RETURN_NONE;
-    }
-    CFCPyWrapper *wrapper = (CFCPyWrapper*)type->tp_alloc(type, 0);
-    if (wrapper == NULL) {
-        PyErr_SetString(PyExc_RuntimeError, "Failed to allocate object");
-        return NULL;
-    }
-    wrapper->cfc_obj = cfc_obj;
-    return (PyObject*)wrapper;
-}
-
-static void
-S_CFCBase_dealloc(CFCPyWrapper *wrapper) {
-    CFCBase *temp = (CFCBase*)wrapper->cfc_obj;
-    wrapper->cfc_obj = NULL;
-    CFCBase_decref(temp);
-    Py_TYPE(wrapper)->tp_free(wrapper);
-}
-
-void*
-S_to_cfc_something(PyObject *wrapper, const char *class_name) {
-    if (wrapper == NULL || wrapper == Py_None) {
-        return NULL;
-    }
-    CFCBase *obj = (CFCBase*)((CFCPyWrapper*)wrapper)->cfc_obj;
-    if (strcmp(CFCBase_get_cfc_class(obj), class_name) != 0) {
-        CFCUtil_die("Object is not a %s, it's a %s", class_name,
-                    CFCBase_get_cfc_class(obj));
-    }
-    return obj;
-}
-
-static CFCHierarchy*
-S_to_Hierarchy(PyObject *wrapper) {
-    return (CFCHierarchy*)S_to_cfc_something(wrapper,
-        "Clownfish::CFC::Model::Hierarchy");
-}
-
-static CFCParcel*
-S_to_Parcel(PyObject *wrapper) {
-    return (CFCParcel*)S_to_cfc_something(wrapper,
-        "Clownfish::CFC::Model::Parcel");
-}
-
-static CFCBindCore*
-S_to_BindCore(PyObject *wrapper) {
-    return (CFCBindCore*)S_to_cfc_something(wrapper,
-        "Clownfish::CFC::Binding::Core");
-}
-
-static PyTypeObject *Hierarchy_pytype;
-static PyTypeObject *Parcel_pytype;
-static PyTypeObject *BindCore_pytype;
-
-/***************************** CFCHierarchy *****************************/
-
-static PyObject*
-S_CFCHierarchy_new(PyTypeObject *type, PyObject *args,
-                   PyObject *keyword_args) {
-    char *dest = NULL;
-    char *keywords[] = {"dest", NULL};
-    int result = PyArg_ParseTupleAndKeywords(args, keyword_args, "|s",
-                                             keywords, &dest);
-    if (!result) { return NULL; }
-    if (!dest) {
-        PyErr_SetString(PyExc_TypeError, "Missing required arg 'dest'");
-        return NULL;
-    }
-    PyObject *inc_func = PyObject_GetAttrString(cfc_module, "_get_inc_dirs");
-    PyObject *dirs = NULL;
-    if (PyCallable_Check(inc_func)) {
-        dirs = PyObject_CallObject(inc_func, NULL);
-    }
-    if (dirs == NULL || !PyList_Check(dirs)) {
-        Py_XDECREF(inc_func);
-        Py_XDECREF(dirs);
-        PyErr_SetString(PyExc_RuntimeError, "_get_inc_dirs failed");
-        return NULL;
-    }
-    CFCHierarchy *hierarchy = CFCHierarchy_new(dest);
-    for (Py_ssize_t i = 0, max = PyList_Size(dirs); i < max; i++) {
-        PyObject *dir = PyList_GetItem(dirs, i);
-        if (PyUnicode_Check(dir)) {
-            char *dir_utf8 = PyUnicode_AsUTF8(dir);
-            CFCHierarchy_add_include_dir(hierarchy, dir_utf8);
-        }
-        else {
-            PyErr_SetString(PyExc_RuntimeError, "not a string");
-            return NULL;
-        }
-    }
-
-    Py_XDECREF(inc_func);
-    Py_XDECREF(dirs);
-
-    return S_wrap_cfcbase(Hierarchy_pytype, hierarchy);
-}
-
-static PyObject*
-S_CFCHierarchy_build(PyObject *wrapper, PyObject *unused) {
-    CHY_UNUSED_VAR(unused);
-    CFCHierarchy_build(S_to_Hierarchy(wrapper));
-    Py_RETURN_NONE;
-}
-
-static PyObject*
-S_CFCHierarchy_add_include_dir(PyObject *wrapper, PyObject *dir) {
-    CFCHierarchy_add_include_dir(S_to_Hierarchy(wrapper),
-                                 PyUnicode_AsUTF8(dir));
-    Py_RETURN_NONE;
-}
-
-static PyObject*
-S_CFCHierarchy_add_source_dir(PyObject *wrapper, PyObject *dir) {
-    CFCHierarchy_add_source_dir(S_to_Hierarchy(wrapper),
-                                PyUnicode_AsUTF8(dir));
-    Py_RETURN_NONE;
-}
-
-static PyObject*
-S_CFCHierarchy_write_log(PyObject *wrapper, PyObject *unused) {
-    CHY_UNUSED_VAR(unused);
-    CFCHierarchy_write_log(S_to_Hierarchy(wrapper));
-    Py_RETURN_NONE;
-}
-
-static PyMethodDef hierarchy_methods[] = {
-    {"add_include_dir", (PyCFunction)S_CFCHierarchy_add_include_dir, METH_O,      NULL},
-    {"add_source_dir",  (PyCFunction)S_CFCHierarchy_add_source_dir,  METH_O,      NULL},
-    {"build",           (PyCFunction)S_CFCHierarchy_build,           METH_NOARGS, NULL},
-    {"write_log",       (PyCFunction)S_CFCHierarchy_write_log,       METH_NOARGS, NULL},
-    {NULL}
-};
-
-static PyTypeObject Hierarchy_pytype_struct = {
-    PyVarObject_HEAD_INIT(NULL, 0)
-    "clownfish.cfc.model.Hierarchy",    // tp_name
-    sizeof(CFCPyWrapper),               // tp_basicsize
-    0,                                  // tp_itemsize
-    (destructor)S_CFCBase_dealloc,      // tp_dealloc
-    0,                                  // tp_print
-    0,                                  // tp_getattr
-    0,                                  // tp_setattr
-    0,                                  // tp_reserved
-    0,                                  // tp_repr
-    0,                                  // tp_as_number
-    0,                                  // tp_as_sequence
-    0,                                  // tp_as_mapping
-    0,                                  // tp_hash
-    0,                                  // tp_call
-    0,                                  // tp_str
-    0,                                  // tp_getattro
-    0,                                  // tp_setattro
-    0,                                  // tp_as_buffer
-    Py_TPFLAGS_DEFAULT,                 // tp_flags
-    "CFCHierarchy",                     // tp_doc
-    0,                                  // tp_traverse
-    0,                                  // tp_clear
-    0,                                  // tp_richcompare
-    0,                                  // tp_weaklistoffset
-    0,                                  // tp_iter
-    0,                                  // tp_iternext
-    hierarchy_methods,                  // tp_methods
-    0,                                  // tp_members
-    0,                                  // tp_getset
-    0,                                  // tp_base
-    0,                                  // tp_dict
-    0,                                  // tp_descr_get
-    0,                                  // tp_descr_set
-    0,                                  // tp_dictoffset
-    0,                                  // tp_init
-    0,                                  // tp_allow
-    (newfunc)S_CFCHierarchy_new         // tp_new
-};
-
-/***************************** CFCParcel *****************************/
-
-PyObject*
-S_CFCParcel_fetch(PyObject *ignored, PyObject *name) {
-    CFCParcel *parcel = CFCParcel_fetch(PyUnicode_AsUTF8(name));
-    return S_wrap_cfcbase(Parcel_pytype, parcel);
-}
-
-static PyMethodDef parcel_methods[] = {
-    {"fetch", (PyCFunction)S_CFCParcel_fetch, METH_STATIC, NULL},
-    {NULL}
-};
-
-static PyTypeObject Parcel_pytype_struct = {
-    PyVarObject_HEAD_INIT(NULL, 0)
-    "clownfish.cfc.model.Parcel",       // tp_name
-    sizeof(CFCPyWrapper),               // tp_basicsize
-    0,                                  // tp_itemsize
-    (destructor)S_CFCBase_dealloc,      // tp_dealloc
-    0,                                  // tp_print
-    0,                                  // tp_getattr
-    0,                                  // tp_setattr
-    0,                                  // tp_reserved
-    0,                                  // tp_repr
-    0,                                  // tp_as_number
-    0,                                  // tp_as_sequence
-    0,                                  // tp_as_mapping
-    0,                                  // tp_hash
-    0,                                  // tp_call
-    0,                                  // tp_str
-    0,                                  // tp_getattro
-    0,                                  // tp_setattro
-    0,                                  // tp_as_buffer
-    Py_TPFLAGS_DEFAULT,                 // tp_flags
-    "CFCParcel",                        // tp_doc
-    0,                                  // tp_traverse
-    0,                                  // tp_clear
-    0,                                  // tp_richcompare
-    0,                                  // tp_weaklistoffset
-    0,                                  // tp_iter
-    0,                                  // tp_iternext
-    parcel_methods,                     // tp_methods
-    0,                                  // tp_members
-    0,                                  // tp_getset
-    0,                                  // tp_base
-    0,                                  // tp_dict
-    0,                                  // tp_descr_get
-    0,                                  // tp_descr_set
-    0,                                  // tp_dictoffset
-    0,                                  // tp_init
-    0,                                  // tp_allow
-    0                                   // tp_new
-};
-
-/***************************** CFCBindCore *****************************/
-
-static PyObject*
-S_CFCBindCore_new(PyTypeObject *type, PyObject *args,
-                   PyObject *keyword_args) {
-    PyObject *hierarchy_wrapped;
-    char *header = "";
-    char *footer = "";
-    char *keywords[] = {"hierarchy", "header", "footer", NULL};
-    int result = PyArg_ParseTupleAndKeywords(args, keyword_args, "O!|ss",
-                                             keywords, Hierarchy_pytype,
-                                             &hierarchy_wrapped, &header,
-                                             &footer);
-    if (!result) { return NULL; }
-    CFCHierarchy *hierarchy = S_to_Hierarchy(hierarchy_wrapped);
-    CFCBindCore *obj = CFCBindCore_new(hierarchy, header, footer);
-    return S_wrap_cfcbase(BindCore_pytype, obj);
-}
-
-static PyObject*
-S_CFCBindCore_write_all_modified(PyObject *wrapper, PyObject *args) {
-    int modified = 0;
-    int result = PyArg_ParseTuple(args, "|p", &modified);
-    if (!result) { return NULL; }
-    CFCBindCore_write_all_modified(S_to_BindCore(wrapper), modified);
-    Py_RETURN_NONE;
-}
-
-static PyMethodDef bindcore_methods[] = {
-    {"write_all_modified", (PyCFunction)S_CFCBindCore_write_all_modified, METH_VARARGS, NULL},
-    {NULL}
-};
-
-static PyTypeObject BindCore_pytype_struct = {
-    PyVarObject_HEAD_INIT(NULL, 0)
-    "clownfish.cfc.binding.BindCore",   // tp_name
-    sizeof(CFCPyWrapper),               // tp_basicsize
-    0,                                  // tp_itemsize
-    (destructor)S_CFCBase_dealloc,      // tp_dealloc
-    0,                                  // tp_print
-    0,                                  // tp_getattr
-    0,                                  // tp_setattr
-    0,                                  // tp_reserved
-    0,                                  // tp_repr
-    0,                                  // tp_as_number
-    0,                                  // tp_as_sequence
-    0,                                  // tp_as_mapping
-    0,                                  // tp_hash
-    0,                                  // tp_call
-    0,                                  // tp_str
-    0,                                  // tp_getattro
-    0,                                  // tp_setattro
-    0,                                  // tp_as_buffer
-    Py_TPFLAGS_DEFAULT,                 // tp_flags
-    "CFCBindCore",                      // tp_doc
-    0,                                  // tp_traverse
-    0,                                  // tp_clear
-    0,                                  // tp_richcompare
-    0,                                  // tp_weaklistoffset
-    0,                                  // tp_iter
-    0,                                  // tp_iternext
-    bindcore_methods,                   // tp_methods
-    0,                                  // tp_members
-    0,                                  // tp_getset
-    0,                                  // tp_base
-    0,                                  // tp_dict
-    0,                                  // tp_descr_get
-    0,                                  // tp_descr_set
-    0,                                  // tp_dictoffset
-    0,                                  // tp_init
-    0,                                  // tp_allow
-    (newfunc)S_CFCBindCore_new          // tp_new
-};
-
-/******************************* common ******************************/
-
-PyMODINIT_FUNC
-PyInit__cfc(void) {
-    // Initialize Python type objects.
-    Hierarchy_pytype = &Hierarchy_pytype_struct;
-    Parcel_pytype    = &Parcel_pytype_struct;
-    BindCore_pytype  = &BindCore_pytype_struct;
-    if (PyType_Ready(Hierarchy_pytype) < 0) {
-        return NULL;
-    }
-    if (PyType_Ready(Parcel_pytype) < 0) {
-        return NULL;
-    }
-    if (PyType_Ready(BindCore_pytype) < 0) {
-        return NULL;
-    }
-
-    // Initialize modules.
-    cfc_module = PyModule_Create(&cfc_module_def);
-    cfc_model_module = PyModule_Create(&cfc_model_module_def);
-    cfc_binding_module = PyModule_Create(&cfc_binding_module_def);
-    PyModule_AddObject(cfc_module, "model", (PyObject*)cfc_model_module);
-    PyModule_AddObject(cfc_module, "binding", (PyObject*)cfc_binding_module);
-
-    // Add type objects to "model" module.
-    Py_INCREF(Hierarchy_pytype);
-    PyModule_AddObject(cfc_model_module, "Hierarchy",
-                       (PyObject*)Hierarchy_pytype);
-    Py_INCREF(Parcel_pytype);
-    PyModule_AddObject(cfc_model_module, "Parcel",
-                       (PyObject*)Parcel_pytype);
-
-    // Add type objects to "binding" module.
-    Py_INCREF(BindCore_pytype);
-    PyModule_AddObject(cfc_binding_module, "BindCore",
-                       (PyObject*)BindCore_pytype);
-
-    return cfc_module;
-}
-
-

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/47234c3d/compiler/python/clownfish/cfc/__init__.py
----------------------------------------------------------------------
diff --git a/compiler/python/clownfish/cfc/__init__.py b/compiler/python/clownfish/cfc/__init__.py
deleted file mode 100644
index f7f3e0b..0000000
--- a/compiler/python/clownfish/cfc/__init__.py
+++ /dev/null
@@ -1,29 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-import clownfish._cfc
-from clownfish._cfc import *
-import site
-import os.path
-
-def _get_inc_dirs():
-    dirs = []
-    for path in site.getsitepackages():
-        path = os.path.join(path, "clownfish/_include")
-        dirs.append(path)
-    return dirs
-
-clownfish._cfc._get_inc_dirs = _get_inc_dirs
-

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/47234c3d/compiler/python/setup.py
----------------------------------------------------------------------
diff --git a/compiler/python/setup.py b/compiler/python/setup.py
index ccfba55..e140161 100644
--- a/compiler/python/setup.py
+++ b/compiler/python/setup.py
@@ -53,7 +53,7 @@ CHARMONY_H_PATH      = 'charmony.h'
 LIBCFC_NAME          = 'libcfc.a' # TODO portability
 LIBCFC_PATH          = os.path.abspath(os.path.join(os.curdir, LIBCFC_NAME))
 
-c_filepaths = [os.path.join('clownfish', '_cfc.c')]
+c_filepaths = [os.path.join('src', 'clownfish', '_cfc.c')]
 paths_to_clean = [
     CHARMONIZER_EXE_PATH,
     CHARMONY_H_PATH,
@@ -111,7 +111,7 @@ class libcfc(_Command):
         self.run_command('charmony')
         subprocess.check_call([make_command, '-j', 'static'])
         # Touch Python binding file if the library has changed.
-        cfc_c = os.path.join('clownfish', '_cfc.c')
+        cfc_c = os.path.join('src', 'clownfish', '_cfc.c')
         if newer_group(['libcfc.a'], cfc_c):
             os.utime(cfc_c, None)
 
@@ -186,5 +186,6 @@ setup(name = 'clownfish-cfc',
           'libcfc': libcfc,
           'test': test,
       },
+      package_dir={'': 'src'},
       ext_modules = [cfc_extension])
 

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/47234c3d/compiler/python/src/clownfish/_cfc.c
----------------------------------------------------------------------
diff --git a/compiler/python/src/clownfish/_cfc.c b/compiler/python/src/clownfish/_cfc.c
new file mode 100644
index 0000000..706943f
--- /dev/null
+++ b/compiler/python/src/clownfish/_cfc.c
@@ -0,0 +1,400 @@
+/* Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "Python.h"
+#include "CFC.h"
+
+typedef struct {
+    PyObject_HEAD
+    void *cfc_obj;
+} CFCPyWrapper;
+
+static PyModuleDef cfc_module_def = {
+    PyModuleDef_HEAD_INIT,
+    "clownfish._cfc",
+    "CFC: Clownfish compiler",
+    -1,
+    NULL, NULL, NULL, NULL, NULL
+};
+
+static PyModuleDef cfc_model_module_def = {
+    PyModuleDef_HEAD_INIT,
+    "clownfish.cfc.model",
+    "CFC classes which model language constructs",
+    -1,
+    NULL, NULL, NULL, NULL, NULL
+};
+
+static PyModuleDef cfc_binding_module_def = {
+    PyModuleDef_HEAD_INIT,
+    "clownfish.cfc.binding",
+    "CFC components which generate bindings",
+    -1,
+    NULL, NULL, NULL, NULL, NULL
+};
+
+static PyObject *cfc_module;
+static PyObject *cfc_model_module;
+static PyObject *cfc_binding_module;
+
+static PyObject*
+S_wrap_cfcbase(PyTypeObject *type, void *cfc_obj) {
+    if (cfc_obj == NULL) {
+        Py_RETURN_NONE;
+    }
+    CFCPyWrapper *wrapper = (CFCPyWrapper*)type->tp_alloc(type, 0);
+    if (wrapper == NULL) {
+        PyErr_SetString(PyExc_RuntimeError, "Failed to allocate object");
+        return NULL;
+    }
+    wrapper->cfc_obj = cfc_obj;
+    return (PyObject*)wrapper;
+}
+
+static void
+S_CFCBase_dealloc(CFCPyWrapper *wrapper) {
+    CFCBase *temp = (CFCBase*)wrapper->cfc_obj;
+    wrapper->cfc_obj = NULL;
+    CFCBase_decref(temp);
+    Py_TYPE(wrapper)->tp_free(wrapper);
+}
+
+void*
+S_to_cfc_something(PyObject *wrapper, const char *class_name) {
+    if (wrapper == NULL || wrapper == Py_None) {
+        return NULL;
+    }
+    CFCBase *obj = (CFCBase*)((CFCPyWrapper*)wrapper)->cfc_obj;
+    if (strcmp(CFCBase_get_cfc_class(obj), class_name) != 0) {
+        CFCUtil_die("Object is not a %s, it's a %s", class_name,
+                    CFCBase_get_cfc_class(obj));
+    }
+    return obj;
+}
+
+static CFCHierarchy*
+S_to_Hierarchy(PyObject *wrapper) {
+    return (CFCHierarchy*)S_to_cfc_something(wrapper,
+        "Clownfish::CFC::Model::Hierarchy");
+}
+
+static CFCParcel*
+S_to_Parcel(PyObject *wrapper) {
+    return (CFCParcel*)S_to_cfc_something(wrapper,
+        "Clownfish::CFC::Model::Parcel");
+}
+
+static CFCBindCore*
+S_to_BindCore(PyObject *wrapper) {
+    return (CFCBindCore*)S_to_cfc_something(wrapper,
+        "Clownfish::CFC::Binding::Core");
+}
+
+static PyTypeObject *Hierarchy_pytype;
+static PyTypeObject *Parcel_pytype;
+static PyTypeObject *BindCore_pytype;
+
+/***************************** CFCHierarchy *****************************/
+
+static PyObject*
+S_CFCHierarchy_new(PyTypeObject *type, PyObject *args,
+                   PyObject *keyword_args) {
+    char *dest = NULL;
+    char *keywords[] = {"dest", NULL};
+    int result = PyArg_ParseTupleAndKeywords(args, keyword_args, "|s",
+                                             keywords, &dest);
+    if (!result) { return NULL; }
+    if (!dest) {
+        PyErr_SetString(PyExc_TypeError, "Missing required arg 'dest'");
+        return NULL;
+    }
+    PyObject *inc_func = PyObject_GetAttrString(cfc_module, "_get_inc_dirs");
+    PyObject *dirs = NULL;
+    if (PyCallable_Check(inc_func)) {
+        dirs = PyObject_CallObject(inc_func, NULL);
+    }
+    if (dirs == NULL || !PyList_Check(dirs)) {
+        Py_XDECREF(inc_func);
+        Py_XDECREF(dirs);
+        PyErr_SetString(PyExc_RuntimeError, "_get_inc_dirs failed");
+        return NULL;
+    }
+    CFCHierarchy *hierarchy = CFCHierarchy_new(dest);
+    for (Py_ssize_t i = 0, max = PyList_Size(dirs); i < max; i++) {
+        PyObject *dir = PyList_GetItem(dirs, i);
+        if (PyUnicode_Check(dir)) {
+            char *dir_utf8 = PyUnicode_AsUTF8(dir);
+            CFCHierarchy_add_include_dir(hierarchy, dir_utf8);
+        }
+        else {
+            PyErr_SetString(PyExc_RuntimeError, "not a string");
+            return NULL;
+        }
+    }
+
+    Py_XDECREF(inc_func);
+    Py_XDECREF(dirs);
+
+    return S_wrap_cfcbase(Hierarchy_pytype, hierarchy);
+}
+
+static PyObject*
+S_CFCHierarchy_build(PyObject *wrapper, PyObject *unused) {
+    CHY_UNUSED_VAR(unused);
+    CFCHierarchy_build(S_to_Hierarchy(wrapper));
+    Py_RETURN_NONE;
+}
+
+static PyObject*
+S_CFCHierarchy_add_include_dir(PyObject *wrapper, PyObject *dir) {
+    CFCHierarchy_add_include_dir(S_to_Hierarchy(wrapper),
+                                 PyUnicode_AsUTF8(dir));
+    Py_RETURN_NONE;
+}
+
+static PyObject*
+S_CFCHierarchy_add_source_dir(PyObject *wrapper, PyObject *dir) {
+    CFCHierarchy_add_source_dir(S_to_Hierarchy(wrapper),
+                                PyUnicode_AsUTF8(dir));
+    Py_RETURN_NONE;
+}
+
+static PyObject*
+S_CFCHierarchy_write_log(PyObject *wrapper, PyObject *unused) {
+    CHY_UNUSED_VAR(unused);
+    CFCHierarchy_write_log(S_to_Hierarchy(wrapper));
+    Py_RETURN_NONE;
+}
+
+static PyMethodDef hierarchy_methods[] = {
+    {"add_include_dir", (PyCFunction)S_CFCHierarchy_add_include_dir, METH_O,      NULL},
+    {"add_source_dir",  (PyCFunction)S_CFCHierarchy_add_source_dir,  METH_O,      NULL},
+    {"build",           (PyCFunction)S_CFCHierarchy_build,           METH_NOARGS, NULL},
+    {"write_log",       (PyCFunction)S_CFCHierarchy_write_log,       METH_NOARGS, NULL},
+    {NULL}
+};
+
+static PyTypeObject Hierarchy_pytype_struct = {
+    PyVarObject_HEAD_INIT(NULL, 0)
+    "clownfish.cfc.model.Hierarchy",    // tp_name
+    sizeof(CFCPyWrapper),               // tp_basicsize
+    0,                                  // tp_itemsize
+    (destructor)S_CFCBase_dealloc,      // tp_dealloc
+    0,                                  // tp_print
+    0,                                  // tp_getattr
+    0,                                  // tp_setattr
+    0,                                  // tp_reserved
+    0,                                  // tp_repr
+    0,                                  // tp_as_number
+    0,                                  // tp_as_sequence
+    0,                                  // tp_as_mapping
+    0,                                  // tp_hash
+    0,                                  // tp_call
+    0,                                  // tp_str
+    0,                                  // tp_getattro
+    0,                                  // tp_setattro
+    0,                                  // tp_as_buffer
+    Py_TPFLAGS_DEFAULT,                 // tp_flags
+    "CFCHierarchy",                     // tp_doc
+    0,                                  // tp_traverse
+    0,                                  // tp_clear
+    0,                                  // tp_richcompare
+    0,                                  // tp_weaklistoffset
+    0,                                  // tp_iter
+    0,                                  // tp_iternext
+    hierarchy_methods,                  // tp_methods
+    0,                                  // tp_members
+    0,                                  // tp_getset
+    0,                                  // tp_base
+    0,                                  // tp_dict
+    0,                                  // tp_descr_get
+    0,                                  // tp_descr_set
+    0,                                  // tp_dictoffset
+    0,                                  // tp_init
+    0,                                  // tp_allow
+    (newfunc)S_CFCHierarchy_new         // tp_new
+};
+
+/***************************** CFCParcel *****************************/
+
+PyObject*
+S_CFCParcel_fetch(PyObject *ignored, PyObject *name) {
+    CFCParcel *parcel = CFCParcel_fetch(PyUnicode_AsUTF8(name));
+    return S_wrap_cfcbase(Parcel_pytype, parcel);
+}
+
+static PyMethodDef parcel_methods[] = {
+    {"fetch", (PyCFunction)S_CFCParcel_fetch, METH_STATIC, NULL},
+    {NULL}
+};
+
+static PyTypeObject Parcel_pytype_struct = {
+    PyVarObject_HEAD_INIT(NULL, 0)
+    "clownfish.cfc.model.Parcel",       // tp_name
+    sizeof(CFCPyWrapper),               // tp_basicsize
+    0,                                  // tp_itemsize
+    (destructor)S_CFCBase_dealloc,      // tp_dealloc
+    0,                                  // tp_print
+    0,                                  // tp_getattr
+    0,                                  // tp_setattr
+    0,                                  // tp_reserved
+    0,                                  // tp_repr
+    0,                                  // tp_as_number
+    0,                                  // tp_as_sequence
+    0,                                  // tp_as_mapping
+    0,                                  // tp_hash
+    0,                                  // tp_call
+    0,                                  // tp_str
+    0,                                  // tp_getattro
+    0,                                  // tp_setattro
+    0,                                  // tp_as_buffer
+    Py_TPFLAGS_DEFAULT,                 // tp_flags
+    "CFCParcel",                        // tp_doc
+    0,                                  // tp_traverse
+    0,                                  // tp_clear
+    0,                                  // tp_richcompare
+    0,                                  // tp_weaklistoffset
+    0,                                  // tp_iter
+    0,                                  // tp_iternext
+    parcel_methods,                     // tp_methods
+    0,                                  // tp_members
+    0,                                  // tp_getset
+    0,                                  // tp_base
+    0,                                  // tp_dict
+    0,                                  // tp_descr_get
+    0,                                  // tp_descr_set
+    0,                                  // tp_dictoffset
+    0,                                  // tp_init
+    0,                                  // tp_allow
+    0                                   // tp_new
+};
+
+/***************************** CFCBindCore *****************************/
+
+static PyObject*
+S_CFCBindCore_new(PyTypeObject *type, PyObject *args,
+                   PyObject *keyword_args) {
+    PyObject *hierarchy_wrapped;
+    char *header = "";
+    char *footer = "";
+    char *keywords[] = {"hierarchy", "header", "footer", NULL};
+    int result = PyArg_ParseTupleAndKeywords(args, keyword_args, "O!|ss",
+                                             keywords, Hierarchy_pytype,
+                                             &hierarchy_wrapped, &header,
+                                             &footer);
+    if (!result) { return NULL; }
+    CFCHierarchy *hierarchy = S_to_Hierarchy(hierarchy_wrapped);
+    CFCBindCore *obj = CFCBindCore_new(hierarchy, header, footer);
+    return S_wrap_cfcbase(BindCore_pytype, obj);
+}
+
+static PyObject*
+S_CFCBindCore_write_all_modified(PyObject *wrapper, PyObject *args) {
+    int modified = 0;
+    int result = PyArg_ParseTuple(args, "|p", &modified);
+    if (!result) { return NULL; }
+    CFCBindCore_write_all_modified(S_to_BindCore(wrapper), modified);
+    Py_RETURN_NONE;
+}
+
+static PyMethodDef bindcore_methods[] = {
+    {"write_all_modified", (PyCFunction)S_CFCBindCore_write_all_modified, METH_VARARGS, NULL},
+    {NULL}
+};
+
+static PyTypeObject BindCore_pytype_struct = {
+    PyVarObject_HEAD_INIT(NULL, 0)
+    "clownfish.cfc.binding.BindCore",   // tp_name
+    sizeof(CFCPyWrapper),               // tp_basicsize
+    0,                                  // tp_itemsize
+    (destructor)S_CFCBase_dealloc,      // tp_dealloc
+    0,                                  // tp_print
+    0,                                  // tp_getattr
+    0,                                  // tp_setattr
+    0,                                  // tp_reserved
+    0,                                  // tp_repr
+    0,                                  // tp_as_number
+    0,                                  // tp_as_sequence
+    0,                                  // tp_as_mapping
+    0,                                  // tp_hash
+    0,                                  // tp_call
+    0,                                  // tp_str
+    0,                                  // tp_getattro
+    0,                                  // tp_setattro
+    0,                                  // tp_as_buffer
+    Py_TPFLAGS_DEFAULT,                 // tp_flags
+    "CFCBindCore",                      // tp_doc
+    0,                                  // tp_traverse
+    0,                                  // tp_clear
+    0,                                  // tp_richcompare
+    0,                                  // tp_weaklistoffset
+    0,                                  // tp_iter
+    0,                                  // tp_iternext
+    bindcore_methods,                   // tp_methods
+    0,                                  // tp_members
+    0,                                  // tp_getset
+    0,                                  // tp_base
+    0,                                  // tp_dict
+    0,                                  // tp_descr_get
+    0,                                  // tp_descr_set
+    0,                                  // tp_dictoffset
+    0,                                  // tp_init
+    0,                                  // tp_allow
+    (newfunc)S_CFCBindCore_new          // tp_new
+};
+
+/******************************* common ******************************/
+
+PyMODINIT_FUNC
+PyInit__cfc(void) {
+    // Initialize Python type objects.
+    Hierarchy_pytype = &Hierarchy_pytype_struct;
+    Parcel_pytype    = &Parcel_pytype_struct;
+    BindCore_pytype  = &BindCore_pytype_struct;
+    if (PyType_Ready(Hierarchy_pytype) < 0) {
+        return NULL;
+    }
+    if (PyType_Ready(Parcel_pytype) < 0) {
+        return NULL;
+    }
+    if (PyType_Ready(BindCore_pytype) < 0) {
+        return NULL;
+    }
+
+    // Initialize modules.
+    cfc_module = PyModule_Create(&cfc_module_def);
+    cfc_model_module = PyModule_Create(&cfc_model_module_def);
+    cfc_binding_module = PyModule_Create(&cfc_binding_module_def);
+    PyModule_AddObject(cfc_module, "model", (PyObject*)cfc_model_module);
+    PyModule_AddObject(cfc_module, "binding", (PyObject*)cfc_binding_module);
+
+    // Add type objects to "model" module.
+    Py_INCREF(Hierarchy_pytype);
+    PyModule_AddObject(cfc_model_module, "Hierarchy",
+                       (PyObject*)Hierarchy_pytype);
+    Py_INCREF(Parcel_pytype);
+    PyModule_AddObject(cfc_model_module, "Parcel",
+                       (PyObject*)Parcel_pytype);
+
+    // Add type objects to "binding" module.
+    Py_INCREF(BindCore_pytype);
+    PyModule_AddObject(cfc_binding_module, "BindCore",
+                       (PyObject*)BindCore_pytype);
+
+    return cfc_module;
+}
+
+

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/47234c3d/compiler/python/src/clownfish/cfc/__init__.py
----------------------------------------------------------------------
diff --git a/compiler/python/src/clownfish/cfc/__init__.py b/compiler/python/src/clownfish/cfc/__init__.py
new file mode 100644
index 0000000..f7f3e0b
--- /dev/null
+++ b/compiler/python/src/clownfish/cfc/__init__.py
@@ -0,0 +1,29 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import clownfish._cfc
+from clownfish._cfc import *
+import site
+import os.path
+
+def _get_inc_dirs():
+    dirs = []
+    for path in site.getsitepackages():
+        path = os.path.join(path, "clownfish/_include")
+        dirs.append(path)
+    return dirs
+
+clownfish._cfc._get_inc_dirs = _get_inc_dirs
+