#! /usr/bin/env python import os import sys import subprocess from distutils.core import setup, Command from distutils.extension import Extension from distutils.version import StrictVersion # Sphinx try: from sphinx.setup_command import BuildDoc except ImportError: class BuildDoc(Command): description = "build documentation using sphinx, that must be installed." user_options = [] def initialize_options(self): pass def finalize_options(self): pass def run(self): print("Error: sphinx not found") # pkg-config def pkg_config(name, require, min_vers=None): try: sys.stdout.write("Checking for " + name + ": ") ver = subprocess.check_output(["pkg-config", "--modversion", require]).decode("utf-8").strip() if min_vers is not None: assert 0 == subprocess.call(["pkg-config", "--atleast-version", min_vers, require]) cflags = subprocess.check_output(["pkg-config", "--cflags", require]).decode("utf-8").split() libs = subprocess.check_output(["pkg-config", "--libs", require]).decode("utf-8").split() sys.stdout.write("OK, found " + ver + "\n") return (cflags, libs) except (OSError, subprocess.CalledProcessError): raise SystemExit("Failed to find " + name + " with 'pkg-config'. Please make sure that it is installed and available on your system path.") except (AssertionError): raise SystemExit("Failed to match version. Found: " + ver + " Needed: " + min_vers) # use cython or pre-generated c files if os.path.exists(os.path.join(os.getcwd(), "efl", "eo", "efl.eo.pyx")): module_suffix = ".pyx" min_ver = "0.17.0" try: from Cython.Distutils import build_ext from Cython.Build import cythonize import Cython.Compiler.Options assert StrictVersion(Cython.__version__) >= StrictVersion(min_ver) Cython.Compiler.Options.fast_fail = True # Stop compilation on first error Cython.Compiler.Options.annotate = False # Generates HTML files with annotated source Cython.Compiler.Options.docstrings = True # Set to False to disable docstrings except (ImportError, AssertionError): raise SystemExit("Requires Cython >= %s (http://cython.org/)" % min_ver) else: module_suffix = ".c" from distutils.command.build_ext import build_ext def cythonize(modules, *args, **kwargs): return modules class CleanGenerated(Command): description = "Clean C and html files generated by Cython" user_options = [] def initialize_options(self): pass def finalize_options(self): pass def run(self): for lib in "eo", "evas", "ecore", "edje", "edje/edit", "emotion", "elementary", "utils": subprocess.call("rm -rfv efl/{0}/*.c efl/{0}/*.html".format(lib), shell=True) subprocess.call("rm -rfv efl/dbus_mainloop/dbus_mainloop.c efl/dbus_mainloop/dbus_mainloop.html", shell=True) modules = [] if set(("build", "build_ext", "install", "bdist", "sdist")) & set(sys.argv): # Eo eo_cflags, eo_libs = pkg_config('Eo', 'eo', "1.7.99") eina_cflags, eina_libs = pkg_config('Eina', 'eina', "1.7.99") eo_ext = Extension("eo", ["efl/eo/efl.eo"+module_suffix], define_macros = [('EFL_BETA_API_SUPPORT', None)], include_dirs = ['include/'], extra_compile_args = eo_cflags, extra_link_args = eo_libs + eina_libs) modules.append(eo_ext) # Utilities utils_ext = [ Extension("utils.deprecated", ["efl/utils/deprecated"+module_suffix], include_dirs = ['include/'], extra_compile_args = eo_cflags, extra_link_args = eo_libs + eina_libs), Extension("utils.conversions", ["efl/utils/conversions"+module_suffix], include_dirs = ['include/'], extra_compile_args = eo_cflags, extra_link_args = eo_libs + eina_libs), Extension("utils.logger", ["efl/utils/logger"+module_suffix], include_dirs = ['include/'], extra_compile_args = eo_cflags, extra_link_args = eo_libs + eina_libs), ] modules += utils_ext # Evas evas_cflags, evas_libs = pkg_config('Evas', 'evas', "1.7.99") evas_ext = Extension("evas", ["efl/evas/efl.evas"+module_suffix], include_dirs = ['include/'], extra_compile_args = evas_cflags, extra_link_args = evas_libs + eina_libs) modules.append(evas_ext) # Ecore ecore_cflags, ecore_libs = pkg_config('Ecore', 'ecore', "1.7.99") efile_cflags, efile_libs = pkg_config('EcoreFile', 'ecore-file', "1.7.99") ecore_ext = Extension("ecore", ["efl/ecore/efl.ecore"+module_suffix], include_dirs = ['include/'], extra_compile_args = ecore_cflags + efile_cflags, extra_link_args = ecore_libs + efile_libs + eina_libs + evas_libs) modules.append(ecore_ext) # Edje edje_cflags, edje_libs = pkg_config('Edje', 'edje', "1.7.99") edje_ext = Extension("edje", ["efl/edje/efl.edje"+module_suffix], include_dirs = ['include/'], extra_compile_args = edje_cflags, extra_link_args = edje_libs + eina_libs + evas_libs) modules.append(edje_ext) # Edje_Edit # edje_edit_ext = Extension("edje_edit", ["efl/edje/efl.edje_edit"+module_suffix], # define_macros = [('EDJE_EDIT_IS_UNSTABLE_AND_I_KNOW_ABOUT_IT', None)], # include_dirs = ['include/'], # extra_compile_args = edje_cflags, # extra_link_args = edje_libs + eina_libs + evas_libs) # modules.append(edje_edit_ext) # Emotion emotion_cflags, emotion_libs = pkg_config('Emotion', 'emotion', "1.7.99") emotion_ext = Extension("emotion", ["efl/emotion/efl.emotion"+module_suffix], include_dirs = ['include/'], extra_compile_args = emotion_cflags, extra_link_args = emotion_libs + eina_libs + evas_libs) modules.append(emotion_ext) # Eldbus # eldbus_cflags, eldbus_libs = pkg_config('Eldbus', 'eldbus', "1.7.99") # pydbus_cflags, pydbus_libs = pkg_config('dbus-python', 'dbus-python') # eldbus_ext = Extension("eldbus", ["efl/eldbus/eldbus"+module_suffix], # include_dirs = ['include/'], # extra_compile_args = eldbus_cflags + pydbus_cflags + ecore_cflags, # extra_link_args = eldbus_libs) # modules.append(eldbus_ext) # dbus mainloop integration dbus_cflags, dbus_libs = pkg_config('DBus', 'dbus-python', "0.83.0") dbus_ml_ext = Extension("dbus_mainloop", ["efl/dbus_mainloop/dbus_mainloop"+module_suffix, "efl/dbus_mainloop/e_dbus.c"], extra_compile_args = dbus_cflags + ecore_cflags, extra_link_args = dbus_libs + ecore_libs) modules.append(dbus_ml_ext) # Elementary elm_exts = [ #Extension("elementary.access", ["efl/elementary/access"+module_suffix]), Extension("elementary.actionslider", ["efl/elementary/actionslider"+module_suffix]), Extension("elementary.background", ["efl/elementary/background"+module_suffix]), Extension("elementary.box", ["efl/elementary/box"+module_suffix]), Extension("elementary.bubble", ["efl/elementary/bubble"+module_suffix]), Extension("elementary.button", ["efl/elementary/button"+module_suffix]), Extension("elementary.calendar_elm", ["efl/elementary/calendar_elm"+module_suffix]), Extension("elementary.check", ["efl/elementary/check"+module_suffix]), Extension("elementary.clock", ["efl/elementary/clock"+module_suffix]), Extension("elementary.colorselector", ["efl/elementary/colorselector"+module_suffix]), Extension("elementary.configuration", ["efl/elementary/configuration"+module_suffix]), Extension("elementary.conformant", ["efl/elementary/conformant"+module_suffix]), Extension("elementary.ctxpopup", ["efl/elementary/ctxpopup"+module_suffix]), Extension("elementary.datetime_elm", ["efl/elementary/datetime_elm"+module_suffix]), Extension("elementary.dayselector", ["efl/elementary/dayselector"+module_suffix]), Extension("elementary.diskselector", ["efl/elementary/diskselector"+module_suffix]), Extension("elementary.entry", ["efl/elementary/entry"+module_suffix]), Extension("elementary.fileselector_button", ["efl/elementary/fileselector_button"+module_suffix]), Extension("elementary.fileselector_entry", ["efl/elementary/fileselector_entry"+module_suffix]), Extension("elementary.fileselector", ["efl/elementary/fileselector"+module_suffix]), Extension("elementary.flip", ["efl/elementary/flip"+module_suffix]), Extension("elementary.flipselector", ["efl/elementary/flipselector"+module_suffix]), Extension("elementary.frame", ["efl/elementary/frame"+module_suffix]), Extension("elementary.general", ["efl/elementary/general"+module_suffix]), Extension("elementary.gengrid", ["efl/elementary/gengrid"+module_suffix]), Extension("elementary.genlist", ["efl/elementary/genlist"+module_suffix]), Extension("elementary.gesture_layer", ["efl/elementary/gesture_layer"+module_suffix]), Extension("elementary.glview", ["efl/elementary/glview"+module_suffix]), Extension("elementary.grid", ["efl/elementary/grid"+module_suffix]), Extension("elementary.hover", ["efl/elementary/hover"+module_suffix]), Extension("elementary.hoversel", ["efl/elementary/hoversel"+module_suffix]), Extension("elementary.icon", ["efl/elementary/icon"+module_suffix]), Extension("elementary.image", ["efl/elementary/image"+module_suffix]), Extension("elementary.index", ["efl/elementary/index"+module_suffix]), Extension("elementary.innerwindow", ["efl/elementary/innerwindow"+module_suffix]), Extension("elementary.label", ["efl/elementary/label"+module_suffix]), Extension("elementary.layout_class", ["efl/elementary/layout_class"+module_suffix]), Extension("elementary.layout", ["efl/elementary/layout"+module_suffix]), Extension("elementary.list", ["efl/elementary/list"+module_suffix]), Extension("elementary.mapbuf", ["efl/elementary/mapbuf"+module_suffix]), Extension("elementary.map", ["efl/elementary/map"+module_suffix]), Extension("elementary.menu", ["efl/elementary/menu"+module_suffix]), Extension("elementary.multibuttonentry", ["efl/elementary/multibuttonentry"+module_suffix]), Extension("elementary.naviframe", ["efl/elementary/naviframe"+module_suffix]), Extension("elementary.need", ["efl/elementary/need"+module_suffix]), Extension("elementary.notify", ["efl/elementary/notify"+module_suffix]), Extension("elementary.object_item", ["efl/elementary/object_item"+module_suffix]), Extension("elementary.object", ["efl/elementary/object"+module_suffix]), Extension("elementary.panel", ["efl/elementary/panel"+module_suffix]), Extension("elementary.panes", ["efl/elementary/panes"+module_suffix]), Extension("elementary.photocam", ["efl/elementary/photocam"+module_suffix]), Extension("elementary.photo", ["efl/elementary/photo"+module_suffix]), Extension("elementary.plug", ["efl/elementary/plug"+module_suffix]), Extension("elementary.popup", ["efl/elementary/popup"+module_suffix]), Extension("elementary.progressbar", ["efl/elementary/progressbar"+module_suffix]), Extension("elementary.radio", ["efl/elementary/radio"+module_suffix]), Extension("elementary.scroller", ["efl/elementary/scroller"+module_suffix]), Extension("elementary.segment_control", ["efl/elementary/segment_control"+module_suffix]), Extension("elementary.separator", ["efl/elementary/separator"+module_suffix]), Extension("elementary.slider", ["efl/elementary/slider"+module_suffix]), Extension("elementary.slideshow", ["efl/elementary/slideshow"+module_suffix]), Extension("elementary.spinner", ["efl/elementary/spinner"+module_suffix]), #Extension("elementary.store", ["efl/elementary/store"+module_suffix]), Extension("elementary.table", ["efl/elementary/table"+module_suffix]), Extension("elementary.theme", ["efl/elementary/theme"+module_suffix]), Extension("elementary.thumb", ["efl/elementary/thumb"+module_suffix]), Extension("elementary.toolbar", ["efl/elementary/toolbar"+module_suffix]), Extension("elementary.transit", ["efl/elementary/transit"+module_suffix]), Extension("elementary.video", ["efl/elementary/video"+module_suffix]), Extension("elementary.web", ["efl/elementary/web"+module_suffix]), Extension("elementary.window", ["efl/elementary/window"+module_suffix]), ] elm_cflags, elm_libs = pkg_config('Elementary', 'elementary', "1.7.99") for e in elm_exts: e.include_dirs = ['include/'] e.extra_compile_args = elm_cflags e.extra_link_args = elm_libs + eina_libs + evas_libs modules = modules + elm_exts setup( name = "efl", version = "1.7.99", author = "Davide Andreoli", author_email = "dave@gurumeditation.it", maintainer = "Davide Andreoli", maintainer_email = "dave@gurumeditation.it", url = "http://www.enlightenment.org", description = "Python bindings for the EFL stack", license = "GNU Lesser General Public License (LGPL)", cmdclass = { 'build_ext': build_ext, 'build_doc': BuildDoc, 'clean_generated_files': CleanGenerated }, packages = ["efl", "efl.elementary", "efl.utils"], package_data = {"efl": ["efl/dbus_mainloop/e_dbus.h"]}, ext_package = "efl", ext_modules = cythonize(modules, include_path=["include"]), )