Chris@87: from __future__ import division, absolute_import, print_function Chris@87: Chris@87: from distutils.core import Command Chris@87: from numpy.distutils import log Chris@87: Chris@87: #XXX: Linker flags Chris@87: Chris@87: def show_fortran_compilers(_cache=[]): Chris@87: # Using cache to prevent infinite recursion Chris@87: if _cache: return Chris@87: _cache.append(1) Chris@87: from numpy.distutils.fcompiler import show_fcompilers Chris@87: import distutils.core Chris@87: dist = distutils.core._setup_distribution Chris@87: show_fcompilers(dist) Chris@87: Chris@87: class config_fc(Command): Chris@87: """ Distutils command to hold user specified options Chris@87: to Fortran compilers. Chris@87: Chris@87: config_fc command is used by the FCompiler.customize() method. Chris@87: """ Chris@87: Chris@87: description = "specify Fortran 77/Fortran 90 compiler information" Chris@87: Chris@87: user_options = [ Chris@87: ('fcompiler=', None, "specify Fortran compiler type"), Chris@87: ('f77exec=', None, "specify F77 compiler command"), Chris@87: ('f90exec=', None, "specify F90 compiler command"), Chris@87: ('f77flags=', None, "specify F77 compiler flags"), Chris@87: ('f90flags=', None, "specify F90 compiler flags"), Chris@87: ('opt=', None, "specify optimization flags"), Chris@87: ('arch=', None, "specify architecture specific optimization flags"), Chris@87: ('debug', 'g', "compile with debugging information"), Chris@87: ('noopt', None, "compile without optimization"), Chris@87: ('noarch', None, "compile without arch-dependent optimization"), Chris@87: ] Chris@87: Chris@87: help_options = [ Chris@87: ('help-fcompiler', None, "list available Fortran compilers", Chris@87: show_fortran_compilers), Chris@87: ] Chris@87: Chris@87: boolean_options = ['debug', 'noopt', 'noarch'] Chris@87: Chris@87: def initialize_options(self): Chris@87: self.fcompiler = None Chris@87: self.f77exec = None Chris@87: self.f90exec = None Chris@87: self.f77flags = None Chris@87: self.f90flags = None Chris@87: self.opt = None Chris@87: self.arch = None Chris@87: self.debug = None Chris@87: self.noopt = None Chris@87: self.noarch = None Chris@87: Chris@87: def finalize_options(self): Chris@87: log.info('unifing config_fc, config, build_clib, build_ext, build commands --fcompiler options') Chris@87: build_clib = self.get_finalized_command('build_clib') Chris@87: build_ext = self.get_finalized_command('build_ext') Chris@87: config = self.get_finalized_command('config') Chris@87: build = self.get_finalized_command('build') Chris@87: cmd_list = [self, config, build_clib, build_ext, build] Chris@87: for a in ['fcompiler']: Chris@87: l = [] Chris@87: for c in cmd_list: Chris@87: v = getattr(c, a) Chris@87: if v is not None: Chris@87: if not isinstance(v, str): v = v.compiler_type Chris@87: if v not in l: l.append(v) Chris@87: if not l: v1 = None Chris@87: else: v1 = l[0] Chris@87: if len(l)>1: Chris@87: log.warn(' commands have different --%s options: %s'\ Chris@87: ', using first in list as default' % (a, l)) Chris@87: if v1: Chris@87: for c in cmd_list: Chris@87: if getattr(c, a) is None: setattr(c, a, v1) Chris@87: Chris@87: def run(self): Chris@87: # Do nothing. Chris@87: return Chris@87: Chris@87: class config_cc(Command): Chris@87: """ Distutils command to hold user specified options Chris@87: to C/C++ compilers. Chris@87: """ Chris@87: Chris@87: description = "specify C/C++ compiler information" Chris@87: Chris@87: user_options = [ Chris@87: ('compiler=', None, "specify C/C++ compiler type"), Chris@87: ] Chris@87: Chris@87: def initialize_options(self): Chris@87: self.compiler = None Chris@87: Chris@87: def finalize_options(self): Chris@87: log.info('unifing config_cc, config, build_clib, build_ext, build commands --compiler options') Chris@87: build_clib = self.get_finalized_command('build_clib') Chris@87: build_ext = self.get_finalized_command('build_ext') Chris@87: config = self.get_finalized_command('config') Chris@87: build = self.get_finalized_command('build') Chris@87: cmd_list = [self, config, build_clib, build_ext, build] Chris@87: for a in ['compiler']: Chris@87: l = [] Chris@87: for c in cmd_list: Chris@87: v = getattr(c, a) Chris@87: if v is not None: Chris@87: if not isinstance(v, str): v = v.compiler_type Chris@87: if v not in l: l.append(v) Chris@87: if not l: v1 = None Chris@87: else: v1 = l[0] Chris@87: if len(l)>1: Chris@87: log.warn(' commands have different --%s options: %s'\ Chris@87: ', using first in list as default' % (a, l)) Chris@87: if v1: Chris@87: for c in cmd_list: Chris@87: if getattr(c, a) is None: setattr(c, a, v1) Chris@87: return Chris@87: Chris@87: def run(self): Chris@87: # Do nothing. Chris@87: return