Changeset 10792:7602a3f6b71e in orange


Ignore:
Timestamp:
04/13/12 19:13:30 (2 years ago)
Author:
Ales Erjavec <ales.erjavec@…>
Branch:
default
Message:

Can now build orangeqt extension by running (optional) build_pyqt_ext command.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • setup.py

    r10763 r10792  
    1717DOCLINES = __doc__.splitlines() 
    1818 
    19 import os, sys         
    20 import distutils.core 
     19import os, sys 
    2120try: 
    2221    from setuptools import setup 
     
    2928 
    3029from distutils.core import Extension 
     30from distutils.command.build import build 
    3131from distutils.command.build_ext import build_ext 
    3232from distutils.command.install_lib import install_lib 
    3333from distutils.util import convert_path 
     34from distutils.errors import DistutilsSetupError 
    3435from distutils.msvccompiler import MSVCCompiler 
    3536from distutils.unixccompiler import UnixCCompiler 
     
    7980    setuptools_args = {} 
    8081 
    81  
    82 import re 
    8382import glob 
    84  
    8583from subprocess import check_call 
    8684 
     
    10098    pass 
    10199    numpy_include_dir = None 
    102      
     100 
    103101python_include_dir = get_python_inc(plat_specific=1) 
    104102 
     
    113111elif sys.platform.startswith("linux"): 
    114112    extra_compile_args = "-fPIC -fpermissive -w -DLINUX".split() 
    115     extra_link_args = ["-Wl,-R$ORIGIN"]     
     113    extra_link_args = ["-Wl,-R$ORIGIN"] 
    116114else: 
    117115    extra_compile_args = [] 
    118116    extra_link_args = [] 
    119          
     117 
     118 
     119# Get the command for building orangeqt extension from 
     120# source/orangeqt/setup.py file 
     121import imp 
     122orangeqt_setup = imp.load_source("orangeqt_setup", "source/orangeqt/setup.py") 
     123 
     124build_pyqt_ext = orangeqt_setup.build_pyqt_ext 
     125 
    120126class LibStatic(Extension): 
    121127    pass 
     
    125131        for name, default in [("extra_pyxtract_cmds", []), ("lib_type", "dynamic")]: 
    126132            setattr(self, name, kwargs.get(name, default)) 
    127             if name in kwargs:     
     133            if name in kwargs: 
    128134                del kwargs[name] 
    129              
     135 
    130136        Extension.__init__(self, *args, **kwargs) 
    131          
     137 
    132138class PyXtractSharedExtension(PyXtractExtension): 
    133139    pass 
    134          
     140 
    135141class pyxtract_build_ext(build_ext): 
    136142    def run_pyxtract(self, ext, dir): 
     
    141147            ## we use the commands which are used for building under windows 
    142148            pyxtract_cmds = [cmd.split() for cmd in getattr(ext, "extra_pyxtract_cmds", [])] 
    143             if os.path.exists("_pyxtract.bat"):  
     149            if os.path.exists("_pyxtract.bat"): 
    144150                pyxtract_cmds.extend([cmd.split()[1:] for cmd in open("_pyxtract.bat").read().strip().splitlines()]) 
    145151            for cmd in pyxtract_cmds: 
     
    152158        finally: 
    153159            os.chdir(original_dir) 
    154          
     160 
    155161    def finalize_options(self): 
    156162        build_ext.finalize_options(self) 
    157163        # add the build_lib dir and build_temp (for  
    158         # liborange_include and liborange linking)             
     164        # liborange_include and liborange linking) 
    159165        if not self.inplace: 
    160166            # for linking with liborange.so (it is in Orange package) 
     
    167173            # for linking with liborange_include.a 
    168174            self.library_dirs.append(self.build_temp) 
    169          
     175 
    170176    def build_extension(self, ext): 
    171177        if isinstance(ext, LibStatic): 
     178            # Build static library 
    172179            self.build_static(ext) 
    173180        elif isinstance(ext, PyXtractExtension): 
     181            # Build pyextract extension 
    174182            self.build_pyxtract(ext) 
     183        elif isinstance(ext, orangeqt_setup.PyQt4Extension): 
     184            # Skip the build (will be handled by build_pyqt_ext command) 
     185            return 
    175186        else: 
    176187            build_ext.build_extension(self, ext) 
    177              
     188 
    178189        if isinstance(ext, PyXtractSharedExtension): 
     190            # Fix extension modules so they can be linked 
     191            # by other modules 
    179192            if isinstance(self.compiler, MSVCCompiler): 
    180193                # Copy ${TEMP}/orange/orange.lib to ${BUILD}/orange.lib 
     
    206219                finally: 
    207220                    os.chdir(realpath) 
    208              
     221 
    209222    def build_pyxtract(self, ext): 
    210223        ## mostly copied from build_extension 
     
    216229                   "a list of source filenames") % ext.name 
    217230        sources = list(sources) 
    218          
     231 
    219232        ext_path = self.get_ext_fullpath(ext.name) 
    220          
     233 
    221234        depends = sources + ext.depends 
    222235        if not (self.force or newer_group(depends, ext_path, 'newer')): 
     
    230243        # accordingly. 
    231244        sources = self.swig_sources(sources, ext) 
    232          
     245 
    233246        # Run pyxtract in dir this adds ppp and px dirs to include_dirs 
    234247        dir = os.path.commonprefix([os.path.split(s)[0] for s in ext.sources]) 
     
    294307            build_temp=self.build_temp, 
    295308            target_lang=language) 
    296          
    297          
     309 
     310 
    298311    def build_static(self, ext): 
    299312        ## mostly copied from build_extension, changed 
     
    305318                   "a list of source filenames") % ext.name 
    306319        sources = list(sources) 
    307          
     320 
    308321        # Static libs get build in the build_temp directory 
    309322        output_dir = self.build_temp 
    310323        if not os.path.exists(output_dir): #VSC fails if the dir does not exist 
    311324            os.makedirs(output_dir) 
    312              
     325 
    313326        lib_filename = self.compiler.library_filename(ext.name, lib_type='static', output_dir=output_dir) 
    314          
     327 
    315328        depends = sources + ext.depends 
    316329        if not (self.force or newer_group(depends, lib_filename, 'newer')): 
     
    386399            debug=self.debug, 
    387400            target_lang=language) 
    388          
     401 
    389402    def get_libraries(self, ext): 
    390403        """ Change the 'orange' library name to 'orange_d' if 
     
    401414                index = libraries.index("orange") 
    402415                libraries[index] = "orange_d" 
    403              
     416 
    404417        return libraries 
    405          
     418 
    406419    if not hasattr(build_ext, "get_ext_fullpath"): 
    407420        #On mac OS X python 2.6.1 distutils does not have this method 
     
    434447            #   package_dir/filename 
    435448            return os.path.join(package_dir, filename) 
    436          
    437          
    438 class my_install_lib(install_lib): 
     449 
     450 
     451# Add build_pyqt_ext to build subcommands 
     452class orange_build(build): 
     453    def has_pyqt_extensions(self): 
     454        # For now this is disabled unless specifically requested 
     455        # using build_pyqt_ext command 
     456        return False 
     457#        return any([isinstance(ext, orangeqt_setup.PyQt4Extension) \ 
     458#                   for ext in self.distribution.ext_modules] 
     459#                   ) 
     460 
     461    sub_commands = build.sub_commands + \ 
     462                   [("build_pyqt_ext", has_pyqt_extensions)] 
     463 
     464 
     465class orange_install_lib(install_lib): 
    439466    """ An command to install orange (preserves liborange.so -> orange.so symlink) 
    440467    """ 
    441468    def run(self): 
    442469        install_lib.run(self) 
    443          
     470 
    444471    def copy_tree(self, infile, outfile, preserve_mode=1, preserve_times=1, preserve_symlinks=1, level=1): 
    445472        """ Run copy_tree with preserve_symlinks=1 as default 
    446473        """  
    447474        install_lib.copy_tree(self, infile, outfile, preserve_mode, preserve_times, preserve_symlinks, level) 
    448          
     475 
    449476    def install(self): 
    450477        """ Copy build_dir to install_dir 
     
    457484            log.info("unlinking %s -> %s", liborange, os.path.join(self.install_dir, "orange.so")) 
    458485            os.unlink(liborange) 
    459              
     486 
    460487        return install_lib.install(self) 
    461      
    462      
    463 class my_install(install): 
     488 
     489 
     490class orange_install(install): 
    464491    """ A command to install orange while also creating 
    465492    a .pth path to access the old orng* modules and orange,  
     
    469496    def run(self): 
    470497        install.run(self) 
    471          
    472498        # Create a .pth file with a path inside the Orange/orng directory 
    473499        # so the old modules are importable 
     
    477503        self.create_path_file() 
    478504        self.path_file, self.extra_dirs = None, None 
    479          
    480              
     505 
     506 
    481507def get_source_files(path, ext="cpp", exclude=[]): 
    482508    files = glob.glob(os.path.join(path, "*." + ext)) 
     
    512538else: 
    513539    orange_sources += get_source_files("source/orange/blas/", "c") 
    514      
     540 
    515541if config.has_option("R", "library"): 
    516542    # Link external R library (for linpack) 
     
    518544else: 
    519545    orange_sources += get_source_files("source/orange/linpack/", "c") 
    520      
     546 
    521547if config.has_option("liblinear", "library"): 
    522548    # Link external LIBLINEAR library 
     
    525551    orange_sources += get_source_files("source/orange/liblinear/", "cpp") 
    526552    orange_include_dirs += ["source/orange/liblinear"] 
    527      
     553 
    528554if config.has_option("libsvm", "library"): 
    529555    # Link external LibSVM library 
     
    531557else: 
    532558    orange_sources += get_source_files("source/orange/libsvm/", "cpp") 
    533      
     559 
    534560 
    535561orange_ext = PyXtractSharedExtension("Orange.orange", orange_sources, 
     
    551577else: 
    552578    shared_libs = libraries + ["orange"] 
    553      
     579 
    554580orangeom_sources = get_source_files("source/orangeom/", exclude=["lib_vectors.cpp"]) 
    555581orangeom_libraries = list(shared_libs) 
     
    593619                      ) 
    594620 
     621 
     622orangeqt_ext = orangeqt_setup.orangeqt_ext 
     623# Fix relative paths, name etc. 
     624orangeqt_ext.name = "Orange.orangeqt" 
     625orangeqt_ext.sources = ["source/orangeqt/orangeqt.sip"] + \ 
     626                       get_source_files("source/orangeqt", "cpp", 
     627                            exclude=["canvas3d.cpp", "plot3d.cpp",  
     628                                     "glextensions.cpp"] 
     629                                        ) 
     630orangeqt_ext.include_dirs += ["source/orangeqt"] 
     631 
    595632def get_packages(): 
    596633    import fnmatch 
     
    599636    #Recursively find '__init__.py's 
    600637    for root, dirnames, filenames in os.walk('Orange'): 
    601       # Add packages for Orange 
    602       for filename in fnmatch.filter(filenames, '__init__.py'): 
    603           matches.append(os.path.join(root, filename)) 
     638        # Add packages for Orange 
     639        for filename in fnmatch.filter(filenames, '__init__.py'): 
     640            matches.append(os.path.join(root, filename)) 
    604641    return [os.path.dirname(pkg).replace(os.path.sep, '.') for pkg in matches] 
     642 
    605643 
    606644def get_package_data(): 
     
    673711    elif os.path.exists('Orange/version.py'): 
    674712        # must be a source distribution, use existing version file 
    675         import imp 
    676713        version = imp.load_source("Orange.version", "Orange/version.py") 
    677714        HG_REVISION = version.hg_revision 
     
    690727    finally: 
    691728        a.close() 
     729 
     730ext_modules = [include_ext, orange_ext, orangeom_ext, 
     731               orangene_ext, corn_ext, statc_ext, 
     732               orangeqt_ext 
     733               ] 
    692734 
    693735def setup_package(): 
     
    705747          keywords = KEYWORDS, 
    706748 
    707           cmdclass={"build_ext": pyxtract_build_ext, 
    708                     "install_lib": my_install_lib, 
    709                     "install": my_install}, 
     749          cmdclass={"build": orange_build, 
     750                    "build_ext": pyxtract_build_ext, 
     751                    "build_pyqt_ext": build_pyqt_ext, 
     752                    "install_lib": orange_install_lib, 
     753                    "install": orange_install}, 
    710754          packages = get_packages(), 
    711755          package_data = get_package_data(), 
    712           ext_modules = [include_ext, orange_ext, orangeom_ext, 
    713                          orangene_ext, corn_ext, statc_ext], 
     756          ext_modules = ext_modules, 
    714757          scripts = ["bin/orange-canvas"], 
    715758          **setuptools_args) 
Note: See TracChangeset for help on using the changeset viewer.