Exemplo n.º 1
0
    def _libs_with_msvc_and_fortran(self, fcompiler, c_libraries,
                                    c_library_dirs):
        if fcompiler is None:
            return

        for libname in c_libraries:
            if libname.startswith('msvc'):
                continue
            fileexists = False
            for libdir in c_library_dirs or []:
                libfile = os.path.join(libdir, '%s.lib' % (libname))
                if os.path.isfile(libfile):
                    fileexists = True
                    break
            if fileexists:
                continue
            # make g77-compiled static libs available to MSVC
            fileexists = False
            for libdir in c_library_dirs:
                libfile = os.path.join(libdir, 'lib%s.a' % (libname))
                if os.path.isfile(libfile):
                    # copy libname.a file to name.lib so that MSVC linker
                    # can find it
                    libfile2 = os.path.join(self.build_temp, libname + '.lib')
                    copy_file(libfile, libfile2)
                    if self.build_temp not in c_library_dirs:
                        c_library_dirs.append(self.build_temp)
                    fileexists = True
                    break
            if fileexists:
                continue
            log.warn('could not find library %r in directories %s'
                     % (libname, c_library_dirs))

        # Always use system linker when using MSVC compiler.
        f_lib_dirs = []
        for dir in fcompiler.library_dirs:
            # correct path when compiling in Cygwin but with normal Win
            # Python
            if dir.startswith('/usr/lib'):
                try:
                    dir = subprocess.check_output(['cygpath', '-w', dir])
                except (OSError, subprocess.CalledProcessError):
                    pass
                else:
                    dir = filepath_from_subprocess_output(dir)
            f_lib_dirs.append(dir)
        c_library_dirs.extend(f_lib_dirs)

        # make g77-compiled static libs available to MSVC
        for lib in fcompiler.libraries:
            if not lib.startswith('msvc'):
                c_libraries.append(lib)
                p = combine_paths(f_lib_dirs, 'lib' + lib + '.a')
                if p:
                    dst_name = os.path.join(self.build_temp, lib + '.lib')
                    if not os.path.isfile(dst_name):
                        copy_file(p[0], dst_name)
                    if self.build_temp not in c_library_dirs:
                        c_library_dirs.append(self.build_temp)
Exemplo n.º 2
0
 def get_output(self, body, headers=None, include_dirs=None,
                libraries=None, library_dirs=None,
                lang="c", use_tee=None):
     """Try to compile, link to an executable, and run a program
     built from 'body' and 'headers'. Returns the exit status code
     of the program and its output.
     """
     # 2008-11-16, RemoveMe
     warnings.warn("\n+++++++++++++++++++++++++++++++++++++++++++++++++\n" \
                   "Usage of get_output is deprecated: please do not \n" \
                   "use it anymore, and avoid configuration checks \n" \
                   "involving running executable on the target machine.\n" \
                   "+++++++++++++++++++++++++++++++++++++++++++++++++\n",
                   DeprecationWarning, stacklevel=2)
     self._check_compiler()
     exitcode, output = 255, ''
     try:
         grabber = GrabStdout()
         try:
             src, obj, exe = self._link(body, headers, include_dirs,
                                        libraries, library_dirs, lang)
             grabber.restore()
         except Exception:
             output = grabber.data
             grabber.restore()
             raise
         exe = os.path.join('.', exe)
         try:
             # specify cwd arg for consistency with
             # historic usage pattern of exec_command()
             # also, note that exe appears to be a string,
             # which exec_command() handled, but we now
             # use a list for check_output() -- this assumes
             # that exe is always a single command
             output = subprocess.check_output([exe], cwd='.')
         except subprocess.CalledProcessError as exc:
             exitstatus = exc.returncode
             output = ''
         except OSError:
             # preserve the EnvironmentError exit status
             # used historically in exec_command()
             exitstatus = 127
             output = ''
         else:
             output = filepath_from_subprocess_output(output)
         if hasattr(os, 'WEXITSTATUS'):
             exitcode = os.WEXITSTATUS(exitstatus)
             if os.WIFSIGNALED(exitstatus):
                 sig = os.WTERMSIG(exitstatus)
                 log.error('subprocess exited with signal %d' % (sig,))
                 if sig == signal.SIGINT:
                     # control-C
                     raise KeyboardInterrupt
         else:
             exitcode = exitstatus
         log.info("success!")
     except (CompileError, LinkError):
         log.info("failure.")
     self._clean()
     return exitcode, output
Exemplo n.º 3
0
 def get_libgcc_dir(self):
     try:
         output = subprocess.check_output(self.compiler_f77 +
                                         ['-print-libgcc-file-name'])
     except (OSError, subprocess.CalledProcessError):
         pass
     else:
         output = filepath_from_subprocess_output(output)
         return os.path.dirname(output)
     return None
