Viewing file: sipdistutils.py (2.85 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
# Subclasses disutils.command.build_ext, # replacing it with a SIP version that compiles .sip -> .cpp # before calling the original build_ext command. # Written by Giovanni Bajo <rasky at develer dot com> # Based on Pyrex.Distutils, written by Graham Fawcett and Darrel Gallion.
import distutils.command.build_ext from distutils.dep_util import newer import os import sys
def replace_suffix(path, new_suffix): return os.path.splitext(path)[0] + new_suffix
class build_ext (distutils.command.build_ext.build_ext):
description = "Compiler SIP descriptions, then build C/C++ extensions (compile/link to build directory)"
def _get_sip_output_list(self, sbf): """ Parse the sbf file specified to extract the name of the generated source files. Make them absolute assuming they reside in the temp directory. """ for L in file(sbf): key, value = L.split("=", 1) if key.strip() == "sources": out = [] for o in value.split(): out.append(os.path.join(self.build_temp, o)) return out
raise RuntimeError, "cannot parse SIP-generated '%s'" % sbf
def _find_sip(self): import sipconfig cfg = sipconfig.Configuration() return cfg.sip_bin
def _sip_inc_dir(self): import sipconfig cfg = sipconfig.Configuration() return cfg.sip_inc_dir
def swig_sources (self, sources, extension=None): if not self.extensions: return
# Add the SIP include directory to the include path if extension is not None: extension.include_dirs.append(self._sip_inc_dir()) else: # pre-2.4 compatibility self.include_dirs.append(self._sip_inc_dir())
# Create the temporary directory if it does not exist already if not os.path.isdir(self.build_temp): os.makedirs(self.build_temp)
# Collect the names of the source (.sip) files sip_sources = [] sip_sources = [source for source in sources if source.endswith('.sip')] other_sources = [source for source in sources if not source.endswith('.sip')] generated_sources = []
sip_bin = self._find_sip()
for sip in sip_sources: # Use the sbf file as dependency check sipbasename = os.path.basename(sip) sbf = os.path.join(self.build_temp, replace_suffix(sipbasename, "sbf")) if newer(sip, sbf) or self.force: self._sip_compile(sip_bin, sip, sbf) out = self._get_sip_output_list(sbf) generated_sources.extend(out)
return generated_sources + other_sources
def _sip_compile(self, sip_bin, source, sbf): self.spawn([sip_bin, "-c", self.build_temp, "-b", sbf, source])
|