from distutils import file_util
import distutils.command.build_py
import distutils.command.config
from distutils.sysconfig import *
from distutils.errors import *
from distutils.filelist import FileList
from util import *
import os, sys, string
from stat import ST_MODE
class build_py(distutils.command.build_py.build_py, distutils.command.config.config):
def initialize_options (self):
distutils.command.build_py.build_py.initialize_options(self)
distutils.command.config.config.initialize_options(self)
def finalize_options (self):
distutils.command.build_py.build_py.finalize_options(self)
distutils.command.config.config.finalize_options(self)
self.include_dirs = self.include_dirs + [get_python_inc()]
self.library_dirs = self.library_dirs + [get_python_lib()]
# for extensions under windows use different directories
# for Release and Debug builds.
# also Python's library directory must be appended to library_dirs
if os.name == 'nt':
self.library_dirs.append(os.path.join(sys.exec_prefix, 'libs'))
# for extensions under Cygwin Python's library directory must be
# appended to library_dirs
if sys.platform[:6] == 'cygwin':
if string.find(sys.executable, sys.exec_prefix) != -1:
# building third party extensions
self.library_dirs.append(os.path.join(sys.prefix, "lib", "python" + sys.version[:3], "config"))
else:
# building python standard extensions
self.library_dirs.append('.')
def run(self):
self._check_compiler()
customize_compiler(self.compiler)
for name, value in self.distribution.define_macros:
self.compiler.define_macro(name, value)
self.dump_source = 0
f = FileList()
f.process_template_line('include src/shadow/*.c')
for file in f.files:
try:
BUILD = get_build_info(file)
#if (not BUILD.has_key('platform_include') or sys.platform in BUILD['platform_include']) and (not BUILD.has_key('platform_exclude') or sys.platform not in BUILD['platform_exclude']):
if not BUILD.has_key('gl_platforms') or self.distribution.gl_platform in BUILD['gl_platforms']:
libs = ['GL', 'GLU']
headers = []
if BUILD.has_key('libs'):
libs.extend(BUILD['libs'])
if BUILD.has_key( 'include_dirs' ):
headers = BUILD['include_dirs']
self.libraries = self.distribution.transform_libs(libs)
self.try_run(
open(file).read(),
library_dirs = self.distribution.library_dirs,
include_dirs = self.distribution.include_dirs + headers,
)
api_version_string = open('api_version').read()
if not api_version_string:
self.warn( """No current api_version_string, expect %s to be improperly generated"""%( file, ))
src = os.path.join(
os.path.splitext(file)[0]+ '.py'
)
else:
# has an api_version_string
src = os.path.join(
os.path.splitext(file)[0]+ '.%04x.py' % string.atoi(api_version_string)
)
names = string.split(os.path.splitext(os.path.split(file)[1])[0], '.')
dest = self.get_module_outfile(self.build_lib, ['OpenGL'] + names[:-1], names[-1])
self.mkpath(os.path.split(dest)[0])
self.copy_file(src, dest)
os.remove('api_version')
except:
import traceback
traceback.print_exc()
self.warn( """Failure compiling version-selector, likely will be missing shadow modules for %r"""%( file,))
distutils.command.build_py.build_py.run(self)
def copy_file (self, infile, outfile, preserve_mode=1, preserve_times=1, link=None, level=1):
"""Copy a file respecting verbose, dry-run and force flags. (The
former two default to whatever is in the Distribution object, and
the latter defaults to false for commands that don't define it.)"""
i = open(infile)
line = i.readline()
mode_change = len(line) > 1 and line[:2] == '#!' and os.name == 'posix'
adjust = string.rstrip(line) == '#!' and os.name == 'posix' and not self.dry_run
if adjust:
o = open(outfile, 'wt')
o.writelines(['#!%s\n' % sys.executable] + i.readlines())
x = (outfile, 1)
else:
x = file_util.copy_file(infile, outfile, preserve_mode, preserve_times, not self.force, link, self.verbose >= level, self.dry_run)
if mode_change:
if self.dry_run:
self.announce("changing mode of %s" % outfile)
else:
mode = (os.stat(outfile)[ST_MODE]) | 0111
self.announce("changing mode of %s to %o" % (outfile, mode))
os.chmod(outfile, mode)
return x
def get_outputs(self, include_bytecode=1):
outputs = []
f = FileList()
f.process_template_line('include src/shadow/*.c')
for file in f.files:
try:
BUILD = get_build_info(file)
#if (not BUILD.has_key('platform_include') or sys.platform in BUILD['platform_include']) and (not BUILD.has_key('platform_exclude') or sys.platform not in BUILD['platform_exclude']):
if not BUILD.has_key('gl_platforms') or self.distribution.gl_platform in BUILD['gl_platforms']:
names = string.split(os.path.splitext(os.path.split(file)[1])[0], '.')
dest = self.get_module_outfile(self.build_lib, ['OpenGL'] + names[:-1], names[-1])
outputs.append(dest)
if include_bytecode:
if self.compile:
outputs.append(dest + "c")
if self.optimize > 0:
outputs.append(dest + "o")
except:
import traceback
traceback.print_exc()
return outputs + (distutils.command.build_py.build_py.get_outputs(self, include_bytecode) or [])
# Copied from config to fix bug
def try_run (self, body,
headers=None, include_dirs=None,
libraries=None, library_dirs=None,
lang="c"):
"""Try to compile, link to an executable, and run a program
built from 'body' and 'headers'. Return true on success, false
otherwise.
"""
from distutils.ccompiler import CompileError,LinkError
self._check_compiler()
try:
src, obj, prog = self._link(body, headers, include_dirs,
libraries, library_dirs, lang)
self.spawn([prog])
ok = 1
except (CompileError, LinkError, DistutilsExecError):
ok = 0
self._clean()
return ok
def _link (self, body,
headers, include_dirs,
libraries, library_dirs, lang):
(src, obj) = self._compile(body, headers, include_dirs, lang)
prog = os.path.splitext(os.path.basename(src))[0]
self.compiler.link_executable([obj], prog,
libraries=libraries,
library_dirs=library_dirs)
if sys.platform == 'win32':
prog = prog + '.exe'
self.temp_files.append(prog)
return (src, obj, prog)
|