Exemplo n.º 4
0
 def get_target(self):
     try:
         output = subprocess.check_output(self.compiler_f77 + ['-v'])
     except (OSError, subprocess.CalledProcessError):
         pass
     else:
         output = filepath_from_subprocess_output(output)
         m = TARGET_R.search(output)
         if m:
             return m.group(1)
     return ""
Exemplo n.º 5
0
 def _link (self, body,
            headers, include_dirs,
            libraries, library_dirs, lang):
     if self.compiler.compiler_type=='msvc':
         libraries = (libraries or [])[:]
         library_dirs = (library_dirs or [])[:]
         if lang in ['f77', 'f90']:
             lang = 'c' # always use system linker when using MSVC compiler
             if self.fcompiler:
                 for d in self.fcompiler.library_dirs or []:
                     # correct path when compiling in Cygwin but with
                     # normal Win Python
                     if d.startswith('/usr/lib'):
                         try:
                             d = subprocess.check_output(['cygpath',
                                                          '-w', d])
                         except (OSError, subprocess.CalledProcessError):
                             pass
                         else:
                             d = filepath_from_subprocess_output(d)
                     library_dirs.append(d)
                 for libname in self.fcompiler.libraries or []:
                     if libname not in libraries:
                         libraries.append(libname)
         for libname in libraries:
             if libname.startswith('msvc'): continue
             fileexists = False
             for libdir in library_dirs or []:
                 libfile = os.path.join(libdir, '%s.lib' % (libname))
                 if os.path.isfile(libfile):
                     fileexists = True
                     break
             if fileexists: continue
             # make g77-compiled static libs available to MSVC
             fileexists = False
             for libdir in library_dirs:
                 libfile = os.path.join(libdir, 'lib%s.a' % (libname))
                 if os.path.isfile(libfile):
                     # copy libname.a file to name.lib so that MSVC linker
                     # can find it
                     libfile2 = os.path.join(libdir, '%s.lib' % (libname))
                     copy_file(libfile, libfile2)
                     self.temp_files.append(libfile2)
                     fileexists = True
                     break
             if fileexists: continue
             log.warn('could not find library %r in directories %s' \
                      % (libname, library_dirs))
     elif self.compiler.compiler_type == 'mingw32':
         generate_manifest(self)
     return self._wrap_method(old_config._link, lang,
                              (body, headers, include_dirs,
                               libraries, library_dirs, lang))
Exemplo n.º 6
0
    def get_libgfortran_dir(self):
        if sys.platform[:5] == 'linux':
            libgfortran_name = 'libgfortran.so'
        elif sys.platform == 'darwin':
            libgfortran_name = 'libgfortran.dylib'
        else:
            libgfortran_name = None

        libgfortran_dir = None
        if libgfortran_name:
            find_lib_arg = ['-print-file-name={0}'.format(libgfortran_name)]
            try:
                output = subprocess.check_output(
                                       self.compiler_f77 + find_lib_arg)
            except (OSError, subprocess.CalledProcessError):
                pass
            else:
                output = filepath_from_subprocess_output(output)
                libgfortran_dir = os.path.dirname(output)
        return libgfortran_dir
Exemplo n.º 7
0
    def get_libgfortran_dir(self):
        if sys.platform[:5] == 'linux':
            libgfortran_name = 'libgfortran.so'
        elif sys.platform == 'darwin':
            libgfortran_name = 'libgfortran.dylib'
        else:
            libgfortran_name = None

        libgfortran_dir = None
        if libgfortran_name:
            find_lib_arg = ['-print-file-name={0}'.format(libgfortran_name)]
            try:
                output = subprocess.check_output(self.compiler_f77 +
                                                 find_lib_arg)
            except (OSError, subprocess.CalledProcessError):
                pass
            else:
                output = filepath_from_subprocess_output(output)
                libgfortran_dir = os.path.dirname(output)
        return libgfortran_dir
