source: orange/source/orangeqt/setup.py @ 10791:da1e4dffb8ea

Revision 10791:da1e4dffb8ea, 5.1 KB checked in by Ales Erjavec <ales.erjavec@…>, 2 years ago (diff)

Now also builds on windows.

Line 
1#!usr/bin/env python
2
3import os, sys
4
5try:
6    from setuptools import setup
7    have_setuptools = True
8except ImportError:
9    from distutils.core import setup
10    have_setuptools = False
11
12from distutils.core import Extension
13from distutils import log
14
15import subprocess
16import glob
17import numpy
18
19NAME                = 'orangeqt-qt'
20DESCRIPTION         = 'orangeqt ploting library'
21URL                 = "http://orange.biolab.si"
22LICENSE             = 'GNU General Public License (GPL)'
23AUTHOR              = "Bioinformatics Laboratory, FRI UL"
24AUTHOR_EMAIL        = "orange@fri.uni-lj.si"
25VERSION             = '0.0.1a'
26
27
28
29import PyQt4.QtCore
30
31from PyQt4 import pyqtconfig
32
33cfg = pyqtconfig.Configuration()
34pyqt_sip_dir = cfg.pyqt_sip_dir
35
36import sipdistutils
37
38extra_compile_args = []
39extra_link_args = []
40include_dirs = []
41library_dirs = []
42
43if sys.platform == "darwin":
44    sip_plaftorm_tag = "WS_MACX"
45elif sys.platform == "win32":
46    sip_plaftorm_tag = "WS_WIN"
47elif sys.platform.startswith("linux"):
48    sip_plaftorm_tag = "WS_X11"
49else:
50    sip_plaftorm_tag = ""
51
52class PyQt4Extension(Extension):
53    pass
54
55class build_pyqt_ext(sipdistutils.build_ext):
56    description = "Build a orangeqt PyQt4 extension."
57   
58    user_options = sipdistutils.build_ext.user_options + \
59        [("required", None, 
60          "orangeqt is required (failure to build will raise an error)")]
61       
62    boolean_options = sipdistutils.build_ext.boolean_options + \
63        ["required"]
64   
65    def initialize_options(self):
66        sipdistutils.build_ext.initialize_options(self)
67        self.required = False
68       
69    def finalize_options(self):
70        sipdistutils.build_ext.finalize_options(self)
71        self.sip_opts = self.sip_opts + ["-k", "-j", "1", "-t", 
72                        sip_plaftorm_tag, "-t",
73                        "Qt_" + PyQt4.QtCore.QT_VERSION_STR.replace('.', '_')]
74        if self.required is not None:
75            self.required = True
76
77    def build_extension(self, ext):
78        if not isinstance(ext, PyQt4Extension):
79            return
80        cppsources = [source for source in ext.sources if source.endswith(".cpp")]
81        if not os.path.exists(self.build_temp):
82            os.makedirs(self.build_temp)
83        for source in cppsources:
84            header = source.replace(".cpp", ".h")
85            if os.path.exists(header):
86                moc_file = os.path.basename(header).replace(".h", ".moc")
87                call_arg = ["moc", "-o", os.path.join(self.build_temp, moc_file), header]
88                log.info("Calling: " + " ".join(call_arg))
89                try:
90                    subprocess.call(call_arg)
91                except OSError:
92                    raise OSError("Could not locate 'moc' executable.")
93        ext.extra_compile_args = ext.extra_compile_args + ["-I" + self.build_temp]
94        sipdistutils.build_ext.build_extension(self, ext)
95   
96    def run(self):
97        try:
98            sipdistutils.build_ext.run(self)
99        except Exception, ex:
100            if self.required:
101                raise
102            else:
103                log.info("Could not build orangeqt extension (%r)\nSkipping." % ex)
104
105    # For sipdistutils to find PyQt4's .sip files
106    def _sip_sipfiles_dir(self):
107        return pyqt_sip_dir
108
109
110def get_source_files(path, ext="cpp", exclude=[]):
111    files = glob.glob(os.path.join(path, "*." + ext))
112    files = [file for file in files if os.path.basename(file) not in exclude]
113    return files
114
115
116# Used Qt4 libs
117qt_libs = ["QtCore", "QtGui", "QtOpenGL"]
118
119
120if cfg.qt_framework:
121    extra_compile_args = ["-F%s" % cfg.qt_lib_dir]
122    extra_link_args = ["-F%s" % cfg.qt_lib_dir]
123    for lib in qt_libs:
124        include_dirs += [os.path.join(cfg.qt_lib_dir,
125                                      lib + ".framework", "Headers")]
126        extra_link_args += ["-framework", lib]
127#    extra_link_args += ["-framework", "OpenGL"]
128    qt_libs = []
129else:
130    include_dirs = [cfg.qt_inc_dir] + \
131                   [os.path.join(cfg.qt_inc_dir, lib) for lib in qt_libs]
132    library_dirs += [cfg.qt_lib_dir]
133
134if sys.platform == "win32":
135    # Qt libs on windows have a 4 added
136    qt_libs = [lib + "4" for lib in qt_libs]
137
138include_dirs += [numpy.get_include(), "./"]
139
140orangeqt_ext = PyQt4Extension("orangeqt",
141                              ["orangeqt.sip"] + get_source_files("", "cpp",
142                               exclude=["canvas3d.cpp", "plot3d.cpp", "glextensions.cpp"]
143                               ),
144                              include_dirs=include_dirs,
145                              extra_compile_args=extra_compile_args + \
146                                                   ["-DORANGEQT_EXPORTS"],
147                              extra_link_args=extra_link_args,
148                              libraries = qt_libs,
149                              library_dirs=library_dirs
150                             )
151
152def setup_package():
153    setup(name = NAME,
154          description = DESCRIPTION,
155          version = VERSION,
156          author = AUTHOR,
157          author_email = AUTHOR_EMAIL,
158          url = URL,
159          license = LICENSE,
160          ext_modules = [orangeqt_ext],
161          cmdclass={"build_ext": build_pyqt_ext},
162          )
163
164if __name__ == '__main__':
165    setup_package()
Note: See TracBrowser for help on using the repository browser.