Exemplo n.º 8
0
def CCompiler_get_version(self, force=False, ok_status=[0]):
    """
    Return compiler version, or None if compiler is not available.

    Parameters
    ----------
    force : bool, optional
        If True, force a new determination of the version, even if the
        compiler already has a version attribute. Default is False.
    ok_status : list of int, optional
        The list of status values returned by the version look-up process
        for which a version string is returned. If the status value is not
        in `ok_status`, None is returned. Default is ``[0]``.

    Returns
    -------
    version : str or None
        Version string, in the format of `distutils.version.LooseVersion`.

    """
    if not force and hasattr(self, 'version'):
        return self.version
    self.find_executables()
    try:
        version_cmd = self.version_cmd
    except AttributeError:
        return None
    if not version_cmd or not version_cmd[0]:
        return None
    try:
        matcher = self.version_match
    except AttributeError:
        try:
            pat = self.version_pattern
        except AttributeError:
            return None

        def matcher(version_string):
            m = re.match(pat, version_string)
            if not m:
                return None
            version = m.group('version')
            return version

    try:
        output = subprocess.check_output(version_cmd, stderr=subprocess.STDOUT)
    except subprocess.CalledProcessError as exc:
        output = exc.output
        status = exc.returncode
    except OSError:
        # match the historical returns for a parent
        # exception class caught by exec_command()
        status = 127
        output = b''
    else:
        # output isn't actually a filepath but we do this
        # for now to match previous distutils behavior
        output = filepath_from_subprocess_output(output)
        status = 0

    version = None
    if status in ok_status:
        version = matcher(output)
        if version:
            version = LooseVersion(version)
    self.version = version
    return version
Exemplo n.º 9
0
 def get_output(
     self,
     body,
     headers=None,
     include_dirs=None,
     libraries=None,
     library_dirs=None,
     lang="c",
     use_tee=None,
 ):
     """Try to compile, link to an executable, and run a program
     built from 'body' and 'headers'. Returns the exit status code
     of the program and its output.
     """
     # 2008-11-16, RemoveMe
     warnings.warn(
         "\n+++++++++++++++++++++++++++++++++++++++++++++++++\n"
         "Usage of get_output is deprecated: please do not \n"
         "use it anymore, and avoid configuration checks \n"
         "involving running executable on the target machine.\n"
         "+++++++++++++++++++++++++++++++++++++++++++++++++\n",
         DeprecationWarning,
         stacklevel=2,
     )
     self._check_compiler()
     exitcode, output = 255, ""
     try:
         grabber = GrabStdout()
         try:
             src, obj, exe = self._link(
                 body, headers, include_dirs, libraries, library_dirs, lang
             )
             grabber.restore()
         except Exception:
             output = grabber.data
             grabber.restore()
             raise
         exe = os.path.join(".", exe)
         try:
             # specify cwd arg for consistency with
             # historic usage pattern of exec_command()
             # also, note that exe appears to be a string,
             # which exec_command() handled, but we now
             # use a list for check_output() -- this assumes
             # that exe is always a single command
             output = subprocess.check_output([exe], cwd=".")
         except subprocess.CalledProcessError as exc:
             exitstatus = exc.returncode
             output = ""
         except OSError:
             # preserve the EnvironmentError exit status
             # used historically in exec_command()
             exitstatus = 127
             output = ""
         else:
             output = filepath_from_subprocess_output(output)
         if hasattr(os, "WEXITSTATUS"):
             exitcode = os.WEXITSTATUS(exitstatus)
             if os.WIFSIGNALED(exitstatus):
                 sig = os.WTERMSIG(exitstatus)
                 log.error("subprocess exited with signal %d" % (sig,))
                 if sig == signal.SIGINT:
                     # control-C
                     raise KeyboardInterrupt
         else:
             exitcode = exitstatus
         log.info("success!")
     except (CompileError, LinkError):
         log.info("failure.")
     self._clean()
     return exitcode, output
Exemplo n.º 10
0
def CCompiler_get_version(self, force=False, ok_status=[0]):
    """
    Return compiler version, or None if compiler is not available.

    Parameters
    ----------
    force : bool, optional
        If True, force a new determination of the version, even if the
        compiler already has a version attribute. Default is False.
    ok_status : list of int, optional
        The list of status values returned by the version look-up process
        for which a version string is returned. If the status value is not
        in `ok_status`, None is returned. Default is ``[0]``.

    Returns
    -------
    version : str or None
        Version string, in the format of `distutils.version.LooseVersion`.

    """
    if not force and hasattr(self, 'version'):
        return self.version
    self.find_executables()
    try:
        version_cmd = self.version_cmd
    except AttributeError:
        return None
    if not version_cmd or not version_cmd[0]:
        return None
    try:
        matcher = self.version_match
    except AttributeError:
        try:
            pat = self.version_pattern
        except AttributeError:
            return None
        def matcher(version_string):
            m = re.match(pat, version_string)
            if not m:
                return None
            version = m.group('version')
            return version

    try:
        output = subprocess.check_output(version_cmd)
    except subprocess.CalledProcessError as exc:
        output = exc.output
        status = exc.returncode
    except OSError:
        # match the historical returns for a parent
        # exception class caught by exec_command()
        status = 127
        output = b''
    else:
        # output isn't actually a filepath but we do this
        # for now to match previous distutils behavior
        output = filepath_from_subprocess_output(output)
        status = 0

    version = None
    if status in ok_status:
        version = matcher(output)
        if version:
            version = LooseVersion(version)
    self.version = version
    return version