init
This commit is contained in:
61
scons-local-3.0.0/SCons/Tool/386asm.py
Normal file
61
scons-local-3.0.0/SCons/Tool/386asm.py
Normal file
@@ -0,0 +1,61 @@
|
||||
"""SCons.Tool.386asm
|
||||
|
||||
Tool specification for the 386ASM assembler for the Phar Lap ETS embedded
|
||||
operating system.
|
||||
|
||||
There normally shouldn't be any need to import this module directly.
|
||||
It will usually be imported through the generic SCons.Tool.Tool()
|
||||
selection method.
|
||||
|
||||
"""
|
||||
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/386asm.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
from SCons.Tool.PharLapCommon import addPharLapPaths
|
||||
import SCons.Util
|
||||
|
||||
as_module = __import__('as', globals(), locals(), [], 1)
|
||||
|
||||
def generate(env):
|
||||
"""Add Builders and construction variables for ar to an Environment."""
|
||||
as_module.generate(env)
|
||||
|
||||
env['AS'] = '386asm'
|
||||
env['ASFLAGS'] = SCons.Util.CLVar('')
|
||||
env['ASPPFLAGS'] = '$ASFLAGS'
|
||||
env['ASCOM'] = '$AS $ASFLAGS $SOURCES -o $TARGET'
|
||||
env['ASPPCOM'] = '$CC $ASPPFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS $SOURCES -o $TARGET'
|
||||
|
||||
addPharLapPaths(env)
|
||||
|
||||
def exists(env):
|
||||
return env.Detect('386asm')
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
69
scons-local-3.0.0/SCons/Tool/DCommon.py
Normal file
69
scons-local-3.0.0/SCons/Tool/DCommon.py
Normal file
@@ -0,0 +1,69 @@
|
||||
from __future__ import print_function
|
||||
|
||||
"""SCons.Tool.DCommon
|
||||
|
||||
Common code for the various D tools.
|
||||
|
||||
Coded by Russel Winder (russel@winder.org.uk)
|
||||
2012-09-06
|
||||
"""
|
||||
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/DCommon.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
import os.path
|
||||
|
||||
|
||||
def isD(env, source):
|
||||
if not source:
|
||||
return 0
|
||||
for s in source:
|
||||
if s.sources:
|
||||
ext = os.path.splitext(str(s.sources[0]))[1]
|
||||
if ext == '.d':
|
||||
return 1
|
||||
return 0
|
||||
|
||||
|
||||
def addDPATHToEnv(env, executable):
|
||||
dPath = env.WhereIs(executable)
|
||||
if dPath:
|
||||
phobosDir = dPath[:dPath.rindex(executable)] + '/../src/phobos'
|
||||
if os.path.isdir(phobosDir):
|
||||
env.Append(DPATH=[phobosDir])
|
||||
|
||||
|
||||
def allAtOnceEmitter(target, source, env):
|
||||
if env['DC'] in ('ldc2', 'dmd'):
|
||||
env.SideEffect(str(target[0]) + '.o', target[0])
|
||||
env.Clean(target[0], str(target[0]) + '.o')
|
||||
return target, source
|
||||
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
280
scons-local-3.0.0/SCons/Tool/FortranCommon.py
Normal file
280
scons-local-3.0.0/SCons/Tool/FortranCommon.py
Normal file
@@ -0,0 +1,280 @@
|
||||
"""SCons.Tool.FortranCommon
|
||||
|
||||
Stuff for processing Fortran, common to all fortran dialects.
|
||||
|
||||
"""
|
||||
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
from __future__ import print_function
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/FortranCommon.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
import re
|
||||
import os.path
|
||||
|
||||
import SCons.Action
|
||||
import SCons.Defaults
|
||||
import SCons.Scanner.Fortran
|
||||
import SCons.Tool
|
||||
import SCons.Util
|
||||
|
||||
def isfortran(env, source):
|
||||
"""Return 1 if any of code in source has fortran files in it, 0
|
||||
otherwise."""
|
||||
try:
|
||||
fsuffixes = env['FORTRANSUFFIXES']
|
||||
except KeyError:
|
||||
# If no FORTRANSUFFIXES, no fortran tool, so there is no need to look
|
||||
# for fortran sources.
|
||||
return 0
|
||||
|
||||
if not source:
|
||||
# Source might be None for unusual cases like SConf.
|
||||
return 0
|
||||
for s in source:
|
||||
if s.sources:
|
||||
ext = os.path.splitext(str(s.sources[0]))[1]
|
||||
if ext in fsuffixes:
|
||||
return 1
|
||||
return 0
|
||||
|
||||
def _fortranEmitter(target, source, env):
|
||||
node = source[0].rfile()
|
||||
if not node.exists() and not node.is_derived():
|
||||
print("Could not locate " + str(node.name))
|
||||
return ([], [])
|
||||
mod_regex = """(?i)^\s*MODULE\s+(?!PROCEDURE)(\w+)"""
|
||||
cre = re.compile(mod_regex,re.M)
|
||||
# Retrieve all USE'd module names
|
||||
modules = cre.findall(node.get_text_contents())
|
||||
# Remove unique items from the list
|
||||
modules = SCons.Util.unique(modules)
|
||||
# Convert module name to a .mod filename
|
||||
suffix = env.subst('$FORTRANMODSUFFIX', target=target, source=source)
|
||||
moddir = env.subst('$FORTRANMODDIR', target=target, source=source)
|
||||
modules = [x.lower() + suffix for x in modules]
|
||||
for m in modules:
|
||||
target.append(env.fs.File(m, moddir))
|
||||
return (target, source)
|
||||
|
||||
def FortranEmitter(target, source, env):
|
||||
target, source = _fortranEmitter(target, source, env)
|
||||
return SCons.Defaults.StaticObjectEmitter(target, source, env)
|
||||
|
||||
def ShFortranEmitter(target, source, env):
|
||||
target, source = _fortranEmitter(target, source, env)
|
||||
return SCons.Defaults.SharedObjectEmitter(target, source, env)
|
||||
|
||||
def ComputeFortranSuffixes(suffixes, ppsuffixes):
|
||||
"""suffixes are fortran source files, and ppsuffixes the ones to be
|
||||
pre-processed. Both should be sequences, not strings."""
|
||||
assert len(suffixes) > 0
|
||||
s = suffixes[0]
|
||||
sup = s.upper()
|
||||
upper_suffixes = [_.upper() for _ in suffixes]
|
||||
if SCons.Util.case_sensitive_suffixes(s, sup):
|
||||
ppsuffixes.extend(upper_suffixes)
|
||||
else:
|
||||
suffixes.extend(upper_suffixes)
|
||||
|
||||
def CreateDialectActions(dialect):
|
||||
"""Create dialect specific actions."""
|
||||
CompAction = SCons.Action.Action('$%sCOM ' % dialect, '$%sCOMSTR' % dialect)
|
||||
CompPPAction = SCons.Action.Action('$%sPPCOM ' % dialect, '$%sPPCOMSTR' % dialect)
|
||||
ShCompAction = SCons.Action.Action('$SH%sCOM ' % dialect, '$SH%sCOMSTR' % dialect)
|
||||
ShCompPPAction = SCons.Action.Action('$SH%sPPCOM ' % dialect, '$SH%sPPCOMSTR' % dialect)
|
||||
|
||||
return CompAction, CompPPAction, ShCompAction, ShCompPPAction
|
||||
|
||||
def DialectAddToEnv(env, dialect, suffixes, ppsuffixes, support_module = 0):
|
||||
"""Add dialect specific construction variables."""
|
||||
ComputeFortranSuffixes(suffixes, ppsuffixes)
|
||||
|
||||
fscan = SCons.Scanner.Fortran.FortranScan("%sPATH" % dialect)
|
||||
|
||||
for suffix in suffixes + ppsuffixes:
|
||||
SCons.Tool.SourceFileScanner.add_scanner(suffix, fscan)
|
||||
|
||||
env.AppendUnique(FORTRANSUFFIXES = suffixes + ppsuffixes)
|
||||
|
||||
compaction, compppaction, shcompaction, shcompppaction = \
|
||||
CreateDialectActions(dialect)
|
||||
|
||||
static_obj, shared_obj = SCons.Tool.createObjBuilders(env)
|
||||
|
||||
for suffix in suffixes:
|
||||
static_obj.add_action(suffix, compaction)
|
||||
shared_obj.add_action(suffix, shcompaction)
|
||||
static_obj.add_emitter(suffix, FortranEmitter)
|
||||
shared_obj.add_emitter(suffix, ShFortranEmitter)
|
||||
|
||||
for suffix in ppsuffixes:
|
||||
static_obj.add_action(suffix, compppaction)
|
||||
shared_obj.add_action(suffix, shcompppaction)
|
||||
static_obj.add_emitter(suffix, FortranEmitter)
|
||||
shared_obj.add_emitter(suffix, ShFortranEmitter)
|
||||
|
||||
if '%sFLAGS' % dialect not in env:
|
||||
env['%sFLAGS' % dialect] = SCons.Util.CLVar('')
|
||||
|
||||
if 'SH%sFLAGS' % dialect not in env:
|
||||
env['SH%sFLAGS' % dialect] = SCons.Util.CLVar('$%sFLAGS' % dialect)
|
||||
|
||||
# If a tool does not define fortran prefix/suffix for include path, use C ones
|
||||
if 'INC%sPREFIX' % dialect not in env:
|
||||
env['INC%sPREFIX' % dialect] = '$INCPREFIX'
|
||||
|
||||
if 'INC%sSUFFIX' % dialect not in env:
|
||||
env['INC%sSUFFIX' % dialect] = '$INCSUFFIX'
|
||||
|
||||
env['_%sINCFLAGS' % dialect] = '$( ${_concat(INC%sPREFIX, %sPATH, INC%sSUFFIX, __env__, RDirs, TARGET, SOURCE)} $)' % (dialect, dialect, dialect)
|
||||
|
||||
if support_module == 1:
|
||||
env['%sCOM' % dialect] = '$%s -o $TARGET -c $%sFLAGS $_%sINCFLAGS $_FORTRANMODFLAG $SOURCES' % (dialect, dialect, dialect)
|
||||
env['%sPPCOM' % dialect] = '$%s -o $TARGET -c $%sFLAGS $CPPFLAGS $_CPPDEFFLAGS $_%sINCFLAGS $_FORTRANMODFLAG $SOURCES' % (dialect, dialect, dialect)
|
||||
env['SH%sCOM' % dialect] = '$SH%s -o $TARGET -c $SH%sFLAGS $_%sINCFLAGS $_FORTRANMODFLAG $SOURCES' % (dialect, dialect, dialect)
|
||||
env['SH%sPPCOM' % dialect] = '$SH%s -o $TARGET -c $SH%sFLAGS $CPPFLAGS $_CPPDEFFLAGS $_%sINCFLAGS $_FORTRANMODFLAG $SOURCES' % (dialect, dialect, dialect)
|
||||
else:
|
||||
env['%sCOM' % dialect] = '$%s -o $TARGET -c $%sFLAGS $_%sINCFLAGS $SOURCES' % (dialect, dialect, dialect)
|
||||
env['%sPPCOM' % dialect] = '$%s -o $TARGET -c $%sFLAGS $CPPFLAGS $_CPPDEFFLAGS $_%sINCFLAGS $SOURCES' % (dialect, dialect, dialect)
|
||||
env['SH%sCOM' % dialect] = '$SH%s -o $TARGET -c $SH%sFLAGS $_%sINCFLAGS $SOURCES' % (dialect, dialect, dialect)
|
||||
env['SH%sPPCOM' % dialect] = '$SH%s -o $TARGET -c $SH%sFLAGS $CPPFLAGS $_CPPDEFFLAGS $_%sINCFLAGS $SOURCES' % (dialect, dialect, dialect)
|
||||
|
||||
def add_fortran_to_env(env):
|
||||
"""Add Builders and construction variables for Fortran to an Environment."""
|
||||
try:
|
||||
FortranSuffixes = env['FORTRANFILESUFFIXES']
|
||||
except KeyError:
|
||||
FortranSuffixes = ['.f', '.for', '.ftn']
|
||||
|
||||
#print("Adding %s to fortran suffixes" % FortranSuffixes)
|
||||
try:
|
||||
FortranPPSuffixes = env['FORTRANPPFILESUFFIXES']
|
||||
except KeyError:
|
||||
FortranPPSuffixes = ['.fpp', '.FPP']
|
||||
|
||||
DialectAddToEnv(env, "FORTRAN", FortranSuffixes,
|
||||
FortranPPSuffixes, support_module = 1)
|
||||
|
||||
env['FORTRANMODPREFIX'] = '' # like $LIBPREFIX
|
||||
env['FORTRANMODSUFFIX'] = '.mod' # like $LIBSUFFIX
|
||||
|
||||
env['FORTRANMODDIR'] = '' # where the compiler should place .mod files
|
||||
env['FORTRANMODDIRPREFIX'] = '' # some prefix to $FORTRANMODDIR - similar to $INCPREFIX
|
||||
env['FORTRANMODDIRSUFFIX'] = '' # some suffix to $FORTRANMODDIR - similar to $INCSUFFIX
|
||||
env['_FORTRANMODFLAG'] = '$( ${_concat(FORTRANMODDIRPREFIX, FORTRANMODDIR, FORTRANMODDIRSUFFIX, __env__, RDirs, TARGET, SOURCE)} $)'
|
||||
|
||||
def add_f77_to_env(env):
|
||||
"""Add Builders and construction variables for f77 to an Environment."""
|
||||
try:
|
||||
F77Suffixes = env['F77FILESUFFIXES']
|
||||
except KeyError:
|
||||
F77Suffixes = ['.f77']
|
||||
|
||||
#print("Adding %s to f77 suffixes" % F77Suffixes)
|
||||
try:
|
||||
F77PPSuffixes = env['F77PPFILESUFFIXES']
|
||||
except KeyError:
|
||||
F77PPSuffixes = []
|
||||
|
||||
DialectAddToEnv(env, "F77", F77Suffixes, F77PPSuffixes)
|
||||
|
||||
def add_f90_to_env(env):
|
||||
"""Add Builders and construction variables for f90 to an Environment."""
|
||||
try:
|
||||
F90Suffixes = env['F90FILESUFFIXES']
|
||||
except KeyError:
|
||||
F90Suffixes = ['.f90']
|
||||
|
||||
#print("Adding %s to f90 suffixes" % F90Suffixes)
|
||||
try:
|
||||
F90PPSuffixes = env['F90PPFILESUFFIXES']
|
||||
except KeyError:
|
||||
F90PPSuffixes = []
|
||||
|
||||
DialectAddToEnv(env, "F90", F90Suffixes, F90PPSuffixes,
|
||||
support_module = 1)
|
||||
|
||||
def add_f95_to_env(env):
|
||||
"""Add Builders and construction variables for f95 to an Environment."""
|
||||
try:
|
||||
F95Suffixes = env['F95FILESUFFIXES']
|
||||
except KeyError:
|
||||
F95Suffixes = ['.f95']
|
||||
|
||||
#print("Adding %s to f95 suffixes" % F95Suffixes)
|
||||
try:
|
||||
F95PPSuffixes = env['F95PPFILESUFFIXES']
|
||||
except KeyError:
|
||||
F95PPSuffixes = []
|
||||
|
||||
DialectAddToEnv(env, "F95", F95Suffixes, F95PPSuffixes,
|
||||
support_module = 1)
|
||||
|
||||
def add_f03_to_env(env):
|
||||
"""Add Builders and construction variables for f03 to an Environment."""
|
||||
try:
|
||||
F03Suffixes = env['F03FILESUFFIXES']
|
||||
except KeyError:
|
||||
F03Suffixes = ['.f03']
|
||||
|
||||
#print("Adding %s to f95 suffixes" % F95Suffixes)
|
||||
try:
|
||||
F03PPSuffixes = env['F03PPFILESUFFIXES']
|
||||
except KeyError:
|
||||
F03PPSuffixes = []
|
||||
|
||||
DialectAddToEnv(env, "F03", F03Suffixes, F03PPSuffixes,
|
||||
support_module = 1)
|
||||
|
||||
def add_f08_to_env(env):
|
||||
"""Add Builders and construction variables for f08 to an Environment."""
|
||||
try:
|
||||
F08Suffixes = env['F08FILESUFFIXES']
|
||||
except KeyError:
|
||||
F08Suffixes = ['.f08']
|
||||
|
||||
try:
|
||||
F08PPSuffixes = env['F08PPFILESUFFIXES']
|
||||
except KeyError:
|
||||
F08PPSuffixes = []
|
||||
|
||||
DialectAddToEnv(env, "F08", F08Suffixes, F08PPSuffixes,
|
||||
support_module = 1)
|
||||
|
||||
def add_all_to_env(env):
|
||||
"""Add builders and construction variables for all supported fortran
|
||||
dialects."""
|
||||
add_fortran_to_env(env)
|
||||
add_f77_to_env(env)
|
||||
add_f90_to_env(env)
|
||||
add_f95_to_env(env)
|
||||
add_f03_to_env(env)
|
||||
add_f08_to_env(env)
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
469
scons-local-3.0.0/SCons/Tool/GettextCommon.py
Normal file
469
scons-local-3.0.0/SCons/Tool/GettextCommon.py
Normal file
@@ -0,0 +1,469 @@
|
||||
"""SCons.Tool.GettextCommon module
|
||||
|
||||
Used by several tools of `gettext` toolset.
|
||||
"""
|
||||
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/GettextCommon.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
import SCons.Warnings
|
||||
import re
|
||||
|
||||
|
||||
#############################################################################
|
||||
class XgettextToolWarning(SCons.Warnings.Warning): pass
|
||||
|
||||
|
||||
class XgettextNotFound(XgettextToolWarning): pass
|
||||
|
||||
|
||||
class MsginitToolWarning(SCons.Warnings.Warning): pass
|
||||
|
||||
|
||||
class MsginitNotFound(MsginitToolWarning): pass
|
||||
|
||||
|
||||
class MsgmergeToolWarning(SCons.Warnings.Warning): pass
|
||||
|
||||
|
||||
class MsgmergeNotFound(MsgmergeToolWarning): pass
|
||||
|
||||
|
||||
class MsgfmtToolWarning(SCons.Warnings.Warning): pass
|
||||
|
||||
|
||||
class MsgfmtNotFound(MsgfmtToolWarning): pass
|
||||
|
||||
|
||||
#############################################################################
|
||||
SCons.Warnings.enableWarningClass(XgettextToolWarning)
|
||||
SCons.Warnings.enableWarningClass(XgettextNotFound)
|
||||
SCons.Warnings.enableWarningClass(MsginitToolWarning)
|
||||
SCons.Warnings.enableWarningClass(MsginitNotFound)
|
||||
SCons.Warnings.enableWarningClass(MsgmergeToolWarning)
|
||||
SCons.Warnings.enableWarningClass(MsgmergeNotFound)
|
||||
SCons.Warnings.enableWarningClass(MsgfmtToolWarning)
|
||||
SCons.Warnings.enableWarningClass(MsgfmtNotFound)
|
||||
|
||||
|
||||
#############################################################################
|
||||
|
||||
#############################################################################
|
||||
class _POTargetFactory(object):
|
||||
""" A factory of `PO` target files.
|
||||
|
||||
Factory defaults differ from these of `SCons.Node.FS.FS`. We set `precious`
|
||||
(this is required by builders and actions gettext) and `noclean` flags by
|
||||
default for all produced nodes.
|
||||
"""
|
||||
|
||||
def __init__(self, env, nodefault=True, alias=None, precious=True
|
||||
, noclean=True):
|
||||
""" Object constructor.
|
||||
|
||||
**Arguments**
|
||||
|
||||
- *env* (`SCons.Environment.Environment`)
|
||||
- *nodefault* (`boolean`) - if `True`, produced nodes will be ignored
|
||||
from default target `'.'`
|
||||
- *alias* (`string`) - if provided, produced nodes will be automatically
|
||||
added to this alias, and alias will be set as `AlwaysBuild`
|
||||
- *precious* (`boolean`) - if `True`, the produced nodes will be set as
|
||||
`Precious`.
|
||||
- *noclen* (`boolean`) - if `True`, the produced nodes will be excluded
|
||||
from `Clean`.
|
||||
"""
|
||||
self.env = env
|
||||
self.alias = alias
|
||||
self.precious = precious
|
||||
self.noclean = noclean
|
||||
self.nodefault = nodefault
|
||||
|
||||
def _create_node(self, name, factory, directory=None, create=1):
|
||||
""" Create node, and set it up to factory settings. """
|
||||
import SCons.Util
|
||||
node = factory(name, directory, create)
|
||||
node.set_noclean(self.noclean)
|
||||
node.set_precious(self.precious)
|
||||
if self.nodefault:
|
||||
self.env.Ignore('.', node)
|
||||
if self.alias:
|
||||
self.env.AlwaysBuild(self.env.Alias(self.alias, node))
|
||||
return node
|
||||
|
||||
def Entry(self, name, directory=None, create=1):
|
||||
""" Create `SCons.Node.FS.Entry` """
|
||||
return self._create_node(name, self.env.fs.Entry, directory, create)
|
||||
|
||||
def File(self, name, directory=None, create=1):
|
||||
""" Create `SCons.Node.FS.File` """
|
||||
return self._create_node(name, self.env.fs.File, directory, create)
|
||||
|
||||
|
||||
#############################################################################
|
||||
|
||||
#############################################################################
|
||||
_re_comment = re.compile(r'(#[^\n\r]+)$', re.M)
|
||||
_re_lang = re.compile(r'([a-zA-Z0-9_]+)', re.M)
|
||||
|
||||
|
||||
#############################################################################
|
||||
def _read_linguas_from_files(env, linguas_files=None):
|
||||
""" Parse `LINGUAS` file and return list of extracted languages """
|
||||
import SCons.Util
|
||||
import SCons.Environment
|
||||
global _re_comment
|
||||
global _re_lang
|
||||
if not SCons.Util.is_List(linguas_files) \
|
||||
and not SCons.Util.is_String(linguas_files) \
|
||||
and not isinstance(linguas_files, SCons.Node.FS.Base) \
|
||||
and linguas_files:
|
||||
# If, linguas_files==True or such, then read 'LINGUAS' file.
|
||||
linguas_files = ['LINGUAS']
|
||||
if linguas_files is None:
|
||||
return []
|
||||
fnodes = env.arg2nodes(linguas_files)
|
||||
linguas = []
|
||||
for fnode in fnodes:
|
||||
contents = _re_comment.sub("", fnode.get_text_contents())
|
||||
ls = [l for l in _re_lang.findall(contents) if l]
|
||||
linguas.extend(ls)
|
||||
return linguas
|
||||
|
||||
|
||||
#############################################################################
|
||||
|
||||
#############################################################################
|
||||
from SCons.Builder import BuilderBase
|
||||
|
||||
|
||||
#############################################################################
|
||||
class _POFileBuilder(BuilderBase):
|
||||
""" `PO` file builder.
|
||||
|
||||
This is multi-target single-source builder. In typical situation the source
|
||||
is single `POT` file, e.g. `messages.pot`, and there are multiple `PO`
|
||||
targets to be updated from this `POT`. We must run
|
||||
`SCons.Builder.BuilderBase._execute()` separatelly for each target to track
|
||||
dependencies separatelly for each target file.
|
||||
|
||||
**NOTE**: if we call `SCons.Builder.BuilderBase._execute(.., target, ...)`
|
||||
with target being list of all targets, all targets would be rebuilt each time
|
||||
one of the targets from this list is missing. This would happen, for example,
|
||||
when new language `ll` enters `LINGUAS_FILE` (at this moment there is no
|
||||
`ll.po` file yet). To avoid this, we override
|
||||
`SCons.Builder.BuilerBase._execute()` and call it separatelly for each
|
||||
target. Here we also append to the target list the languages read from
|
||||
`LINGUAS_FILE`.
|
||||
"""
|
||||
|
||||
#
|
||||
# * The argument for overriding _execute(): We must use environment with
|
||||
# builder overrides applied (see BuilderBase.__init__(). Here it comes for
|
||||
# free.
|
||||
# * The argument against using 'emitter': The emitter is called too late
|
||||
# by BuilderBase._execute(). If user calls, for example:
|
||||
#
|
||||
# env.POUpdate(LINGUAS_FILE = 'LINGUAS')
|
||||
#
|
||||
# the builder throws error, because it is called with target=None,
|
||||
# source=None and is trying to "generate" sources or target list first.
|
||||
# If user calls
|
||||
#
|
||||
# env.POUpdate(['foo', 'baz'], LINGUAS_FILE = 'LINGUAS')
|
||||
#
|
||||
# the env.BuilderWrapper() calls our builder with target=None,
|
||||
# source=['foo', 'baz']. The BuilderBase._execute() then splits execution
|
||||
# and execute iterativelly (recursion) self._execute(None, source[i]).
|
||||
# After that it calls emitter (which is quite too late). The emitter is
|
||||
# also called in each iteration, what makes things yet worse.
|
||||
def __init__(self, env, **kw):
|
||||
if not 'suffix' in kw:
|
||||
kw['suffix'] = '$POSUFFIX'
|
||||
if not 'src_suffix' in kw:
|
||||
kw['src_suffix'] = '$POTSUFFIX'
|
||||
if not 'src_builder' in kw:
|
||||
kw['src_builder'] = '_POTUpdateBuilder'
|
||||
if not 'single_source' in kw:
|
||||
kw['single_source'] = True
|
||||
alias = None
|
||||
if 'target_alias' in kw:
|
||||
alias = kw['target_alias']
|
||||
del kw['target_alias']
|
||||
if not 'target_factory' in kw:
|
||||
kw['target_factory'] = _POTargetFactory(env, alias=alias).File
|
||||
BuilderBase.__init__(self, **kw)
|
||||
|
||||
def _execute(self, env, target, source, *args, **kw):
|
||||
""" Execute builder's actions.
|
||||
|
||||
Here we append to `target` the languages read from `$LINGUAS_FILE` and
|
||||
apply `SCons.Builder.BuilderBase._execute()` separatelly to each target.
|
||||
The arguments and return value are same as for
|
||||
`SCons.Builder.BuilderBase._execute()`.
|
||||
"""
|
||||
import SCons.Util
|
||||
import SCons.Node
|
||||
linguas_files = None
|
||||
if 'LINGUAS_FILE' in env and env['LINGUAS_FILE']:
|
||||
linguas_files = env['LINGUAS_FILE']
|
||||
# This prevents endless recursion loop (we'll be invoked once for
|
||||
# each target appended here, we must not extend the list again).
|
||||
env['LINGUAS_FILE'] = None
|
||||
linguas = _read_linguas_from_files(env, linguas_files)
|
||||
if SCons.Util.is_List(target):
|
||||
target.extend(linguas)
|
||||
elif target is not None:
|
||||
target = [target] + linguas
|
||||
else:
|
||||
target = linguas
|
||||
if not target:
|
||||
# Let the SCons.BuilderBase to handle this patologic situation
|
||||
return BuilderBase._execute(self, env, target, source, *args, **kw)
|
||||
# The rest is ours
|
||||
if not SCons.Util.is_List(target):
|
||||
target = [target]
|
||||
result = []
|
||||
for tgt in target:
|
||||
r = BuilderBase._execute(self, env, [tgt], source, *args, **kw)
|
||||
result.extend(r)
|
||||
if linguas_files is not None:
|
||||
env['LINGUAS_FILE'] = linguas_files
|
||||
return SCons.Node.NodeList(result)
|
||||
|
||||
|
||||
#############################################################################
|
||||
|
||||
import SCons.Environment
|
||||
|
||||
|
||||
#############################################################################
|
||||
def _translate(env, target=None, source=SCons.Environment._null, *args, **kw):
|
||||
""" Function for `Translate()` pseudo-builder """
|
||||
if target is None: target = []
|
||||
pot = env.POTUpdate(None, source, *args, **kw)
|
||||
po = env.POUpdate(target, pot, *args, **kw)
|
||||
return po
|
||||
|
||||
|
||||
#############################################################################
|
||||
|
||||
#############################################################################
|
||||
class RPaths(object):
|
||||
""" Callable object, which returns pathnames relative to SCons current
|
||||
working directory.
|
||||
|
||||
It seems like `SCons.Node.FS.Base.get_path()` returns absolute paths
|
||||
for nodes that are outside of current working directory (`env.fs.getcwd()`).
|
||||
Here, we often have `SConscript`, `POT` and `PO` files within `po/`
|
||||
directory and source files (e.g. `*.c`) outside of it. When generating `POT`
|
||||
template file, references to source files are written to `POT` template, so
|
||||
a translator may later quickly jump to appropriate source file and line from
|
||||
its `PO` editor (e.g. `poedit`). Relative paths in `PO` file are usually
|
||||
interpreted by `PO` editor as paths relative to the place, where `PO` file
|
||||
lives. The absolute paths would make resultant `POT` file nonportable, as
|
||||
the references would be correct only on the machine, where `POT` file was
|
||||
recently re-created. For such reason, we need a function, which always
|
||||
returns relative paths. This is the purpose of `RPaths` callable object.
|
||||
|
||||
The `__call__` method returns paths relative to current working directory, but
|
||||
we assume, that *xgettext(1)* is run from the directory, where target file is
|
||||
going to be created.
|
||||
|
||||
Note, that this may not work for files distributed over several hosts or
|
||||
across different drives on windows. We assume here, that single local
|
||||
filesystem holds both source files and target `POT` templates.
|
||||
|
||||
Intended use of `RPaths` - in `xgettext.py`::
|
||||
|
||||
def generate(env):
|
||||
from GettextCommon import RPaths
|
||||
...
|
||||
sources = '$( ${_concat( "", SOURCES, "", __env__, XgettextRPaths, TARGET, SOURCES)} $)'
|
||||
env.Append(
|
||||
...
|
||||
XGETTEXTCOM = 'XGETTEXT ... ' + sources,
|
||||
...
|
||||
XgettextRPaths = RPaths(env)
|
||||
)
|
||||
"""
|
||||
|
||||
# NOTE: This callable object returns pathnames of dirs/files relative to
|
||||
# current working directory. The pathname remains relative also for entries
|
||||
# that are outside of current working directory (node, that
|
||||
# SCons.Node.FS.File and siblings return absolute path in such case). For
|
||||
# simplicity we compute path relative to current working directory, this
|
||||
# seems be enough for our purposes (don't need TARGET variable and
|
||||
# SCons.Defaults.Variable_Caller stuff).
|
||||
|
||||
def __init__(self, env):
|
||||
""" Initialize `RPaths` callable object.
|
||||
|
||||
**Arguments**:
|
||||
|
||||
- *env* - a `SCons.Environment.Environment` object, defines *current
|
||||
working dir*.
|
||||
"""
|
||||
self.env = env
|
||||
|
||||
# FIXME: I'm not sure, how it should be implemented (what the *args are in
|
||||
# general, what is **kw).
|
||||
def __call__(self, nodes, *args, **kw):
|
||||
""" Return nodes' paths (strings) relative to current working directory.
|
||||
|
||||
**Arguments**:
|
||||
|
||||
- *nodes* ([`SCons.Node.FS.Base`]) - list of nodes.
|
||||
- *args* - currently unused.
|
||||
- *kw* - currently unused.
|
||||
|
||||
**Returns**:
|
||||
|
||||
- Tuple of strings, which represent paths relative to current working
|
||||
directory (for given environment).
|
||||
"""
|
||||
import os
|
||||
import SCons.Node.FS
|
||||
rpaths = ()
|
||||
cwd = self.env.fs.getcwd().get_abspath()
|
||||
for node in nodes:
|
||||
rpath = None
|
||||
if isinstance(node, SCons.Node.FS.Base):
|
||||
rpath = os.path.relpath(node.get_abspath(), cwd)
|
||||
# FIXME: Other types possible here?
|
||||
if rpath is not None:
|
||||
rpaths += (rpath,)
|
||||
return rpaths
|
||||
|
||||
|
||||
#############################################################################
|
||||
|
||||
#############################################################################
|
||||
def _init_po_files(target, source, env):
|
||||
""" Action function for `POInit` builder. """
|
||||
nop = lambda target, source, env: 0
|
||||
if 'POAUTOINIT' in env:
|
||||
autoinit = env['POAUTOINIT']
|
||||
else:
|
||||
autoinit = False
|
||||
# Well, if everything outside works well, this loop should do single
|
||||
# iteration. Otherwise we are rebuilding all the targets even, if just
|
||||
# one has changed (but is this our fault?).
|
||||
for tgt in target:
|
||||
if not tgt.exists():
|
||||
if autoinit:
|
||||
action = SCons.Action.Action('$MSGINITCOM', '$MSGINITCOMSTR')
|
||||
else:
|
||||
msg = 'File ' + repr(str(tgt)) + ' does not exist. ' \
|
||||
+ 'If you are a translator, you can create it through: \n' \
|
||||
+ '$MSGINITCOM'
|
||||
action = SCons.Action.Action(nop, msg)
|
||||
status = action([tgt], source, env)
|
||||
if status: return status
|
||||
return 0
|
||||
|
||||
|
||||
#############################################################################
|
||||
|
||||
#############################################################################
|
||||
def _detect_xgettext(env):
|
||||
""" Detects *xgettext(1)* binary """
|
||||
if 'XGETTEXT' in env:
|
||||
return env['XGETTEXT']
|
||||
xgettext = env.Detect('xgettext');
|
||||
if xgettext:
|
||||
return xgettext
|
||||
raise SCons.Errors.StopError(XgettextNotFound, "Could not detect xgettext")
|
||||
return None
|
||||
|
||||
|
||||
#############################################################################
|
||||
def _xgettext_exists(env):
|
||||
return _detect_xgettext(env)
|
||||
|
||||
|
||||
#############################################################################
|
||||
|
||||
#############################################################################
|
||||
def _detect_msginit(env):
|
||||
""" Detects *msginit(1)* program. """
|
||||
if 'MSGINIT' in env:
|
||||
return env['MSGINIT']
|
||||
msginit = env.Detect('msginit');
|
||||
if msginit:
|
||||
return msginit
|
||||
raise SCons.Errors.StopError(MsginitNotFound, "Could not detect msginit")
|
||||
return None
|
||||
|
||||
|
||||
#############################################################################
|
||||
def _msginit_exists(env):
|
||||
return _detect_msginit(env)
|
||||
|
||||
|
||||
#############################################################################
|
||||
|
||||
#############################################################################
|
||||
def _detect_msgmerge(env):
|
||||
""" Detects *msgmerge(1)* program. """
|
||||
if 'MSGMERGE' in env:
|
||||
return env['MSGMERGE']
|
||||
msgmerge = env.Detect('msgmerge');
|
||||
if msgmerge:
|
||||
return msgmerge
|
||||
raise SCons.Errors.StopError(MsgmergeNotFound, "Could not detect msgmerge")
|
||||
return None
|
||||
|
||||
|
||||
#############################################################################
|
||||
def _msgmerge_exists(env):
|
||||
return _detect_msgmerge(env)
|
||||
|
||||
|
||||
#############################################################################
|
||||
|
||||
#############################################################################
|
||||
def _detect_msgfmt(env):
|
||||
""" Detects *msgmfmt(1)* program. """
|
||||
if 'MSGFMT' in env:
|
||||
return env['MSGFMT']
|
||||
msgfmt = env.Detect('msgfmt');
|
||||
if msgfmt:
|
||||
return msgfmt
|
||||
raise SCons.Errors.StopError(MsgfmtNotFound, "Could not detect msgfmt")
|
||||
return None
|
||||
|
||||
|
||||
#############################################################################
|
||||
def _msgfmt_exists(env):
|
||||
return _detect_msgfmt(env)
|
||||
|
||||
|
||||
#############################################################################
|
||||
|
||||
#############################################################################
|
||||
def tool_list(platform, env):
|
||||
""" List tools that shall be generated by top-level `gettext` tool """
|
||||
return ['xgettext', 'msginit', 'msgmerge', 'msgfmt']
|
||||
|
||||
#############################################################################
|
||||
324
scons-local-3.0.0/SCons/Tool/JavaCommon.py
Normal file
324
scons-local-3.0.0/SCons/Tool/JavaCommon.py
Normal file
@@ -0,0 +1,324 @@
|
||||
"""SCons.Tool.JavaCommon
|
||||
|
||||
Stuff for processing Java.
|
||||
|
||||
"""
|
||||
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/JavaCommon.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
import os
|
||||
import os.path
|
||||
import re
|
||||
|
||||
java_parsing = 1
|
||||
|
||||
default_java_version = '1.4'
|
||||
|
||||
if java_parsing:
|
||||
# Parse Java files for class names.
|
||||
#
|
||||
# This is a really cool parser from Charles Crain
|
||||
# that finds appropriate class names in Java source.
|
||||
|
||||
# A regular expression that will find, in a java file:
|
||||
# newlines;
|
||||
# double-backslashes;
|
||||
# a single-line comment "//";
|
||||
# single or double quotes preceeded by a backslash;
|
||||
# single quotes, double quotes, open or close braces, semi-colons,
|
||||
# periods, open or close parentheses;
|
||||
# floating-point numbers;
|
||||
# any alphanumeric token (keyword, class name, specifier);
|
||||
# any alphanumeric token surrounded by angle brackets (generics);
|
||||
# the multi-line comment begin and end tokens /* and */;
|
||||
# array declarations "[]".
|
||||
_reToken = re.compile(r'(\n|\\\\|//|\\[\'"]|[\'"\{\}\;\.\(\)]|' +
|
||||
r'\d*\.\d*|[A-Za-z_][\w\$\.]*|<[A-Za-z_]\w+>|' +
|
||||
r'/\*|\*/|\[\])')
|
||||
|
||||
class OuterState(object):
|
||||
"""The initial state for parsing a Java file for classes,
|
||||
interfaces, and anonymous inner classes."""
|
||||
def __init__(self, version=default_java_version):
|
||||
|
||||
if not version in ('1.1', '1.2', '1.3','1.4', '1.5', '1.6', '1.7',
|
||||
'1.8', '5', '6'):
|
||||
msg = "Java version %s not supported" % version
|
||||
raise NotImplementedError(msg)
|
||||
|
||||
self.version = version
|
||||
self.listClasses = []
|
||||
self.listOutputs = []
|
||||
self.stackBrackets = []
|
||||
self.brackets = 0
|
||||
self.nextAnon = 1
|
||||
self.localClasses = []
|
||||
self.stackAnonClassBrackets = []
|
||||
self.anonStacksStack = [[0]]
|
||||
self.package = None
|
||||
|
||||
def trace(self):
|
||||
pass
|
||||
|
||||
def __getClassState(self):
|
||||
try:
|
||||
return self.classState
|
||||
except AttributeError:
|
||||
ret = ClassState(self)
|
||||
self.classState = ret
|
||||
return ret
|
||||
|
||||
def __getPackageState(self):
|
||||
try:
|
||||
return self.packageState
|
||||
except AttributeError:
|
||||
ret = PackageState(self)
|
||||
self.packageState = ret
|
||||
return ret
|
||||
|
||||
def __getAnonClassState(self):
|
||||
try:
|
||||
return self.anonState
|
||||
except AttributeError:
|
||||
self.outer_state = self
|
||||
ret = SkipState(1, AnonClassState(self))
|
||||
self.anonState = ret
|
||||
return ret
|
||||
|
||||
def __getSkipState(self):
|
||||
try:
|
||||
return self.skipState
|
||||
except AttributeError:
|
||||
ret = SkipState(1, self)
|
||||
self.skipState = ret
|
||||
return ret
|
||||
|
||||
def __getAnonStack(self):
|
||||
return self.anonStacksStack[-1]
|
||||
|
||||
def openBracket(self):
|
||||
self.brackets = self.brackets + 1
|
||||
|
||||
def closeBracket(self):
|
||||
self.brackets = self.brackets - 1
|
||||
if len(self.stackBrackets) and \
|
||||
self.brackets == self.stackBrackets[-1]:
|
||||
self.listOutputs.append('$'.join(self.listClasses))
|
||||
self.localClasses.pop()
|
||||
self.listClasses.pop()
|
||||
self.anonStacksStack.pop()
|
||||
self.stackBrackets.pop()
|
||||
if len(self.stackAnonClassBrackets) and \
|
||||
self.brackets == self.stackAnonClassBrackets[-1]:
|
||||
self.__getAnonStack().pop()
|
||||
self.stackAnonClassBrackets.pop()
|
||||
|
||||
def parseToken(self, token):
|
||||
if token[:2] == '//':
|
||||
return IgnoreState('\n', self)
|
||||
elif token == '/*':
|
||||
return IgnoreState('*/', self)
|
||||
elif token == '{':
|
||||
self.openBracket()
|
||||
elif token == '}':
|
||||
self.closeBracket()
|
||||
elif token in [ '"', "'" ]:
|
||||
return IgnoreState(token, self)
|
||||
elif token == "new":
|
||||
# anonymous inner class
|
||||
if len(self.listClasses) > 0:
|
||||
return self.__getAnonClassState()
|
||||
return self.__getSkipState() # Skip the class name
|
||||
elif token in ['class', 'interface', 'enum']:
|
||||
if len(self.listClasses) == 0:
|
||||
self.nextAnon = 1
|
||||
self.stackBrackets.append(self.brackets)
|
||||
return self.__getClassState()
|
||||
elif token == 'package':
|
||||
return self.__getPackageState()
|
||||
elif token == '.':
|
||||
# Skip the attribute, it might be named "class", in which
|
||||
# case we don't want to treat the following token as
|
||||
# an inner class name...
|
||||
return self.__getSkipState()
|
||||
return self
|
||||
|
||||
def addAnonClass(self):
|
||||
"""Add an anonymous inner class"""
|
||||
if self.version in ('1.1', '1.2', '1.3', '1.4'):
|
||||
clazz = self.listClasses[0]
|
||||
self.listOutputs.append('%s$%d' % (clazz, self.nextAnon))
|
||||
elif self.version in ('1.5', '1.6', '1.7', '1.8', '5', '6'):
|
||||
self.stackAnonClassBrackets.append(self.brackets)
|
||||
className = []
|
||||
className.extend(self.listClasses)
|
||||
self.__getAnonStack()[-1] = self.__getAnonStack()[-1] + 1
|
||||
for anon in self.__getAnonStack():
|
||||
className.append(str(anon))
|
||||
self.listOutputs.append('$'.join(className))
|
||||
|
||||
self.nextAnon = self.nextAnon + 1
|
||||
self.__getAnonStack().append(0)
|
||||
|
||||
def setPackage(self, package):
|
||||
self.package = package
|
||||
|
||||
class AnonClassState(object):
|
||||
"""A state that looks for anonymous inner classes."""
|
||||
def __init__(self, old_state):
|
||||
# outer_state is always an instance of OuterState
|
||||
self.outer_state = old_state.outer_state
|
||||
self.old_state = old_state
|
||||
self.brace_level = 0
|
||||
def parseToken(self, token):
|
||||
# This is an anonymous class if and only if the next
|
||||
# non-whitespace token is a bracket. Everything between
|
||||
# braces should be parsed as normal java code.
|
||||
if token[:2] == '//':
|
||||
return IgnoreState('\n', self)
|
||||
elif token == '/*':
|
||||
return IgnoreState('*/', self)
|
||||
elif token == '\n':
|
||||
return self
|
||||
elif token[0] == '<' and token[-1] == '>':
|
||||
return self
|
||||
elif token == '(':
|
||||
self.brace_level = self.brace_level + 1
|
||||
return self
|
||||
if self.brace_level > 0:
|
||||
if token == 'new':
|
||||
# look further for anonymous inner class
|
||||
return SkipState(1, AnonClassState(self))
|
||||
elif token in [ '"', "'" ]:
|
||||
return IgnoreState(token, self)
|
||||
elif token == ')':
|
||||
self.brace_level = self.brace_level - 1
|
||||
return self
|
||||
if token == '{':
|
||||
self.outer_state.addAnonClass()
|
||||
return self.old_state.parseToken(token)
|
||||
|
||||
class SkipState(object):
|
||||
"""A state that will skip a specified number of tokens before
|
||||
reverting to the previous state."""
|
||||
def __init__(self, tokens_to_skip, old_state):
|
||||
self.tokens_to_skip = tokens_to_skip
|
||||
self.old_state = old_state
|
||||
def parseToken(self, token):
|
||||
self.tokens_to_skip = self.tokens_to_skip - 1
|
||||
if self.tokens_to_skip < 1:
|
||||
return self.old_state
|
||||
return self
|
||||
|
||||
class ClassState(object):
|
||||
"""A state we go into when we hit a class or interface keyword."""
|
||||
def __init__(self, outer_state):
|
||||
# outer_state is always an instance of OuterState
|
||||
self.outer_state = outer_state
|
||||
def parseToken(self, token):
|
||||
# the next non-whitespace token should be the name of the class
|
||||
if token == '\n':
|
||||
return self
|
||||
# If that's an inner class which is declared in a method, it
|
||||
# requires an index prepended to the class-name, e.g.
|
||||
# 'Foo$1Inner'
|
||||
# http://scons.tigris.org/issues/show_bug.cgi?id=2087
|
||||
if self.outer_state.localClasses and \
|
||||
self.outer_state.stackBrackets[-1] > \
|
||||
self.outer_state.stackBrackets[-2]+1:
|
||||
locals = self.outer_state.localClasses[-1]
|
||||
try:
|
||||
idx = locals[token]
|
||||
locals[token] = locals[token]+1
|
||||
except KeyError:
|
||||
locals[token] = 1
|
||||
token = str(locals[token]) + token
|
||||
self.outer_state.localClasses.append({})
|
||||
self.outer_state.listClasses.append(token)
|
||||
self.outer_state.anonStacksStack.append([0])
|
||||
return self.outer_state
|
||||
|
||||
class IgnoreState(object):
|
||||
"""A state that will ignore all tokens until it gets to a
|
||||
specified token."""
|
||||
def __init__(self, ignore_until, old_state):
|
||||
self.ignore_until = ignore_until
|
||||
self.old_state = old_state
|
||||
def parseToken(self, token):
|
||||
if self.ignore_until == token:
|
||||
return self.old_state
|
||||
return self
|
||||
|
||||
class PackageState(object):
|
||||
"""The state we enter when we encounter the package keyword.
|
||||
We assume the next token will be the package name."""
|
||||
def __init__(self, outer_state):
|
||||
# outer_state is always an instance of OuterState
|
||||
self.outer_state = outer_state
|
||||
def parseToken(self, token):
|
||||
self.outer_state.setPackage(token)
|
||||
return self.outer_state
|
||||
|
||||
def parse_java_file(fn, version=default_java_version):
|
||||
return parse_java(open(fn, 'r').read(), version)
|
||||
|
||||
def parse_java(contents, version=default_java_version, trace=None):
|
||||
"""Parse a .java file and return a double of package directory,
|
||||
plus a list of .class files that compiling that .java file will
|
||||
produce"""
|
||||
package = None
|
||||
initial = OuterState(version)
|
||||
currstate = initial
|
||||
for token in _reToken.findall(contents):
|
||||
# The regex produces a bunch of groups, but only one will
|
||||
# have anything in it.
|
||||
currstate = currstate.parseToken(token)
|
||||
if trace: trace(token, currstate)
|
||||
if initial.package:
|
||||
package = initial.package.replace('.', os.sep)
|
||||
return (package, initial.listOutputs)
|
||||
|
||||
else:
|
||||
# Don't actually parse Java files for class names.
|
||||
#
|
||||
# We might make this a configurable option in the future if
|
||||
# Java-file parsing takes too long (although it shouldn't relative
|
||||
# to how long the Java compiler itself seems to take...).
|
||||
|
||||
def parse_java_file(fn):
|
||||
""" "Parse" a .java file.
|
||||
|
||||
This actually just splits the file name, so the assumption here
|
||||
is that the file name matches the public class name, and that
|
||||
the path to the file is the same as the package name.
|
||||
"""
|
||||
return os.path.split(file)
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
57
scons-local-3.0.0/SCons/Tool/MSCommon/__init__.py
Normal file
57
scons-local-3.0.0/SCons/Tool/MSCommon/__init__.py
Normal file
@@ -0,0 +1,57 @@
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/MSCommon/__init__.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
__doc__ = """
|
||||
Common functions for Microsoft Visual Studio and Visual C/C++.
|
||||
"""
|
||||
|
||||
import copy
|
||||
import os
|
||||
import re
|
||||
import subprocess
|
||||
|
||||
import SCons.Errors
|
||||
import SCons.Platform.win32
|
||||
import SCons.Util
|
||||
|
||||
from SCons.Tool.MSCommon.sdk import mssdk_exists, \
|
||||
mssdk_setup_env
|
||||
|
||||
from SCons.Tool.MSCommon.vc import msvc_exists, \
|
||||
msvc_setup_env, \
|
||||
msvc_setup_env_once, \
|
||||
msvc_version_to_maj_min
|
||||
|
||||
from SCons.Tool.MSCommon.vs import get_default_version, \
|
||||
get_vs_by_version, \
|
||||
merge_default_version, \
|
||||
msvs_exists, \
|
||||
query_versions
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
67
scons-local-3.0.0/SCons/Tool/MSCommon/arch.py
Normal file
67
scons-local-3.0.0/SCons/Tool/MSCommon/arch.py
Normal file
@@ -0,0 +1,67 @@
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/MSCommon/arch.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
__doc__ = """Module to define supported Windows chip architectures.
|
||||
"""
|
||||
|
||||
import os
|
||||
|
||||
class ArchDefinition(object):
|
||||
"""
|
||||
A class for defining architecture-specific settings and logic.
|
||||
"""
|
||||
def __init__(self, arch, synonyms=[]):
|
||||
self.arch = arch
|
||||
self.synonyms = synonyms
|
||||
|
||||
SupportedArchitectureList = [
|
||||
ArchitectureDefinition(
|
||||
'x86',
|
||||
['i386', 'i486', 'i586', 'i686'],
|
||||
),
|
||||
|
||||
ArchitectureDefinition(
|
||||
'x86_64',
|
||||
['AMD64', 'amd64', 'em64t', 'EM64T', 'x86_64'],
|
||||
),
|
||||
|
||||
ArchitectureDefinition(
|
||||
'ia64',
|
||||
['IA64'],
|
||||
),
|
||||
|
||||
ArchitectureDefinition(
|
||||
'arm',
|
||||
['ARM'],
|
||||
),
|
||||
|
||||
]
|
||||
|
||||
SupportedArchitectureMap = {}
|
||||
for a in SupportedArchitectureList:
|
||||
SupportedArchitectureMap[a.arch] = a
|
||||
for s in a.synonyms:
|
||||
SupportedArchitectureMap[s] = a
|
||||
|
||||
247
scons-local-3.0.0/SCons/Tool/MSCommon/common.py
Normal file
247
scons-local-3.0.0/SCons/Tool/MSCommon/common.py
Normal file
@@ -0,0 +1,247 @@
|
||||
"""
|
||||
Common helper functions for working with the Microsoft tool chain.
|
||||
"""
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
from __future__ import print_function
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/MSCommon/common.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
import copy
|
||||
import os
|
||||
import subprocess
|
||||
import re
|
||||
|
||||
import SCons.Util
|
||||
|
||||
|
||||
LOGFILE = os.environ.get('SCONS_MSCOMMON_DEBUG')
|
||||
if LOGFILE == '-':
|
||||
def debug(message):
|
||||
print(message)
|
||||
elif LOGFILE:
|
||||
try:
|
||||
import logging
|
||||
except ImportError:
|
||||
debug = lambda message: open(LOGFILE, 'a').write(message + '\n')
|
||||
else:
|
||||
logging.basicConfig(filename=LOGFILE, level=logging.DEBUG)
|
||||
debug = logging.debug
|
||||
else:
|
||||
debug = lambda x: None
|
||||
|
||||
|
||||
_is_win64 = None
|
||||
|
||||
def is_win64():
|
||||
"""Return true if running on windows 64 bits.
|
||||
|
||||
Works whether python itself runs in 64 bits or 32 bits."""
|
||||
# Unfortunately, python does not provide a useful way to determine
|
||||
# if the underlying Windows OS is 32-bit or 64-bit. Worse, whether
|
||||
# the Python itself is 32-bit or 64-bit affects what it returns,
|
||||
# so nothing in sys.* or os.* help.
|
||||
|
||||
# Apparently the best solution is to use env vars that Windows
|
||||
# sets. If PROCESSOR_ARCHITECTURE is not x86, then the python
|
||||
# process is running in 64 bit mode (on a 64-bit OS, 64-bit
|
||||
# hardware, obviously).
|
||||
# If this python is 32-bit but the OS is 64, Windows will set
|
||||
# ProgramW6432 and PROCESSOR_ARCHITEW6432 to non-null.
|
||||
# (Checking for HKLM\Software\Wow6432Node in the registry doesn't
|
||||
# work, because some 32-bit installers create it.)
|
||||
global _is_win64
|
||||
if _is_win64 is None:
|
||||
# I structured these tests to make it easy to add new ones or
|
||||
# add exceptions in the future, because this is a bit fragile.
|
||||
_is_win64 = False
|
||||
if os.environ.get('PROCESSOR_ARCHITECTURE', 'x86') != 'x86':
|
||||
_is_win64 = True
|
||||
if os.environ.get('PROCESSOR_ARCHITEW6432'):
|
||||
_is_win64 = True
|
||||
if os.environ.get('ProgramW6432'):
|
||||
_is_win64 = True
|
||||
return _is_win64
|
||||
|
||||
|
||||
def read_reg(value, hkroot=SCons.Util.HKEY_LOCAL_MACHINE):
|
||||
return SCons.Util.RegGetValue(hkroot, value)[0]
|
||||
|
||||
def has_reg(value):
|
||||
"""Return True if the given key exists in HKEY_LOCAL_MACHINE, False
|
||||
otherwise."""
|
||||
try:
|
||||
SCons.Util.RegOpenKeyEx(SCons.Util.HKEY_LOCAL_MACHINE, value)
|
||||
ret = True
|
||||
except SCons.Util.WinError:
|
||||
ret = False
|
||||
return ret
|
||||
|
||||
# Functions for fetching environment variable settings from batch files.
|
||||
|
||||
def normalize_env(env, keys, force=False):
|
||||
"""Given a dictionary representing a shell environment, add the variables
|
||||
from os.environ needed for the processing of .bat files; the keys are
|
||||
controlled by the keys argument.
|
||||
|
||||
It also makes sure the environment values are correctly encoded.
|
||||
|
||||
If force=True, then all of the key values that exist are copied
|
||||
into the returned dictionary. If force=false, values are only
|
||||
copied if the key does not already exist in the copied dictionary.
|
||||
|
||||
Note: the environment is copied."""
|
||||
normenv = {}
|
||||
if env:
|
||||
for k in list(env.keys()):
|
||||
normenv[k] = copy.deepcopy(env[k])
|
||||
|
||||
for k in keys:
|
||||
if k in os.environ and (force or not k in normenv):
|
||||
normenv[k] = os.environ[k]
|
||||
|
||||
# This shouldn't be necessary, since the default environment should include system32,
|
||||
# but keep this here to be safe, since it's needed to find reg.exe which the MSVC
|
||||
# bat scripts use.
|
||||
sys32_dir = os.path.join(os.environ.get("SystemRoot",
|
||||
os.environ.get("windir", r"C:\Windows\system32")),
|
||||
"System32")
|
||||
|
||||
if sys32_dir not in normenv['PATH']:
|
||||
normenv['PATH'] = normenv['PATH'] + os.pathsep + sys32_dir
|
||||
|
||||
# Without Wbem in PATH, vcvarsall.bat has a "'wmic' is not recognized"
|
||||
# error starting with Visual Studio 2017, although the script still
|
||||
# seems to work anyway.
|
||||
sys32_wbem_dir = os.path.join(sys32_dir, 'Wbem')
|
||||
if sys32_wbem_dir not in normenv['PATH']:
|
||||
normenv['PATH'] = normenv['PATH'] + os.pathsep + sys32_wbem_dir
|
||||
|
||||
debug("PATH: %s"%normenv['PATH'])
|
||||
|
||||
return normenv
|
||||
|
||||
def get_output(vcbat, args = None, env = None):
|
||||
"""Parse the output of given bat file, with given args."""
|
||||
|
||||
if env is None:
|
||||
# Create a blank environment, for use in launching the tools
|
||||
env = SCons.Environment.Environment(tools=[])
|
||||
|
||||
# TODO: This is a hard-coded list of the variables that (may) need
|
||||
# to be imported from os.environ[] for v[sc]*vars*.bat file
|
||||
# execution to work. This list should really be either directly
|
||||
# controlled by vc.py, or else derived from the common_tools_var
|
||||
# settings in vs.py.
|
||||
vs_vc_vars = [
|
||||
'COMSPEC',
|
||||
# VS100 and VS110: Still set, but modern MSVC setup scripts will
|
||||
# discard these if registry has values. However Intel compiler setup
|
||||
# script still requires these as of 2013/2014.
|
||||
'VS140COMNTOOLS',
|
||||
'VS120COMNTOOLS',
|
||||
'VS110COMNTOOLS',
|
||||
'VS100COMNTOOLS',
|
||||
'VS90COMNTOOLS',
|
||||
'VS80COMNTOOLS',
|
||||
'VS71COMNTOOLS',
|
||||
'VS70COMNTOOLS',
|
||||
'VS60COMNTOOLS',
|
||||
]
|
||||
env['ENV'] = normalize_env(env['ENV'], vs_vc_vars, force=False)
|
||||
|
||||
if args:
|
||||
debug("Calling '%s %s'" % (vcbat, args))
|
||||
popen = SCons.Action._subproc(env,
|
||||
'"%s" %s & set' % (vcbat, args),
|
||||
stdin='devnull',
|
||||
stdout=subprocess.PIPE,
|
||||
stderr=subprocess.PIPE)
|
||||
else:
|
||||
debug("Calling '%s'" % vcbat)
|
||||
popen = SCons.Action._subproc(env,
|
||||
'"%s" & set' % vcbat,
|
||||
stdin='devnull',
|
||||
stdout=subprocess.PIPE,
|
||||
stderr=subprocess.PIPE)
|
||||
|
||||
# Use the .stdout and .stderr attributes directly because the
|
||||
# .communicate() method uses the threading module on Windows
|
||||
# and won't work under Pythons not built with threading.
|
||||
stdout = popen.stdout.read()
|
||||
stderr = popen.stderr.read()
|
||||
|
||||
# Extra debug logic, uncomment if necessary
|
||||
# debug('get_output():stdout:%s'%stdout)
|
||||
# debug('get_output():stderr:%s'%stderr)
|
||||
|
||||
if stderr:
|
||||
# TODO: find something better to do with stderr;
|
||||
# this at least prevents errors from getting swallowed.
|
||||
import sys
|
||||
sys.stderr.write(stderr)
|
||||
if popen.wait() != 0:
|
||||
raise IOError(stderr.decode("mbcs"))
|
||||
|
||||
output = stdout.decode("mbcs")
|
||||
return output
|
||||
|
||||
def parse_output(output, keep=("INCLUDE", "LIB", "LIBPATH", "PATH")):
|
||||
"""
|
||||
Parse output from running visual c++/studios vcvarsall.bat and running set
|
||||
To capture the values listed in keep
|
||||
"""
|
||||
|
||||
# dkeep is a dict associating key: path_list, where key is one item from
|
||||
# keep, and pat_list the associated list of paths
|
||||
dkeep = dict([(i, []) for i in keep])
|
||||
|
||||
# rdk will keep the regex to match the .bat file output line starts
|
||||
rdk = {}
|
||||
for i in keep:
|
||||
rdk[i] = re.compile('%s=(.*)' % i, re.I)
|
||||
|
||||
def add_env(rmatch, key, dkeep=dkeep):
|
||||
path_list = rmatch.group(1).split(os.pathsep)
|
||||
for path in path_list:
|
||||
# Do not add empty paths (when a var ends with ;)
|
||||
if path:
|
||||
# XXX: For some reason, VC98 .bat file adds "" around the PATH
|
||||
# values, and it screws up the environment later, so we strip
|
||||
# it.
|
||||
path = path.strip('"')
|
||||
dkeep[key].append(str(path))
|
||||
|
||||
for line in output.splitlines():
|
||||
for k, value in rdk.items():
|
||||
match = value.match(line)
|
||||
if match:
|
||||
add_env(match, k)
|
||||
|
||||
return dkeep
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
83
scons-local-3.0.0/SCons/Tool/MSCommon/netframework.py
Normal file
83
scons-local-3.0.0/SCons/Tool/MSCommon/netframework.py
Normal file
@@ -0,0 +1,83 @@
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/MSCommon/netframework.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
__doc__ = """
|
||||
"""
|
||||
|
||||
import os
|
||||
import re
|
||||
import SCons.Util
|
||||
|
||||
from .common import read_reg, debug
|
||||
|
||||
# Original value recorded by dcournapeau
|
||||
_FRAMEWORKDIR_HKEY_ROOT = r'Software\Microsoft\.NETFramework\InstallRoot'
|
||||
# On SGK's system
|
||||
_FRAMEWORKDIR_HKEY_ROOT = r'Software\Microsoft\Microsoft SDKs\.NETFramework\v2.0\InstallationFolder'
|
||||
|
||||
def find_framework_root():
|
||||
# XXX: find it from environment (FrameworkDir)
|
||||
try:
|
||||
froot = read_reg(_FRAMEWORKDIR_HKEY_ROOT)
|
||||
debug("Found framework install root in registry: {}".format(froot))
|
||||
except SCons.Util.WinError as e:
|
||||
debug("Could not read reg key {}".format(_FRAMEWORKDIR_HKEY_ROOT))
|
||||
return None
|
||||
|
||||
if not os.path.exists(froot):
|
||||
debug("{} not found on fs".format(froot))
|
||||
return None
|
||||
|
||||
return froot
|
||||
|
||||
def query_versions():
|
||||
froot = find_framework_root()
|
||||
if froot:
|
||||
contents = os.listdir(froot)
|
||||
|
||||
l = re.compile('v[0-9]+.*')
|
||||
versions = [e for e in contents if l.match(e)]
|
||||
|
||||
def versrt(a,b):
|
||||
# since version numbers aren't really floats...
|
||||
aa = a[1:]
|
||||
bb = b[1:]
|
||||
aal = aa.split('.')
|
||||
bbl = bb.split('.')
|
||||
# sequence comparison in python is lexicographical
|
||||
# which is exactly what we want.
|
||||
# Note we sort backwards so the highest version is first.
|
||||
return cmp(bbl,aal)
|
||||
|
||||
versions.sort(versrt)
|
||||
else:
|
||||
versions = []
|
||||
|
||||
return versions
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
403
scons-local-3.0.0/SCons/Tool/MSCommon/sdk.py
Normal file
403
scons-local-3.0.0/SCons/Tool/MSCommon/sdk.py
Normal file
@@ -0,0 +1,403 @@
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/MSCommon/sdk.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
__doc__ = """Module to detect the Platform/Windows SDK
|
||||
|
||||
PSDK 2003 R1 is the earliest version detected.
|
||||
"""
|
||||
|
||||
import os
|
||||
|
||||
import SCons.Errors
|
||||
import SCons.Util
|
||||
|
||||
from . import common
|
||||
|
||||
debug = common.debug
|
||||
|
||||
# SDK Checks. This is of course a mess as everything else on MS platforms. Here
|
||||
# is what we do to detect the SDK:
|
||||
#
|
||||
# For Windows SDK >= 6.0: just look into the registry entries:
|
||||
# HKLM\Software\Microsoft\Microsoft SDKs\Windows
|
||||
# All the keys in there are the available versions.
|
||||
#
|
||||
# For Platform SDK before 6.0 (2003 server R1 and R2, etc...), there does not
|
||||
# seem to be any sane registry key, so the precise location is hardcoded.
|
||||
#
|
||||
# For versions below 2003R1, it seems the PSDK is included with Visual Studio?
|
||||
#
|
||||
# Also, per the following:
|
||||
# http://benjamin.smedbergs.us/blog/tag/atl/
|
||||
# VC++ Professional comes with the SDK, VC++ Express does not.
|
||||
|
||||
# Location of the SDK (checked for 6.1 only)
|
||||
_CURINSTALLED_SDK_HKEY_ROOT = \
|
||||
r"Software\Microsoft\Microsoft SDKs\Windows\CurrentInstallFolder"
|
||||
|
||||
|
||||
class SDKDefinition(object):
|
||||
"""
|
||||
An abstract base class for trying to find installed SDK directories.
|
||||
"""
|
||||
def __init__(self, version, **kw):
|
||||
self.version = version
|
||||
self.__dict__.update(kw)
|
||||
|
||||
def find_sdk_dir(self):
|
||||
"""Try to find the MS SDK from the registry.
|
||||
|
||||
Return None if failed or the directory does not exist.
|
||||
"""
|
||||
if not SCons.Util.can_read_reg:
|
||||
debug('find_sdk_dir(): can not read registry')
|
||||
return None
|
||||
|
||||
hkey = self.HKEY_FMT % self.hkey_data
|
||||
debug('find_sdk_dir(): checking registry:{}'.format(hkey))
|
||||
|
||||
try:
|
||||
sdk_dir = common.read_reg(hkey)
|
||||
except SCons.Util.WinError as e:
|
||||
debug('find_sdk_dir(): no SDK registry key {}'.format(repr(hkey)))
|
||||
return None
|
||||
|
||||
debug('find_sdk_dir(): Trying SDK Dir: {}'.format(sdk_dir))
|
||||
|
||||
if not os.path.exists(sdk_dir):
|
||||
debug('find_sdk_dir(): {} not on file system'.format(sdk_dir))
|
||||
return None
|
||||
|
||||
ftc = os.path.join(sdk_dir, self.sanity_check_file)
|
||||
if not os.path.exists(ftc):
|
||||
debug("find_sdk_dir(): sanity check {} not found".format(ftc))
|
||||
return None
|
||||
|
||||
return sdk_dir
|
||||
|
||||
def get_sdk_dir(self):
|
||||
"""Return the MSSSDK given the version string."""
|
||||
try:
|
||||
return self._sdk_dir
|
||||
except AttributeError:
|
||||
sdk_dir = self.find_sdk_dir()
|
||||
self._sdk_dir = sdk_dir
|
||||
return sdk_dir
|
||||
|
||||
def get_sdk_vc_script(self,host_arch, target_arch):
|
||||
""" Return the script to initialize the VC compiler installed by SDK
|
||||
"""
|
||||
|
||||
if (host_arch == 'amd64' and target_arch == 'x86'):
|
||||
# No cross tools needed compiling 32 bits on 64 bit machine
|
||||
host_arch=target_arch
|
||||
|
||||
arch_string=target_arch
|
||||
if (host_arch != target_arch):
|
||||
arch_string='%s_%s'%(host_arch,target_arch)
|
||||
|
||||
debug("sdk.py: get_sdk_vc_script():arch_string:%s host_arch:%s target_arch:%s"%(arch_string,
|
||||
host_arch,
|
||||
target_arch))
|
||||
file=self.vc_setup_scripts.get(arch_string,None)
|
||||
debug("sdk.py: get_sdk_vc_script():file:%s"%file)
|
||||
return file
|
||||
|
||||
class WindowsSDK(SDKDefinition):
|
||||
"""
|
||||
A subclass for trying to find installed Windows SDK directories.
|
||||
"""
|
||||
HKEY_FMT = r'Software\Microsoft\Microsoft SDKs\Windows\v%s\InstallationFolder'
|
||||
def __init__(self, *args, **kw):
|
||||
SDKDefinition.__init__(self, *args, **kw)
|
||||
self.hkey_data = self.version
|
||||
|
||||
class PlatformSDK(SDKDefinition):
|
||||
"""
|
||||
A subclass for trying to find installed Platform SDK directories.
|
||||
"""
|
||||
HKEY_FMT = r'Software\Microsoft\MicrosoftSDK\InstalledSDKS\%s\Install Dir'
|
||||
def __init__(self, *args, **kw):
|
||||
SDKDefinition.__init__(self, *args, **kw)
|
||||
self.hkey_data = self.uuid
|
||||
|
||||
#
|
||||
# The list of VC initialization scripts installed by the SDK
|
||||
# These should be tried if the vcvarsall.bat TARGET_ARCH fails
|
||||
preSDK61VCSetupScripts = { 'x86' : r'bin\vcvars32.bat',
|
||||
'amd64' : r'bin\vcvarsamd64.bat',
|
||||
'x86_amd64': r'bin\vcvarsx86_amd64.bat',
|
||||
'x86_ia64' : r'bin\vcvarsx86_ia64.bat',
|
||||
'ia64' : r'bin\vcvarsia64.bat'}
|
||||
|
||||
SDK61VCSetupScripts = {'x86' : r'bin\vcvars32.bat',
|
||||
'amd64' : r'bin\amd64\vcvarsamd64.bat',
|
||||
'x86_amd64': r'bin\x86_amd64\vcvarsx86_amd64.bat',
|
||||
'x86_ia64' : r'bin\x86_ia64\vcvarsx86_ia64.bat',
|
||||
'ia64' : r'bin\ia64\vcvarsia64.bat'}
|
||||
|
||||
SDK70VCSetupScripts = { 'x86' : r'bin\vcvars32.bat',
|
||||
'amd64' : r'bin\vcvars64.bat',
|
||||
'x86_amd64': r'bin\vcvarsx86_amd64.bat',
|
||||
'x86_ia64' : r'bin\vcvarsx86_ia64.bat',
|
||||
'ia64' : r'bin\vcvarsia64.bat'}
|
||||
|
||||
SDK100VCSetupScripts = {'x86' : r'bin\vcvars32.bat',
|
||||
'amd64' : r'bin\vcvars64.bat',
|
||||
'x86_amd64': r'bin\x86_amd64\vcvarsx86_amd64.bat',
|
||||
'x86_arm' : r'bin\x86_arm\vcvarsx86_arm.bat'}
|
||||
|
||||
|
||||
# The list of support SDKs which we know how to detect.
|
||||
#
|
||||
# The first SDK found in the list is the one used by default if there
|
||||
# are multiple SDKs installed. Barring good reasons to the contrary,
|
||||
# this means we should list SDKs from most recent to oldest.
|
||||
#
|
||||
# If you update this list, update the documentation in Tool/mssdk.xml.
|
||||
SupportedSDKList = [
|
||||
WindowsSDK('10.0',
|
||||
sanity_check_file=r'bin\SetEnv.Cmd',
|
||||
include_subdir='include',
|
||||
lib_subdir={
|
||||
'x86' : ['lib'],
|
||||
'x86_64' : [r'lib\x64'],
|
||||
'ia64' : [r'lib\ia64'],
|
||||
},
|
||||
vc_setup_scripts = SDK70VCSetupScripts,
|
||||
),
|
||||
WindowsSDK('7.1',
|
||||
sanity_check_file=r'bin\SetEnv.Cmd',
|
||||
include_subdir='include',
|
||||
lib_subdir={
|
||||
'x86' : ['lib'],
|
||||
'x86_64' : [r'lib\x64'],
|
||||
'ia64' : [r'lib\ia64'],
|
||||
},
|
||||
vc_setup_scripts = SDK70VCSetupScripts,
|
||||
),
|
||||
WindowsSDK('7.0A',
|
||||
sanity_check_file=r'bin\SetEnv.Cmd',
|
||||
include_subdir='include',
|
||||
lib_subdir={
|
||||
'x86' : ['lib'],
|
||||
'x86_64' : [r'lib\x64'],
|
||||
'ia64' : [r'lib\ia64'],
|
||||
},
|
||||
vc_setup_scripts = SDK70VCSetupScripts,
|
||||
),
|
||||
WindowsSDK('7.0',
|
||||
sanity_check_file=r'bin\SetEnv.Cmd',
|
||||
include_subdir='include',
|
||||
lib_subdir={
|
||||
'x86' : ['lib'],
|
||||
'x86_64' : [r'lib\x64'],
|
||||
'ia64' : [r'lib\ia64'],
|
||||
},
|
||||
vc_setup_scripts = SDK70VCSetupScripts,
|
||||
),
|
||||
WindowsSDK('6.1',
|
||||
sanity_check_file=r'bin\SetEnv.Cmd',
|
||||
include_subdir='include',
|
||||
lib_subdir={
|
||||
'x86' : ['lib'],
|
||||
'x86_64' : [r'lib\x64'],
|
||||
'ia64' : [r'lib\ia64'],
|
||||
},
|
||||
vc_setup_scripts = SDK61VCSetupScripts,
|
||||
),
|
||||
|
||||
WindowsSDK('6.0A',
|
||||
sanity_check_file=r'include\windows.h',
|
||||
include_subdir='include',
|
||||
lib_subdir={
|
||||
'x86' : ['lib'],
|
||||
'x86_64' : [r'lib\x64'],
|
||||
'ia64' : [r'lib\ia64'],
|
||||
},
|
||||
vc_setup_scripts = preSDK61VCSetupScripts,
|
||||
),
|
||||
|
||||
WindowsSDK('6.0',
|
||||
sanity_check_file=r'bin\gacutil.exe',
|
||||
include_subdir='include',
|
||||
lib_subdir='lib',
|
||||
vc_setup_scripts = preSDK61VCSetupScripts,
|
||||
),
|
||||
|
||||
PlatformSDK('2003R2',
|
||||
sanity_check_file=r'SetEnv.Cmd',
|
||||
uuid="D2FF9F89-8AA2-4373-8A31-C838BF4DBBE1",
|
||||
vc_setup_scripts = preSDK61VCSetupScripts,
|
||||
),
|
||||
|
||||
PlatformSDK('2003R1',
|
||||
sanity_check_file=r'SetEnv.Cmd',
|
||||
uuid="8F9E5EF3-A9A5-491B-A889-C58EFFECE8B3",
|
||||
vc_setup_scripts = preSDK61VCSetupScripts,
|
||||
),
|
||||
]
|
||||
|
||||
SupportedSDKMap = {}
|
||||
for sdk in SupportedSDKList:
|
||||
SupportedSDKMap[sdk.version] = sdk
|
||||
|
||||
|
||||
# Finding installed SDKs isn't cheap, because it goes not only to the
|
||||
# registry but also to the disk to sanity-check that there is, in fact,
|
||||
# an SDK installed there and that the registry entry isn't just stale.
|
||||
# Find this information once, when requested, and cache it.
|
||||
|
||||
InstalledSDKList = None
|
||||
InstalledSDKMap = None
|
||||
|
||||
def get_installed_sdks():
|
||||
global InstalledSDKList
|
||||
global InstalledSDKMap
|
||||
debug('sdk.py:get_installed_sdks()')
|
||||
if InstalledSDKList is None:
|
||||
InstalledSDKList = []
|
||||
InstalledSDKMap = {}
|
||||
for sdk in SupportedSDKList:
|
||||
debug('MSCommon/sdk.py: trying to find SDK %s' % sdk.version)
|
||||
if sdk.get_sdk_dir():
|
||||
debug('MSCommon/sdk.py:found SDK %s' % sdk.version)
|
||||
InstalledSDKList.append(sdk)
|
||||
InstalledSDKMap[sdk.version] = sdk
|
||||
return InstalledSDKList
|
||||
|
||||
|
||||
# We may be asked to update multiple construction environments with
|
||||
# SDK information. When doing this, we check on-disk for whether
|
||||
# the SDK has 'mfc' and 'atl' subdirectories. Since going to disk
|
||||
# is expensive, cache results by directory.
|
||||
|
||||
SDKEnvironmentUpdates = {}
|
||||
|
||||
def set_sdk_by_directory(env, sdk_dir):
|
||||
global SDKEnvironmentUpdates
|
||||
debug('set_sdk_by_directory: Using dir:%s'%sdk_dir)
|
||||
try:
|
||||
env_tuple_list = SDKEnvironmentUpdates[sdk_dir]
|
||||
except KeyError:
|
||||
env_tuple_list = []
|
||||
SDKEnvironmentUpdates[sdk_dir] = env_tuple_list
|
||||
|
||||
include_path = os.path.join(sdk_dir, 'include')
|
||||
mfc_path = os.path.join(include_path, 'mfc')
|
||||
atl_path = os.path.join(include_path, 'atl')
|
||||
|
||||
if os.path.exists(mfc_path):
|
||||
env_tuple_list.append(('INCLUDE', mfc_path))
|
||||
if os.path.exists(atl_path):
|
||||
env_tuple_list.append(('INCLUDE', atl_path))
|
||||
env_tuple_list.append(('INCLUDE', include_path))
|
||||
|
||||
env_tuple_list.append(('LIB', os.path.join(sdk_dir, 'lib')))
|
||||
env_tuple_list.append(('LIBPATH', os.path.join(sdk_dir, 'lib')))
|
||||
env_tuple_list.append(('PATH', os.path.join(sdk_dir, 'bin')))
|
||||
|
||||
for variable, directory in env_tuple_list:
|
||||
env.PrependENVPath(variable, directory)
|
||||
|
||||
def get_sdk_by_version(mssdk):
|
||||
if mssdk not in SupportedSDKMap:
|
||||
raise SCons.Errors.UserError("SDK version {} is not supported".format(repr(mssdk)))
|
||||
get_installed_sdks()
|
||||
return InstalledSDKMap.get(mssdk)
|
||||
|
||||
def get_default_sdk():
|
||||
"""Set up the default Platform/Windows SDK."""
|
||||
get_installed_sdks()
|
||||
if not InstalledSDKList:
|
||||
return None
|
||||
return InstalledSDKList[0]
|
||||
|
||||
def mssdk_setup_env(env):
|
||||
debug('sdk.py:mssdk_setup_env()')
|
||||
if 'MSSDK_DIR' in env:
|
||||
sdk_dir = env['MSSDK_DIR']
|
||||
if sdk_dir is None:
|
||||
return
|
||||
sdk_dir = env.subst(sdk_dir)
|
||||
debug('sdk.py:mssdk_setup_env: Using MSSDK_DIR:{}'.format(sdk_dir))
|
||||
elif 'MSSDK_VERSION' in env:
|
||||
sdk_version = env['MSSDK_VERSION']
|
||||
if sdk_version is None:
|
||||
msg = "SDK version is specified as None"
|
||||
raise SCons.Errors.UserError(msg)
|
||||
sdk_version = env.subst(sdk_version)
|
||||
mssdk = get_sdk_by_version(sdk_version)
|
||||
if mssdk is None:
|
||||
msg = "SDK version %s is not installed" % sdk_version
|
||||
raise SCons.Errors.UserError(msg)
|
||||
sdk_dir = mssdk.get_sdk_dir()
|
||||
debug('sdk.py:mssdk_setup_env: Using MSSDK_VERSION:%s'%sdk_dir)
|
||||
elif 'MSVS_VERSION' in env:
|
||||
msvs_version = env['MSVS_VERSION']
|
||||
debug('sdk.py:mssdk_setup_env:Getting MSVS_VERSION from env:%s'%msvs_version)
|
||||
if msvs_version is None:
|
||||
debug('sdk.py:mssdk_setup_env thinks msvs_version is None')
|
||||
return
|
||||
msvs_version = env.subst(msvs_version)
|
||||
from . import vs
|
||||
msvs = vs.get_vs_by_version(msvs_version)
|
||||
debug('sdk.py:mssdk_setup_env:msvs is :%s'%msvs)
|
||||
if not msvs:
|
||||
debug('sdk.py:mssdk_setup_env: no VS version detected, bailingout:%s'%msvs)
|
||||
return
|
||||
sdk_version = msvs.sdk_version
|
||||
debug('sdk.py:msvs.sdk_version is %s'%sdk_version)
|
||||
if not sdk_version:
|
||||
return
|
||||
mssdk = get_sdk_by_version(sdk_version)
|
||||
if not mssdk:
|
||||
mssdk = get_default_sdk()
|
||||
if not mssdk:
|
||||
return
|
||||
sdk_dir = mssdk.get_sdk_dir()
|
||||
debug('sdk.py:mssdk_setup_env: Using MSVS_VERSION:%s'%sdk_dir)
|
||||
else:
|
||||
mssdk = get_default_sdk()
|
||||
if not mssdk:
|
||||
return
|
||||
sdk_dir = mssdk.get_sdk_dir()
|
||||
debug('sdk.py:mssdk_setup_env: not using any env values. sdk_dir:%s'%sdk_dir)
|
||||
|
||||
set_sdk_by_directory(env, sdk_dir)
|
||||
|
||||
#print "No MSVS_VERSION: this is likely to be a bug"
|
||||
|
||||
def mssdk_exists(version=None):
|
||||
sdks = get_installed_sdks()
|
||||
if version is None:
|
||||
return len(sdks) > 0
|
||||
return version in sdks
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
573
scons-local-3.0.0/SCons/Tool/MSCommon/vc.py
Normal file
573
scons-local-3.0.0/SCons/Tool/MSCommon/vc.py
Normal file
@@ -0,0 +1,573 @@
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
|
||||
# TODO:
|
||||
# * supported arch for versions: for old versions of batch file without
|
||||
# argument, giving bogus argument cannot be detected, so we have to hardcode
|
||||
# this here
|
||||
# * print warning when msvc version specified but not found
|
||||
# * find out why warning do not print
|
||||
# * test on 64 bits XP + VS 2005 (and VS 6 if possible)
|
||||
# * SDK
|
||||
# * Assembly
|
||||
__revision__ = "src/engine/SCons/Tool/MSCommon/vc.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
__doc__ = """Module for Visual C/C++ detection and configuration.
|
||||
"""
|
||||
import SCons.compat
|
||||
import SCons.Util
|
||||
|
||||
import subprocess
|
||||
import os
|
||||
import platform
|
||||
from string import digits as string_digits
|
||||
|
||||
import SCons.Warnings
|
||||
|
||||
from . import common
|
||||
|
||||
debug = common.debug
|
||||
|
||||
from . import sdk
|
||||
|
||||
get_installed_sdks = sdk.get_installed_sdks
|
||||
|
||||
|
||||
class VisualCException(Exception):
|
||||
pass
|
||||
|
||||
class UnsupportedVersion(VisualCException):
|
||||
pass
|
||||
|
||||
class UnsupportedArch(VisualCException):
|
||||
pass
|
||||
|
||||
class MissingConfiguration(VisualCException):
|
||||
pass
|
||||
|
||||
class NoVersionFound(VisualCException):
|
||||
pass
|
||||
|
||||
class BatchFileExecutionError(VisualCException):
|
||||
pass
|
||||
|
||||
# Dict to 'canonalize' the arch
|
||||
_ARCH_TO_CANONICAL = {
|
||||
"amd64" : "amd64",
|
||||
"emt64" : "amd64",
|
||||
"i386" : "x86",
|
||||
"i486" : "x86",
|
||||
"i586" : "x86",
|
||||
"i686" : "x86",
|
||||
"ia64" : "ia64",
|
||||
"itanium" : "ia64",
|
||||
"x86" : "x86",
|
||||
"x86_64" : "amd64",
|
||||
"x86_amd64" : "x86_amd64", # Cross compile to 64 bit from 32bits
|
||||
}
|
||||
|
||||
# Given a (host, target) tuple, return the argument for the bat file. Both host
|
||||
# and targets should be canonalized.
|
||||
_HOST_TARGET_ARCH_TO_BAT_ARCH = {
|
||||
("x86", "x86"): "x86",
|
||||
("x86", "amd64"): "x86_amd64",
|
||||
("x86", "x86_amd64"): "x86_amd64",
|
||||
("amd64", "x86_amd64"): "x86_amd64", # This is present in (at least) VS2012 express
|
||||
("amd64", "amd64"): "amd64",
|
||||
("amd64", "x86"): "x86",
|
||||
("x86", "ia64"): "x86_ia64"
|
||||
}
|
||||
|
||||
def get_host_target(env):
|
||||
debug('vc.py:get_host_target()')
|
||||
|
||||
host_platform = env.get('HOST_ARCH')
|
||||
if not host_platform:
|
||||
host_platform = platform.machine()
|
||||
# TODO(2.5): the native Python platform.machine() function returns
|
||||
# '' on all Python versions before 2.6, after which it also uses
|
||||
# PROCESSOR_ARCHITECTURE.
|
||||
if not host_platform:
|
||||
host_platform = os.environ.get('PROCESSOR_ARCHITECTURE', '')
|
||||
|
||||
# Retain user requested TARGET_ARCH
|
||||
req_target_platform = env.get('TARGET_ARCH')
|
||||
debug('vc.py:get_host_target() req_target_platform:%s'%req_target_platform)
|
||||
|
||||
if req_target_platform:
|
||||
# If user requested a specific platform then only try that one.
|
||||
target_platform = req_target_platform
|
||||
else:
|
||||
target_platform = host_platform
|
||||
|
||||
try:
|
||||
host = _ARCH_TO_CANONICAL[host_platform.lower()]
|
||||
except KeyError as e:
|
||||
msg = "Unrecognized host architecture %s"
|
||||
raise ValueError(msg % repr(host_platform))
|
||||
|
||||
try:
|
||||
target = _ARCH_TO_CANONICAL[target_platform.lower()]
|
||||
except KeyError as e:
|
||||
all_archs = str(list(_ARCH_TO_CANONICAL.keys()))
|
||||
raise ValueError("Unrecognized target architecture %s\n\tValid architectures: %s" % (target_platform, all_archs))
|
||||
|
||||
return (host, target,req_target_platform)
|
||||
|
||||
# If you update this, update SupportedVSList in Tool/MSCommon/vs.py, and the
|
||||
# MSVC_VERSION documentation in Tool/msvc.xml.
|
||||
_VCVER = ["14.1", "14.0", "14.0Exp", "12.0", "12.0Exp", "11.0", "11.0Exp", "10.0", "10.0Exp", "9.0", "9.0Exp","8.0", "8.0Exp","7.1", "7.0", "6.0"]
|
||||
|
||||
_VCVER_TO_PRODUCT_DIR = {
|
||||
'14.1' : [
|
||||
(SCons.Util.HKEY_LOCAL_MACHINE, r'')], # Visual Studio 2017 doesn't set this registry key anymore
|
||||
'14.0' : [
|
||||
(SCons.Util.HKEY_LOCAL_MACHINE, r'Microsoft\VisualStudio\14.0\Setup\VC\ProductDir')],
|
||||
'14.0Exp' : [
|
||||
(SCons.Util.HKEY_LOCAL_MACHINE, r'Microsoft\VCExpress\14.0\Setup\VC\ProductDir')],
|
||||
'12.0' : [
|
||||
(SCons.Util.HKEY_LOCAL_MACHINE, r'Microsoft\VisualStudio\12.0\Setup\VC\ProductDir'),
|
||||
],
|
||||
'12.0Exp' : [
|
||||
(SCons.Util.HKEY_LOCAL_MACHINE, r'Microsoft\VCExpress\12.0\Setup\VC\ProductDir'),
|
||||
],
|
||||
'11.0': [
|
||||
(SCons.Util.HKEY_LOCAL_MACHINE, r'Microsoft\VisualStudio\11.0\Setup\VC\ProductDir'),
|
||||
],
|
||||
'11.0Exp' : [
|
||||
(SCons.Util.HKEY_LOCAL_MACHINE, r'Microsoft\VCExpress\11.0\Setup\VC\ProductDir'),
|
||||
],
|
||||
'10.0': [
|
||||
(SCons.Util.HKEY_LOCAL_MACHINE, r'Microsoft\VisualStudio\10.0\Setup\VC\ProductDir'),
|
||||
],
|
||||
'10.0Exp' : [
|
||||
(SCons.Util.HKEY_LOCAL_MACHINE, r'Microsoft\VCExpress\10.0\Setup\VC\ProductDir'),
|
||||
],
|
||||
'9.0': [
|
||||
(SCons.Util.HKEY_CURRENT_USER, r'Microsoft\DevDiv\VCForPython\9.0\installdir',),
|
||||
(SCons.Util.HKEY_LOCAL_MACHINE, r'Microsoft\VisualStudio\9.0\Setup\VC\ProductDir',),
|
||||
],
|
||||
'9.0Exp' : [
|
||||
(SCons.Util.HKEY_LOCAL_MACHINE, r'Microsoft\VCExpress\9.0\Setup\VC\ProductDir'),
|
||||
],
|
||||
'8.0': [
|
||||
(SCons.Util.HKEY_LOCAL_MACHINE, r'Microsoft\VisualStudio\8.0\Setup\VC\ProductDir'),
|
||||
],
|
||||
'8.0Exp': [
|
||||
(SCons.Util.HKEY_LOCAL_MACHINE, r'Microsoft\VCExpress\8.0\Setup\VC\ProductDir'),
|
||||
],
|
||||
'7.1': [
|
||||
(SCons.Util.HKEY_LOCAL_MACHINE, r'Microsoft\VisualStudio\7.1\Setup\VC\ProductDir'),
|
||||
],
|
||||
'7.0': [
|
||||
(SCons.Util.HKEY_LOCAL_MACHINE, r'Microsoft\VisualStudio\7.0\Setup\VC\ProductDir'),
|
||||
],
|
||||
'6.0': [
|
||||
(SCons.Util.HKEY_LOCAL_MACHINE, r'Microsoft\VisualStudio\6.0\Setup\Microsoft Visual C++\ProductDir'),
|
||||
]
|
||||
}
|
||||
|
||||
def msvc_version_to_maj_min(msvc_version):
|
||||
msvc_version_numeric = ''.join([x for x in msvc_version if x in string_digits + '.'])
|
||||
|
||||
t = msvc_version_numeric.split(".")
|
||||
if not len(t) == 2:
|
||||
raise ValueError("Unrecognized version %s (%s)" % (msvc_version,msvc_version_numeric))
|
||||
try:
|
||||
maj = int(t[0])
|
||||
min = int(t[1])
|
||||
return maj, min
|
||||
except ValueError as e:
|
||||
raise ValueError("Unrecognized version %s (%s)" % (msvc_version,msvc_version_numeric))
|
||||
|
||||
def is_host_target_supported(host_target, msvc_version):
|
||||
"""Return True if the given (host, target) tuple is supported given the
|
||||
msvc version.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
host_target: tuple
|
||||
tuple of (canonalized) host-target, e.g. ("x86", "amd64") for cross
|
||||
compilation from 32 bits windows to 64 bits.
|
||||
msvc_version: str
|
||||
msvc version (major.minor, e.g. 10.0)
|
||||
|
||||
Note
|
||||
----
|
||||
This only check whether a given version *may* support the given (host,
|
||||
target), not that the toolchain is actually present on the machine.
|
||||
"""
|
||||
# We assume that any Visual Studio version supports x86 as a target
|
||||
if host_target[1] != "x86":
|
||||
maj, min = msvc_version_to_maj_min(msvc_version)
|
||||
if maj < 8:
|
||||
return False
|
||||
|
||||
return True
|
||||
|
||||
|
||||
def find_vc_pdir_vswhere(msvc_version):
|
||||
"""
|
||||
Find the MSVC product directory using vswhere.exe .
|
||||
Run it asking for specified version and get MSVS install location
|
||||
:param msvc_version:
|
||||
:return: MSVC install dir
|
||||
"""
|
||||
vswhere_path = os.path.join(
|
||||
'C:\\',
|
||||
'Program Files (x86)',
|
||||
'Microsoft Visual Studio',
|
||||
'Installer',
|
||||
'vswhere.exe'
|
||||
)
|
||||
vswhere_cmd = [vswhere_path, '-version', msvc_version, '-property', 'installationPath']
|
||||
|
||||
if os.path.exists(vswhere_path):
|
||||
sp = subprocess.Popen(vswhere_cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
||||
vsdir, err = sp.communicate()
|
||||
vsdir = vsdir.decode("mbcs")
|
||||
vsdir = vsdir.rstrip()
|
||||
vc_pdir = os.path.join(vsdir, 'VC')
|
||||
return vc_pdir
|
||||
else:
|
||||
# No vswhere on system, no install info available
|
||||
return None
|
||||
|
||||
|
||||
def find_vc_pdir(msvc_version):
|
||||
"""Try to find the product directory for the given
|
||||
version.
|
||||
|
||||
Note
|
||||
----
|
||||
If for some reason the requested version could not be found, an
|
||||
exception which inherits from VisualCException will be raised."""
|
||||
root = 'Software\\'
|
||||
try:
|
||||
hkeys = _VCVER_TO_PRODUCT_DIR[msvc_version]
|
||||
except KeyError:
|
||||
debug("Unknown version of MSVC: %s" % msvc_version)
|
||||
raise UnsupportedVersion("Unknown version %s" % msvc_version)
|
||||
|
||||
for hkroot, key in hkeys:
|
||||
try:
|
||||
comps = None
|
||||
if not key:
|
||||
comps = find_vc_pdir_vswhere(msvc_version)
|
||||
if not comps:
|
||||
debug('find_vc_dir(): no VC found via vswhere for version {}'.format(repr(key)))
|
||||
raise SCons.Util.WinError
|
||||
else:
|
||||
if common.is_win64():
|
||||
try:
|
||||
# ordinally at win64, try Wow6432Node first.
|
||||
comps = common.read_reg(root + 'Wow6432Node\\' + key, hkroot)
|
||||
except SCons.Util.WinError as e:
|
||||
# at Microsoft Visual Studio for Python 2.7, value is not in Wow6432Node
|
||||
pass
|
||||
if not comps:
|
||||
# not Win64, or Microsoft Visual Studio for Python 2.7
|
||||
comps = common.read_reg(root + key, hkroot)
|
||||
except SCons.Util.WinError as e:
|
||||
debug('find_vc_dir(): no VC registry key {}'.format(repr(key)))
|
||||
else:
|
||||
debug('find_vc_dir(): found VC in registry: {}'.format(comps))
|
||||
if os.path.exists(comps):
|
||||
return comps
|
||||
else:
|
||||
debug('find_vc_dir(): reg says dir is {}, but it does not exist. (ignoring)'.format(comps))
|
||||
raise MissingConfiguration("registry dir {} not found on the filesystem".format(comps))
|
||||
return None
|
||||
|
||||
def find_batch_file(env,msvc_version,host_arch,target_arch):
|
||||
"""
|
||||
Find the location of the batch script which should set up the compiler
|
||||
for any TARGET_ARCH whose compilers were installed by Visual Studio/VCExpress
|
||||
"""
|
||||
pdir = find_vc_pdir(msvc_version)
|
||||
if pdir is None:
|
||||
raise NoVersionFound("No version of Visual Studio found")
|
||||
|
||||
debug('vc.py: find_batch_file() pdir:{}'.format(pdir))
|
||||
|
||||
# filter out e.g. "Exp" from the version name
|
||||
msvc_ver_numeric = ''.join([x for x in msvc_version if x in string_digits + "."])
|
||||
vernum = float(msvc_ver_numeric)
|
||||
if 7 <= vernum < 8:
|
||||
pdir = os.path.join(pdir, os.pardir, "Common7", "Tools")
|
||||
batfilename = os.path.join(pdir, "vsvars32.bat")
|
||||
elif vernum < 7:
|
||||
pdir = os.path.join(pdir, "Bin")
|
||||
batfilename = os.path.join(pdir, "vcvars32.bat")
|
||||
elif 8 <= vernum <= 14:
|
||||
batfilename = os.path.join(pdir, "vcvarsall.bat")
|
||||
else: # vernum >= 14.1 VS2017 and above
|
||||
batfilename = os.path.join(pdir, "Auxiliary", "Build", "vcvarsall.bat")
|
||||
|
||||
if not os.path.exists(batfilename):
|
||||
debug("Not found: %s" % batfilename)
|
||||
batfilename = None
|
||||
|
||||
installed_sdks=get_installed_sdks()
|
||||
for _sdk in installed_sdks:
|
||||
sdk_bat_file = _sdk.get_sdk_vc_script(host_arch,target_arch)
|
||||
if not sdk_bat_file:
|
||||
debug("vc.py:find_batch_file() not found:%s"%_sdk)
|
||||
else:
|
||||
sdk_bat_file_path = os.path.join(pdir,sdk_bat_file)
|
||||
if os.path.exists(sdk_bat_file_path):
|
||||
debug('vc.py:find_batch_file() sdk_bat_file_path:%s'%sdk_bat_file_path)
|
||||
return (batfilename,sdk_bat_file_path)
|
||||
return (batfilename,None)
|
||||
|
||||
|
||||
__INSTALLED_VCS_RUN = None
|
||||
|
||||
def cached_get_installed_vcs():
|
||||
global __INSTALLED_VCS_RUN
|
||||
|
||||
if __INSTALLED_VCS_RUN is None:
|
||||
ret = get_installed_vcs()
|
||||
__INSTALLED_VCS_RUN = ret
|
||||
|
||||
return __INSTALLED_VCS_RUN
|
||||
|
||||
def get_installed_vcs():
|
||||
installed_versions = []
|
||||
for ver in _VCVER:
|
||||
debug('trying to find VC %s' % ver)
|
||||
try:
|
||||
if find_vc_pdir(ver):
|
||||
debug('found VC %s' % ver)
|
||||
installed_versions.append(ver)
|
||||
else:
|
||||
debug('find_vc_pdir return None for ver %s' % ver)
|
||||
except VisualCException as e:
|
||||
debug('did not find VC %s: caught exception %s' % (ver, str(e)))
|
||||
return installed_versions
|
||||
|
||||
def reset_installed_vcs():
|
||||
"""Make it try again to find VC. This is just for the tests."""
|
||||
__INSTALLED_VCS_RUN = None
|
||||
|
||||
# Running these batch files isn't cheap: most of the time spent in
|
||||
# msvs.generate() is due to vcvars*.bat. In a build that uses "tools='msvs'"
|
||||
# in multiple environments, for example:
|
||||
# env1 = Environment(tools='msvs')
|
||||
# env2 = Environment(tools='msvs')
|
||||
# we can greatly improve the speed of the second and subsequent Environment
|
||||
# (or Clone) calls by memoizing the environment variables set by vcvars*.bat.
|
||||
script_env_stdout_cache = {}
|
||||
def script_env(script, args=None):
|
||||
cache_key = (script, args)
|
||||
stdout = script_env_stdout_cache.get(cache_key, None)
|
||||
if stdout is None:
|
||||
stdout = common.get_output(script, args)
|
||||
script_env_stdout_cache[cache_key] = stdout
|
||||
|
||||
# Stupid batch files do not set return code: we take a look at the
|
||||
# beginning of the output for an error message instead
|
||||
olines = stdout.splitlines()
|
||||
if olines[0].startswith("The specified configuration type is missing"):
|
||||
raise BatchFileExecutionError("\n".join(olines[:2]))
|
||||
|
||||
return common.parse_output(stdout)
|
||||
|
||||
def get_default_version(env):
|
||||
debug('get_default_version()')
|
||||
|
||||
msvc_version = env.get('MSVC_VERSION')
|
||||
msvs_version = env.get('MSVS_VERSION')
|
||||
|
||||
debug('get_default_version(): msvc_version:%s msvs_version:%s'%(msvc_version,msvs_version))
|
||||
|
||||
if msvs_version and not msvc_version:
|
||||
SCons.Warnings.warn(
|
||||
SCons.Warnings.DeprecatedWarning,
|
||||
"MSVS_VERSION is deprecated: please use MSVC_VERSION instead ")
|
||||
return msvs_version
|
||||
elif msvc_version and msvs_version:
|
||||
if not msvc_version == msvs_version:
|
||||
SCons.Warnings.warn(
|
||||
SCons.Warnings.VisualVersionMismatch,
|
||||
"Requested msvc version (%s) and msvs version (%s) do " \
|
||||
"not match: please use MSVC_VERSION only to request a " \
|
||||
"visual studio version, MSVS_VERSION is deprecated" \
|
||||
% (msvc_version, msvs_version))
|
||||
return msvs_version
|
||||
if not msvc_version:
|
||||
installed_vcs = cached_get_installed_vcs()
|
||||
debug('installed_vcs:%s' % installed_vcs)
|
||||
if not installed_vcs:
|
||||
#msg = 'No installed VCs'
|
||||
#debug('msv %s\n' % repr(msg))
|
||||
#SCons.Warnings.warn(SCons.Warnings.VisualCMissingWarning, msg)
|
||||
debug('msvc_setup_env: No installed VCs')
|
||||
return None
|
||||
msvc_version = installed_vcs[0]
|
||||
debug('msvc_setup_env: using default installed MSVC version %s\n' % repr(msvc_version))
|
||||
|
||||
return msvc_version
|
||||
|
||||
def msvc_setup_env_once(env):
|
||||
try:
|
||||
has_run = env["MSVC_SETUP_RUN"]
|
||||
except KeyError:
|
||||
has_run = False
|
||||
|
||||
if not has_run:
|
||||
msvc_setup_env(env)
|
||||
env["MSVC_SETUP_RUN"] = True
|
||||
|
||||
def msvc_find_valid_batch_script(env,version):
|
||||
debug('vc.py:msvc_find_valid_batch_script()')
|
||||
# Find the host platform, target platform, and if present the requested
|
||||
# target platform
|
||||
(host_platform, target_platform,req_target_platform) = get_host_target(env)
|
||||
|
||||
try_target_archs = [target_platform]
|
||||
debug("msvs_find_valid_batch_script(): req_target_platform %s target_platform:%s"%(req_target_platform,target_platform))
|
||||
|
||||
# VS2012 has a "cross compile" environment to build 64 bit
|
||||
# with x86_amd64 as the argument to the batch setup script
|
||||
if req_target_platform in ('amd64','x86_64'):
|
||||
try_target_archs.append('x86_amd64')
|
||||
elif not req_target_platform and target_platform in ['amd64','x86_64']:
|
||||
# There may not be "native" amd64, but maybe "cross" x86_amd64 tools
|
||||
try_target_archs.append('x86_amd64')
|
||||
# If the user hasn't specifically requested a TARGET_ARCH, and
|
||||
# The TARGET_ARCH is amd64 then also try 32 bits if there are no viable
|
||||
# 64 bit tools installed
|
||||
try_target_archs.append('x86')
|
||||
|
||||
debug("msvs_find_valid_batch_script(): host_platform: %s try_target_archs:%s"%(host_platform, try_target_archs))
|
||||
|
||||
d = None
|
||||
for tp in try_target_archs:
|
||||
# Set to current arch.
|
||||
env['TARGET_ARCH']=tp
|
||||
|
||||
debug("vc.py:msvc_find_valid_batch_script() trying target_platform:%s"%tp)
|
||||
host_target = (host_platform, tp)
|
||||
if not is_host_target_supported(host_target, version):
|
||||
warn_msg = "host, target = %s not supported for MSVC version %s" % \
|
||||
(host_target, version)
|
||||
SCons.Warnings.warn(SCons.Warnings.VisualCMissingWarning, warn_msg)
|
||||
arg = _HOST_TARGET_ARCH_TO_BAT_ARCH[host_target]
|
||||
|
||||
# Get just version numbers
|
||||
maj, min = msvc_version_to_maj_min(version)
|
||||
# VS2015+
|
||||
if maj >= 14:
|
||||
if env.get('MSVC_UWP_APP') == '1':
|
||||
# Initialize environment variables with store/universal paths
|
||||
arg += ' store'
|
||||
|
||||
# Try to locate a batch file for this host/target platform combo
|
||||
try:
|
||||
(vc_script,sdk_script) = find_batch_file(env,version,host_platform,tp)
|
||||
debug('vc.py:msvc_find_valid_batch_script() vc_script:%s sdk_script:%s'%(vc_script,sdk_script))
|
||||
except VisualCException as e:
|
||||
msg = str(e)
|
||||
debug('Caught exception while looking for batch file (%s)' % msg)
|
||||
warn_msg = "VC version %s not installed. " + \
|
||||
"C/C++ compilers are most likely not set correctly.\n" + \
|
||||
" Installed versions are: %s"
|
||||
warn_msg = warn_msg % (version, cached_get_installed_vcs())
|
||||
SCons.Warnings.warn(SCons.Warnings.VisualCMissingWarning, warn_msg)
|
||||
continue
|
||||
|
||||
# Try to use the located batch file for this host/target platform combo
|
||||
debug('vc.py:msvc_find_valid_batch_script() use_script 2 %s, args:%s\n' % (repr(vc_script), arg))
|
||||
if vc_script:
|
||||
try:
|
||||
d = script_env(vc_script, args=arg)
|
||||
except BatchFileExecutionError as e:
|
||||
debug('vc.py:msvc_find_valid_batch_script() use_script 3: failed running VC script %s: %s: Error:%s'%(repr(vc_script),arg,e))
|
||||
vc_script=None
|
||||
continue
|
||||
if not vc_script and sdk_script:
|
||||
debug('vc.py:msvc_find_valid_batch_script() use_script 4: trying sdk script: %s'%(sdk_script))
|
||||
try:
|
||||
d = script_env(sdk_script)
|
||||
except BatchFileExecutionError as e:
|
||||
debug('vc.py:msvc_find_valid_batch_script() use_script 5: failed running SDK script %s: Error:%s'%(repr(sdk_script),e))
|
||||
continue
|
||||
elif not vc_script and not sdk_script:
|
||||
debug('vc.py:msvc_find_valid_batch_script() use_script 6: Neither VC script nor SDK script found')
|
||||
continue
|
||||
|
||||
debug("vc.py:msvc_find_valid_batch_script() Found a working script/target: %s %s"%(repr(sdk_script),arg))
|
||||
break # We've found a working target_platform, so stop looking
|
||||
|
||||
# If we cannot find a viable installed compiler, reset the TARGET_ARCH
|
||||
# To it's initial value
|
||||
if not d:
|
||||
env['TARGET_ARCH']=req_target_platform
|
||||
|
||||
return d
|
||||
|
||||
|
||||
def msvc_setup_env(env):
|
||||
debug('msvc_setup_env()')
|
||||
|
||||
version = get_default_version(env)
|
||||
if version is None:
|
||||
warn_msg = "No version of Visual Studio compiler found - C/C++ " \
|
||||
"compilers most likely not set correctly"
|
||||
SCons.Warnings.warn(SCons.Warnings.VisualCMissingWarning, warn_msg)
|
||||
return None
|
||||
debug('msvc_setup_env: using specified MSVC version %s\n' % repr(version))
|
||||
|
||||
# XXX: we set-up both MSVS version for backward
|
||||
# compatibility with the msvs tool
|
||||
env['MSVC_VERSION'] = version
|
||||
env['MSVS_VERSION'] = version
|
||||
env['MSVS'] = {}
|
||||
|
||||
|
||||
use_script = env.get('MSVC_USE_SCRIPT', True)
|
||||
if SCons.Util.is_String(use_script):
|
||||
debug('vc.py:msvc_setup_env() use_script 1 %s\n' % repr(use_script))
|
||||
d = script_env(use_script)
|
||||
elif use_script:
|
||||
d = msvc_find_valid_batch_script(env,version)
|
||||
debug('vc.py:msvc_setup_env() use_script 2 %s\n' % d)
|
||||
if not d:
|
||||
return d
|
||||
else:
|
||||
debug('MSVC_USE_SCRIPT set to False')
|
||||
warn_msg = "MSVC_USE_SCRIPT set to False, assuming environment " \
|
||||
"set correctly."
|
||||
SCons.Warnings.warn(SCons.Warnings.VisualCMissingWarning, warn_msg)
|
||||
return None
|
||||
|
||||
for k, v in d.items():
|
||||
debug('vc.py:msvc_setup_env() env:%s -> %s'%(k,v))
|
||||
env.PrependENVPath(k, v, delete_existing=True)
|
||||
|
||||
def msvc_exists(version=None):
|
||||
vcs = cached_get_installed_vcs()
|
||||
if version is None:
|
||||
return len(vcs) > 0
|
||||
return version in vcs
|
||||
573
scons-local-3.0.0/SCons/Tool/MSCommon/vs.py
Normal file
573
scons-local-3.0.0/SCons/Tool/MSCommon/vs.py
Normal file
@@ -0,0 +1,573 @@
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/MSCommon/vs.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
__doc__ = """Module to detect Visual Studio and/or Visual C/C++
|
||||
"""
|
||||
|
||||
import os
|
||||
|
||||
import SCons.Errors
|
||||
import SCons.Util
|
||||
|
||||
from .common import debug, \
|
||||
get_output, \
|
||||
is_win64, \
|
||||
normalize_env, \
|
||||
parse_output, \
|
||||
read_reg
|
||||
|
||||
import SCons.Tool.MSCommon.vc
|
||||
|
||||
class VisualStudio(object):
|
||||
"""
|
||||
An abstract base class for trying to find installed versions of
|
||||
Visual Studio.
|
||||
"""
|
||||
def __init__(self, version, **kw):
|
||||
self.version = version
|
||||
kw['vc_version'] = kw.get('vc_version', version)
|
||||
kw['sdk_version'] = kw.get('sdk_version', version)
|
||||
self.__dict__.update(kw)
|
||||
self._cache = {}
|
||||
|
||||
def find_batch_file(self):
|
||||
vs_dir = self.get_vs_dir()
|
||||
if not vs_dir:
|
||||
debug('find_executable(): no vs_dir')
|
||||
return None
|
||||
batch_file = os.path.join(vs_dir, self.batch_file_path)
|
||||
batch_file = os.path.normpath(batch_file)
|
||||
if not os.path.isfile(batch_file):
|
||||
debug('find_batch_file(): %s not on file system' % batch_file)
|
||||
return None
|
||||
return batch_file
|
||||
|
||||
def find_vs_dir_by_vc(self):
|
||||
SCons.Tool.MSCommon.vc.get_installed_vcs()
|
||||
dir = SCons.Tool.MSCommon.vc.find_vc_pdir(self.vc_version)
|
||||
if not dir:
|
||||
debug('find_vs_dir(): no installed VC %s' % self.vc_version)
|
||||
return None
|
||||
return dir
|
||||
|
||||
def find_vs_dir_by_reg(self):
|
||||
root = 'Software\\'
|
||||
|
||||
if is_win64():
|
||||
root = root + 'Wow6432Node\\'
|
||||
for key in self.hkeys:
|
||||
if key=='use_dir':
|
||||
return self.find_vs_dir_by_vc()
|
||||
key = root + key
|
||||
try:
|
||||
comps = read_reg(key)
|
||||
except SCons.Util.WinError as e:
|
||||
debug('find_vs_dir_by_reg(): no VS registry key {}'.format(repr(key)))
|
||||
else:
|
||||
debug('find_vs_dir_by_reg(): found VS in registry: {}'.format(comps))
|
||||
return comps
|
||||
return None
|
||||
|
||||
def find_vs_dir(self):
|
||||
""" Can use registry or location of VC to find vs dir
|
||||
First try to find by registry, and if that fails find via VC dir
|
||||
"""
|
||||
|
||||
|
||||
if True:
|
||||
vs_dir=self.find_vs_dir_by_reg()
|
||||
return vs_dir
|
||||
else:
|
||||
return self.find_vs_dir_by_vc()
|
||||
|
||||
def find_executable(self):
|
||||
vs_dir = self.get_vs_dir()
|
||||
if not vs_dir:
|
||||
debug('find_executable(): no vs_dir ({})'.format(vs_dir))
|
||||
return None
|
||||
executable = os.path.join(vs_dir, self.executable_path)
|
||||
executable = os.path.normpath(executable)
|
||||
if not os.path.isfile(executable):
|
||||
debug('find_executable(): {} not on file system'.format(executable))
|
||||
return None
|
||||
return executable
|
||||
|
||||
def get_batch_file(self):
|
||||
try:
|
||||
return self._cache['batch_file']
|
||||
except KeyError:
|
||||
batch_file = self.find_batch_file()
|
||||
self._cache['batch_file'] = batch_file
|
||||
return batch_file
|
||||
|
||||
def get_executable(self):
|
||||
try:
|
||||
debug('get_executable using cache:%s'%self._cache['executable'])
|
||||
return self._cache['executable']
|
||||
except KeyError:
|
||||
executable = self.find_executable()
|
||||
self._cache['executable'] = executable
|
||||
debug('get_executable not in cache:%s'%executable)
|
||||
return executable
|
||||
|
||||
def get_vs_dir(self):
|
||||
try:
|
||||
return self._cache['vs_dir']
|
||||
except KeyError:
|
||||
vs_dir = self.find_vs_dir()
|
||||
self._cache['vs_dir'] = vs_dir
|
||||
return vs_dir
|
||||
|
||||
def get_supported_arch(self):
|
||||
try:
|
||||
return self._cache['supported_arch']
|
||||
except KeyError:
|
||||
# RDEVE: for the time being use hardcoded lists
|
||||
# supported_arch = self.find_supported_arch()
|
||||
self._cache['supported_arch'] = self.supported_arch
|
||||
return self.supported_arch
|
||||
|
||||
def reset(self):
|
||||
self._cache = {}
|
||||
|
||||
# The list of supported Visual Studio versions we know how to detect.
|
||||
#
|
||||
# How to look for .bat file ?
|
||||
# - VS 2008 Express (x86):
|
||||
# * from registry key productdir, gives the full path to vsvarsall.bat. In
|
||||
# HKEY_LOCAL_MACHINE):
|
||||
# Software\Microsoft\VCEpress\9.0\Setup\VC\productdir
|
||||
# * from environmnent variable VS90COMNTOOLS: the path is then ..\..\VC
|
||||
# relatively to the path given by the variable.
|
||||
#
|
||||
# - VS 2008 Express (WoW6432: 32 bits on windows x64):
|
||||
# Software\Wow6432Node\Microsoft\VCEpress\9.0\Setup\VC\productdir
|
||||
#
|
||||
# - VS 2005 Express (x86):
|
||||
# * from registry key productdir, gives the full path to vsvarsall.bat. In
|
||||
# HKEY_LOCAL_MACHINE):
|
||||
# Software\Microsoft\VCEpress\8.0\Setup\VC\productdir
|
||||
# * from environmnent variable VS80COMNTOOLS: the path is then ..\..\VC
|
||||
# relatively to the path given by the variable.
|
||||
#
|
||||
# - VS 2005 Express (WoW6432: 32 bits on windows x64): does not seem to have a
|
||||
# productdir ?
|
||||
#
|
||||
# - VS 2003 .Net (pro edition ? x86):
|
||||
# * from registry key productdir. The path is then ..\Common7\Tools\
|
||||
# relatively to the key. The key is in HKEY_LOCAL_MACHINE):
|
||||
# Software\Microsoft\VisualStudio\7.1\Setup\VC\productdir
|
||||
# * from environmnent variable VS71COMNTOOLS: the path is the full path to
|
||||
# vsvars32.bat
|
||||
#
|
||||
# - VS 98 (VS 6):
|
||||
# * from registry key productdir. The path is then Bin
|
||||
# relatively to the key. The key is in HKEY_LOCAL_MACHINE):
|
||||
# Software\Microsoft\VisualStudio\6.0\Setup\VC98\productdir
|
||||
#
|
||||
# The first version found in the list is the one used by default if
|
||||
# there are multiple versions installed. Barring good reasons to
|
||||
# the contrary, this means we should list versions from most recent
|
||||
# to oldest. Pro versions get listed before Express versions on the
|
||||
# assumption that, by default, you'd rather use the version you paid
|
||||
# good money for in preference to whatever Microsoft makes available
|
||||
# for free.
|
||||
#
|
||||
# If you update this list, update _VCVER and _VCVER_TO_PRODUCT_DIR in
|
||||
# Tool/MSCommon/vc.py, and the MSVC_VERSION documentation in Tool/msvc.xml.
|
||||
|
||||
SupportedVSList = [
|
||||
# Visual Studio 2017
|
||||
VisualStudio('14.1',
|
||||
vc_version='14.1',
|
||||
sdk_version='10.0A',
|
||||
hkeys=[],
|
||||
common_tools_var='VS150COMNTOOLS',
|
||||
executable_path=r'Common7\IDE\devenv.com',
|
||||
batch_file_path=r'VC\Auxiliary\Build\vsvars32.bat',
|
||||
supported_arch=['x86', 'amd64', "arm"],
|
||||
),
|
||||
|
||||
# Visual Studio 2015
|
||||
VisualStudio('14.0',
|
||||
vc_version='14.0',
|
||||
sdk_version='10.0',
|
||||
hkeys=[r'Microsoft\VisualStudio\14.0\Setup\VS\ProductDir'],
|
||||
common_tools_var='VS140COMNTOOLS',
|
||||
executable_path=r'Common7\IDE\devenv.com',
|
||||
batch_file_path=r'Common7\Tools\vsvars32.bat',
|
||||
supported_arch=['x86', 'amd64', "arm"],
|
||||
),
|
||||
|
||||
# Visual C++ 2015 Express Edition (for Desktop)
|
||||
VisualStudio('14.0Exp',
|
||||
vc_version='14.0',
|
||||
sdk_version='10.0A',
|
||||
hkeys=[r'Microsoft\VisualStudio\14.0\Setup\VS\ProductDir'],
|
||||
common_tools_var='VS140COMNTOOLS',
|
||||
executable_path=r'Common7\IDE\WDExpress.exe',
|
||||
batch_file_path=r'Common7\Tools\vsvars32.bat',
|
||||
supported_arch=['x86', 'amd64', "arm"],
|
||||
),
|
||||
|
||||
# Visual Studio 2013
|
||||
VisualStudio('12.0',
|
||||
vc_version='12.0',
|
||||
sdk_version='8.1A',
|
||||
hkeys=[r'Microsoft\VisualStudio\12.0\Setup\VS\ProductDir'],
|
||||
common_tools_var='VS120COMNTOOLS',
|
||||
executable_path=r'Common7\IDE\devenv.com',
|
||||
batch_file_path=r'Common7\Tools\vsvars32.bat',
|
||||
supported_arch=['x86', 'amd64'],
|
||||
),
|
||||
|
||||
# Visual C++ 2013 Express Edition (for Desktop)
|
||||
VisualStudio('12.0Exp',
|
||||
vc_version='12.0',
|
||||
sdk_version='8.1A',
|
||||
hkeys=[r'Microsoft\VisualStudio\12.0\Setup\VS\ProductDir'],
|
||||
common_tools_var='VS120COMNTOOLS',
|
||||
executable_path=r'Common7\IDE\WDExpress.exe',
|
||||
batch_file_path=r'Common7\Tools\vsvars32.bat',
|
||||
supported_arch=['x86', 'amd64'],
|
||||
),
|
||||
|
||||
# Visual Studio 2012
|
||||
VisualStudio('11.0',
|
||||
sdk_version='8.0A',
|
||||
hkeys=[r'Microsoft\VisualStudio\11.0\Setup\VS\ProductDir'],
|
||||
common_tools_var='VS110COMNTOOLS',
|
||||
executable_path=r'Common7\IDE\devenv.com',
|
||||
batch_file_path=r'Common7\Tools\vsvars32.bat',
|
||||
supported_arch=['x86', 'amd64'],
|
||||
),
|
||||
|
||||
# Visual C++ 2012 Express Edition (for Desktop)
|
||||
VisualStudio('11.0Exp',
|
||||
vc_version='11.0',
|
||||
sdk_version='8.0A',
|
||||
hkeys=[r'Microsoft\VisualStudio\11.0\Setup\VS\ProductDir'],
|
||||
common_tools_var='VS110COMNTOOLS',
|
||||
executable_path=r'Common7\IDE\WDExpress.exe',
|
||||
batch_file_path=r'Common7\Tools\vsvars32.bat',
|
||||
supported_arch=['x86', 'amd64'],
|
||||
),
|
||||
|
||||
# Visual Studio 2010
|
||||
VisualStudio('10.0',
|
||||
sdk_version='7.0A',
|
||||
hkeys=[r'Microsoft\VisualStudio\10.0\Setup\VS\ProductDir'],
|
||||
common_tools_var='VS100COMNTOOLS',
|
||||
executable_path=r'Common7\IDE\devenv.com',
|
||||
batch_file_path=r'Common7\Tools\vsvars32.bat',
|
||||
supported_arch=['x86', 'amd64'],
|
||||
),
|
||||
|
||||
# Visual C++ 2010 Express Edition
|
||||
VisualStudio('10.0Exp',
|
||||
vc_version='10.0',
|
||||
sdk_version='7.0A',
|
||||
hkeys=[r'Microsoft\VCExpress\10.0\Setup\VS\ProductDir'],
|
||||
common_tools_var='VS100COMNTOOLS',
|
||||
executable_path=r'Common7\IDE\VCExpress.exe',
|
||||
batch_file_path=r'Common7\Tools\vsvars32.bat',
|
||||
supported_arch=['x86'],
|
||||
),
|
||||
|
||||
# Visual Studio 2008
|
||||
VisualStudio('9.0',
|
||||
sdk_version='6.0A',
|
||||
hkeys=[r'Microsoft\VisualStudio\9.0\Setup\VS\ProductDir'],
|
||||
common_tools_var='VS90COMNTOOLS',
|
||||
executable_path=r'Common7\IDE\devenv.com',
|
||||
batch_file_path=r'Common7\Tools\vsvars32.bat',
|
||||
supported_arch=['x86', 'amd64'],
|
||||
),
|
||||
|
||||
# Visual C++ 2008 Express Edition
|
||||
VisualStudio('9.0Exp',
|
||||
vc_version='9.0',
|
||||
sdk_version='6.0A',
|
||||
hkeys=[r'Microsoft\VCExpress\9.0\Setup\VS\ProductDir'],
|
||||
common_tools_var='VS90COMNTOOLS',
|
||||
executable_path=r'Common7\IDE\VCExpress.exe',
|
||||
batch_file_path=r'Common7\Tools\vsvars32.bat',
|
||||
supported_arch=['x86'],
|
||||
),
|
||||
|
||||
# Visual Studio 2005
|
||||
VisualStudio('8.0',
|
||||
sdk_version='6.0A',
|
||||
hkeys=[r'Microsoft\VisualStudio\8.0\Setup\VS\ProductDir'],
|
||||
common_tools_var='VS80COMNTOOLS',
|
||||
executable_path=r'Common7\IDE\devenv.com',
|
||||
batch_file_path=r'Common7\Tools\vsvars32.bat',
|
||||
default_dirname='Microsoft Visual Studio 8',
|
||||
supported_arch=['x86', 'amd64'],
|
||||
),
|
||||
|
||||
# Visual C++ 2005 Express Edition
|
||||
VisualStudio('8.0Exp',
|
||||
vc_version='8.0Exp',
|
||||
sdk_version='6.0A',
|
||||
hkeys=[r'Microsoft\VCExpress\8.0\Setup\VS\ProductDir'],
|
||||
common_tools_var='VS80COMNTOOLS',
|
||||
executable_path=r'Common7\IDE\VCExpress.exe',
|
||||
batch_file_path=r'Common7\Tools\vsvars32.bat',
|
||||
default_dirname='Microsoft Visual Studio 8',
|
||||
supported_arch=['x86'],
|
||||
),
|
||||
|
||||
# Visual Studio .NET 2003
|
||||
VisualStudio('7.1',
|
||||
sdk_version='6.0',
|
||||
hkeys=[r'Microsoft\VisualStudio\7.1\Setup\VS\ProductDir'],
|
||||
common_tools_var='VS71COMNTOOLS',
|
||||
executable_path=r'Common7\IDE\devenv.com',
|
||||
batch_file_path=r'Common7\Tools\vsvars32.bat',
|
||||
default_dirname='Microsoft Visual Studio .NET 2003',
|
||||
supported_arch=['x86'],
|
||||
),
|
||||
|
||||
# Visual Studio .NET
|
||||
VisualStudio('7.0',
|
||||
sdk_version='2003R2',
|
||||
hkeys=[r'Microsoft\VisualStudio\7.0\Setup\VS\ProductDir'],
|
||||
common_tools_var='VS70COMNTOOLS',
|
||||
executable_path=r'IDE\devenv.com',
|
||||
batch_file_path=r'Common7\Tools\vsvars32.bat',
|
||||
default_dirname='Microsoft Visual Studio .NET',
|
||||
supported_arch=['x86'],
|
||||
),
|
||||
|
||||
# Visual Studio 6.0
|
||||
VisualStudio('6.0',
|
||||
sdk_version='2003R1',
|
||||
hkeys=[r'Microsoft\VisualStudio\6.0\Setup\Microsoft Visual Studio\ProductDir',
|
||||
'use_dir'],
|
||||
common_tools_var='VS60COMNTOOLS',
|
||||
executable_path=r'Common\MSDev98\Bin\MSDEV.COM',
|
||||
batch_file_path=r'Common7\Tools\vsvars32.bat',
|
||||
default_dirname='Microsoft Visual Studio',
|
||||
supported_arch=['x86'],
|
||||
),
|
||||
]
|
||||
|
||||
SupportedVSMap = {}
|
||||
for vs in SupportedVSList:
|
||||
SupportedVSMap[vs.version] = vs
|
||||
|
||||
|
||||
# Finding installed versions of Visual Studio isn't cheap, because it
|
||||
# goes not only to the registry but also to the disk to sanity-check
|
||||
# that there is, in fact, a Visual Studio directory there and that the
|
||||
# registry entry isn't just stale. Find this information once, when
|
||||
# requested, and cache it.
|
||||
|
||||
InstalledVSList = None
|
||||
InstalledVSMap = None
|
||||
|
||||
def get_installed_visual_studios():
|
||||
global InstalledVSList
|
||||
global InstalledVSMap
|
||||
if InstalledVSList is None:
|
||||
InstalledVSList = []
|
||||
InstalledVSMap = {}
|
||||
for vs in SupportedVSList:
|
||||
debug('trying to find VS %s' % vs.version)
|
||||
if vs.get_executable():
|
||||
debug('found VS %s' % vs.version)
|
||||
InstalledVSList.append(vs)
|
||||
InstalledVSMap[vs.version] = vs
|
||||
return InstalledVSList
|
||||
|
||||
def reset_installed_visual_studios():
|
||||
global InstalledVSList
|
||||
global InstalledVSMap
|
||||
InstalledVSList = None
|
||||
InstalledVSMap = None
|
||||
for vs in SupportedVSList:
|
||||
vs.reset()
|
||||
|
||||
# Need to clear installed VC's as well as they are used in finding
|
||||
# installed VS's
|
||||
SCons.Tool.MSCommon.vc.reset_installed_vcs()
|
||||
|
||||
|
||||
# We may be asked to update multiple construction environments with
|
||||
# SDK information. When doing this, we check on-disk for whether
|
||||
# the SDK has 'mfc' and 'atl' subdirectories. Since going to disk
|
||||
# is expensive, cache results by directory.
|
||||
|
||||
#SDKEnvironmentUpdates = {}
|
||||
#
|
||||
#def set_sdk_by_directory(env, sdk_dir):
|
||||
# global SDKEnvironmentUpdates
|
||||
# try:
|
||||
# env_tuple_list = SDKEnvironmentUpdates[sdk_dir]
|
||||
# except KeyError:
|
||||
# env_tuple_list = []
|
||||
# SDKEnvironmentUpdates[sdk_dir] = env_tuple_list
|
||||
#
|
||||
# include_path = os.path.join(sdk_dir, 'include')
|
||||
# mfc_path = os.path.join(include_path, 'mfc')
|
||||
# atl_path = os.path.join(include_path, 'atl')
|
||||
#
|
||||
# if os.path.exists(mfc_path):
|
||||
# env_tuple_list.append(('INCLUDE', mfc_path))
|
||||
# if os.path.exists(atl_path):
|
||||
# env_tuple_list.append(('INCLUDE', atl_path))
|
||||
# env_tuple_list.append(('INCLUDE', include_path))
|
||||
#
|
||||
# env_tuple_list.append(('LIB', os.path.join(sdk_dir, 'lib')))
|
||||
# env_tuple_list.append(('LIBPATH', os.path.join(sdk_dir, 'lib')))
|
||||
# env_tuple_list.append(('PATH', os.path.join(sdk_dir, 'bin')))
|
||||
#
|
||||
# for variable, directory in env_tuple_list:
|
||||
# env.PrependENVPath(variable, directory)
|
||||
|
||||
def msvs_exists():
|
||||
return (len(get_installed_visual_studios()) > 0)
|
||||
|
||||
def get_vs_by_version(msvs):
|
||||
global InstalledVSMap
|
||||
global SupportedVSMap
|
||||
|
||||
debug('vs.py:get_vs_by_version()')
|
||||
if msvs not in SupportedVSMap:
|
||||
msg = "Visual Studio version %s is not supported" % repr(msvs)
|
||||
raise SCons.Errors.UserError(msg)
|
||||
get_installed_visual_studios()
|
||||
vs = InstalledVSMap.get(msvs)
|
||||
debug('InstalledVSMap:%s'%InstalledVSMap)
|
||||
debug('vs.py:get_vs_by_version: found vs:%s'%vs)
|
||||
# Some check like this would let us provide a useful error message
|
||||
# if they try to set a Visual Studio version that's not installed.
|
||||
# However, we also want to be able to run tests (like the unit
|
||||
# tests) on systems that don't, or won't ever, have it installed.
|
||||
# It might be worth resurrecting this, with some configurable
|
||||
# setting that the tests can use to bypass the check.
|
||||
#if not vs:
|
||||
# msg = "Visual Studio version %s is not installed" % repr(msvs)
|
||||
# raise SCons.Errors.UserError, msg
|
||||
return vs
|
||||
|
||||
def get_default_version(env):
|
||||
"""Returns the default version string to use for MSVS.
|
||||
|
||||
If no version was requested by the user through the MSVS environment
|
||||
variable, query all the available visual studios through
|
||||
get_installed_visual_studios, and take the highest one.
|
||||
|
||||
Return
|
||||
------
|
||||
version: str
|
||||
the default version.
|
||||
"""
|
||||
if 'MSVS' not in env or not SCons.Util.is_Dict(env['MSVS']):
|
||||
# get all versions, and remember them for speed later
|
||||
versions = [vs.version for vs in get_installed_visual_studios()]
|
||||
env['MSVS'] = {'VERSIONS' : versions}
|
||||
else:
|
||||
versions = env['MSVS'].get('VERSIONS', [])
|
||||
|
||||
if 'MSVS_VERSION' not in env:
|
||||
if versions:
|
||||
env['MSVS_VERSION'] = versions[0] #use highest version by default
|
||||
else:
|
||||
debug('get_default_version: WARNING: no installed versions found, '
|
||||
'using first in SupportedVSList (%s)'%SupportedVSList[0].version)
|
||||
env['MSVS_VERSION'] = SupportedVSList[0].version
|
||||
|
||||
env['MSVS']['VERSION'] = env['MSVS_VERSION']
|
||||
|
||||
return env['MSVS_VERSION']
|
||||
|
||||
def get_default_arch(env):
|
||||
"""Return the default arch to use for MSVS
|
||||
|
||||
if no version was requested by the user through the MSVS_ARCH environment
|
||||
variable, select x86
|
||||
|
||||
Return
|
||||
------
|
||||
arch: str
|
||||
"""
|
||||
arch = env.get('MSVS_ARCH', 'x86')
|
||||
|
||||
msvs = InstalledVSMap.get(env['MSVS_VERSION'])
|
||||
|
||||
if not msvs:
|
||||
arch = 'x86'
|
||||
elif not arch in msvs.get_supported_arch():
|
||||
fmt = "Visual Studio version %s does not support architecture %s"
|
||||
raise SCons.Errors.UserError(fmt % (env['MSVS_VERSION'], arch))
|
||||
|
||||
return arch
|
||||
|
||||
def merge_default_version(env):
|
||||
version = get_default_version(env)
|
||||
arch = get_default_arch(env)
|
||||
|
||||
def msvs_setup_env(env):
|
||||
batfilename = msvs.get_batch_file()
|
||||
msvs = get_vs_by_version(version)
|
||||
if msvs is None:
|
||||
return
|
||||
|
||||
# XXX: I think this is broken. This will silently set a bogus tool instead
|
||||
# of failing, but there is no other way with the current scons tool
|
||||
# framework
|
||||
if batfilename is not None:
|
||||
|
||||
vars = ('LIB', 'LIBPATH', 'PATH', 'INCLUDE')
|
||||
|
||||
msvs_list = get_installed_visual_studios()
|
||||
vscommonvarnames = [vs.common_tools_var for vs in msvs_list]
|
||||
save_ENV = env['ENV']
|
||||
nenv = normalize_env(env['ENV'],
|
||||
['COMSPEC'] + vscommonvarnames,
|
||||
force=True)
|
||||
try:
|
||||
output = get_output(batfilename, arch, env=nenv)
|
||||
finally:
|
||||
env['ENV'] = save_ENV
|
||||
vars = parse_output(output, vars)
|
||||
|
||||
for k, v in vars.items():
|
||||
env.PrependENVPath(k, v, delete_existing=1)
|
||||
|
||||
def query_versions():
|
||||
"""Query the system to get available versions of VS. A version is
|
||||
considered when a batfile is found."""
|
||||
msvs_list = get_installed_visual_studios()
|
||||
versions = [msvs.version for msvs in msvs_list]
|
||||
return versions
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
115
scons-local-3.0.0/SCons/Tool/PharLapCommon.py
Normal file
115
scons-local-3.0.0/SCons/Tool/PharLapCommon.py
Normal file
@@ -0,0 +1,115 @@
|
||||
"""SCons.Tool.PharLapCommon
|
||||
|
||||
This module contains common code used by all Tools for the
|
||||
Phar Lap ETS tool chain. Right now, this is linkloc and
|
||||
386asm.
|
||||
|
||||
"""
|
||||
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/PharLapCommon.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
import os
|
||||
import os.path
|
||||
import SCons.Errors
|
||||
import SCons.Util
|
||||
import re
|
||||
|
||||
def getPharLapPath():
|
||||
"""Reads the registry to find the installed path of the Phar Lap ETS
|
||||
development kit.
|
||||
|
||||
Raises UserError if no installed version of Phar Lap can
|
||||
be found."""
|
||||
|
||||
if not SCons.Util.can_read_reg:
|
||||
raise SCons.Errors.InternalError("No Windows registry module was found")
|
||||
try:
|
||||
k=SCons.Util.RegOpenKeyEx(SCons.Util.HKEY_LOCAL_MACHINE,
|
||||
'SOFTWARE\\Pharlap\\ETS')
|
||||
val, type = SCons.Util.RegQueryValueEx(k, 'BaseDir')
|
||||
|
||||
# The following is a hack...there is (not surprisingly)
|
||||
# an odd issue in the Phar Lap plug in that inserts
|
||||
# a bunch of junk data after the phar lap path in the
|
||||
# registry. We must trim it.
|
||||
idx=val.find('\0')
|
||||
if idx >= 0:
|
||||
val = val[:idx]
|
||||
|
||||
return os.path.normpath(val)
|
||||
except SCons.Util.RegError:
|
||||
raise SCons.Errors.UserError("Cannot find Phar Lap ETS path in the registry. Is it installed properly?")
|
||||
|
||||
REGEX_ETS_VER = re.compile(r'#define\s+ETS_VER\s+([0-9]+)')
|
||||
|
||||
def getPharLapVersion():
|
||||
"""Returns the version of the installed ETS Tool Suite as a
|
||||
decimal number. This version comes from the ETS_VER #define in
|
||||
the embkern.h header. For example, '#define ETS_VER 1010' (which
|
||||
is what Phar Lap 10.1 defines) would cause this method to return
|
||||
1010. Phar Lap 9.1 does not have such a #define, but this method
|
||||
will return 910 as a default.
|
||||
|
||||
Raises UserError if no installed version of Phar Lap can
|
||||
be found."""
|
||||
|
||||
include_path = os.path.join(getPharLapPath(), os.path.normpath("include/embkern.h"))
|
||||
if not os.path.exists(include_path):
|
||||
raise SCons.Errors.UserError("Cannot find embkern.h in ETS include directory.\nIs Phar Lap ETS installed properly?")
|
||||
mo = REGEX_ETS_VER.search(open(include_path, 'r').read())
|
||||
if mo:
|
||||
return int(mo.group(1))
|
||||
# Default return for Phar Lap 9.1
|
||||
return 910
|
||||
|
||||
def addPharLapPaths(env):
|
||||
"""This function adds the path to the Phar Lap binaries, includes,
|
||||
and libraries, if they are not already there."""
|
||||
ph_path = getPharLapPath()
|
||||
|
||||
try:
|
||||
env_dict = env['ENV']
|
||||
except KeyError:
|
||||
env_dict = {}
|
||||
env['ENV'] = env_dict
|
||||
SCons.Util.AddPathIfNotExists(env_dict, 'PATH',
|
||||
os.path.join(ph_path, 'bin'))
|
||||
SCons.Util.AddPathIfNotExists(env_dict, 'INCLUDE',
|
||||
os.path.join(ph_path, 'include'))
|
||||
SCons.Util.AddPathIfNotExists(env_dict, 'LIB',
|
||||
os.path.join(ph_path, 'lib'))
|
||||
SCons.Util.AddPathIfNotExists(env_dict, 'LIB',
|
||||
os.path.join(ph_path, os.path.normpath('lib/vclib')))
|
||||
|
||||
env['PHARLAP_PATH'] = getPharLapPath()
|
||||
env['PHARLAP_VERSION'] = str(getPharLapVersion())
|
||||
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
1240
scons-local-3.0.0/SCons/Tool/__init__.py
Normal file
1240
scons-local-3.0.0/SCons/Tool/__init__.py
Normal file
File diff suppressed because it is too large
Load Diff
43
scons-local-3.0.0/SCons/Tool/aixc++.py
Normal file
43
scons-local-3.0.0/SCons/Tool/aixc++.py
Normal file
@@ -0,0 +1,43 @@
|
||||
"""SCons.Tool.aixc++
|
||||
|
||||
Tool-specific initialization for IBM xlC / Visual Age C++ compiler.
|
||||
|
||||
There normally shouldn't be any need to import this module directly.
|
||||
It will usually be imported through the generic SCons.Tool.Tool()
|
||||
selection method.
|
||||
|
||||
"""
|
||||
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/aixc++.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
#forward proxy to the preffered cxx version
|
||||
from SCons.Tool.aixcxx import *
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
74
scons-local-3.0.0/SCons/Tool/aixcc.py
Normal file
74
scons-local-3.0.0/SCons/Tool/aixcc.py
Normal file
@@ -0,0 +1,74 @@
|
||||
"""SCons.Tool.aixcc
|
||||
|
||||
Tool-specific initialization for IBM xlc / Visual Age C compiler.
|
||||
|
||||
There normally shouldn't be any need to import this module directly.
|
||||
It will usually be imported through the generic SCons.Tool.Tool()
|
||||
selection method.
|
||||
"""
|
||||
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/aixcc.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
import os.path
|
||||
|
||||
import SCons.Platform.aix
|
||||
|
||||
from . import cc
|
||||
|
||||
packages = ['vac.C', 'ibmcxx.cmp']
|
||||
|
||||
def get_xlc(env):
|
||||
xlc = env.get('CC', 'xlc')
|
||||
return SCons.Platform.aix.get_xlc(env, xlc, packages)
|
||||
|
||||
def generate(env):
|
||||
"""Add Builders and construction variables for xlc / Visual Age
|
||||
suite to an Environment."""
|
||||
path, _cc, version = get_xlc(env)
|
||||
if path and _cc:
|
||||
_cc = os.path.join(path, _cc)
|
||||
|
||||
if 'CC' not in env:
|
||||
env['CC'] = _cc
|
||||
|
||||
cc.generate(env)
|
||||
|
||||
if version:
|
||||
env['CCVERSION'] = version
|
||||
|
||||
def exists(env):
|
||||
path, _cc, version = get_xlc(env)
|
||||
if path and _cc:
|
||||
xlc = os.path.join(path, _cc)
|
||||
if os.path.exists(xlc):
|
||||
return xlc
|
||||
return None
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
77
scons-local-3.0.0/SCons/Tool/aixcxx.py
Normal file
77
scons-local-3.0.0/SCons/Tool/aixcxx.py
Normal file
@@ -0,0 +1,77 @@
|
||||
"""SCons.Tool.aixc++
|
||||
|
||||
Tool-specific initialization for IBM xlC / Visual Age C++ compiler.
|
||||
|
||||
There normally shouldn't be any need to import this module directly.
|
||||
It will usually be imported through the generic SCons.Tool.Tool()
|
||||
selection method.
|
||||
|
||||
"""
|
||||
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/aixcxx.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
import os.path
|
||||
|
||||
import SCons.Platform.aix
|
||||
|
||||
import SCons.Tool.cxx
|
||||
cplusplus = SCons.Tool.cxx
|
||||
#cplusplus = __import__('cxx', globals(), locals(), [])
|
||||
|
||||
packages = ['vacpp.cmp.core', 'vacpp.cmp.batch', 'vacpp.cmp.C', 'ibmcxx.cmp']
|
||||
|
||||
def get_xlc(env):
|
||||
xlc = env.get('CXX', 'xlC')
|
||||
return SCons.Platform.aix.get_xlc(env, xlc, packages)
|
||||
|
||||
def generate(env):
|
||||
"""Add Builders and construction variables for xlC / Visual Age
|
||||
suite to an Environment."""
|
||||
path, _cxx, version = get_xlc(env)
|
||||
if path and _cxx:
|
||||
_cxx = os.path.join(path, _cxx)
|
||||
|
||||
if 'CXX' not in env:
|
||||
env['CXX'] = _cxx
|
||||
|
||||
cplusplus.generate(env)
|
||||
|
||||
if version:
|
||||
env['CXXVERSION'] = version
|
||||
|
||||
def exists(env):
|
||||
path, _cxx, version = get_xlc(env)
|
||||
if path and _cxx:
|
||||
xlc = os.path.join(path, _cxx)
|
||||
if os.path.exists(xlc):
|
||||
return xlc
|
||||
return None
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
80
scons-local-3.0.0/SCons/Tool/aixf77.py
Normal file
80
scons-local-3.0.0/SCons/Tool/aixf77.py
Normal file
@@ -0,0 +1,80 @@
|
||||
"""engine.SCons.Tool.aixf77
|
||||
|
||||
Tool-specific initialization for IBM Visual Age f77 Fortran compiler.
|
||||
|
||||
There normally shouldn't be any need to import this module directly.
|
||||
It will usually be imported through the generic SCons.Tool.Tool()
|
||||
selection method.
|
||||
"""
|
||||
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/aixf77.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
import os.path
|
||||
|
||||
#import SCons.Platform.aix
|
||||
|
||||
from . import f77
|
||||
|
||||
# It would be good to look for the AIX F77 package the same way we're now
|
||||
# looking for the C and C++ packages. This should be as easy as supplying
|
||||
# the correct package names in the following list and uncommenting the
|
||||
# SCons.Platform.aix_get_xlc() call in the function below.
|
||||
packages = []
|
||||
|
||||
def get_xlf77(env):
|
||||
xlf77 = env.get('F77', 'xlf77')
|
||||
xlf77_r = env.get('SHF77', 'xlf77_r')
|
||||
#return SCons.Platform.aix.get_xlc(env, xlf77, xlf77_r, packages)
|
||||
return (None, xlf77, xlf77_r, None)
|
||||
|
||||
def generate(env):
|
||||
"""
|
||||
Add Builders and construction variables for the Visual Age FORTRAN
|
||||
compiler to an Environment.
|
||||
"""
|
||||
path, _f77, _shf77, version = get_xlf77(env)
|
||||
if path:
|
||||
_f77 = os.path.join(path, _f77)
|
||||
_shf77 = os.path.join(path, _shf77)
|
||||
|
||||
f77.generate(env)
|
||||
|
||||
env['F77'] = _f77
|
||||
env['SHF77'] = _shf77
|
||||
|
||||
def exists(env):
|
||||
path, _f77, _shf77, version = get_xlf77(env)
|
||||
if path and _f77:
|
||||
xlf77 = os.path.join(path, _f77)
|
||||
if os.path.exists(xlf77):
|
||||
return xlf77
|
||||
return None
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
81
scons-local-3.0.0/SCons/Tool/aixlink.py
Normal file
81
scons-local-3.0.0/SCons/Tool/aixlink.py
Normal file
@@ -0,0 +1,81 @@
|
||||
"""SCons.Tool.aixlink
|
||||
|
||||
Tool-specific initialization for the IBM Visual Age linker.
|
||||
|
||||
There normally shouldn't be any need to import this module directly.
|
||||
It will usually be imported through the generic SCons.Tool.Tool()
|
||||
selection method.
|
||||
"""
|
||||
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/aixlink.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
import os
|
||||
import os.path
|
||||
|
||||
import SCons.Util
|
||||
|
||||
from . import aixcc
|
||||
from . import link
|
||||
|
||||
import SCons.Tool.cxx
|
||||
cplusplus = SCons.Tool.cxx
|
||||
#cplusplus = __import__('cxx', globals(), locals(), [])
|
||||
|
||||
|
||||
def smart_linkflags(source, target, env, for_signature):
|
||||
if cplusplus.iscplusplus(source):
|
||||
build_dir = env.subst('$BUILDDIR', target=target, source=source)
|
||||
if build_dir:
|
||||
return '-qtempinc=' + os.path.join(build_dir, 'tempinc')
|
||||
return ''
|
||||
|
||||
def generate(env):
|
||||
"""
|
||||
Add Builders and construction variables for Visual Age linker to
|
||||
an Environment.
|
||||
"""
|
||||
link.generate(env)
|
||||
|
||||
env['SMARTLINKFLAGS'] = smart_linkflags
|
||||
env['LINKFLAGS'] = SCons.Util.CLVar('$SMARTLINKFLAGS')
|
||||
env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS -qmkshrobj -qsuppress=1501-218')
|
||||
env['SHLIBSUFFIX'] = '.a'
|
||||
|
||||
def exists(env):
|
||||
# TODO: sync with link.smart_link() to choose a linker
|
||||
linkers = { 'CXX': ['aixc++'], 'CC': ['aixcc'] }
|
||||
alltools = []
|
||||
for langvar, linktools in linkers.items():
|
||||
if langvar in env: # use CC over CXX when user specified CC but not CXX
|
||||
return SCons.Tool.FindTool(linktools, env)
|
||||
alltools.extend(linktools)
|
||||
return SCons.Tool.FindTool(alltools, env)
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
79
scons-local-3.0.0/SCons/Tool/applelink.py
Normal file
79
scons-local-3.0.0/SCons/Tool/applelink.py
Normal file
@@ -0,0 +1,79 @@
|
||||
"""SCons.Tool.applelink
|
||||
|
||||
Tool-specific initialization for the Apple gnu-like linker.
|
||||
|
||||
There normally shouldn't be any need to import this module directly.
|
||||
It will usually be imported through the generic SCons.Tool.Tool()
|
||||
selection method.
|
||||
|
||||
"""
|
||||
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/applelink.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
import SCons.Util
|
||||
|
||||
# Even though the Mac is based on the GNU toolchain, it doesn't understand
|
||||
# the -rpath option, so we use the "link" tool instead of "gnulink".
|
||||
from . import link
|
||||
|
||||
def generate(env):
|
||||
"""Add Builders and construction variables for applelink to an
|
||||
Environment."""
|
||||
link.generate(env)
|
||||
|
||||
env['FRAMEWORKPATHPREFIX'] = '-F'
|
||||
env['_FRAMEWORKPATH'] = '${_concat(FRAMEWORKPATHPREFIX, FRAMEWORKPATH, "", __env__)}'
|
||||
env['_FRAMEWORKS'] = '${_concat("-framework ", FRAMEWORKS, "", __env__)}'
|
||||
env['LINKCOM'] = env['LINKCOM'] + ' $_FRAMEWORKPATH $_FRAMEWORKS $FRAMEWORKSFLAGS'
|
||||
env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS -dynamiclib')
|
||||
env['SHLINKCOM'] = env['SHLINKCOM'] + ' $_FRAMEWORKPATH $_FRAMEWORKS $FRAMEWORKSFLAGS'
|
||||
|
||||
|
||||
# TODO: Work needed to generate versioned shared libraries
|
||||
# Leaving this commented out, and also going to disable versioned library checking for now
|
||||
# see: http://docstore.mik.ua/orelly/unix3/mac/ch05_04.htm for proper naming
|
||||
#link._setup_versioned_lib_variables(env, tool = 'applelink')#, use_soname = use_soname)
|
||||
#env['LINKCALLBACKS'] = link._versioned_lib_callbacks()
|
||||
|
||||
|
||||
# override the default for loadable modules, which are different
|
||||
# on OS X than dynamic shared libs. echoing what XCode does for
|
||||
# pre/suffixes:
|
||||
env['LDMODULEPREFIX'] = ''
|
||||
env['LDMODULESUFFIX'] = ''
|
||||
env['LDMODULEFLAGS'] = SCons.Util.CLVar('$LINKFLAGS -bundle')
|
||||
env['LDMODULECOM'] = '$LDMODULE -o ${TARGET} $LDMODULEFLAGS $SOURCES $_LIBDIRFLAGS $_LIBFLAGS $_FRAMEWORKPATH $_FRAMEWORKS $FRAMEWORKSFLAGS'
|
||||
|
||||
|
||||
|
||||
def exists(env):
|
||||
return env['PLATFORM'] == 'darwin'
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
63
scons-local-3.0.0/SCons/Tool/ar.py
Normal file
63
scons-local-3.0.0/SCons/Tool/ar.py
Normal file
@@ -0,0 +1,63 @@
|
||||
"""SCons.Tool.ar
|
||||
|
||||
Tool-specific initialization for ar (library archive).
|
||||
|
||||
There normally shouldn't be any need to import this module directly.
|
||||
It will usually be imported through the generic SCons.Tool.Tool()
|
||||
selection method.
|
||||
|
||||
"""
|
||||
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/ar.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
import SCons.Defaults
|
||||
import SCons.Tool
|
||||
import SCons.Util
|
||||
|
||||
|
||||
def generate(env):
|
||||
"""Add Builders and construction variables for ar to an Environment."""
|
||||
SCons.Tool.createStaticLibBuilder(env)
|
||||
|
||||
env['AR'] = 'ar'
|
||||
env['ARFLAGS'] = SCons.Util.CLVar('rc')
|
||||
env['ARCOM'] = '$AR $ARFLAGS $TARGET $SOURCES'
|
||||
env['LIBPREFIX'] = 'lib'
|
||||
env['LIBSUFFIX'] = '.a'
|
||||
|
||||
if env.get('RANLIB',env.Detect('ranlib')) :
|
||||
env['RANLIB'] = env.get('RANLIB','ranlib')
|
||||
env['RANLIBFLAGS'] = SCons.Util.CLVar('')
|
||||
env['RANLIBCOM'] = '$RANLIB $RANLIBFLAGS $TARGET'
|
||||
|
||||
def exists(env):
|
||||
return env.Detect('ar')
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
78
scons-local-3.0.0/SCons/Tool/as.py
Normal file
78
scons-local-3.0.0/SCons/Tool/as.py
Normal file
@@ -0,0 +1,78 @@
|
||||
"""SCons.Tool.as
|
||||
|
||||
Tool-specific initialization for as, the generic Posix assembler.
|
||||
|
||||
There normally shouldn't be any need to import this module directly.
|
||||
It will usually be imported through the generic SCons.Tool.Tool()
|
||||
selection method.
|
||||
|
||||
"""
|
||||
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/as.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
import SCons.Defaults
|
||||
import SCons.Tool
|
||||
import SCons.Util
|
||||
|
||||
assemblers = ['as']
|
||||
|
||||
ASSuffixes = ['.s', '.asm', '.ASM']
|
||||
ASPPSuffixes = ['.spp', '.SPP', '.sx']
|
||||
if SCons.Util.case_sensitive_suffixes('.s', '.S'):
|
||||
ASPPSuffixes.extend(['.S'])
|
||||
else:
|
||||
ASSuffixes.extend(['.S'])
|
||||
|
||||
def generate(env):
|
||||
"""Add Builders and construction variables for as to an Environment."""
|
||||
static_obj, shared_obj = SCons.Tool.createObjBuilders(env)
|
||||
|
||||
for suffix in ASSuffixes:
|
||||
static_obj.add_action(suffix, SCons.Defaults.ASAction)
|
||||
shared_obj.add_action(suffix, SCons.Defaults.ASAction)
|
||||
static_obj.add_emitter(suffix, SCons.Defaults.StaticObjectEmitter)
|
||||
shared_obj.add_emitter(suffix, SCons.Defaults.SharedObjectEmitter)
|
||||
|
||||
for suffix in ASPPSuffixes:
|
||||
static_obj.add_action(suffix, SCons.Defaults.ASPPAction)
|
||||
shared_obj.add_action(suffix, SCons.Defaults.ASPPAction)
|
||||
static_obj.add_emitter(suffix, SCons.Defaults.StaticObjectEmitter)
|
||||
shared_obj.add_emitter(suffix, SCons.Defaults.SharedObjectEmitter)
|
||||
|
||||
env['AS'] = env.Detect(assemblers) or 'as'
|
||||
env['ASFLAGS'] = SCons.Util.CLVar('')
|
||||
env['ASCOM'] = '$AS $ASFLAGS -o $TARGET $SOURCES'
|
||||
env['ASPPFLAGS'] = '$ASFLAGS'
|
||||
env['ASPPCOM'] = '$CC $ASPPFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -c -o $TARGET $SOURCES'
|
||||
|
||||
def exists(env):
|
||||
return env.Detect(assemblers)
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
81
scons-local-3.0.0/SCons/Tool/bcc32.py
Normal file
81
scons-local-3.0.0/SCons/Tool/bcc32.py
Normal file
@@ -0,0 +1,81 @@
|
||||
"""SCons.Tool.bcc32
|
||||
|
||||
XXX
|
||||
|
||||
"""
|
||||
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/bcc32.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
import os
|
||||
import os.path
|
||||
|
||||
import SCons.Defaults
|
||||
import SCons.Tool
|
||||
import SCons.Util
|
||||
|
||||
def findIt(program, env):
|
||||
# First search in the SCons path and then the OS path:
|
||||
borwin = env.WhereIs(program) or SCons.Util.WhereIs(program)
|
||||
if borwin:
|
||||
dir = os.path.dirname(borwin)
|
||||
env.PrependENVPath('PATH', dir)
|
||||
return borwin
|
||||
|
||||
def generate(env):
|
||||
findIt('bcc32', env)
|
||||
"""Add Builders and construction variables for bcc to an
|
||||
Environment."""
|
||||
static_obj, shared_obj = SCons.Tool.createObjBuilders(env)
|
||||
for suffix in ['.c', '.cpp']:
|
||||
static_obj.add_action(suffix, SCons.Defaults.CAction)
|
||||
shared_obj.add_action(suffix, SCons.Defaults.ShCAction)
|
||||
static_obj.add_emitter(suffix, SCons.Defaults.StaticObjectEmitter)
|
||||
shared_obj.add_emitter(suffix, SCons.Defaults.SharedObjectEmitter)
|
||||
|
||||
env['CC'] = 'bcc32'
|
||||
env['CCFLAGS'] = SCons.Util.CLVar('')
|
||||
env['CFLAGS'] = SCons.Util.CLVar('')
|
||||
env['CCCOM'] = '$CC -q $CFLAGS $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -c -o$TARGET $SOURCES'
|
||||
env['SHCC'] = '$CC'
|
||||
env['SHCCFLAGS'] = SCons.Util.CLVar('$CCFLAGS')
|
||||
env['SHCFLAGS'] = SCons.Util.CLVar('$CFLAGS')
|
||||
env['SHCCCOM'] = '$SHCC -WD $SHCFLAGS $SHCCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -c -o$TARGET $SOURCES'
|
||||
env['CPPDEFPREFIX'] = '-D'
|
||||
env['CPPDEFSUFFIX'] = ''
|
||||
env['INCPREFIX'] = '-I'
|
||||
env['INCSUFFIX'] = ''
|
||||
env['SHOBJSUFFIX'] = '.dll'
|
||||
env['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME'] = 0
|
||||
env['CFILESUFFIX'] = '.cpp'
|
||||
|
||||
def exists(env):
|
||||
return findIt('bcc32', env)
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
44
scons-local-3.0.0/SCons/Tool/c++.py
Normal file
44
scons-local-3.0.0/SCons/Tool/c++.py
Normal file
@@ -0,0 +1,44 @@
|
||||
"""SCons.Tool.c++
|
||||
|
||||
Tool-specific initialization for generic Posix C++ compilers.
|
||||
|
||||
There normally shouldn't be any need to import this module directly.
|
||||
It will usually be imported through the generic SCons.Tool.Tool()
|
||||
selection method.
|
||||
"""
|
||||
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/c++.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
|
||||
#forward proxy to the preffered cxx version
|
||||
from SCons.Tool.cxx import *
|
||||
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
105
scons-local-3.0.0/SCons/Tool/cc.py
Normal file
105
scons-local-3.0.0/SCons/Tool/cc.py
Normal file
@@ -0,0 +1,105 @@
|
||||
"""SCons.Tool.cc
|
||||
|
||||
Tool-specific initialization for generic Posix C compilers.
|
||||
|
||||
There normally shouldn't be any need to import this module directly.
|
||||
It will usually be imported through the generic SCons.Tool.Tool()
|
||||
selection method.
|
||||
"""
|
||||
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/cc.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
import SCons.Tool
|
||||
import SCons.Defaults
|
||||
import SCons.Util
|
||||
|
||||
CSuffixes = ['.c', '.m']
|
||||
if not SCons.Util.case_sensitive_suffixes('.c', '.C'):
|
||||
CSuffixes.append('.C')
|
||||
|
||||
def add_common_cc_variables(env):
|
||||
"""
|
||||
Add underlying common "C compiler" variables that
|
||||
are used by multiple tools (specifically, c++).
|
||||
"""
|
||||
if '_CCCOMCOM' not in env:
|
||||
env['_CCCOMCOM'] = '$CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS'
|
||||
# It's a hack to test for darwin here, but the alternative
|
||||
# of creating an applecc.py to contain this seems overkill.
|
||||
# Maybe someday the Apple platform will require more setup and
|
||||
# this logic will be moved.
|
||||
env['FRAMEWORKS'] = SCons.Util.CLVar('')
|
||||
env['FRAMEWORKPATH'] = SCons.Util.CLVar('')
|
||||
if env['PLATFORM'] == 'darwin':
|
||||
env['_CCCOMCOM'] = env['_CCCOMCOM'] + ' $_FRAMEWORKPATH'
|
||||
|
||||
if 'CCFLAGS' not in env:
|
||||
env['CCFLAGS'] = SCons.Util.CLVar('')
|
||||
|
||||
if 'SHCCFLAGS' not in env:
|
||||
env['SHCCFLAGS'] = SCons.Util.CLVar('$CCFLAGS')
|
||||
|
||||
compilers = ['cc']
|
||||
|
||||
def generate(env):
|
||||
"""
|
||||
Add Builders and construction variables for C compilers to an Environment.
|
||||
"""
|
||||
static_obj, shared_obj = SCons.Tool.createObjBuilders(env)
|
||||
|
||||
for suffix in CSuffixes:
|
||||
static_obj.add_action(suffix, SCons.Defaults.CAction)
|
||||
shared_obj.add_action(suffix, SCons.Defaults.ShCAction)
|
||||
static_obj.add_emitter(suffix, SCons.Defaults.StaticObjectEmitter)
|
||||
shared_obj.add_emitter(suffix, SCons.Defaults.SharedObjectEmitter)
|
||||
|
||||
add_common_cc_variables(env)
|
||||
|
||||
if 'CC' not in env:
|
||||
env['CC'] = env.Detect(compilers) or compilers[0]
|
||||
env['CFLAGS'] = SCons.Util.CLVar('')
|
||||
env['CCCOM'] = '$CC -o $TARGET -c $CFLAGS $CCFLAGS $_CCCOMCOM $SOURCES'
|
||||
env['SHCC'] = '$CC'
|
||||
env['SHCFLAGS'] = SCons.Util.CLVar('$CFLAGS')
|
||||
env['SHCCCOM'] = '$SHCC -o $TARGET -c $SHCFLAGS $SHCCFLAGS $_CCCOMCOM $SOURCES'
|
||||
|
||||
env['CPPDEFPREFIX'] = '-D'
|
||||
env['CPPDEFSUFFIX'] = ''
|
||||
env['INCPREFIX'] = '-I'
|
||||
env['INCSUFFIX'] = ''
|
||||
env['SHOBJSUFFIX'] = '.os'
|
||||
env['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME'] = 0
|
||||
|
||||
env['CFILESUFFIX'] = '.c'
|
||||
|
||||
def exists(env):
|
||||
return env.Detect(env.get('CC', compilers))
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
83
scons-local-3.0.0/SCons/Tool/clang.py
Normal file
83
scons-local-3.0.0/SCons/Tool/clang.py
Normal file
@@ -0,0 +1,83 @@
|
||||
# -*- coding: utf-8; -*-
|
||||
|
||||
"""SCons.Tool.clang
|
||||
|
||||
Tool-specific initialization for clang.
|
||||
|
||||
There normally shouldn't be any need to import this module directly.
|
||||
It will usually be imported through the generic SCons.Tool.Tool()
|
||||
selection method.
|
||||
|
||||
"""
|
||||
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
|
||||
# __revision__ = "src/engine/SCons/Tool/clang.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
# Based on SCons/Tool/gcc.py by Paweł Tomulik 2014 as a separate tool.
|
||||
# Brought into the SCons mainline by Russel Winder 2017.
|
||||
|
||||
import os
|
||||
import re
|
||||
import subprocess
|
||||
import sys
|
||||
|
||||
import SCons.Util
|
||||
import SCons.Tool.cc
|
||||
|
||||
compilers = ['clang']
|
||||
|
||||
def generate(env):
|
||||
"""Add Builders and construction variables for clang to an Environment."""
|
||||
SCons.Tool.cc.generate(env)
|
||||
|
||||
env['CC'] = env.Detect(compilers) or 'clang'
|
||||
if env['PLATFORM'] in ['cygwin', 'win32']:
|
||||
env['SHCCFLAGS'] = SCons.Util.CLVar('$CCFLAGS')
|
||||
else:
|
||||
env['SHCCFLAGS'] = SCons.Util.CLVar('$CCFLAGS -fPIC')
|
||||
# determine compiler version
|
||||
if env['CC']:
|
||||
#pipe = SCons.Action._subproc(env, [env['CC'], '-dumpversion'],
|
||||
pipe = SCons.Action._subproc(env, [env['CC'], '--version'],
|
||||
stdin='devnull',
|
||||
stderr='devnull',
|
||||
stdout=subprocess.PIPE)
|
||||
if pipe.wait() != 0: return
|
||||
# clang -dumpversion is of no use
|
||||
line = pipe.stdout.readline()
|
||||
if sys.version_info[0] > 2:
|
||||
line = line.decode()
|
||||
match = re.search(r'clang +version +([0-9]+(?:\.[0-9]+)+)', line)
|
||||
if match:
|
||||
env['CCVERSION'] = match.group(1)
|
||||
|
||||
def exists(env):
|
||||
return env.Detect(compilers)
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
91
scons-local-3.0.0/SCons/Tool/clangxx.py
Normal file
91
scons-local-3.0.0/SCons/Tool/clangxx.py
Normal file
@@ -0,0 +1,91 @@
|
||||
# -*- coding: utf-8; -*-
|
||||
|
||||
"""SCons.Tool.clang++
|
||||
|
||||
Tool-specific initialization for clang++.
|
||||
|
||||
There normally shouldn't be any need to import this module directly.
|
||||
It will usually be imported through the generic SCons.Tool.Tool()
|
||||
selection method.
|
||||
|
||||
"""
|
||||
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
|
||||
# __revision__ = "src/engine/SCons/Tool/clangxx.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
# Based on SCons/Tool/g++.py by Paweł Tomulik 2014 as a separate tool.
|
||||
# Brought into the SCons mainline by Russel Winder 2017.
|
||||
|
||||
import os.path
|
||||
import re
|
||||
import subprocess
|
||||
import sys
|
||||
|
||||
import SCons.Tool
|
||||
import SCons.Util
|
||||
import SCons.Tool.cxx
|
||||
|
||||
compilers = ['clang++']
|
||||
|
||||
def generate(env):
|
||||
"""Add Builders and construction variables for clang++ to an Environment."""
|
||||
static_obj, shared_obj = SCons.Tool.createObjBuilders(env)
|
||||
|
||||
SCons.Tool.cxx.generate(env)
|
||||
|
||||
env['CXX'] = env.Detect(compilers) or 'clang++'
|
||||
|
||||
# platform specific settings
|
||||
if env['PLATFORM'] == 'aix':
|
||||
env['SHCXXFLAGS'] = SCons.Util.CLVar('$CXXFLAGS -mminimal-toc')
|
||||
env['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME'] = 1
|
||||
env['SHOBJSUFFIX'] = '$OBJSUFFIX'
|
||||
elif env['PLATFORM'] == 'hpux':
|
||||
env['SHOBJSUFFIX'] = '.pic.o'
|
||||
elif env['PLATFORM'] == 'sunos':
|
||||
env['SHOBJSUFFIX'] = '.pic.o'
|
||||
# determine compiler version
|
||||
if env['CXX']:
|
||||
pipe = SCons.Action._subproc(env, [env['CXX'], '--version'],
|
||||
stdin='devnull',
|
||||
stderr='devnull',
|
||||
stdout=subprocess.PIPE)
|
||||
if pipe.wait() != 0: return
|
||||
# clang -dumpversion is of no use
|
||||
line = pipe.stdout.readline()
|
||||
if sys.version_info[0] > 2:
|
||||
line = line.decode()
|
||||
match = re.search(r'clang +version +([0-9]+(?:\.[0-9]+)+)', line)
|
||||
if match:
|
||||
env['CXXVERSION'] = match.group(1)
|
||||
|
||||
def exists(env):
|
||||
return env.Detect(compilers)
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
58
scons-local-3.0.0/SCons/Tool/cvf.py
Normal file
58
scons-local-3.0.0/SCons/Tool/cvf.py
Normal file
@@ -0,0 +1,58 @@
|
||||
"""engine.SCons.Tool.cvf
|
||||
|
||||
Tool-specific initialization for the Compaq Visual Fortran compiler.
|
||||
|
||||
"""
|
||||
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/cvf.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
from . import fortran
|
||||
|
||||
compilers = ['f90']
|
||||
|
||||
def generate(env):
|
||||
"""Add Builders and construction variables for compaq visual fortran to an Environment."""
|
||||
|
||||
fortran.generate(env)
|
||||
|
||||
env['FORTRAN'] = 'f90'
|
||||
env['FORTRANCOM'] = '$FORTRAN $FORTRANFLAGS $_FORTRANMODFLAG $_FORTRANINCFLAGS /compile_only ${SOURCES.windows} /object:${TARGET.windows}'
|
||||
env['FORTRANPPCOM'] = '$FORTRAN $FORTRANFLAGS $CPPFLAGS $_CPPDEFFLAGS $_FORTRANMODFLAG $_FORTRANINCFLAGS /compile_only ${SOURCES.windows} /object:${TARGET.windows}'
|
||||
env['SHFORTRANCOM'] = '$SHFORTRAN $SHFORTRANFLAGS $_FORTRANMODFLAG $_FORTRANINCFLAGS /compile_only ${SOURCES.windows} /object:${TARGET.windows}'
|
||||
env['SHFORTRANPPCOM'] = '$SHFORTRAN $SHFORTRANFLAGS $CPPFLAGS $_CPPDEFFLAGS $_FORTRANMODFLAG $_FORTRANINCFLAGS /compile_only ${SOURCES.windows} /object:${TARGET.windows}'
|
||||
env['OBJSUFFIX'] = '.obj'
|
||||
env['FORTRANMODDIR'] = '${TARGET.dir}'
|
||||
env['FORTRANMODDIRPREFIX'] = '/module:'
|
||||
env['FORTRANMODDIRSUFFIX'] = ''
|
||||
|
||||
def exists(env):
|
||||
return env.Detect(compilers)
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
100
scons-local-3.0.0/SCons/Tool/cxx.py
Normal file
100
scons-local-3.0.0/SCons/Tool/cxx.py
Normal file
@@ -0,0 +1,100 @@
|
||||
"""SCons.Tool.c++
|
||||
|
||||
Tool-specific initialization for generic Posix C++ compilers.
|
||||
|
||||
There normally shouldn't be any need to import this module directly.
|
||||
It will usually be imported through the generic SCons.Tool.Tool()
|
||||
selection method.
|
||||
"""
|
||||
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/cxx.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
import os.path
|
||||
|
||||
import SCons.Tool
|
||||
import SCons.Defaults
|
||||
import SCons.Util
|
||||
|
||||
compilers = ['CC', 'c++']
|
||||
|
||||
CXXSuffixes = ['.cpp', '.cc', '.cxx', '.c++', '.C++', '.mm']
|
||||
if SCons.Util.case_sensitive_suffixes('.c', '.C'):
|
||||
CXXSuffixes.append('.C')
|
||||
|
||||
def iscplusplus(source):
|
||||
if not source:
|
||||
# Source might be None for unusual cases like SConf.
|
||||
return 0
|
||||
for s in source:
|
||||
if s.sources:
|
||||
ext = os.path.splitext(str(s.sources[0]))[1]
|
||||
if ext in CXXSuffixes:
|
||||
return 1
|
||||
return 0
|
||||
|
||||
def generate(env):
|
||||
"""
|
||||
Add Builders and construction variables for Visual Age C++ compilers
|
||||
to an Environment.
|
||||
"""
|
||||
import SCons.Tool
|
||||
import SCons.Tool.cc
|
||||
static_obj, shared_obj = SCons.Tool.createObjBuilders(env)
|
||||
|
||||
for suffix in CXXSuffixes:
|
||||
static_obj.add_action(suffix, SCons.Defaults.CXXAction)
|
||||
shared_obj.add_action(suffix, SCons.Defaults.ShCXXAction)
|
||||
static_obj.add_emitter(suffix, SCons.Defaults.StaticObjectEmitter)
|
||||
shared_obj.add_emitter(suffix, SCons.Defaults.SharedObjectEmitter)
|
||||
|
||||
SCons.Tool.cc.add_common_cc_variables(env)
|
||||
|
||||
if 'CXX' not in env:
|
||||
env['CXX'] = env.Detect(compilers) or compilers[0]
|
||||
env['CXXFLAGS'] = SCons.Util.CLVar('')
|
||||
env['CXXCOM'] = '$CXX -o $TARGET -c $CXXFLAGS $CCFLAGS $_CCCOMCOM $SOURCES'
|
||||
env['SHCXX'] = '$CXX'
|
||||
env['SHCXXFLAGS'] = SCons.Util.CLVar('$CXXFLAGS')
|
||||
env['SHCXXCOM'] = '$SHCXX -o $TARGET -c $SHCXXFLAGS $SHCCFLAGS $_CCCOMCOM $SOURCES'
|
||||
|
||||
env['CPPDEFPREFIX'] = '-D'
|
||||
env['CPPDEFSUFFIX'] = ''
|
||||
env['INCPREFIX'] = '-I'
|
||||
env['INCSUFFIX'] = ''
|
||||
env['SHOBJSUFFIX'] = '.os'
|
||||
env['OBJSUFFIX'] = '.o'
|
||||
env['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME'] = 0
|
||||
|
||||
env['CXXFILESUFFIX'] = '.cc'
|
||||
|
||||
def exists(env):
|
||||
return env.Detect(env.get('CXX', compilers))
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
236
scons-local-3.0.0/SCons/Tool/cyglink.py
Normal file
236
scons-local-3.0.0/SCons/Tool/cyglink.py
Normal file
@@ -0,0 +1,236 @@
|
||||
"""SCons.Tool.cyglink
|
||||
|
||||
Customization of gnulink for Cygwin (http://www.cygwin.com/)
|
||||
|
||||
There normally shouldn't be any need to import this module directly.
|
||||
It will usually be imported through the generic SCons.Tool.Tool()
|
||||
selection method.
|
||||
|
||||
"""
|
||||
|
||||
from __future__ import absolute_import, print_function
|
||||
|
||||
import re
|
||||
import os
|
||||
|
||||
import SCons.Action
|
||||
import SCons.Util
|
||||
import SCons.Tool
|
||||
|
||||
#MAYBE: from . import gnulink
|
||||
from . import gnulink
|
||||
from . import link
|
||||
|
||||
def _lib_generator(target, source, env, for_signature, **kw):
|
||||
try: cmd = kw['cmd']
|
||||
except KeyError: cmd = SCons.Util.CLVar(['$SHLINK'])
|
||||
|
||||
try: vp = kw['varprefix']
|
||||
except KeyError: vp = 'SHLIB'
|
||||
|
||||
dll = env.FindIxes(target, '%sPREFIX' % vp, '%sSUFFIX' % vp)
|
||||
if dll: cmd.extend(['-o', dll])
|
||||
|
||||
cmd.extend(['$SHLINKFLAGS', '$__%sVERSIONFLAGS' % vp, '$__RPATH'])
|
||||
|
||||
implib = env.FindIxes(target, 'IMPLIBPREFIX', 'IMPLIBSUFFIX')
|
||||
if implib:
|
||||
cmd.extend([
|
||||
'-Wl,--out-implib='+implib.get_string(for_signature),
|
||||
'-Wl,--export-all-symbols',
|
||||
'-Wl,--enable-auto-import',
|
||||
'-Wl,--whole-archive', '$SOURCES',
|
||||
'-Wl,--no-whole-archive', '$_LIBDIRFLAGS', '$_LIBFLAGS'
|
||||
])
|
||||
else:
|
||||
cmd.extend(['$SOURCES', '$_LIBDIRFLAGS', '$_LIBFLAGS'])
|
||||
|
||||
return [cmd]
|
||||
|
||||
|
||||
def shlib_generator(target, source, env, for_signature):
|
||||
return _lib_generator(target, source, env, for_signature,
|
||||
varprefix='SHLIB',
|
||||
cmd = SCons.Util.CLVar(['$SHLINK']))
|
||||
|
||||
def ldmod_generator(target, source, env, for_signature):
|
||||
return _lib_generator(target, source, env, for_signature,
|
||||
varprefix='LDMODULE',
|
||||
cmd = SCons.Util.CLVar(['$LDMODULE']))
|
||||
|
||||
def _lib_emitter(target, source, env, **kw):
|
||||
Verbose = False
|
||||
|
||||
if Verbose:
|
||||
print("_lib_emitter: target[0]=%r" % target[0].get_path())
|
||||
|
||||
try: vp = kw['varprefix']
|
||||
except KeyError: vp = 'SHLIB'
|
||||
|
||||
try: libtype = kw['libtype']
|
||||
except KeyError: libtype = 'ShLib'
|
||||
|
||||
dll = env.FindIxes(target, '%sPREFIX' % vp, '%sSUFFIX' % vp)
|
||||
no_import_lib = env.get('no_import_lib', 0)
|
||||
|
||||
if Verbose:
|
||||
print("_lib_emitter: dll=%r" % dll.get_path())
|
||||
|
||||
if not dll or len(target) > 1:
|
||||
raise SCons.Errors.UserError("A shared library should have exactly one target with the suffix: %s" % env.subst("$%sSUFFIX" % vp))
|
||||
|
||||
# Remove any "lib" after the prefix
|
||||
pre = env.subst('$%sPREFIX' % vp)
|
||||
if dll.name[len(pre):len(pre)+3] == 'lib':
|
||||
dll.name = pre + dll.name[len(pre)+3:]
|
||||
|
||||
if Verbose:
|
||||
print("_lib_emitter: dll.name=%r" % dll.name)
|
||||
|
||||
orig_target = target
|
||||
target = [env.fs.File(dll)]
|
||||
target[0].attributes.shared = 1
|
||||
|
||||
if Verbose:
|
||||
print("_lib_emitter: after target=[env.fs.File(dll)]: target[0]=%r" % target[0].get_path())
|
||||
|
||||
# Append an import lib target
|
||||
if not no_import_lib:
|
||||
# Create list of target libraries as strings
|
||||
target_strings = env.ReplaceIxes(orig_target[0],
|
||||
'%sPREFIX' % vp, '%sSUFFIX' % vp,
|
||||
'IMPLIBPREFIX', 'IMPLIBSUFFIX')
|
||||
if Verbose:
|
||||
print("_lib_emitter: target_strings=%r" % target_strings)
|
||||
|
||||
implib_target = env.fs.File(target_strings)
|
||||
if Verbose:
|
||||
print("_lib_emitter: implib_target=%r" % implib_target.get_path())
|
||||
implib_target.attributes.shared = 1
|
||||
target.append(implib_target)
|
||||
|
||||
symlinks = SCons.Tool.ImpLibSymlinkGenerator(env, implib_target,
|
||||
implib_libtype=libtype,
|
||||
generator_libtype=libtype+'ImpLib')
|
||||
if Verbose:
|
||||
print("_lib_emitter: implib symlinks=%r" % SCons.Tool.StringizeLibSymlinks(symlinks))
|
||||
if symlinks:
|
||||
SCons.Tool.EmitLibSymlinks(env, symlinks, implib_target, clean_targets = target[0])
|
||||
implib_target.attributes.shliblinks = symlinks
|
||||
|
||||
return (target, source)
|
||||
|
||||
def shlib_emitter(target, source, env):
|
||||
return _lib_emitter(target, source, env, varprefix='SHLIB', libtype='ShLib')
|
||||
|
||||
def ldmod_emitter(target, source, env):
|
||||
return _lib_emitter(target, source, env, varprefix='LDMODULE', libtype='LdMod')
|
||||
|
||||
def _versioned_lib_suffix(env, suffix, version):
|
||||
"""Generate versioned shared library suffix from a unversioned one.
|
||||
If suffix='.dll', and version='0.1.2', then it returns '-0-1-2.dll'"""
|
||||
Verbose = False
|
||||
if Verbose:
|
||||
print("_versioned_lib_suffix: suffix= ", suffix)
|
||||
print("_versioned_lib_suffix: version= ", version)
|
||||
cygversion = re.sub('\.', '-', version)
|
||||
if not suffix.startswith('-' + cygversion):
|
||||
suffix = '-' + cygversion + suffix
|
||||
if Verbose:
|
||||
print("_versioned_lib_suffix: return suffix= ", suffix)
|
||||
return suffix
|
||||
|
||||
def _versioned_implib_name(env, libnode, version, prefix, suffix, **kw):
|
||||
return link._versioned_lib_name(env, libnode, version, prefix, suffix,
|
||||
SCons.Tool.ImpLibPrefixGenerator,
|
||||
SCons.Tool.ImpLibSuffixGenerator,
|
||||
implib_libtype=kw['libtype'])
|
||||
|
||||
def _versioned_implib_symlinks(env, libnode, version, prefix, suffix, **kw):
|
||||
"""Generate link names that should be created for a versioned shared library.
|
||||
Returns a list in the form [ (link, linktarget), ... ]
|
||||
"""
|
||||
Verbose = False
|
||||
|
||||
if Verbose:
|
||||
print("_versioned_implib_symlinks: libnode=%r" % libnode.get_path())
|
||||
print("_versioned_implib_symlinks: version=%r" % version)
|
||||
|
||||
try: libtype = kw['libtype']
|
||||
except KeyError: libtype = 'ShLib'
|
||||
|
||||
|
||||
linkdir = os.path.dirname(libnode.get_path())
|
||||
if Verbose:
|
||||
print("_versioned_implib_symlinks: linkdir=%r" % linkdir)
|
||||
|
||||
name = SCons.Tool.ImpLibNameGenerator(env, libnode,
|
||||
implib_libtype=libtype,
|
||||
generator_libtype=libtype+'ImpLib')
|
||||
if Verbose:
|
||||
print("_versioned_implib_symlinks: name=%r" % name)
|
||||
|
||||
major = version.split('.')[0]
|
||||
|
||||
link0 = env.fs.File(os.path.join(linkdir, name))
|
||||
symlinks = [(link0, libnode)]
|
||||
|
||||
if Verbose:
|
||||
print("_versioned_implib_symlinks: return symlinks=%r" % SCons.Tool.StringizeLibSymlinks(symlinks))
|
||||
|
||||
return symlinks
|
||||
|
||||
shlib_action = SCons.Action.Action(shlib_generator, generator=1)
|
||||
ldmod_action = SCons.Action.Action(ldmod_generator, generator=1)
|
||||
|
||||
def generate(env):
|
||||
"""Add Builders and construction variables for cyglink to an Environment."""
|
||||
gnulink.generate(env)
|
||||
|
||||
env['LINKFLAGS'] = SCons.Util.CLVar('-Wl,-no-undefined')
|
||||
|
||||
env['SHLINKCOM'] = shlib_action
|
||||
env['LDMODULECOM'] = ldmod_action
|
||||
env.Append(SHLIBEMITTER = [shlib_emitter])
|
||||
env.Append(LDMODULEEMITTER = [ldmod_emitter])
|
||||
|
||||
env['SHLIBPREFIX'] = 'cyg'
|
||||
env['SHLIBSUFFIX'] = '.dll'
|
||||
|
||||
env['IMPLIBPREFIX'] = 'lib'
|
||||
env['IMPLIBSUFFIX'] = '.dll.a'
|
||||
|
||||
# Variables used by versioned shared libraries
|
||||
env['_SHLIBVERSIONFLAGS'] = '$SHLIBVERSIONFLAGS'
|
||||
env['_LDMODULEVERSIONFLAGS'] = '$LDMODULEVERSIONFLAGS'
|
||||
|
||||
# SHLIBVERSIONFLAGS and LDMODULEVERSIONFLAGS are same as in gnulink...
|
||||
|
||||
# LINKCALLBACKS are NOT inherited from gnulink
|
||||
env['LINKCALLBACKS'] = {
|
||||
'VersionedShLibSuffix' : _versioned_lib_suffix,
|
||||
'VersionedLdModSuffix' : _versioned_lib_suffix,
|
||||
'VersionedImpLibSuffix' : _versioned_lib_suffix,
|
||||
'VersionedShLibName' : link._versioned_shlib_name,
|
||||
'VersionedLdModName' : link._versioned_ldmod_name,
|
||||
'VersionedShLibImpLibName' : lambda *args: _versioned_implib_name(*args, libtype='ShLib'),
|
||||
'VersionedLdModImpLibName' : lambda *args: _versioned_implib_name(*args, libtype='LdMod'),
|
||||
'VersionedShLibImpLibSymlinks' : lambda *args: _versioned_implib_symlinks(*args, libtype='ShLib'),
|
||||
'VersionedLdModImpLibSymlinks' : lambda *args: _versioned_implib_symlinks(*args, libtype='LdMod'),
|
||||
}
|
||||
|
||||
# these variables were set by gnulink but are not used in cyglink
|
||||
try: del env['_SHLIBSONAME']
|
||||
except KeyError: pass
|
||||
try: del env['_LDMODULESONAME']
|
||||
except KeyError: pass
|
||||
|
||||
def exists(env):
|
||||
return gnulink.exists(env)
|
||||
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
50
scons-local-3.0.0/SCons/Tool/default.py
Normal file
50
scons-local-3.0.0/SCons/Tool/default.py
Normal file
@@ -0,0 +1,50 @@
|
||||
"""SCons.Tool.default
|
||||
|
||||
Initialization with a default tool list.
|
||||
|
||||
There normally shouldn't be any need to import this module directly.
|
||||
It will usually be imported through the generic SCons.Tool.Tool()
|
||||
selection method.
|
||||
|
||||
"""
|
||||
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/default.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
import SCons.Tool
|
||||
|
||||
def generate(env):
|
||||
"""Add default tools."""
|
||||
for t in SCons.Tool.tool_list(env['PLATFORM'], env):
|
||||
SCons.Tool.Tool(t)(env)
|
||||
|
||||
def exists(env):
|
||||
return 1
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
161
scons-local-3.0.0/SCons/Tool/dmd.py
Normal file
161
scons-local-3.0.0/SCons/Tool/dmd.py
Normal file
@@ -0,0 +1,161 @@
|
||||
from __future__ import print_function
|
||||
|
||||
"""SCons.Tool.dmd
|
||||
|
||||
Tool-specific initialization for the Digital Mars D compiler.
|
||||
(http://digitalmars.com/d)
|
||||
|
||||
Originally coded by Andy Friesen (andy@ikagames.com)
|
||||
15 November 2003
|
||||
|
||||
Evolved by Russel Winder (russel@winder.org.uk)
|
||||
2010-02-07 onwards
|
||||
|
||||
Compiler variables:
|
||||
DC - The name of the D compiler to use. Defaults to dmd or gdmd,
|
||||
whichever is found.
|
||||
DPATH - List of paths to search for import modules.
|
||||
DVERSIONS - List of version tags to enable when compiling.
|
||||
DDEBUG - List of debug tags to enable when compiling.
|
||||
|
||||
Linker related variables:
|
||||
LIBS - List of library files to link in.
|
||||
DLINK - Name of the linker to use. Defaults to dmd or gdmd,
|
||||
whichever is found.
|
||||
DLINKFLAGS - List of linker flags.
|
||||
|
||||
Lib tool variables:
|
||||
DLIB - Name of the lib tool to use. Defaults to lib.
|
||||
DLIBFLAGS - List of flags to pass to the lib tool.
|
||||
LIBS - Same as for the linker. (libraries to pull into the .lib)
|
||||
"""
|
||||
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/dmd.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
import os
|
||||
import subprocess
|
||||
|
||||
import SCons.Action
|
||||
import SCons.Builder
|
||||
import SCons.Defaults
|
||||
import SCons.Scanner.D
|
||||
import SCons.Tool
|
||||
|
||||
import SCons.Tool.DCommon as DCommon
|
||||
|
||||
|
||||
def generate(env):
|
||||
static_obj, shared_obj = SCons.Tool.createObjBuilders(env)
|
||||
|
||||
static_obj.add_action('.d', SCons.Defaults.DAction)
|
||||
shared_obj.add_action('.d', SCons.Defaults.ShDAction)
|
||||
static_obj.add_emitter('.d', SCons.Defaults.StaticObjectEmitter)
|
||||
shared_obj.add_emitter('.d', SCons.Defaults.SharedObjectEmitter)
|
||||
|
||||
env['DC'] = env.Detect(['dmd', 'ldmd2', 'gdmd']) or 'dmd'
|
||||
env['DCOM'] = '$DC $_DINCFLAGS $_DVERFLAGS $_DDEBUGFLAGS $_DFLAGS -c -of$TARGET $SOURCES'
|
||||
env['_DINCFLAGS'] = '${_concat(DINCPREFIX, DPATH, DINCSUFFIX, __env__, RDirs, TARGET, SOURCE)}'
|
||||
env['_DVERFLAGS'] = '${_concat(DVERPREFIX, DVERSIONS, DVERSUFFIX, __env__)}'
|
||||
env['_DDEBUGFLAGS'] = '${_concat(DDEBUGPREFIX, DDEBUG, DDEBUGSUFFIX, __env__)}'
|
||||
env['_DFLAGS'] = '${_concat(DFLAGPREFIX, DFLAGS, DFLAGSUFFIX, __env__)}'
|
||||
|
||||
env['SHDC'] = '$DC'
|
||||
env['SHDCOM'] = '$DC $_DINCFLAGS $_DVERFLAGS $_DDEBUGFLAGS $_DFLAGS -c -fPIC -of$TARGET $SOURCES'
|
||||
|
||||
env['DPATH'] = ['#/']
|
||||
env['DFLAGS'] = []
|
||||
env['DVERSIONS'] = []
|
||||
env['DDEBUG'] = []
|
||||
|
||||
if env['DC']:
|
||||
DCommon.addDPATHToEnv(env, env['DC'])
|
||||
|
||||
env['DINCPREFIX'] = '-I'
|
||||
env['DINCSUFFIX'] = ''
|
||||
env['DVERPREFIX'] = '-version='
|
||||
env['DVERSUFFIX'] = ''
|
||||
env['DDEBUGPREFIX'] = '-debug='
|
||||
env['DDEBUGSUFFIX'] = ''
|
||||
env['DFLAGPREFIX'] = '-'
|
||||
env['DFLAGSUFFIX'] = ''
|
||||
env['DFILESUFFIX'] = '.d'
|
||||
|
||||
env['DLINK'] = '$DC'
|
||||
env['DLINKFLAGS'] = SCons.Util.CLVar('')
|
||||
env['DLINKCOM'] = '$DLINK -of$TARGET $DLINKFLAGS $__DRPATH $SOURCES $_DLIBDIRFLAGS $_DLIBFLAGS'
|
||||
|
||||
env['SHDLINK'] = '$DC'
|
||||
env['SHDLINKFLAGS'] = SCons.Util.CLVar('$DLINKFLAGS -shared -defaultlib=libphobos2.so')
|
||||
env['SHDLINKCOM'] = '$DLINK -of$TARGET $SHDLINKFLAGS $__SHDLIBVERSIONFLAGS $__DRPATH $SOURCES $_DLIBDIRFLAGS $_DLIBFLAGS'
|
||||
|
||||
env['DLIBLINKPREFIX'] = '' if env['PLATFORM'] == 'win32' else '-L-l'
|
||||
env['DLIBLINKSUFFIX'] = '.lib' if env['PLATFORM'] == 'win32' else ''
|
||||
env['_DLIBFLAGS'] = '${_stripixes(DLIBLINKPREFIX, LIBS, DLIBLINKSUFFIX, LIBPREFIXES, LIBSUFFIXES, __env__)}'
|
||||
|
||||
env['DLIBDIRPREFIX'] = '-L-L'
|
||||
env['DLIBDIRSUFFIX'] = ''
|
||||
env['_DLIBDIRFLAGS'] = '${_concat(DLIBDIRPREFIX, LIBPATH, DLIBDIRSUFFIX, __env__, RDirs, TARGET, SOURCE)}'
|
||||
|
||||
env['DLIB'] = 'lib' if env['PLATFORM'] == 'win32' else 'ar cr'
|
||||
env['DLIBCOM'] = '$DLIB $_DLIBFLAGS {0}$TARGET $SOURCES $_DLIBFLAGS'.format('-c ' if env['PLATFORM'] == 'win32' else '')
|
||||
|
||||
# env['_DLIBFLAGS'] = '${_concat(DLIBFLAGPREFIX, DLIBFLAGS, DLIBFLAGSUFFIX, __env__)}'
|
||||
|
||||
env['DLIBFLAGPREFIX'] = '-'
|
||||
env['DLIBFLAGSUFFIX'] = ''
|
||||
|
||||
# __RPATH is set to $_RPATH in the platform specification if that
|
||||
# platform supports it.
|
||||
env['DRPATHPREFIX'] = '-L-rpath,' if env['PLATFORM'] == 'darwin' else '-L-rpath='
|
||||
env['DRPATHSUFFIX'] = ''
|
||||
env['_DRPATH'] = '${_concat(DRPATHPREFIX, RPATH, DRPATHSUFFIX, __env__)}'
|
||||
|
||||
# Support for versioned libraries
|
||||
env['_SHDLIBVERSIONFLAGS'] = '$SHDLIBVERSIONFLAGS -L-soname=$_SHDLIBSONAME'
|
||||
env['_SHDLIBSONAME'] = '${DShLibSonameGenerator(__env__,TARGET)}'
|
||||
# NOTE: this is a quick hack, the soname will only work if there is
|
||||
# c/c++ linker loaded which provides callback for the ShLibSonameGenerator
|
||||
env['DShLibSonameGenerator'] = SCons.Tool.ShLibSonameGenerator
|
||||
# NOTE: this is only for further reference, currently $SHDLIBVERSION does
|
||||
# not work, the user must use $SHLIBVERSION
|
||||
env['SHDLIBVERSION'] = '$SHLIBVERSION'
|
||||
env['SHDLIBVERSIONFLAGS'] = []
|
||||
|
||||
env['BUILDERS']['ProgramAllAtOnce'] = SCons.Builder.Builder(
|
||||
action='$DC $_DINCFLAGS $_DVERFLAGS $_DDEBUGFLAGS $_DFLAGS -of$TARGET $DLINKFLAGS $__DRPATH $SOURCES $_DLIBDIRFLAGS $_DLIBFLAGS',
|
||||
emitter=DCommon.allAtOnceEmitter,
|
||||
)
|
||||
|
||||
|
||||
def exists(env):
|
||||
return env.Detect(['dmd', 'ldmd2', 'gdmd'])
|
||||
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
883
scons-local-3.0.0/SCons/Tool/docbook/__init__.py
Normal file
883
scons-local-3.0.0/SCons/Tool/docbook/__init__.py
Normal file
@@ -0,0 +1,883 @@
|
||||
|
||||
"""SCons.Tool.docbook
|
||||
|
||||
Tool-specific initialization for Docbook.
|
||||
|
||||
There normally shouldn't be any need to import this module directly.
|
||||
It will usually be imported through the generic SCons.Tool.Tool()
|
||||
selection method.
|
||||
|
||||
"""
|
||||
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
|
||||
import os
|
||||
import glob
|
||||
import re
|
||||
|
||||
import SCons.Action
|
||||
import SCons.Builder
|
||||
import SCons.Defaults
|
||||
import SCons.Script
|
||||
import SCons.Tool
|
||||
import SCons.Util
|
||||
|
||||
|
||||
__debug_tool_location = False
|
||||
# Get full path to this script
|
||||
scriptpath = os.path.dirname(os.path.realpath(__file__))
|
||||
|
||||
# Local folder for the collection of DocBook XSLs
|
||||
db_xsl_folder = 'docbook-xsl-1.76.1'
|
||||
|
||||
# Do we have libxml2/libxslt/lxml?
|
||||
has_libxml2 = True
|
||||
has_lxml = True
|
||||
try:
|
||||
import libxml2
|
||||
import libxslt
|
||||
except:
|
||||
has_libxml2 = False
|
||||
try:
|
||||
import lxml
|
||||
except:
|
||||
has_lxml = False
|
||||
|
||||
# Set this to True, to prefer xsltproc over libxml2 and lxml
|
||||
prefer_xsltproc = False
|
||||
|
||||
# Regexs for parsing Docbook XML sources of MAN pages
|
||||
re_manvolnum = re.compile("<manvolnum>([^<]*)</manvolnum>")
|
||||
re_refname = re.compile("<refname>([^<]*)</refname>")
|
||||
|
||||
#
|
||||
# Helper functions
|
||||
#
|
||||
def __extend_targets_sources(target, source):
|
||||
""" Prepare the lists of target and source files. """
|
||||
if not SCons.Util.is_List(target):
|
||||
target = [target]
|
||||
if not source:
|
||||
source = target[:]
|
||||
elif not SCons.Util.is_List(source):
|
||||
source = [source]
|
||||
if len(target) < len(source):
|
||||
target.extend(source[len(target):])
|
||||
|
||||
return target, source
|
||||
|
||||
def __init_xsl_stylesheet(kw, env, user_xsl_var, default_path):
|
||||
if kw.get('DOCBOOK_XSL','') == '':
|
||||
xsl_style = kw.get('xsl', env.subst(user_xsl_var))
|
||||
if xsl_style == '':
|
||||
path_args = [scriptpath, db_xsl_folder] + default_path
|
||||
xsl_style = os.path.join(*path_args)
|
||||
kw['DOCBOOK_XSL'] = xsl_style
|
||||
|
||||
def __select_builder(lxml_builder, libxml2_builder, cmdline_builder):
|
||||
""" Selects a builder, based on which Python modules are present. """
|
||||
if prefer_xsltproc:
|
||||
return cmdline_builder
|
||||
|
||||
if not has_libxml2:
|
||||
# At the moment we prefer libxml2 over lxml, the latter can lead
|
||||
# to conflicts when installed together with libxml2.
|
||||
if has_lxml:
|
||||
return lxml_builder
|
||||
else:
|
||||
return cmdline_builder
|
||||
|
||||
return libxml2_builder
|
||||
|
||||
def __ensure_suffix(t, suffix):
|
||||
""" Ensure that the target t has the given suffix. """
|
||||
tpath = str(t)
|
||||
if not tpath.endswith(suffix):
|
||||
return tpath+suffix
|
||||
|
||||
return t
|
||||
|
||||
def __ensure_suffix_stem(t, suffix):
|
||||
""" Ensure that the target t has the given suffix, and return the file's stem. """
|
||||
tpath = str(t)
|
||||
if not tpath.endswith(suffix):
|
||||
stem = tpath
|
||||
tpath += suffix
|
||||
|
||||
return tpath, stem
|
||||
else:
|
||||
stem, ext = os.path.splitext(tpath)
|
||||
|
||||
return t, stem
|
||||
|
||||
def __get_xml_text(root):
|
||||
""" Return the text for the given root node (xml.dom.minidom). """
|
||||
txt = ""
|
||||
for e in root.childNodes:
|
||||
if (e.nodeType == e.TEXT_NODE):
|
||||
txt += e.data
|
||||
return txt
|
||||
|
||||
def __create_output_dir(base_dir):
|
||||
""" Ensure that the output directory base_dir exists. """
|
||||
root, tail = os.path.split(base_dir)
|
||||
dir = None
|
||||
if tail:
|
||||
if base_dir.endswith('/'):
|
||||
dir = base_dir
|
||||
else:
|
||||
dir = root
|
||||
else:
|
||||
if base_dir.endswith('/'):
|
||||
dir = base_dir
|
||||
|
||||
if dir and not os.path.isdir(dir):
|
||||
os.makedirs(dir)
|
||||
|
||||
|
||||
#
|
||||
# Supported command line tools and their call "signature"
|
||||
#
|
||||
xsltproc_com_priority = ['xsltproc', 'saxon', 'saxon-xslt', 'xalan']
|
||||
|
||||
# TODO: Set minimum version of saxon-xslt to be 8.x (lower than this only supports xslt 1.0.
|
||||
# see: http://saxon.sourceforge.net/saxon6.5.5/
|
||||
# see: http://saxon.sourceforge.net/
|
||||
xsltproc_com = {'xsltproc' : '$DOCBOOK_XSLTPROC $DOCBOOK_XSLTPROCFLAGS -o $TARGET $DOCBOOK_XSL $SOURCE',
|
||||
'saxon' : '$DOCBOOK_XSLTPROC $DOCBOOK_XSLTPROCFLAGS -o $TARGET $DOCBOOK_XSL $SOURCE $DOCBOOK_XSLTPROCPARAMS',
|
||||
'saxon-xslt' : '$DOCBOOK_XSLTPROC $DOCBOOK_XSLTPROCFLAGS -o $TARGET $DOCBOOK_XSL $SOURCE $DOCBOOK_XSLTPROCPARAMS',
|
||||
'xalan' : '$DOCBOOK_XSLTPROC $DOCBOOK_XSLTPROCFLAGS -q -out $TARGET -xsl $DOCBOOK_XSL -in $SOURCE'}
|
||||
xmllint_com = {'xmllint' : '$DOCBOOK_XMLLINT $DOCBOOK_XMLLINTFLAGS --xinclude $SOURCE > $TARGET'}
|
||||
fop_com = {'fop' : '$DOCBOOK_FOP $DOCBOOK_FOPFLAGS -fo $SOURCE -pdf $TARGET',
|
||||
'xep' : '$DOCBOOK_FOP $DOCBOOK_FOPFLAGS -valid -fo $SOURCE -pdf $TARGET',
|
||||
'jw' : '$DOCBOOK_FOP $DOCBOOK_FOPFLAGS -f docbook -b pdf $SOURCE -o $TARGET'}
|
||||
|
||||
def __detect_cl_tool(env, chainkey, cdict, cpriority=None):
|
||||
"""
|
||||
Helper function, picks a command line tool from the list
|
||||
and initializes its environment variables.
|
||||
"""
|
||||
if env.get(chainkey,'') == '':
|
||||
clpath = ''
|
||||
|
||||
if cpriority is None:
|
||||
cpriority = cdict.keys()
|
||||
for cltool in cpriority:
|
||||
if __debug_tool_location:
|
||||
print("DocBook: Looking for %s"%cltool)
|
||||
clpath = env.WhereIs(cltool)
|
||||
if clpath:
|
||||
if __debug_tool_location:
|
||||
print("DocBook: Found:%s"%cltool)
|
||||
env[chainkey] = clpath
|
||||
if not env[chainkey + 'COM']:
|
||||
env[chainkey + 'COM'] = cdict[cltool]
|
||||
break
|
||||
|
||||
def _detect(env):
|
||||
"""
|
||||
Detect all the command line tools that we might need for creating
|
||||
the requested output formats.
|
||||
"""
|
||||
global prefer_xsltproc
|
||||
|
||||
if env.get('DOCBOOK_PREFER_XSLTPROC',''):
|
||||
prefer_xsltproc = True
|
||||
|
||||
if ((not has_libxml2 and not has_lxml) or (prefer_xsltproc)):
|
||||
# Try to find the XSLT processors
|
||||
__detect_cl_tool(env, 'DOCBOOK_XSLTPROC', xsltproc_com, xsltproc_com_priority)
|
||||
__detect_cl_tool(env, 'DOCBOOK_XMLLINT', xmllint_com)
|
||||
|
||||
__detect_cl_tool(env, 'DOCBOOK_FOP', fop_com, ['fop','xep','jw'])
|
||||
|
||||
#
|
||||
# Scanners
|
||||
#
|
||||
include_re = re.compile('fileref\\s*=\\s*["|\']([^\\n]*)["|\']')
|
||||
sentity_re = re.compile('<!ENTITY\\s+%*\\s*[^\\s]+\\s+SYSTEM\\s+["|\']([^\\n]*)["|\']>')
|
||||
|
||||
def __xml_scan(node, env, path, arg):
|
||||
""" Simple XML file scanner, detecting local images and XIncludes as implicit dependencies. """
|
||||
# Does the node exist yet?
|
||||
if not os.path.isfile(str(node)):
|
||||
return []
|
||||
|
||||
if env.get('DOCBOOK_SCANENT',''):
|
||||
# Use simple pattern matching for system entities..., no support
|
||||
# for recursion yet.
|
||||
contents = node.get_text_contents()
|
||||
return sentity_re.findall(contents)
|
||||
|
||||
xsl_file = os.path.join(scriptpath,'utils','xmldepend.xsl')
|
||||
if not has_libxml2 or prefer_xsltproc:
|
||||
if has_lxml and not prefer_xsltproc:
|
||||
|
||||
from lxml import etree
|
||||
|
||||
xsl_tree = etree.parse(xsl_file)
|
||||
doc = etree.parse(str(node))
|
||||
result = doc.xslt(xsl_tree)
|
||||
|
||||
depfiles = [x.strip() for x in str(result).splitlines() if x.strip() != "" and not x.startswith("<?xml ")]
|
||||
return depfiles
|
||||
else:
|
||||
# Try to call xsltproc
|
||||
xsltproc = env.subst("$DOCBOOK_XSLTPROC")
|
||||
if xsltproc and xsltproc.endswith('xsltproc'):
|
||||
result = env.backtick(' '.join([xsltproc, xsl_file, str(node)]))
|
||||
depfiles = [x.strip() for x in str(result).splitlines() if x.strip() != "" and not x.startswith("<?xml ")]
|
||||
return depfiles
|
||||
else:
|
||||
# Use simple pattern matching, there is currently no support
|
||||
# for xi:includes...
|
||||
contents = node.get_text_contents()
|
||||
return include_re.findall(contents)
|
||||
|
||||
styledoc = libxml2.parseFile(xsl_file)
|
||||
style = libxslt.parseStylesheetDoc(styledoc)
|
||||
doc = libxml2.readFile(str(node), None, libxml2.XML_PARSE_NOENT)
|
||||
result = style.applyStylesheet(doc, None)
|
||||
|
||||
depfiles = []
|
||||
for x in str(result).splitlines():
|
||||
if x.strip() != "" and not x.startswith("<?xml "):
|
||||
depfiles.extend(x.strip().split())
|
||||
|
||||
style.freeStylesheet()
|
||||
doc.freeDoc()
|
||||
result.freeDoc()
|
||||
|
||||
return depfiles
|
||||
|
||||
# Creating the instance of our XML dependency scanner
|
||||
docbook_xml_scanner = SCons.Script.Scanner(function = __xml_scan,
|
||||
argument = None)
|
||||
|
||||
|
||||
#
|
||||
# Action generators
|
||||
#
|
||||
def __generate_xsltproc_action(source, target, env, for_signature):
|
||||
cmd = env['DOCBOOK_XSLTPROCCOM']
|
||||
# Does the environment have a base_dir defined?
|
||||
base_dir = env.subst('$base_dir')
|
||||
if base_dir:
|
||||
# Yes, so replace target path by its filename
|
||||
return cmd.replace('$TARGET','${TARGET.file}')
|
||||
return cmd
|
||||
|
||||
|
||||
#
|
||||
# Emitters
|
||||
#
|
||||
def __emit_xsl_basedir(target, source, env):
|
||||
# Does the environment have a base_dir defined?
|
||||
base_dir = env.subst('$base_dir')
|
||||
if base_dir:
|
||||
# Yes, so prepend it to each target
|
||||
return [os.path.join(base_dir, str(t)) for t in target], source
|
||||
|
||||
# No, so simply pass target and source names through
|
||||
return target, source
|
||||
|
||||
|
||||
#
|
||||
# Builders
|
||||
#
|
||||
def __build_libxml2(target, source, env):
|
||||
"""
|
||||
General XSLT builder (HTML/FO), using the libxml2 module.
|
||||
"""
|
||||
xsl_style = env.subst('$DOCBOOK_XSL')
|
||||
styledoc = libxml2.parseFile(xsl_style)
|
||||
style = libxslt.parseStylesheetDoc(styledoc)
|
||||
doc = libxml2.readFile(str(source[0]),None,libxml2.XML_PARSE_NOENT)
|
||||
# Support for additional parameters
|
||||
parampass = {}
|
||||
if parampass:
|
||||
result = style.applyStylesheet(doc, parampass)
|
||||
else:
|
||||
result = style.applyStylesheet(doc, None)
|
||||
style.saveResultToFilename(str(target[0]), result, 0)
|
||||
style.freeStylesheet()
|
||||
doc.freeDoc()
|
||||
result.freeDoc()
|
||||
|
||||
return None
|
||||
|
||||
def __build_lxml(target, source, env):
|
||||
"""
|
||||
General XSLT builder (HTML/FO), using the lxml module.
|
||||
"""
|
||||
from lxml import etree
|
||||
|
||||
xslt_ac = etree.XSLTAccessControl(read_file=True,
|
||||
write_file=True,
|
||||
create_dir=True,
|
||||
read_network=False,
|
||||
write_network=False)
|
||||
xsl_style = env.subst('$DOCBOOK_XSL')
|
||||
xsl_tree = etree.parse(xsl_style)
|
||||
transform = etree.XSLT(xsl_tree, access_control=xslt_ac)
|
||||
doc = etree.parse(str(source[0]))
|
||||
# Support for additional parameters
|
||||
parampass = {}
|
||||
if parampass:
|
||||
result = transform(doc, **parampass)
|
||||
else:
|
||||
result = transform(doc)
|
||||
|
||||
try:
|
||||
of = open(str(target[0]), "wb")
|
||||
of.write(of.write(etree.tostring(result, pretty_print=True)))
|
||||
of.close()
|
||||
except:
|
||||
pass
|
||||
|
||||
return None
|
||||
|
||||
def __xinclude_libxml2(target, source, env):
|
||||
"""
|
||||
Resolving XIncludes, using the libxml2 module.
|
||||
"""
|
||||
doc = libxml2.readFile(str(source[0]), None, libxml2.XML_PARSE_NOENT)
|
||||
doc.xincludeProcessFlags(libxml2.XML_PARSE_NOENT)
|
||||
doc.saveFile(str(target[0]))
|
||||
doc.freeDoc()
|
||||
|
||||
return None
|
||||
|
||||
def __xinclude_lxml(target, source, env):
|
||||
"""
|
||||
Resolving XIncludes, using the lxml module.
|
||||
"""
|
||||
from lxml import etree
|
||||
|
||||
doc = etree.parse(str(source[0]))
|
||||
doc.xinclude()
|
||||
try:
|
||||
doc.write(str(target[0]), xml_declaration=True,
|
||||
encoding="UTF-8", pretty_print=True)
|
||||
except:
|
||||
pass
|
||||
|
||||
return None
|
||||
|
||||
__libxml2_builder = SCons.Builder.Builder(
|
||||
action = __build_libxml2,
|
||||
src_suffix = '.xml',
|
||||
source_scanner = docbook_xml_scanner,
|
||||
emitter = __emit_xsl_basedir)
|
||||
__lxml_builder = SCons.Builder.Builder(
|
||||
action = __build_lxml,
|
||||
src_suffix = '.xml',
|
||||
source_scanner = docbook_xml_scanner,
|
||||
emitter = __emit_xsl_basedir)
|
||||
|
||||
__xinclude_libxml2_builder = SCons.Builder.Builder(
|
||||
action = __xinclude_libxml2,
|
||||
suffix = '.xml',
|
||||
src_suffix = '.xml',
|
||||
source_scanner = docbook_xml_scanner)
|
||||
__xinclude_lxml_builder = SCons.Builder.Builder(
|
||||
action = __xinclude_lxml,
|
||||
suffix = '.xml',
|
||||
src_suffix = '.xml',
|
||||
source_scanner = docbook_xml_scanner)
|
||||
|
||||
__xsltproc_builder = SCons.Builder.Builder(
|
||||
action = SCons.Action.CommandGeneratorAction(__generate_xsltproc_action,
|
||||
{'cmdstr' : '$DOCBOOK_XSLTPROCCOMSTR'}),
|
||||
src_suffix = '.xml',
|
||||
source_scanner = docbook_xml_scanner,
|
||||
emitter = __emit_xsl_basedir)
|
||||
__xmllint_builder = SCons.Builder.Builder(
|
||||
action = SCons.Action.Action('$DOCBOOK_XMLLINTCOM','$DOCBOOK_XMLLINTCOMSTR'),
|
||||
suffix = '.xml',
|
||||
src_suffix = '.xml',
|
||||
source_scanner = docbook_xml_scanner)
|
||||
__fop_builder = SCons.Builder.Builder(
|
||||
action = SCons.Action.Action('$DOCBOOK_FOPCOM','$DOCBOOK_FOPCOMSTR'),
|
||||
suffix = '.pdf',
|
||||
src_suffix = '.fo',
|
||||
ensure_suffix=1)
|
||||
|
||||
def DocbookEpub(env, target, source=None, *args, **kw):
|
||||
"""
|
||||
A pseudo-Builder, providing a Docbook toolchain for ePub output.
|
||||
"""
|
||||
import zipfile
|
||||
import shutil
|
||||
|
||||
def build_open_container(target, source, env):
|
||||
"""Generate the *.epub file from intermediate outputs
|
||||
|
||||
Constructs the epub file according to the Open Container Format. This
|
||||
function could be replaced by a call to the SCons Zip builder if support
|
||||
was added for different compression formats for separate source nodes.
|
||||
"""
|
||||
zf = zipfile.ZipFile(str(target[0]), 'w')
|
||||
mime_file = open('mimetype', 'w')
|
||||
mime_file.write('application/epub+zip')
|
||||
mime_file.close()
|
||||
zf.write(mime_file.name, compress_type = zipfile.ZIP_STORED)
|
||||
for s in source:
|
||||
if os.path.isfile(str(s)):
|
||||
head, tail = os.path.split(str(s))
|
||||
if not head:
|
||||
continue
|
||||
s = head
|
||||
for dirpath, dirnames, filenames in os.walk(str(s)):
|
||||
for fname in filenames:
|
||||
path = os.path.join(dirpath, fname)
|
||||
if os.path.isfile(path):
|
||||
zf.write(path, os.path.relpath(path, str(env.get('ZIPROOT', ''))),
|
||||
zipfile.ZIP_DEFLATED)
|
||||
zf.close()
|
||||
|
||||
def add_resources(target, source, env):
|
||||
"""Add missing resources to the OEBPS directory
|
||||
|
||||
Ensure all the resources in the manifest are present in the OEBPS directory.
|
||||
"""
|
||||
hrefs = []
|
||||
content_file = os.path.join(source[0].get_abspath(), 'content.opf')
|
||||
if not os.path.isfile(content_file):
|
||||
return
|
||||
|
||||
hrefs = []
|
||||
if has_libxml2:
|
||||
nsmap = {'opf' : 'http://www.idpf.org/2007/opf'}
|
||||
# Read file and resolve entities
|
||||
doc = libxml2.readFile(content_file, None, 0)
|
||||
opf = doc.getRootElement()
|
||||
# Create xpath context
|
||||
xpath_context = doc.xpathNewContext()
|
||||
# Register namespaces
|
||||
for key, val in nsmap.items():
|
||||
xpath_context.xpathRegisterNs(key, val)
|
||||
|
||||
if hasattr(opf, 'xpathEval') and xpath_context:
|
||||
# Use the xpath context
|
||||
xpath_context.setContextNode(opf)
|
||||
items = xpath_context.xpathEval(".//opf:item")
|
||||
else:
|
||||
items = opf.findall(".//{'http://www.idpf.org/2007/opf'}item")
|
||||
|
||||
for item in items:
|
||||
if hasattr(item, 'prop'):
|
||||
hrefs.append(item.prop('href'))
|
||||
else:
|
||||
hrefs.append(item.attrib['href'])
|
||||
|
||||
doc.freeDoc()
|
||||
xpath_context.xpathFreeContext()
|
||||
elif has_lxml:
|
||||
from lxml import etree
|
||||
|
||||
opf = etree.parse(content_file)
|
||||
# All the opf:item elements are resources
|
||||
for item in opf.xpath('//opf:item',
|
||||
namespaces= { 'opf': 'http://www.idpf.org/2007/opf' }):
|
||||
hrefs.append(item.attrib['href'])
|
||||
|
||||
for href in hrefs:
|
||||
# If the resource was not already created by DocBook XSL itself,
|
||||
# copy it into the OEBPS folder
|
||||
referenced_file = os.path.join(source[0].get_abspath(), href)
|
||||
if not os.path.exists(referenced_file):
|
||||
shutil.copy(href, os.path.join(source[0].get_abspath(), href))
|
||||
|
||||
# Init list of targets/sources
|
||||
target, source = __extend_targets_sources(target, source)
|
||||
|
||||
# Init XSL stylesheet
|
||||
__init_xsl_stylesheet(kw, env, '$DOCBOOK_DEFAULT_XSL_EPUB', ['epub','docbook.xsl'])
|
||||
|
||||
# Setup builder
|
||||
__builder = __select_builder(__lxml_builder, __libxml2_builder, __xsltproc_builder)
|
||||
|
||||
# Create targets
|
||||
result = []
|
||||
if not env.GetOption('clean'):
|
||||
# Ensure that the folders OEBPS and META-INF exist
|
||||
__create_output_dir('OEBPS/')
|
||||
__create_output_dir('META-INF/')
|
||||
dirs = env.Dir(['OEBPS', 'META-INF'])
|
||||
|
||||
# Set the fixed base_dir
|
||||
kw['base_dir'] = 'OEBPS/'
|
||||
tocncx = __builder.__call__(env, 'toc.ncx', source[0], **kw)
|
||||
cxml = env.File('META-INF/container.xml')
|
||||
env.SideEffect(cxml, tocncx)
|
||||
|
||||
env.Depends(tocncx, kw['DOCBOOK_XSL'])
|
||||
result.extend(tocncx+[cxml])
|
||||
|
||||
container = env.Command(__ensure_suffix(str(target[0]), '.epub'),
|
||||
tocncx+[cxml], [add_resources, build_open_container])
|
||||
mimetype = env.File('mimetype')
|
||||
env.SideEffect(mimetype, container)
|
||||
|
||||
result.extend(container)
|
||||
# Add supporting files for cleanup
|
||||
env.Clean(tocncx, dirs)
|
||||
|
||||
return result
|
||||
|
||||
def DocbookHtml(env, target, source=None, *args, **kw):
|
||||
"""
|
||||
A pseudo-Builder, providing a Docbook toolchain for HTML output.
|
||||
"""
|
||||
# Init list of targets/sources
|
||||
target, source = __extend_targets_sources(target, source)
|
||||
|
||||
# Init XSL stylesheet
|
||||
__init_xsl_stylesheet(kw, env, '$DOCBOOK_DEFAULT_XSL_HTML', ['html','docbook.xsl'])
|
||||
|
||||
# Setup builder
|
||||
__builder = __select_builder(__lxml_builder, __libxml2_builder, __xsltproc_builder)
|
||||
|
||||
# Create targets
|
||||
result = []
|
||||
for t,s in zip(target,source):
|
||||
r = __builder.__call__(env, __ensure_suffix(t,'.html'), s, **kw)
|
||||
env.Depends(r, kw['DOCBOOK_XSL'])
|
||||
result.extend(r)
|
||||
|
||||
return result
|
||||
|
||||
def DocbookHtmlChunked(env, target, source=None, *args, **kw):
|
||||
"""
|
||||
A pseudo-Builder, providing a Docbook toolchain for chunked HTML output.
|
||||
"""
|
||||
# Init target/source
|
||||
if not SCons.Util.is_List(target):
|
||||
target = [target]
|
||||
if not source:
|
||||
source = target
|
||||
target = ['index.html']
|
||||
elif not SCons.Util.is_List(source):
|
||||
source = [source]
|
||||
|
||||
# Init XSL stylesheet
|
||||
__init_xsl_stylesheet(kw, env, '$DOCBOOK_DEFAULT_XSL_HTMLCHUNKED', ['html','chunkfast.xsl'])
|
||||
|
||||
# Setup builder
|
||||
__builder = __select_builder(__lxml_builder, __libxml2_builder, __xsltproc_builder)
|
||||
|
||||
# Detect base dir
|
||||
base_dir = kw.get('base_dir', '')
|
||||
if base_dir:
|
||||
__create_output_dir(base_dir)
|
||||
|
||||
# Create targets
|
||||
result = []
|
||||
r = __builder.__call__(env, __ensure_suffix(str(target[0]), '.html'), source[0], **kw)
|
||||
env.Depends(r, kw['DOCBOOK_XSL'])
|
||||
result.extend(r)
|
||||
# Add supporting files for cleanup
|
||||
env.Clean(r, glob.glob(os.path.join(base_dir, '*.html')))
|
||||
|
||||
return result
|
||||
|
||||
|
||||
def DocbookHtmlhelp(env, target, source=None, *args, **kw):
|
||||
"""
|
||||
A pseudo-Builder, providing a Docbook toolchain for HTMLHELP output.
|
||||
"""
|
||||
# Init target/source
|
||||
if not SCons.Util.is_List(target):
|
||||
target = [target]
|
||||
if not source:
|
||||
source = target
|
||||
target = ['index.html']
|
||||
elif not SCons.Util.is_List(source):
|
||||
source = [source]
|
||||
|
||||
# Init XSL stylesheet
|
||||
__init_xsl_stylesheet(kw, env, '$DOCBOOK_DEFAULT_XSL_HTMLHELP', ['htmlhelp','htmlhelp.xsl'])
|
||||
|
||||
# Setup builder
|
||||
__builder = __select_builder(__lxml_builder, __libxml2_builder, __xsltproc_builder)
|
||||
|
||||
# Detect base dir
|
||||
base_dir = kw.get('base_dir', '')
|
||||
if base_dir:
|
||||
__create_output_dir(base_dir)
|
||||
|
||||
# Create targets
|
||||
result = []
|
||||
r = __builder.__call__(env, __ensure_suffix(str(target[0]), '.html'), source[0], **kw)
|
||||
env.Depends(r, kw['DOCBOOK_XSL'])
|
||||
result.extend(r)
|
||||
# Add supporting files for cleanup
|
||||
env.Clean(r, ['toc.hhc', 'htmlhelp.hhp', 'index.hhk'] +
|
||||
glob.glob(os.path.join(base_dir, '[ar|bk|ch]*.html')))
|
||||
|
||||
return result
|
||||
|
||||
def DocbookPdf(env, target, source=None, *args, **kw):
|
||||
"""
|
||||
A pseudo-Builder, providing a Docbook toolchain for PDF output.
|
||||
"""
|
||||
# Init list of targets/sources
|
||||
target, source = __extend_targets_sources(target, source)
|
||||
|
||||
# Init XSL stylesheet
|
||||
__init_xsl_stylesheet(kw, env, '$DOCBOOK_DEFAULT_XSL_PDF', ['fo','docbook.xsl'])
|
||||
|
||||
# Setup builder
|
||||
__builder = __select_builder(__lxml_builder, __libxml2_builder, __xsltproc_builder)
|
||||
|
||||
# Create targets
|
||||
result = []
|
||||
for t,s in zip(target,source):
|
||||
t, stem = __ensure_suffix_stem(t, '.pdf')
|
||||
xsl = __builder.__call__(env, stem+'.fo', s, **kw)
|
||||
result.extend(xsl)
|
||||
env.Depends(xsl, kw['DOCBOOK_XSL'])
|
||||
result.extend(__fop_builder.__call__(env, t, xsl, **kw))
|
||||
|
||||
return result
|
||||
|
||||
def DocbookMan(env, target, source=None, *args, **kw):
|
||||
"""
|
||||
A pseudo-Builder, providing a Docbook toolchain for Man page output.
|
||||
"""
|
||||
# Init list of targets/sources
|
||||
target, source = __extend_targets_sources(target, source)
|
||||
|
||||
# Init XSL stylesheet
|
||||
__init_xsl_stylesheet(kw, env, '$DOCBOOK_DEFAULT_XSL_MAN', ['manpages','docbook.xsl'])
|
||||
|
||||
# Setup builder
|
||||
__builder = __select_builder(__lxml_builder, __libxml2_builder, __xsltproc_builder)
|
||||
|
||||
# Create targets
|
||||
result = []
|
||||
for t,s in zip(target,source):
|
||||
volnum = "1"
|
||||
outfiles = []
|
||||
srcfile = __ensure_suffix(str(s),'.xml')
|
||||
if os.path.isfile(srcfile):
|
||||
try:
|
||||
import xml.dom.minidom
|
||||
|
||||
dom = xml.dom.minidom.parse(__ensure_suffix(str(s),'.xml'))
|
||||
# Extract volume number, default is 1
|
||||
for node in dom.getElementsByTagName('refmeta'):
|
||||
for vol in node.getElementsByTagName('manvolnum'):
|
||||
volnum = __get_xml_text(vol)
|
||||
|
||||
# Extract output filenames
|
||||
for node in dom.getElementsByTagName('refnamediv'):
|
||||
for ref in node.getElementsByTagName('refname'):
|
||||
outfiles.append(__get_xml_text(ref)+'.'+volnum)
|
||||
|
||||
except:
|
||||
# Use simple regex parsing
|
||||
f = open(__ensure_suffix(str(s),'.xml'), 'r')
|
||||
content = f.read()
|
||||
f.close()
|
||||
|
||||
for m in re_manvolnum.finditer(content):
|
||||
volnum = m.group(1)
|
||||
|
||||
for m in re_refname.finditer(content):
|
||||
outfiles.append(m.group(1)+'.'+volnum)
|
||||
|
||||
if not outfiles:
|
||||
# Use stem of the source file
|
||||
spath = str(s)
|
||||
if not spath.endswith('.xml'):
|
||||
outfiles.append(spath+'.'+volnum)
|
||||
else:
|
||||
stem, ext = os.path.splitext(spath)
|
||||
outfiles.append(stem+'.'+volnum)
|
||||
else:
|
||||
# We have to completely rely on the given target name
|
||||
outfiles.append(t)
|
||||
|
||||
__builder.__call__(env, outfiles[0], s, **kw)
|
||||
env.Depends(outfiles[0], kw['DOCBOOK_XSL'])
|
||||
result.append(outfiles[0])
|
||||
if len(outfiles) > 1:
|
||||
env.Clean(outfiles[0], outfiles[1:])
|
||||
|
||||
|
||||
return result
|
||||
|
||||
def DocbookSlidesPdf(env, target, source=None, *args, **kw):
|
||||
"""
|
||||
A pseudo-Builder, providing a Docbook toolchain for PDF slides output.
|
||||
"""
|
||||
# Init list of targets/sources
|
||||
target, source = __extend_targets_sources(target, source)
|
||||
|
||||
# Init XSL stylesheet
|
||||
__init_xsl_stylesheet(kw, env, '$DOCBOOK_DEFAULT_XSL_SLIDESPDF', ['slides','fo','plain.xsl'])
|
||||
|
||||
# Setup builder
|
||||
__builder = __select_builder(__lxml_builder, __libxml2_builder, __xsltproc_builder)
|
||||
|
||||
# Create targets
|
||||
result = []
|
||||
for t,s in zip(target,source):
|
||||
t, stem = __ensure_suffix_stem(t, '.pdf')
|
||||
xsl = __builder.__call__(env, stem+'.fo', s, **kw)
|
||||
env.Depends(xsl, kw['DOCBOOK_XSL'])
|
||||
result.extend(xsl)
|
||||
result.extend(__fop_builder.__call__(env, t, xsl, **kw))
|
||||
|
||||
return result
|
||||
|
||||
def DocbookSlidesHtml(env, target, source=None, *args, **kw):
|
||||
"""
|
||||
A pseudo-Builder, providing a Docbook toolchain for HTML slides output.
|
||||
"""
|
||||
# Init list of targets/sources
|
||||
if not SCons.Util.is_List(target):
|
||||
target = [target]
|
||||
if not source:
|
||||
source = target
|
||||
target = ['index.html']
|
||||
elif not SCons.Util.is_List(source):
|
||||
source = [source]
|
||||
|
||||
# Init XSL stylesheet
|
||||
__init_xsl_stylesheet(kw, env, '$DOCBOOK_DEFAULT_XSL_SLIDESHTML', ['slides','html','plain.xsl'])
|
||||
|
||||
# Setup builder
|
||||
__builder = __select_builder(__lxml_builder, __libxml2_builder, __xsltproc_builder)
|
||||
|
||||
# Detect base dir
|
||||
base_dir = kw.get('base_dir', '')
|
||||
if base_dir:
|
||||
__create_output_dir(base_dir)
|
||||
|
||||
# Create targets
|
||||
result = []
|
||||
r = __builder.__call__(env, __ensure_suffix(str(target[0]), '.html'), source[0], **kw)
|
||||
env.Depends(r, kw['DOCBOOK_XSL'])
|
||||
result.extend(r)
|
||||
# Add supporting files for cleanup
|
||||
env.Clean(r, [os.path.join(base_dir, 'toc.html')] +
|
||||
glob.glob(os.path.join(base_dir, 'foil*.html')))
|
||||
|
||||
return result
|
||||
|
||||
def DocbookXInclude(env, target, source, *args, **kw):
|
||||
"""
|
||||
A pseudo-Builder, for resolving XIncludes in a separate processing step.
|
||||
"""
|
||||
# Init list of targets/sources
|
||||
target, source = __extend_targets_sources(target, source)
|
||||
|
||||
# Setup builder
|
||||
__builder = __select_builder(__xinclude_lxml_builder,__xinclude_libxml2_builder,__xmllint_builder)
|
||||
|
||||
# Create targets
|
||||
result = []
|
||||
for t,s in zip(target,source):
|
||||
result.extend(__builder.__call__(env, t, s, **kw))
|
||||
|
||||
return result
|
||||
|
||||
def DocbookXslt(env, target, source=None, *args, **kw):
|
||||
"""
|
||||
A pseudo-Builder, applying a simple XSL transformation to the input file.
|
||||
"""
|
||||
# Init list of targets/sources
|
||||
target, source = __extend_targets_sources(target, source)
|
||||
|
||||
# Init XSL stylesheet
|
||||
kw['DOCBOOK_XSL'] = kw.get('xsl', 'transform.xsl')
|
||||
|
||||
# Setup builder
|
||||
__builder = __select_builder(__lxml_builder, __libxml2_builder, __xsltproc_builder)
|
||||
|
||||
# Create targets
|
||||
result = []
|
||||
for t,s in zip(target,source):
|
||||
r = __builder.__call__(env, t, s, **kw)
|
||||
env.Depends(r, kw['DOCBOOK_XSL'])
|
||||
result.extend(r)
|
||||
|
||||
return result
|
||||
|
||||
|
||||
def generate(env):
|
||||
"""Add Builders and construction variables for docbook to an Environment."""
|
||||
|
||||
env.SetDefault(
|
||||
# Default names for customized XSL stylesheets
|
||||
DOCBOOK_DEFAULT_XSL_EPUB = '',
|
||||
DOCBOOK_DEFAULT_XSL_HTML = '',
|
||||
DOCBOOK_DEFAULT_XSL_HTMLCHUNKED = '',
|
||||
DOCBOOK_DEFAULT_XSL_HTMLHELP = '',
|
||||
DOCBOOK_DEFAULT_XSL_PDF = '',
|
||||
DOCBOOK_DEFAULT_XSL_MAN = '',
|
||||
DOCBOOK_DEFAULT_XSL_SLIDESPDF = '',
|
||||
DOCBOOK_DEFAULT_XSL_SLIDESHTML = '',
|
||||
|
||||
# Paths to the detected executables
|
||||
DOCBOOK_XSLTPROC = '',
|
||||
DOCBOOK_XMLLINT = '',
|
||||
DOCBOOK_FOP = '',
|
||||
|
||||
# Additional flags for the text processors
|
||||
DOCBOOK_XSLTPROCFLAGS = SCons.Util.CLVar(''),
|
||||
DOCBOOK_XMLLINTFLAGS = SCons.Util.CLVar(''),
|
||||
DOCBOOK_FOPFLAGS = SCons.Util.CLVar(''),
|
||||
DOCBOOK_XSLTPROCPARAMS = SCons.Util.CLVar(''),
|
||||
|
||||
# Default command lines for the detected executables
|
||||
DOCBOOK_XSLTPROCCOM = xsltproc_com['xsltproc'],
|
||||
DOCBOOK_XMLLINTCOM = xmllint_com['xmllint'],
|
||||
DOCBOOK_FOPCOM = fop_com['fop'],
|
||||
|
||||
# Screen output for the text processors
|
||||
DOCBOOK_XSLTPROCCOMSTR = None,
|
||||
DOCBOOK_XMLLINTCOMSTR = None,
|
||||
DOCBOOK_FOPCOMSTR = None,
|
||||
|
||||
)
|
||||
_detect(env)
|
||||
|
||||
env.AddMethod(DocbookEpub, "DocbookEpub")
|
||||
env.AddMethod(DocbookHtml, "DocbookHtml")
|
||||
env.AddMethod(DocbookHtmlChunked, "DocbookHtmlChunked")
|
||||
env.AddMethod(DocbookHtmlhelp, "DocbookHtmlhelp")
|
||||
env.AddMethod(DocbookPdf, "DocbookPdf")
|
||||
env.AddMethod(DocbookMan, "DocbookMan")
|
||||
env.AddMethod(DocbookSlidesPdf, "DocbookSlidesPdf")
|
||||
env.AddMethod(DocbookSlidesHtml, "DocbookSlidesHtml")
|
||||
env.AddMethod(DocbookXInclude, "DocbookXInclude")
|
||||
env.AddMethod(DocbookXslt, "DocbookXslt")
|
||||
|
||||
|
||||
def exists(env):
|
||||
return 1
|
||||
64
scons-local-3.0.0/SCons/Tool/dvi.py
Normal file
64
scons-local-3.0.0/SCons/Tool/dvi.py
Normal file
@@ -0,0 +1,64 @@
|
||||
"""SCons.Tool.dvi
|
||||
|
||||
Common DVI Builder definition for various other Tool modules that use it.
|
||||
|
||||
"""
|
||||
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/dvi.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
import SCons.Builder
|
||||
import SCons.Tool
|
||||
|
||||
DVIBuilder = None
|
||||
|
||||
def generate(env):
|
||||
try:
|
||||
env['BUILDERS']['DVI']
|
||||
except KeyError:
|
||||
global DVIBuilder
|
||||
|
||||
if DVIBuilder is None:
|
||||
# The suffix is hard-coded to '.dvi', not configurable via a
|
||||
# construction variable like $DVISUFFIX, because the output
|
||||
# file name is hard-coded within TeX.
|
||||
DVIBuilder = SCons.Builder.Builder(action = {},
|
||||
source_scanner = SCons.Tool.LaTeXScanner,
|
||||
suffix = '.dvi',
|
||||
emitter = {},
|
||||
source_ext_match = None)
|
||||
|
||||
env['BUILDERS']['DVI'] = DVIBuilder
|
||||
|
||||
def exists(env):
|
||||
# This only puts a skeleton Builder in place, so if someone
|
||||
# references this Tool directly, it's always "available."
|
||||
return 1
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
125
scons-local-3.0.0/SCons/Tool/dvipdf.py
Normal file
125
scons-local-3.0.0/SCons/Tool/dvipdf.py
Normal file
@@ -0,0 +1,125 @@
|
||||
"""SCons.Tool.dvipdf
|
||||
|
||||
Tool-specific initialization for dvipdf.
|
||||
|
||||
There normally shouldn't be any need to import this module directly.
|
||||
It will usually be imported through the generic SCons.Tool.Tool()
|
||||
selection method.
|
||||
|
||||
"""
|
||||
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/dvipdf.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
import SCons.Action
|
||||
import SCons.Defaults
|
||||
import SCons.Tool.pdf
|
||||
import SCons.Tool.tex
|
||||
import SCons.Util
|
||||
|
||||
_null = SCons.Scanner.LaTeX._null
|
||||
|
||||
def DviPdfPsFunction(XXXDviAction, target = None, source= None, env=None):
|
||||
"""A builder for DVI files that sets the TEXPICTS environment
|
||||
variable before running dvi2ps or dvipdf."""
|
||||
|
||||
try:
|
||||
abspath = source[0].attributes.path
|
||||
except AttributeError :
|
||||
abspath = ''
|
||||
|
||||
saved_env = SCons.Scanner.LaTeX.modify_env_var(env, 'TEXPICTS', abspath)
|
||||
|
||||
result = XXXDviAction(target, source, env)
|
||||
|
||||
if saved_env is _null:
|
||||
try:
|
||||
del env['ENV']['TEXPICTS']
|
||||
except KeyError:
|
||||
pass # was never set
|
||||
else:
|
||||
env['ENV']['TEXPICTS'] = saved_env
|
||||
|
||||
return result
|
||||
|
||||
def DviPdfFunction(target = None, source= None, env=None):
|
||||
result = DviPdfPsFunction(PDFAction,target,source,env)
|
||||
return result
|
||||
|
||||
def DviPdfStrFunction(target = None, source= None, env=None):
|
||||
"""A strfunction for dvipdf that returns the appropriate
|
||||
command string for the no_exec options."""
|
||||
if env.GetOption("no_exec"):
|
||||
result = env.subst('$DVIPDFCOM',0,target,source)
|
||||
else:
|
||||
result = ''
|
||||
return result
|
||||
|
||||
PDFAction = None
|
||||
DVIPDFAction = None
|
||||
|
||||
def PDFEmitter(target, source, env):
|
||||
"""Strips any .aux or .log files from the input source list.
|
||||
These are created by the TeX Builder that in all likelihood was
|
||||
used to generate the .dvi file we're using as input, and we only
|
||||
care about the .dvi file.
|
||||
"""
|
||||
def strip_suffixes(n):
|
||||
return not SCons.Util.splitext(str(n))[1] in ['.aux', '.log']
|
||||
source = [src for src in source if strip_suffixes(src)]
|
||||
return (target, source)
|
||||
|
||||
def generate(env):
|
||||
"""Add Builders and construction variables for dvipdf to an Environment."""
|
||||
global PDFAction
|
||||
if PDFAction is None:
|
||||
PDFAction = SCons.Action.Action('$DVIPDFCOM', '$DVIPDFCOMSTR')
|
||||
|
||||
global DVIPDFAction
|
||||
if DVIPDFAction is None:
|
||||
DVIPDFAction = SCons.Action.Action(DviPdfFunction, strfunction = DviPdfStrFunction)
|
||||
|
||||
from . import pdf
|
||||
pdf.generate(env)
|
||||
|
||||
bld = env['BUILDERS']['PDF']
|
||||
bld.add_action('.dvi', DVIPDFAction)
|
||||
bld.add_emitter('.dvi', PDFEmitter)
|
||||
|
||||
env['DVIPDF'] = 'dvipdf'
|
||||
env['DVIPDFFLAGS'] = SCons.Util.CLVar('')
|
||||
env['DVIPDFCOM'] = 'cd ${TARGET.dir} && $DVIPDF $DVIPDFFLAGS ${SOURCE.file} ${TARGET.file}'
|
||||
|
||||
# Deprecated synonym.
|
||||
env['PDFCOM'] = ['$DVIPDFCOM']
|
||||
|
||||
def exists(env):
|
||||
SCons.Tool.tex.generate_darwin(env)
|
||||
return env.Detect('dvipdf')
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
95
scons-local-3.0.0/SCons/Tool/dvips.py
Normal file
95
scons-local-3.0.0/SCons/Tool/dvips.py
Normal file
@@ -0,0 +1,95 @@
|
||||
"""SCons.Tool.dvips
|
||||
|
||||
Tool-specific initialization for dvips.
|
||||
|
||||
There normally shouldn't be any need to import this module directly.
|
||||
It will usually be imported through the generic SCons.Tool.Tool()
|
||||
selection method.
|
||||
|
||||
"""
|
||||
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/dvips.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
import SCons.Action
|
||||
import SCons.Builder
|
||||
import SCons.Tool.dvipdf
|
||||
import SCons.Util
|
||||
|
||||
def DviPsFunction(target = None, source= None, env=None):
|
||||
result = SCons.Tool.dvipdf.DviPdfPsFunction(PSAction,target,source,env)
|
||||
return result
|
||||
|
||||
def DviPsStrFunction(target = None, source= None, env=None):
|
||||
"""A strfunction for dvipdf that returns the appropriate
|
||||
command string for the no_exec options."""
|
||||
if env.GetOption("no_exec"):
|
||||
result = env.subst('$PSCOM',0,target,source)
|
||||
else:
|
||||
result = ''
|
||||
return result
|
||||
|
||||
PSAction = None
|
||||
DVIPSAction = None
|
||||
PSBuilder = None
|
||||
|
||||
def generate(env):
|
||||
"""Add Builders and construction variables for dvips to an Environment."""
|
||||
global PSAction
|
||||
if PSAction is None:
|
||||
PSAction = SCons.Action.Action('$PSCOM', '$PSCOMSTR')
|
||||
|
||||
global DVIPSAction
|
||||
if DVIPSAction is None:
|
||||
DVIPSAction = SCons.Action.Action(DviPsFunction, strfunction = DviPsStrFunction)
|
||||
|
||||
global PSBuilder
|
||||
if PSBuilder is None:
|
||||
PSBuilder = SCons.Builder.Builder(action = PSAction,
|
||||
prefix = '$PSPREFIX',
|
||||
suffix = '$PSSUFFIX',
|
||||
src_suffix = '.dvi',
|
||||
src_builder = 'DVI',
|
||||
single_source=True)
|
||||
|
||||
env['BUILDERS']['PostScript'] = PSBuilder
|
||||
|
||||
env['DVIPS'] = 'dvips'
|
||||
env['DVIPSFLAGS'] = SCons.Util.CLVar('')
|
||||
# I'm not quite sure I got the directories and filenames right for variant_dir
|
||||
# We need to be in the correct directory for the sake of latex \includegraphics eps included files.
|
||||
env['PSCOM'] = 'cd ${TARGET.dir} && $DVIPS $DVIPSFLAGS -o ${TARGET.file} ${SOURCE.file}'
|
||||
env['PSPREFIX'] = ''
|
||||
env['PSSUFFIX'] = '.ps'
|
||||
|
||||
def exists(env):
|
||||
SCons.Tool.tex.generate_darwin(env)
|
||||
return env.Detect('dvips')
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
63
scons-local-3.0.0/SCons/Tool/f03.py
Normal file
63
scons-local-3.0.0/SCons/Tool/f03.py
Normal file
@@ -0,0 +1,63 @@
|
||||
"""engine.SCons.Tool.f03
|
||||
|
||||
Tool-specific initialization for the generic Posix f03 Fortran compiler.
|
||||
|
||||
There normally shouldn't be any need to import this module directly.
|
||||
It will usually be imported through the generic SCons.Tool.Tool()
|
||||
selection method.
|
||||
|
||||
"""
|
||||
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/f03.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
import SCons.Defaults
|
||||
import SCons.Tool
|
||||
import SCons.Util
|
||||
from . import fortran
|
||||
from SCons.Tool.FortranCommon import add_all_to_env, add_f03_to_env
|
||||
|
||||
compilers = ['f03']
|
||||
|
||||
def generate(env):
|
||||
add_all_to_env(env)
|
||||
add_f03_to_env(env)
|
||||
|
||||
fcomp = env.Detect(compilers) or 'f03'
|
||||
env['F03'] = fcomp
|
||||
env['SHF03'] = fcomp
|
||||
|
||||
env['FORTRAN'] = fcomp
|
||||
env['SHFORTRAN'] = fcomp
|
||||
|
||||
|
||||
def exists(env):
|
||||
return env.Detect(compilers)
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
65
scons-local-3.0.0/SCons/Tool/f08.py
Normal file
65
scons-local-3.0.0/SCons/Tool/f08.py
Normal file
@@ -0,0 +1,65 @@
|
||||
"""engine.SCons.Tool.f08
|
||||
|
||||
Tool-specific initialization for the generic Posix f08 Fortran compiler.
|
||||
|
||||
There normally shouldn't be any need to import this module directly.
|
||||
It will usually be imported through the generic SCons.Tool.Tool()
|
||||
selection method.
|
||||
|
||||
"""
|
||||
|
||||
from __future__ import absolute_import
|
||||
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/f08.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
import SCons.Defaults
|
||||
import SCons.Tool
|
||||
import SCons.Util
|
||||
from . import fortran
|
||||
from SCons.Tool.FortranCommon import add_all_to_env, add_f08_to_env
|
||||
|
||||
compilers = ['f08']
|
||||
|
||||
def generate(env):
|
||||
add_all_to_env(env)
|
||||
add_f08_to_env(env)
|
||||
|
||||
fcomp = env.Detect(compilers) or 'f08'
|
||||
env['F08'] = fcomp
|
||||
env['SHF08'] = fcomp
|
||||
|
||||
env['FORTRAN'] = fcomp
|
||||
env['SHFORTRAN'] = fcomp
|
||||
|
||||
|
||||
def exists(env):
|
||||
return env.Detect(compilers)
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
62
scons-local-3.0.0/SCons/Tool/f77.py
Normal file
62
scons-local-3.0.0/SCons/Tool/f77.py
Normal file
@@ -0,0 +1,62 @@
|
||||
"""engine.SCons.Tool.f77
|
||||
|
||||
Tool-specific initialization for the generic Posix f77 Fortran compiler.
|
||||
|
||||
There normally shouldn't be any need to import this module directly.
|
||||
It will usually be imported through the generic SCons.Tool.Tool()
|
||||
selection method.
|
||||
|
||||
"""
|
||||
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/f77.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
import SCons.Defaults
|
||||
import SCons.Scanner.Fortran
|
||||
import SCons.Tool
|
||||
import SCons.Util
|
||||
from SCons.Tool.FortranCommon import add_all_to_env, add_f77_to_env
|
||||
|
||||
compilers = ['f77']
|
||||
|
||||
def generate(env):
|
||||
add_all_to_env(env)
|
||||
add_f77_to_env(env)
|
||||
|
||||
fcomp = env.Detect(compilers) or 'f77'
|
||||
env['F77'] = fcomp
|
||||
env['SHF77'] = fcomp
|
||||
|
||||
env['FORTRAN'] = fcomp
|
||||
env['SHFORTRAN'] = fcomp
|
||||
|
||||
def exists(env):
|
||||
return env.Detect(compilers)
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
62
scons-local-3.0.0/SCons/Tool/f90.py
Normal file
62
scons-local-3.0.0/SCons/Tool/f90.py
Normal file
@@ -0,0 +1,62 @@
|
||||
"""engine.SCons.Tool.f90
|
||||
|
||||
Tool-specific initialization for the generic Posix f90 Fortran compiler.
|
||||
|
||||
There normally shouldn't be any need to import this module directly.
|
||||
It will usually be imported through the generic SCons.Tool.Tool()
|
||||
selection method.
|
||||
|
||||
"""
|
||||
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/f90.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
import SCons.Defaults
|
||||
import SCons.Scanner.Fortran
|
||||
import SCons.Tool
|
||||
import SCons.Util
|
||||
from SCons.Tool.FortranCommon import add_all_to_env, add_f90_to_env
|
||||
|
||||
compilers = ['f90']
|
||||
|
||||
def generate(env):
|
||||
add_all_to_env(env)
|
||||
add_f90_to_env(env)
|
||||
|
||||
fc = env.Detect(compilers) or 'f90'
|
||||
env['F90'] = fc
|
||||
env['SHF90'] = fc
|
||||
|
||||
env['FORTRAN'] = fc
|
||||
env['SHFORTRAN'] = fc
|
||||
|
||||
def exists(env):
|
||||
return env.Detect(compilers)
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
63
scons-local-3.0.0/SCons/Tool/f95.py
Normal file
63
scons-local-3.0.0/SCons/Tool/f95.py
Normal file
@@ -0,0 +1,63 @@
|
||||
"""engine.SCons.Tool.f95
|
||||
|
||||
Tool-specific initialization for the generic Posix f95 Fortran compiler.
|
||||
|
||||
There normally shouldn't be any need to import this module directly.
|
||||
It will usually be imported through the generic SCons.Tool.Tool()
|
||||
selection method.
|
||||
|
||||
"""
|
||||
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/f95.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
import SCons.Defaults
|
||||
import SCons.Tool
|
||||
import SCons.Util
|
||||
from . import fortran
|
||||
from SCons.Tool.FortranCommon import add_all_to_env, add_f95_to_env
|
||||
|
||||
compilers = ['f95']
|
||||
|
||||
def generate(env):
|
||||
add_all_to_env(env)
|
||||
add_f95_to_env(env)
|
||||
|
||||
fcomp = env.Detect(compilers) or 'f95'
|
||||
env['F95'] = fcomp
|
||||
env['SHF95'] = fcomp
|
||||
|
||||
env['FORTRAN'] = fcomp
|
||||
env['SHFORTRAN'] = fcomp
|
||||
|
||||
|
||||
def exists(env):
|
||||
return env.Detect(compilers)
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
98
scons-local-3.0.0/SCons/Tool/filesystem.py
Normal file
98
scons-local-3.0.0/SCons/Tool/filesystem.py
Normal file
@@ -0,0 +1,98 @@
|
||||
"""SCons.Tool.filesystem
|
||||
|
||||
Tool-specific initialization for the filesystem tools.
|
||||
|
||||
There normally shouldn't be any need to import this module directly.
|
||||
It will usually be imported through the generic SCons.Tool.Tool()
|
||||
selection method.
|
||||
"""
|
||||
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/filesystem.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
import SCons
|
||||
from SCons.Tool.install import copyFunc
|
||||
|
||||
copyToBuilder, copyAsBuilder = None, None
|
||||
|
||||
def copyto_emitter(target, source, env):
|
||||
""" changes the path of the source to be under the target (which
|
||||
are assumed to be directories.
|
||||
"""
|
||||
n_target = []
|
||||
|
||||
for t in target:
|
||||
n_target = n_target + [t.File( str( s ) ) for s in source]
|
||||
|
||||
return (n_target, source)
|
||||
|
||||
def copy_action_func(target, source, env):
|
||||
assert( len(target) == len(source) ), "\ntarget: %s\nsource: %s" %(list(map(str, target)),list(map(str, source)))
|
||||
|
||||
for t, s in zip(target, source):
|
||||
if copyFunc(t.get_path(), s.get_path(), env):
|
||||
return 1
|
||||
|
||||
return 0
|
||||
|
||||
def copy_action_str(target, source, env):
|
||||
return env.subst_target_source(env['COPYSTR'], 0, target, source)
|
||||
|
||||
copy_action = SCons.Action.Action( copy_action_func, copy_action_str )
|
||||
|
||||
def generate(env):
|
||||
try:
|
||||
env['BUILDERS']['CopyTo']
|
||||
env['BUILDERS']['CopyAs']
|
||||
except KeyError as e:
|
||||
global copyToBuilder
|
||||
if copyToBuilder is None:
|
||||
copyToBuilder = SCons.Builder.Builder(
|
||||
action = copy_action,
|
||||
target_factory = env.fs.Dir,
|
||||
source_factory = env.fs.Entry,
|
||||
multi = 1,
|
||||
emitter = [ copyto_emitter, ] )
|
||||
|
||||
global copyAsBuilder
|
||||
if copyAsBuilder is None:
|
||||
copyAsBuilder = SCons.Builder.Builder(
|
||||
action = copy_action,
|
||||
target_factory = env.fs.Entry,
|
||||
source_factory = env.fs.Entry )
|
||||
|
||||
env['BUILDERS']['CopyTo'] = copyToBuilder
|
||||
env['BUILDERS']['CopyAs'] = copyAsBuilder
|
||||
|
||||
env['COPYSTR'] = 'Copy file(s): "$SOURCES" to "$TARGETS"'
|
||||
|
||||
def exists(env):
|
||||
return 1
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
62
scons-local-3.0.0/SCons/Tool/fortran.py
Normal file
62
scons-local-3.0.0/SCons/Tool/fortran.py
Normal file
@@ -0,0 +1,62 @@
|
||||
"""SCons.Tool.fortran
|
||||
|
||||
Tool-specific initialization for a generic Posix f77/f90 Fortran compiler.
|
||||
|
||||
There normally shouldn't be any need to import this module directly.
|
||||
It will usually be imported through the generic SCons.Tool.Tool()
|
||||
selection method.
|
||||
|
||||
"""
|
||||
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/fortran.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
import re
|
||||
|
||||
import SCons.Action
|
||||
import SCons.Defaults
|
||||
import SCons.Scanner.Fortran
|
||||
import SCons.Tool
|
||||
import SCons.Util
|
||||
from SCons.Tool.FortranCommon import add_all_to_env, add_fortran_to_env
|
||||
|
||||
compilers = ['f95', 'f90', 'f77']
|
||||
|
||||
def generate(env):
|
||||
add_all_to_env(env)
|
||||
add_fortran_to_env(env)
|
||||
|
||||
fc = env.Detect(compilers) or 'f77'
|
||||
env['SHFORTRAN'] = fc
|
||||
env['FORTRAN'] = fc
|
||||
|
||||
def exists(env):
|
||||
return env.Detect(compilers)
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
45
scons-local-3.0.0/SCons/Tool/g++.py
Normal file
45
scons-local-3.0.0/SCons/Tool/g++.py
Normal file
@@ -0,0 +1,45 @@
|
||||
"""SCons.Tool.g++
|
||||
|
||||
Tool-specific initialization for g++.
|
||||
|
||||
There normally shouldn't be any need to import this module directly.
|
||||
It will usually be imported through the generic SCons.Tool.Tool()
|
||||
selection method.
|
||||
|
||||
"""
|
||||
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/g++.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
|
||||
#forward proxy to the preffered cxx version
|
||||
from SCons.Tool.gxx import *
|
||||
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
73
scons-local-3.0.0/SCons/Tool/g77.py
Normal file
73
scons-local-3.0.0/SCons/Tool/g77.py
Normal file
@@ -0,0 +1,73 @@
|
||||
"""engine.SCons.Tool.g77
|
||||
|
||||
Tool-specific initialization for g77.
|
||||
|
||||
There normally shouldn't be any need to import this module directly.
|
||||
It will usually be imported through the generic SCons.Tool.Tool()
|
||||
selection method.
|
||||
|
||||
"""
|
||||
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/g77.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
import SCons.Util
|
||||
from SCons.Tool.FortranCommon import add_all_to_env, add_f77_to_env
|
||||
|
||||
compilers = ['g77', 'f77']
|
||||
|
||||
def generate(env):
|
||||
"""Add Builders and construction variables for g77 to an Environment."""
|
||||
add_all_to_env(env)
|
||||
add_f77_to_env(env)
|
||||
|
||||
fcomp = env.Detect(compilers) or 'g77'
|
||||
if env['PLATFORM'] in ['cygwin', 'win32']:
|
||||
env['SHFORTRANFLAGS'] = SCons.Util.CLVar('$FORTRANFLAGS')
|
||||
env['SHF77FLAGS'] = SCons.Util.CLVar('$F77FLAGS')
|
||||
else:
|
||||
env['SHFORTRANFLAGS'] = SCons.Util.CLVar('$FORTRANFLAGS -fPIC')
|
||||
env['SHF77FLAGS'] = SCons.Util.CLVar('$F77FLAGS -fPIC')
|
||||
|
||||
env['FORTRAN'] = fcomp
|
||||
env['SHFORTRAN'] = '$FORTRAN'
|
||||
|
||||
env['F77'] = fcomp
|
||||
env['SHF77'] = '$F77'
|
||||
|
||||
env['INCFORTRANPREFIX'] = "-I"
|
||||
env['INCFORTRANSUFFIX'] = ""
|
||||
|
||||
env['INCF77PREFIX'] = "-I"
|
||||
env['INCF77SUFFIX'] = ""
|
||||
|
||||
def exists(env):
|
||||
return env.Detect(compilers)
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
56
scons-local-3.0.0/SCons/Tool/gas.py
Normal file
56
scons-local-3.0.0/SCons/Tool/gas.py
Normal file
@@ -0,0 +1,56 @@
|
||||
"""SCons.Tool.gas
|
||||
|
||||
Tool-specific initialization for as, the Gnu assembler.
|
||||
|
||||
There normally shouldn't be any need to import this module directly.
|
||||
It will usually be imported through the generic SCons.Tool.Tool()
|
||||
selection method.
|
||||
|
||||
"""
|
||||
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/gas.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
try:
|
||||
as_module = __import__('as', globals(), locals(), [])
|
||||
except:
|
||||
as_module = __import__(__package__+'.as', globals(), locals(), ['*'])
|
||||
|
||||
assemblers = ['as', 'gas']
|
||||
|
||||
def generate(env):
|
||||
"""Add Builders and construction variables for as to an Environment."""
|
||||
as_module.generate(env)
|
||||
|
||||
env['AS'] = env.Detect(assemblers) or 'as'
|
||||
|
||||
def exists(env):
|
||||
return env.Detect(assemblers)
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
100
scons-local-3.0.0/SCons/Tool/gcc.py
Normal file
100
scons-local-3.0.0/SCons/Tool/gcc.py
Normal file
@@ -0,0 +1,100 @@
|
||||
"""SCons.Tool.gcc
|
||||
|
||||
Tool-specific initialization for gcc.
|
||||
|
||||
There normally shouldn't be any need to import this module directly.
|
||||
It will usually be imported through the generic SCons.Tool.Tool()
|
||||
selection method.
|
||||
|
||||
"""
|
||||
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/gcc.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
from . import cc
|
||||
import os
|
||||
import re
|
||||
import subprocess
|
||||
|
||||
import SCons.Util
|
||||
|
||||
compilers = ['gcc', 'cc']
|
||||
|
||||
def generate(env):
|
||||
"""Add Builders and construction variables for gcc to an Environment."""
|
||||
|
||||
if 'CC' not in env:
|
||||
env['CC'] = env.Detect(compilers) or compilers[0]
|
||||
|
||||
cc.generate(env)
|
||||
|
||||
if env['PLATFORM'] in ['cygwin', 'win32']:
|
||||
env['SHCCFLAGS'] = SCons.Util.CLVar('$CCFLAGS')
|
||||
else:
|
||||
env['SHCCFLAGS'] = SCons.Util.CLVar('$CCFLAGS -fPIC')
|
||||
# determine compiler version
|
||||
version = detect_version(env, env['CC'])
|
||||
if version:
|
||||
env['CCVERSION'] = version
|
||||
|
||||
def exists(env):
|
||||
# is executable, and is a GNU compiler (or accepts '--version' at least)
|
||||
return detect_version(env, env.Detect(env.get('CC', compilers)))
|
||||
|
||||
def detect_version(env, cc):
|
||||
"""Return the version of the GNU compiler, or None if it is not a GNU compiler."""
|
||||
cc = env.subst(cc)
|
||||
if not cc:
|
||||
return None
|
||||
version = None
|
||||
#pipe = SCons.Action._subproc(env, SCons.Util.CLVar(cc) + ['-dumpversion'],
|
||||
pipe = SCons.Action._subproc(env, SCons.Util.CLVar(cc) + ['--version'],
|
||||
stdin = 'devnull',
|
||||
stderr = 'devnull',
|
||||
stdout = subprocess.PIPE)
|
||||
# -dumpversion was added in GCC 3.0. As long as we're supporting
|
||||
# GCC versions older than that, we should use --version and a
|
||||
# regular expression.
|
||||
#line = pipe.stdout.read().strip()
|
||||
#if line:
|
||||
# version = line
|
||||
line = SCons.Util.to_str(pipe.stdout.readline())
|
||||
match = re.search(r'[0-9]+(\.[0-9]+)+', line)
|
||||
if match:
|
||||
version = match.group(0)
|
||||
# Non-GNU compiler's output (like AIX xlc's) may exceed the stdout buffer:
|
||||
# So continue with reading to let the child process actually terminate.
|
||||
while SCons.Util.to_str(pipe.stdout.readline()):
|
||||
pass
|
||||
ret = pipe.wait()
|
||||
if ret != 0:
|
||||
return None
|
||||
return version
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
145
scons-local-3.0.0/SCons/Tool/gdc.py
Normal file
145
scons-local-3.0.0/SCons/Tool/gdc.py
Normal file
@@ -0,0 +1,145 @@
|
||||
from __future__ import print_function
|
||||
|
||||
"""SCons.Tool.gdc
|
||||
|
||||
Tool-specific initialization for the GDC compiler.
|
||||
(https://github.com/D-Programming-GDC/GDC)
|
||||
|
||||
Developed by Russel Winder (russel@winder.org.uk)
|
||||
2012-05-09 onwards
|
||||
|
||||
Compiler variables:
|
||||
DC - The name of the D compiler to use. Defaults to gdc.
|
||||
DPATH - List of paths to search for import modules.
|
||||
DVERSIONS - List of version tags to enable when compiling.
|
||||
DDEBUG - List of debug tags to enable when compiling.
|
||||
|
||||
Linker related variables:
|
||||
LIBS - List of library files to link in.
|
||||
DLINK - Name of the linker to use. Defaults to gdc.
|
||||
DLINKFLAGS - List of linker flags.
|
||||
|
||||
Lib tool variables:
|
||||
DLIB - Name of the lib tool to use. Defaults to lib.
|
||||
DLIBFLAGS - List of flags to pass to the lib tool.
|
||||
LIBS - Same as for the linker. (libraries to pull into the .lib)
|
||||
"""
|
||||
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/gdc.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
import SCons.Action
|
||||
import SCons.Defaults
|
||||
import SCons.Tool
|
||||
|
||||
import SCons.Tool.DCommon as DCommon
|
||||
|
||||
|
||||
def generate(env):
|
||||
static_obj, shared_obj = SCons.Tool.createObjBuilders(env)
|
||||
|
||||
static_obj.add_action('.d', SCons.Defaults.DAction)
|
||||
shared_obj.add_action('.d', SCons.Defaults.ShDAction)
|
||||
static_obj.add_emitter('.d', SCons.Defaults.StaticObjectEmitter)
|
||||
shared_obj.add_emitter('.d', SCons.Defaults.SharedObjectEmitter)
|
||||
|
||||
env['DC'] = env.Detect('gdc') or 'gdc'
|
||||
env['DCOM'] = '$DC $_DINCFLAGS $_DVERFLAGS $_DDEBUGFLAGS $_DFLAGS -c -o $TARGET $SOURCES'
|
||||
env['_DINCFLAGS'] = '${_concat(DINCPREFIX, DPATH, DINCSUFFIX, __env__, RDirs, TARGET, SOURCE)}'
|
||||
env['_DVERFLAGS'] = '${_concat(DVERPREFIX, DVERSIONS, DVERSUFFIX, __env__)}'
|
||||
env['_DDEBUGFLAGS'] = '${_concat(DDEBUGPREFIX, DDEBUG, DDEBUGSUFFIX, __env__)}'
|
||||
env['_DFLAGS'] = '${_concat(DFLAGPREFIX, DFLAGS, DFLAGSUFFIX, __env__)}'
|
||||
|
||||
env['SHDC'] = '$DC'
|
||||
env['SHDCOM'] = '$SHDC $_DINCFLAGS $_DVERFLAGS $_DDEBUGFLAGS $_DFLAGS -fPIC -c -o $TARGET $SOURCES'
|
||||
|
||||
env['DPATH'] = ['#/']
|
||||
env['DFLAGS'] = []
|
||||
env['DVERSIONS'] = []
|
||||
env['DDEBUG'] = []
|
||||
|
||||
if env['DC']:
|
||||
DCommon.addDPATHToEnv(env, env['DC'])
|
||||
|
||||
env['DINCPREFIX'] = '-I'
|
||||
env['DINCSUFFIX'] = ''
|
||||
env['DVERPREFIX'] = '-version='
|
||||
env['DVERSUFFIX'] = ''
|
||||
env['DDEBUGPREFIX'] = '-debug='
|
||||
env['DDEBUGSUFFIX'] = ''
|
||||
env['DFLAGPREFIX'] = '-'
|
||||
env['DFLAGSUFFIX'] = ''
|
||||
env['DFILESUFFIX'] = '.d'
|
||||
|
||||
env['DLINK'] = '$DC'
|
||||
env['DLINKFLAGS'] = SCons.Util.CLVar('')
|
||||
env['DLINKCOM'] = '$DLINK -o $TARGET $DLINKFLAGS $__RPATH $SOURCES $_LIBDIRFLAGS $_LIBFLAGS'
|
||||
|
||||
env['SHDLINK'] = '$DC'
|
||||
env['SHDLINKFLAGS'] = SCons.Util.CLVar('$DLINKFLAGS -shared -shared-libphobos')
|
||||
env['SHDLINKCOM'] = '$DLINK -o $TARGET $SHDLINKFLAGS $__SHDLIBVERSIONFLAGS $__RPATH $SOURCES $_LIBDIRFLAGS $_LIBFLAGS'
|
||||
|
||||
env['DLIB'] = 'lib' if env['PLATFORM'] == 'win32' else 'ar cr'
|
||||
env['DLIBCOM'] = '$DLIB $_DLIBFLAGS {0}$TARGET $SOURCES $_DLINKLIBFLAGS'.format('-c ' if env['PLATFORM'] == 'win32' else '')
|
||||
|
||||
env['_DLIBFLAGS'] = '${_concat(DLIBFLAGPREFIX, DLIBFLAGS, DLIBFLAGSUFFIX, __env__)}'
|
||||
|
||||
env['DLIBFLAGPREFIX'] = '-'
|
||||
env['DLIBFLAGSUFFIX'] = ''
|
||||
env['DLINKFLAGPREFIX'] = '-'
|
||||
env['DLINKFLAGSUFFIX'] = ''
|
||||
|
||||
# __RPATH is set to $_RPATH in the platform specification if that
|
||||
# platform supports it.
|
||||
env['RPATHPREFIX'] = '-Wl,-rpath='
|
||||
env['RPATHSUFFIX'] = ''
|
||||
env['_RPATH'] = '${_concat(RPATHPREFIX, RPATH, RPATHSUFFIX, __env__)}'
|
||||
|
||||
# Support for versioned libraries
|
||||
env['_SHDLIBVERSIONFLAGS'] = '$SHDLIBVERSIONFLAGS -Wl,-soname=$_SHDLIBSONAME'
|
||||
env['_SHDLIBSONAME'] = '${DShLibSonameGenerator(__env__,TARGET)}'
|
||||
# NOTE: this is a quick hack, the soname will only work if there is
|
||||
# c/c++ linker loaded which provides callback for the ShLibSonameGenerator
|
||||
env['DShLibSonameGenerator'] = SCons.Tool.ShLibSonameGenerator
|
||||
# NOTE: this is only for further reference, currently $SHDLIBVERSION does
|
||||
# not work, the user must use $SHLIBVERSION
|
||||
env['SHDLIBVERSION'] = '$SHLIBVERSION'
|
||||
env['SHDLIBVERSIONFLAGS'] = '$SHLIBVERSIONFLAGS'
|
||||
|
||||
env['BUILDERS']['ProgramAllAtOnce'] = SCons.Builder.Builder(
|
||||
action='$DC $_DINCFLAGS $_DVERFLAGS $_DDEBUGFLAGS $_DFLAGS -o $TARGET $DLINKFLAGS $__DRPATH $SOURCES $_DLIBDIRFLAGS $_DLIBFLAGS',
|
||||
emitter=DCommon.allAtOnceEmitter,
|
||||
)
|
||||
|
||||
|
||||
def exists(env):
|
||||
return env.Detect('gdc')
|
||||
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
48
scons-local-3.0.0/SCons/Tool/gettext_tool.py
Normal file
48
scons-local-3.0.0/SCons/Tool/gettext_tool.py
Normal file
@@ -0,0 +1,48 @@
|
||||
"""gettext tool
|
||||
"""
|
||||
|
||||
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/gettext_tool.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
#############################################################################
|
||||
def generate(env,**kw):
|
||||
import SCons.Tool
|
||||
from SCons.Tool.GettextCommon \
|
||||
import _translate, tool_list
|
||||
for t in tool_list(env['PLATFORM'], env):
|
||||
env.Tool(t)
|
||||
env.AddMethod(_translate, 'Translate')
|
||||
#############################################################################
|
||||
|
||||
#############################################################################
|
||||
def exists(env):
|
||||
from SCons.Tool.GettextCommon \
|
||||
import _xgettext_exists, _msginit_exists, \
|
||||
_msgmerge_exists, _msgfmt_exists
|
||||
try:
|
||||
return _xgettext_exists(env) and _msginit_exists(env) \
|
||||
and _msgmerge_exists(env) and _msgfmt_exists(env)
|
||||
except:
|
||||
return False
|
||||
#############################################################################
|
||||
64
scons-local-3.0.0/SCons/Tool/gfortran.py
Normal file
64
scons-local-3.0.0/SCons/Tool/gfortran.py
Normal file
@@ -0,0 +1,64 @@
|
||||
"""SCons.Tool.gfortran
|
||||
|
||||
Tool-specific initialization for gfortran, the GNU Fortran 95/Fortran
|
||||
2003 compiler.
|
||||
|
||||
There normally shouldn't be any need to import this module directly.
|
||||
It will usually be imported through the generic SCons.Tool.Tool()
|
||||
selection method.
|
||||
|
||||
"""
|
||||
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/gfortran.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
import SCons.Util
|
||||
|
||||
from . import fortran
|
||||
|
||||
def generate(env):
|
||||
"""Add Builders and construction variables for gfortran to an
|
||||
Environment."""
|
||||
fortran.generate(env)
|
||||
|
||||
for dialect in ['F77', 'F90', 'FORTRAN', 'F95', 'F03', 'F08']:
|
||||
env['%s' % dialect] = 'gfortran'
|
||||
env['SH%s' % dialect] = '$%s' % dialect
|
||||
if env['PLATFORM'] in ['cygwin', 'win32']:
|
||||
env['SH%sFLAGS' % dialect] = SCons.Util.CLVar('$%sFLAGS' % dialect)
|
||||
else:
|
||||
env['SH%sFLAGS' % dialect] = SCons.Util.CLVar('$%sFLAGS -fPIC' % dialect)
|
||||
|
||||
env['INC%sPREFIX' % dialect] = "-I"
|
||||
env['INC%sSUFFIX' % dialect] = ""
|
||||
|
||||
def exists(env):
|
||||
return env.Detect('gfortran')
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
80
scons-local-3.0.0/SCons/Tool/gnulink.py
Normal file
80
scons-local-3.0.0/SCons/Tool/gnulink.py
Normal file
@@ -0,0 +1,80 @@
|
||||
"""SCons.Tool.gnulink
|
||||
|
||||
Tool-specific initialization for the gnu linker.
|
||||
|
||||
There normally shouldn't be any need to import this module directly.
|
||||
It will usually be imported through the generic SCons.Tool.Tool()
|
||||
selection method.
|
||||
|
||||
"""
|
||||
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/gnulink.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
import SCons.Util
|
||||
import SCons.Tool
|
||||
import os
|
||||
import sys
|
||||
import re
|
||||
|
||||
from . import link
|
||||
|
||||
|
||||
def generate(env):
|
||||
"""Add Builders and construction variables for gnulink to an Environment."""
|
||||
link.generate(env)
|
||||
|
||||
if env['PLATFORM'] == 'hpux':
|
||||
env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS -shared -fPIC')
|
||||
|
||||
# __RPATH is set to $_RPATH in the platform specification if that
|
||||
# platform supports it.
|
||||
env['RPATHPREFIX'] = '-Wl,-rpath='
|
||||
env['RPATHSUFFIX'] = ''
|
||||
env['_RPATH'] = '${_concat(RPATHPREFIX, RPATH, RPATHSUFFIX, __env__)}'
|
||||
|
||||
# OpenBSD doesn't usually use SONAME for libraries
|
||||
use_soname = not sys.platform.startswith('openbsd')
|
||||
link._setup_versioned_lib_variables(env, tool = 'gnulink', use_soname = use_soname)
|
||||
env['LINKCALLBACKS'] = link._versioned_lib_callbacks()
|
||||
|
||||
# For backward-compatibility with older SCons versions
|
||||
env['SHLIBVERSIONFLAGS'] = SCons.Util.CLVar('-Wl,-Bsymbolic')
|
||||
|
||||
def exists(env):
|
||||
# TODO: sync with link.smart_link() to choose a linker
|
||||
linkers = { 'CXX': ['g++'], 'CC': ['gcc'] }
|
||||
alltools = []
|
||||
for langvar, linktools in linkers.items():
|
||||
if langvar in env: # use CC over CXX when user specified CC but not CXX
|
||||
return SCons.Tool.FindTool(linktools, env)
|
||||
alltools.extend(linktools)
|
||||
return SCons.Tool.FindTool(alltools, env) # find CXX or CC
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
91
scons-local-3.0.0/SCons/Tool/gs.py
Normal file
91
scons-local-3.0.0/SCons/Tool/gs.py
Normal file
@@ -0,0 +1,91 @@
|
||||
"""SCons.Tool.gs
|
||||
|
||||
Tool-specific initialization for Ghostscript.
|
||||
|
||||
There normally shouldn't be any need to import this module directly.
|
||||
It will usually be imported through the generic SCons.Tool.Tool()
|
||||
selection method.
|
||||
|
||||
"""
|
||||
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/gs.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
import SCons.Action
|
||||
import SCons.Builder
|
||||
import SCons.Platform
|
||||
import SCons.Util
|
||||
|
||||
# Ghostscript goes by different names on different platforms...
|
||||
platform = SCons.Platform.platform_default()
|
||||
|
||||
if platform == 'os2':
|
||||
gs = 'gsos2'
|
||||
elif platform == 'win32':
|
||||
gs = 'gswin32c'
|
||||
else:
|
||||
gs = 'gs'
|
||||
|
||||
GhostscriptAction = None
|
||||
|
||||
def generate(env):
|
||||
"""Add Builders and construction variables for Ghostscript to an
|
||||
Environment."""
|
||||
global GhostscriptAction
|
||||
# The following try-except block enables us to use the Tool
|
||||
# in standalone mode (without the accompanying pdf.py),
|
||||
# whenever we need an explicit call of gs via the Gs()
|
||||
# Builder ...
|
||||
try:
|
||||
if GhostscriptAction is None:
|
||||
GhostscriptAction = SCons.Action.Action('$GSCOM', '$GSCOMSTR')
|
||||
|
||||
from SCons.Tool import pdf
|
||||
pdf.generate(env)
|
||||
|
||||
bld = env['BUILDERS']['PDF']
|
||||
bld.add_action('.ps', GhostscriptAction)
|
||||
except ImportError as e:
|
||||
pass
|
||||
|
||||
gsbuilder = SCons.Builder.Builder(action = SCons.Action.Action('$GSCOM', '$GSCOMSTR'))
|
||||
env['BUILDERS']['Gs'] = gsbuilder
|
||||
|
||||
env['GS'] = gs
|
||||
env['GSFLAGS'] = SCons.Util.CLVar('-dNOPAUSE -dBATCH -sDEVICE=pdfwrite')
|
||||
env['GSCOM'] = '$GS $GSFLAGS -sOutputFile=$TARGET $SOURCES'
|
||||
|
||||
|
||||
def exists(env):
|
||||
if 'PS2PDF' in env:
|
||||
return env.Detect(env['PS2PDF'])
|
||||
else:
|
||||
return env.Detect(gs) or SCons.Util.WhereIs(gs)
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
79
scons-local-3.0.0/SCons/Tool/gxx.py
Normal file
79
scons-local-3.0.0/SCons/Tool/gxx.py
Normal file
@@ -0,0 +1,79 @@
|
||||
"""SCons.Tool.g++
|
||||
|
||||
Tool-specific initialization for g++.
|
||||
|
||||
There normally shouldn't be any need to import this module directly.
|
||||
It will usually be imported through the generic SCons.Tool.Tool()
|
||||
selection method.
|
||||
|
||||
"""
|
||||
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/gxx.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
import os.path
|
||||
import re
|
||||
import subprocess
|
||||
|
||||
import SCons.Tool
|
||||
import SCons.Util
|
||||
|
||||
from . import gcc
|
||||
from . import cxx
|
||||
|
||||
compilers = ['g++']
|
||||
|
||||
def generate(env):
|
||||
"""Add Builders and construction variables for g++ to an Environment."""
|
||||
static_obj, shared_obj = SCons.Tool.createObjBuilders(env)
|
||||
|
||||
if 'CXX' not in env:
|
||||
env['CXX'] = env.Detect(compilers) or compilers[0]
|
||||
|
||||
cxx.generate(env)
|
||||
|
||||
# platform specific settings
|
||||
if env['PLATFORM'] == 'aix':
|
||||
env['SHCXXFLAGS'] = SCons.Util.CLVar('$CXXFLAGS -mminimal-toc')
|
||||
env['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME'] = 1
|
||||
env['SHOBJSUFFIX'] = '$OBJSUFFIX'
|
||||
elif env['PLATFORM'] == 'hpux':
|
||||
env['SHOBJSUFFIX'] = '.pic.o'
|
||||
elif env['PLATFORM'] == 'sunos':
|
||||
env['SHOBJSUFFIX'] = '.pic.o'
|
||||
# determine compiler version
|
||||
version = gcc.detect_version(env, env['CXX'])
|
||||
if version:
|
||||
env['CXXVERSION'] = version
|
||||
|
||||
def exists(env):
|
||||
# is executable, and is a GNU compiler (or accepts '--version' at least)
|
||||
return gcc.detect_version(env, env.Detect(env.get('CXX', compilers)))
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
45
scons-local-3.0.0/SCons/Tool/hpc++.py
Normal file
45
scons-local-3.0.0/SCons/Tool/hpc++.py
Normal file
@@ -0,0 +1,45 @@
|
||||
"""SCons.Tool.hpc++
|
||||
|
||||
Tool-specific initialization for c++ on HP/UX.
|
||||
|
||||
There normally shouldn't be any need to import this module directly.
|
||||
It will usually be imported through the generic SCons.Tool.Tool()
|
||||
selection method.
|
||||
|
||||
"""
|
||||
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/hpc++.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
|
||||
#forward proxy to the preffered cxx version
|
||||
from SCons.Tool.hpcxx import *
|
||||
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
53
scons-local-3.0.0/SCons/Tool/hpcc.py
Normal file
53
scons-local-3.0.0/SCons/Tool/hpcc.py
Normal file
@@ -0,0 +1,53 @@
|
||||
"""SCons.Tool.hpcc
|
||||
|
||||
Tool-specific initialization for HP aCC and cc.
|
||||
|
||||
There normally shouldn't be any need to import this module directly.
|
||||
It will usually be imported through the generic SCons.Tool.Tool()
|
||||
selection method.
|
||||
"""
|
||||
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/hpcc.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
import SCons.Util
|
||||
|
||||
from . import cc
|
||||
|
||||
def generate(env):
|
||||
"""Add Builders and construction variables for aCC & cc to an Environment."""
|
||||
cc.generate(env)
|
||||
|
||||
env['CXX'] = 'aCC'
|
||||
env['SHCCFLAGS'] = SCons.Util.CLVar('$CCFLAGS +Z')
|
||||
|
||||
def exists(env):
|
||||
return env.Detect('aCC')
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
87
scons-local-3.0.0/SCons/Tool/hpcxx.py
Normal file
87
scons-local-3.0.0/SCons/Tool/hpcxx.py
Normal file
@@ -0,0 +1,87 @@
|
||||
"""SCons.Tool.hpc++
|
||||
|
||||
Tool-specific initialization for c++ on HP/UX.
|
||||
|
||||
There normally shouldn't be any need to import this module directly.
|
||||
It will usually be imported through the generic SCons.Tool.Tool()
|
||||
selection method.
|
||||
|
||||
"""
|
||||
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/hpcxx.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
import os.path
|
||||
|
||||
import SCons.Util
|
||||
|
||||
import SCons.Tool.cxx
|
||||
cplusplus = SCons.Tool.cxx
|
||||
#cplusplus = __import__('cxx', globals(), locals(), [])
|
||||
|
||||
|
||||
acc = None
|
||||
|
||||
# search for the acc compiler and linker front end
|
||||
|
||||
try:
|
||||
dirs = os.listdir('/opt')
|
||||
except (IOError, OSError):
|
||||
# Not being able to read the directory because it doesn't exist
|
||||
# (IOError) or isn't readable (OSError) is okay.
|
||||
dirs = []
|
||||
|
||||
for dir in dirs:
|
||||
cc = '/opt/' + dir + '/bin/aCC'
|
||||
if os.path.exists(cc):
|
||||
acc = cc
|
||||
break
|
||||
|
||||
|
||||
def generate(env):
|
||||
"""Add Builders and construction variables for g++ to an Environment."""
|
||||
cplusplus.generate(env)
|
||||
|
||||
if acc:
|
||||
env['CXX'] = acc or 'aCC'
|
||||
env['SHCXXFLAGS'] = SCons.Util.CLVar('$CXXFLAGS +Z')
|
||||
# determine version of aCC
|
||||
line = os.popen(acc + ' -V 2>&1').readline().rstrip()
|
||||
if line.find('aCC: HP ANSI C++') == 0:
|
||||
env['CXXVERSION'] = line.split()[-1]
|
||||
|
||||
if env['PLATFORM'] == 'cygwin':
|
||||
env['SHCXXFLAGS'] = SCons.Util.CLVar('$CXXFLAGS')
|
||||
else:
|
||||
env['SHCXXFLAGS'] = SCons.Util.CLVar('$CXXFLAGS +Z')
|
||||
|
||||
def exists(env):
|
||||
return acc
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
77
scons-local-3.0.0/SCons/Tool/hplink.py
Normal file
77
scons-local-3.0.0/SCons/Tool/hplink.py
Normal file
@@ -0,0 +1,77 @@
|
||||
"""SCons.Tool.hplink
|
||||
|
||||
Tool-specific initialization for the HP linker.
|
||||
|
||||
There normally shouldn't be any need to import this module directly.
|
||||
It will usually be imported through the generic SCons.Tool.Tool()
|
||||
selection method.
|
||||
"""
|
||||
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/hplink.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
import os
|
||||
import os.path
|
||||
|
||||
import SCons.Util
|
||||
|
||||
from . import link
|
||||
|
||||
ccLinker = None
|
||||
|
||||
# search for the acc compiler and linker front end
|
||||
|
||||
try:
|
||||
dirs = os.listdir('/opt')
|
||||
except (IOError, OSError):
|
||||
# Not being able to read the directory because it doesn't exist
|
||||
# (IOError) or isn't readable (OSError) is okay.
|
||||
dirs = []
|
||||
|
||||
for dir in dirs:
|
||||
linker = '/opt/' + dir + '/bin/aCC'
|
||||
if os.path.exists(linker):
|
||||
ccLinker = linker
|
||||
break
|
||||
|
||||
def generate(env):
|
||||
"""
|
||||
Add Builders and construction variables for Visual Age linker to
|
||||
an Environment.
|
||||
"""
|
||||
link.generate(env)
|
||||
|
||||
env['LINKFLAGS'] = SCons.Util.CLVar('-Wl,+s -Wl,+vnocompatwarnings')
|
||||
env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS -b')
|
||||
env['SHLIBSUFFIX'] = '.sl'
|
||||
|
||||
def exists(env):
|
||||
return ccLinker
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
59
scons-local-3.0.0/SCons/Tool/icc.py
Normal file
59
scons-local-3.0.0/SCons/Tool/icc.py
Normal file
@@ -0,0 +1,59 @@
|
||||
"""engine.SCons.Tool.icc
|
||||
|
||||
Tool-specific initialization for the OS/2 icc compiler.
|
||||
|
||||
There normally shouldn't be any need to import this module directly.
|
||||
It will usually be imported through the generic SCons.Tool.Tool()
|
||||
selection method.
|
||||
|
||||
"""
|
||||
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/icc.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
from . import cc
|
||||
|
||||
def generate(env):
|
||||
"""Add Builders and construction variables for the OS/2 to an Environment."""
|
||||
cc.generate(env)
|
||||
|
||||
env['CC'] = 'icc'
|
||||
env['CCCOM'] = '$CC $CFLAGS $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS /c $SOURCES /Fo$TARGET'
|
||||
env['CXXCOM'] = '$CXX $CXXFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS /c $SOURCES /Fo$TARGET'
|
||||
env['CPPDEFPREFIX'] = '/D'
|
||||
env['CPPDEFSUFFIX'] = ''
|
||||
env['INCPREFIX'] = '/I'
|
||||
env['INCSUFFIX'] = ''
|
||||
env['CFILESUFFIX'] = '.c'
|
||||
env['CXXFILESUFFIX'] = '.cc'
|
||||
|
||||
def exists(env):
|
||||
return env.Detect('icc')
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
52
scons-local-3.0.0/SCons/Tool/icl.py
Normal file
52
scons-local-3.0.0/SCons/Tool/icl.py
Normal file
@@ -0,0 +1,52 @@
|
||||
"""engine.SCons.Tool.icl
|
||||
|
||||
Tool-specific initialization for the Intel C/C++ compiler.
|
||||
|
||||
There normally shouldn't be any need to import this module directly.
|
||||
It will usually be imported through the generic SCons.Tool.Tool()
|
||||
selection method.
|
||||
|
||||
"""
|
||||
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/icl.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
import SCons.Tool.intelc
|
||||
|
||||
# This has been completely superseded by intelc.py, which can
|
||||
# handle both Windows and Linux versions.
|
||||
|
||||
def generate(*args, **kw):
|
||||
"""Add Builders and construction variables for icl to an Environment."""
|
||||
return SCons.Tool.intelc.generate(*args, **kw)
|
||||
|
||||
def exists(*args, **kw):
|
||||
return SCons.Tool.intelc.exists(*args, **kw)
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
72
scons-local-3.0.0/SCons/Tool/ifl.py
Normal file
72
scons-local-3.0.0/SCons/Tool/ifl.py
Normal file
@@ -0,0 +1,72 @@
|
||||
"""SCons.Tool.ifl
|
||||
|
||||
Tool-specific initialization for the Intel Fortran compiler.
|
||||
|
||||
There normally shouldn't be any need to import this module directly.
|
||||
It will usually be imported through the generic SCons.Tool.Tool()
|
||||
selection method.
|
||||
|
||||
"""
|
||||
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/ifl.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
import SCons.Defaults
|
||||
from SCons.Scanner.Fortran import FortranScan
|
||||
from .FortranCommon import add_all_to_env
|
||||
|
||||
def generate(env):
|
||||
"""Add Builders and construction variables for ifl to an Environment."""
|
||||
fscan = FortranScan("FORTRANPATH")
|
||||
SCons.Tool.SourceFileScanner.add_scanner('.i', fscan)
|
||||
SCons.Tool.SourceFileScanner.add_scanner('.i90', fscan)
|
||||
|
||||
if 'FORTRANFILESUFFIXES' not in env:
|
||||
env['FORTRANFILESUFFIXES'] = ['.i']
|
||||
else:
|
||||
env['FORTRANFILESUFFIXES'].append('.i')
|
||||
|
||||
if 'F90FILESUFFIXES' not in env:
|
||||
env['F90FILESUFFIXES'] = ['.i90']
|
||||
else:
|
||||
env['F90FILESUFFIXES'].append('.i90')
|
||||
|
||||
add_all_to_env(env)
|
||||
|
||||
env['FORTRAN'] = 'ifl'
|
||||
env['SHFORTRAN'] = '$FORTRAN'
|
||||
env['FORTRANCOM'] = '$FORTRAN $FORTRANFLAGS $_FORTRANINCFLAGS /c $SOURCES /Fo$TARGET'
|
||||
env['FORTRANPPCOM'] = '$FORTRAN $FORTRANFLAGS $CPPFLAGS $_CPPDEFFLAGS $_FORTRANINCFLAGS /c $SOURCES /Fo$TARGET'
|
||||
env['SHFORTRANCOM'] = '$SHFORTRAN $SHFORTRANFLAGS $_FORTRANINCFLAGS /c $SOURCES /Fo$TARGET'
|
||||
env['SHFORTRANPPCOM'] = '$SHFORTRAN $SHFORTRANFLAGS $CPPFLAGS $_CPPDEFFLAGS $_FORTRANINCFLAGS /c $SOURCES /Fo$TARGET'
|
||||
|
||||
def exists(env):
|
||||
return env.Detect('ifl')
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
88
scons-local-3.0.0/SCons/Tool/ifort.py
Normal file
88
scons-local-3.0.0/SCons/Tool/ifort.py
Normal file
@@ -0,0 +1,88 @@
|
||||
"""SCons.Tool.ifort
|
||||
|
||||
Tool-specific initialization for newer versions of the Intel Fortran Compiler
|
||||
for Linux/Windows (and possibly Mac OS X).
|
||||
|
||||
There normally shouldn't be any need to import this module directly.
|
||||
It will usually be imported through the generic SCons.Tool.Tool()
|
||||
selection method.
|
||||
|
||||
"""
|
||||
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/ifort.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
import SCons.Defaults
|
||||
from SCons.Scanner.Fortran import FortranScan
|
||||
from .FortranCommon import add_all_to_env
|
||||
|
||||
def generate(env):
|
||||
"""Add Builders and construction variables for ifort to an Environment."""
|
||||
# ifort supports Fortran 90 and Fortran 95
|
||||
# Additionally, ifort recognizes more file extensions.
|
||||
fscan = FortranScan("FORTRANPATH")
|
||||
SCons.Tool.SourceFileScanner.add_scanner('.i', fscan)
|
||||
SCons.Tool.SourceFileScanner.add_scanner('.i90', fscan)
|
||||
|
||||
if 'FORTRANFILESUFFIXES' not in env:
|
||||
env['FORTRANFILESUFFIXES'] = ['.i']
|
||||
else:
|
||||
env['FORTRANFILESUFFIXES'].append('.i')
|
||||
|
||||
if 'F90FILESUFFIXES' not in env:
|
||||
env['F90FILESUFFIXES'] = ['.i90']
|
||||
else:
|
||||
env['F90FILESUFFIXES'].append('.i90')
|
||||
|
||||
add_all_to_env(env)
|
||||
|
||||
fc = 'ifort'
|
||||
|
||||
for dialect in ['F77', 'F90', 'FORTRAN', 'F95']:
|
||||
env['%s' % dialect] = fc
|
||||
env['SH%s' % dialect] = '$%s' % dialect
|
||||
if env['PLATFORM'] == 'posix':
|
||||
env['SH%sFLAGS' % dialect] = SCons.Util.CLVar('$%sFLAGS -fPIC' % dialect)
|
||||
|
||||
if env['PLATFORM'] == 'win32':
|
||||
# On Windows, the ifort compiler specifies the object on the
|
||||
# command line with -object:, not -o. Massage the necessary
|
||||
# command-line construction variables.
|
||||
for dialect in ['F77', 'F90', 'FORTRAN', 'F95']:
|
||||
for var in ['%sCOM' % dialect, '%sPPCOM' % dialect,
|
||||
'SH%sCOM' % dialect, 'SH%sPPCOM' % dialect]:
|
||||
env[var] = env[var].replace('-o $TARGET', '-object:$TARGET')
|
||||
env['FORTRANMODDIRPREFIX'] = "/module:"
|
||||
else:
|
||||
env['FORTRANMODDIRPREFIX'] = "-module "
|
||||
|
||||
def exists(env):
|
||||
return env.Detect('ifort')
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
59
scons-local-3.0.0/SCons/Tool/ilink.py
Normal file
59
scons-local-3.0.0/SCons/Tool/ilink.py
Normal file
@@ -0,0 +1,59 @@
|
||||
"""SCons.Tool.ilink
|
||||
|
||||
Tool-specific initialization for the OS/2 ilink linker.
|
||||
|
||||
There normally shouldn't be any need to import this module directly.
|
||||
It will usually be imported through the generic SCons.Tool.Tool()
|
||||
selection method.
|
||||
|
||||
"""
|
||||
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/ilink.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
import SCons.Defaults
|
||||
import SCons.Tool
|
||||
import SCons.Util
|
||||
|
||||
def generate(env):
|
||||
"""Add Builders and construction variables for ilink to an Environment."""
|
||||
SCons.Tool.createProgBuilder(env)
|
||||
|
||||
env['LINK'] = 'ilink'
|
||||
env['LINKFLAGS'] = SCons.Util.CLVar('')
|
||||
env['LINKCOM'] = '$LINK $LINKFLAGS /O:$TARGET $SOURCES $_LIBDIRFLAGS $_LIBFLAGS'
|
||||
env['LIBDIRPREFIX']='/LIBPATH:'
|
||||
env['LIBDIRSUFFIX']=''
|
||||
env['LIBLINKPREFIX']=''
|
||||
env['LIBLINKSUFFIX']='$LIBSUFFIX'
|
||||
|
||||
def exists(env):
|
||||
return env.Detect('ilink')
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
60
scons-local-3.0.0/SCons/Tool/ilink32.py
Normal file
60
scons-local-3.0.0/SCons/Tool/ilink32.py
Normal file
@@ -0,0 +1,60 @@
|
||||
"""SCons.Tool.ilink32
|
||||
|
||||
XXX
|
||||
|
||||
"""
|
||||
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/ilink32.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
import SCons.Tool
|
||||
import SCons.Tool.bcc32
|
||||
import SCons.Util
|
||||
|
||||
def generate(env):
|
||||
"""Add Builders and construction variables for Borland ilink to an
|
||||
Environment."""
|
||||
SCons.Tool.createSharedLibBuilder(env)
|
||||
SCons.Tool.createProgBuilder(env)
|
||||
|
||||
env['LINK'] = '$CC'
|
||||
env['LINKFLAGS'] = SCons.Util.CLVar('')
|
||||
env['LINKCOM'] = '$LINK -q $LINKFLAGS -e$TARGET $SOURCES $LIBS'
|
||||
env['LIBDIRPREFIX']=''
|
||||
env['LIBDIRSUFFIX']=''
|
||||
env['LIBLINKPREFIX']=''
|
||||
env['LIBLINKSUFFIX']='$LIBSUFFIX'
|
||||
|
||||
|
||||
def exists(env):
|
||||
# Uses bcc32 to do linking as it generally knows where the standard
|
||||
# LIBS are and set up the linking correctly
|
||||
return SCons.Tool.bcc32.findIt('bcc32', env)
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
428
scons-local-3.0.0/SCons/Tool/install.py
Normal file
428
scons-local-3.0.0/SCons/Tool/install.py
Normal file
@@ -0,0 +1,428 @@
|
||||
"""SCons.Tool.install
|
||||
|
||||
Tool-specific initialization for the install tool.
|
||||
|
||||
There normally shouldn't be any need to import this module directly.
|
||||
It will usually be imported through the generic SCons.Tool.Tool()
|
||||
selection method.
|
||||
"""
|
||||
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
from __future__ import print_function
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/install.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
import os
|
||||
import re
|
||||
import shutil
|
||||
import stat
|
||||
|
||||
import SCons.Action
|
||||
import SCons.Tool
|
||||
import SCons.Util
|
||||
|
||||
#
|
||||
# We keep track of *all* installed files.
|
||||
_INSTALLED_FILES = []
|
||||
_UNIQUE_INSTALLED_FILES = None
|
||||
|
||||
class CopytreeError(EnvironmentError):
|
||||
pass
|
||||
|
||||
# This is a patched version of shutil.copytree from python 2.5. It
|
||||
# doesn't fail if the dir exists, which regular copytree does
|
||||
# (annoyingly). Note the XXX comment in the docstring.
|
||||
def scons_copytree(src, dst, symlinks=False):
|
||||
"""Recursively copy a directory tree using copy2().
|
||||
|
||||
The destination directory must not already exist.
|
||||
If exception(s) occur, an CopytreeError is raised with a list of reasons.
|
||||
|
||||
If the optional symlinks flag is true, symbolic links in the
|
||||
source tree result in symbolic links in the destination tree; if
|
||||
it is false, the contents of the files pointed to by symbolic
|
||||
links are copied.
|
||||
|
||||
XXX Consider this example code rather than the ultimate tool.
|
||||
|
||||
"""
|
||||
names = os.listdir(src)
|
||||
# garyo@genarts.com fix: check for dir before making dirs.
|
||||
if not os.path.exists(dst):
|
||||
os.makedirs(dst)
|
||||
errors = []
|
||||
for name in names:
|
||||
srcname = os.path.join(src, name)
|
||||
dstname = os.path.join(dst, name)
|
||||
try:
|
||||
if symlinks and os.path.islink(srcname):
|
||||
linkto = os.readlink(srcname)
|
||||
os.symlink(linkto, dstname)
|
||||
elif os.path.isdir(srcname):
|
||||
scons_copytree(srcname, dstname, symlinks)
|
||||
else:
|
||||
shutil.copy2(srcname, dstname)
|
||||
# XXX What about devices, sockets etc.?
|
||||
except (IOError, os.error) as why:
|
||||
errors.append((srcname, dstname, str(why)))
|
||||
# catch the CopytreeError from the recursive copytree so that we can
|
||||
# continue with other files
|
||||
except CopytreeError as err:
|
||||
errors.extend(err.args[0])
|
||||
try:
|
||||
shutil.copystat(src, dst)
|
||||
except SCons.Util.WinError:
|
||||
# can't copy file access times on Windows
|
||||
pass
|
||||
except OSError as why:
|
||||
errors.extend((src, dst, str(why)))
|
||||
if errors:
|
||||
raise CopytreeError(errors)
|
||||
|
||||
|
||||
#
|
||||
# Functions doing the actual work of the Install Builder.
|
||||
#
|
||||
def copyFunc(dest, source, env):
|
||||
"""Install a source file or directory into a destination by copying,
|
||||
(including copying permission/mode bits)."""
|
||||
|
||||
if os.path.isdir(source):
|
||||
if os.path.exists(dest):
|
||||
if not os.path.isdir(dest):
|
||||
raise SCons.Errors.UserError("cannot overwrite non-directory `%s' with a directory `%s'" % (str(dest), str(source)))
|
||||
else:
|
||||
parent = os.path.split(dest)[0]
|
||||
if not os.path.exists(parent):
|
||||
os.makedirs(parent)
|
||||
scons_copytree(source, dest)
|
||||
else:
|
||||
shutil.copy2(source, dest)
|
||||
st = os.stat(source)
|
||||
os.chmod(dest, stat.S_IMODE(st[stat.ST_MODE]) | stat.S_IWRITE)
|
||||
|
||||
return 0
|
||||
|
||||
#
|
||||
# Functions doing the actual work of the InstallVersionedLib Builder.
|
||||
#
|
||||
def copyFuncVersionedLib(dest, source, env):
|
||||
"""Install a versioned library into a destination by copying,
|
||||
(including copying permission/mode bits) and then creating
|
||||
required symlinks."""
|
||||
|
||||
if os.path.isdir(source):
|
||||
raise SCons.Errors.UserError("cannot install directory `%s' as a version library" % str(source) )
|
||||
else:
|
||||
# remove the link if it is already there
|
||||
try:
|
||||
os.remove(dest)
|
||||
except:
|
||||
pass
|
||||
shutil.copy2(source, dest)
|
||||
st = os.stat(source)
|
||||
os.chmod(dest, stat.S_IMODE(st[stat.ST_MODE]) | stat.S_IWRITE)
|
||||
installShlibLinks(dest, source, env)
|
||||
|
||||
return 0
|
||||
|
||||
def listShlibLinksToInstall(dest, source, env):
|
||||
install_links = []
|
||||
source = env.arg2nodes(source)
|
||||
dest = env.fs.File(dest)
|
||||
install_dir = dest.get_dir()
|
||||
for src in source:
|
||||
symlinks = getattr(getattr(src,'attributes',None), 'shliblinks', None)
|
||||
if symlinks:
|
||||
for link, linktgt in symlinks:
|
||||
link_base = os.path.basename(link.get_path())
|
||||
linktgt_base = os.path.basename(linktgt.get_path())
|
||||
install_link = env.fs.File(link_base, install_dir)
|
||||
install_linktgt = env.fs.File(linktgt_base, install_dir)
|
||||
install_links.append((install_link, install_linktgt))
|
||||
return install_links
|
||||
|
||||
def installShlibLinks(dest, source, env):
|
||||
"""If we are installing a versioned shared library create the required links."""
|
||||
Verbose = False
|
||||
symlinks = listShlibLinksToInstall(dest, source, env)
|
||||
if Verbose:
|
||||
print('installShlibLinks: symlinks={:r}'.format(SCons.Tool.StringizeLibSymlinks(symlinks)))
|
||||
if symlinks:
|
||||
SCons.Tool.CreateLibSymlinks(env, symlinks)
|
||||
return
|
||||
|
||||
def installFunc(target, source, env):
|
||||
"""Install a source file into a target using the function specified
|
||||
as the INSTALL construction variable."""
|
||||
try:
|
||||
install = env['INSTALL']
|
||||
except KeyError:
|
||||
raise SCons.Errors.UserError('Missing INSTALL construction variable.')
|
||||
|
||||
assert len(target)==len(source), \
|
||||
"Installing source %s into target %s: target and source lists must have same length."%(list(map(str, source)), list(map(str, target)))
|
||||
for t,s in zip(target,source):
|
||||
if install(t.get_path(),s.get_path(),env):
|
||||
return 1
|
||||
|
||||
return 0
|
||||
|
||||
def installFuncVersionedLib(target, source, env):
|
||||
"""Install a versioned library into a target using the function specified
|
||||
as the INSTALLVERSIONEDLIB construction variable."""
|
||||
try:
|
||||
install = env['INSTALLVERSIONEDLIB']
|
||||
except KeyError:
|
||||
raise SCons.Errors.UserError('Missing INSTALLVERSIONEDLIB construction variable.')
|
||||
|
||||
assert len(target)==len(source), \
|
||||
"Installing source %s into target %s: target and source lists must have same length."%(list(map(str, source)), list(map(str, target)))
|
||||
for t,s in zip(target,source):
|
||||
if hasattr(t.attributes, 'shlibname'):
|
||||
tpath = os.path.join(t.get_dir(), t.attributes.shlibname)
|
||||
else:
|
||||
tpath = t.get_path()
|
||||
if install(tpath,s.get_path(),env):
|
||||
return 1
|
||||
|
||||
return 0
|
||||
|
||||
def stringFunc(target, source, env):
|
||||
installstr = env.get('INSTALLSTR')
|
||||
if installstr:
|
||||
return env.subst_target_source(installstr, 0, target, source)
|
||||
target = str(target[0])
|
||||
source = str(source[0])
|
||||
if os.path.isdir(source):
|
||||
type = 'directory'
|
||||
else:
|
||||
type = 'file'
|
||||
return 'Install %s: "%s" as "%s"' % (type, source, target)
|
||||
|
||||
#
|
||||
# Emitter functions
|
||||
#
|
||||
def add_targets_to_INSTALLED_FILES(target, source, env):
|
||||
""" An emitter that adds all target files to the list stored in the
|
||||
_INSTALLED_FILES global variable. This way all installed files of one
|
||||
scons call will be collected.
|
||||
"""
|
||||
global _INSTALLED_FILES, _UNIQUE_INSTALLED_FILES
|
||||
_INSTALLED_FILES.extend(target)
|
||||
|
||||
_UNIQUE_INSTALLED_FILES = None
|
||||
return (target, source)
|
||||
|
||||
def add_versioned_targets_to_INSTALLED_FILES(target, source, env):
|
||||
""" An emitter that adds all target files to the list stored in the
|
||||
_INSTALLED_FILES global variable. This way all installed files of one
|
||||
scons call will be collected.
|
||||
"""
|
||||
global _INSTALLED_FILES, _UNIQUE_INSTALLED_FILES
|
||||
Verbose = False
|
||||
_INSTALLED_FILES.extend(target)
|
||||
if Verbose:
|
||||
print("add_versioned_targets_to_INSTALLED_FILES: target={:r}".format(list(map(str, target))))
|
||||
symlinks = listShlibLinksToInstall(target[0], source, env)
|
||||
if symlinks:
|
||||
SCons.Tool.EmitLibSymlinks(env, symlinks, target[0])
|
||||
_UNIQUE_INSTALLED_FILES = None
|
||||
return (target, source)
|
||||
|
||||
class DESTDIR_factory(object):
|
||||
""" A node factory, where all files will be relative to the dir supplied
|
||||
in the constructor.
|
||||
"""
|
||||
def __init__(self, env, dir):
|
||||
self.env = env
|
||||
self.dir = env.arg2nodes( dir, env.fs.Dir )[0]
|
||||
|
||||
def Entry(self, name):
|
||||
name = SCons.Util.make_path_relative(name)
|
||||
return self.dir.Entry(name)
|
||||
|
||||
def Dir(self, name):
|
||||
name = SCons.Util.make_path_relative(name)
|
||||
return self.dir.Dir(name)
|
||||
|
||||
#
|
||||
# The Builder Definition
|
||||
#
|
||||
install_action = SCons.Action.Action(installFunc, stringFunc)
|
||||
installas_action = SCons.Action.Action(installFunc, stringFunc)
|
||||
installVerLib_action = SCons.Action.Action(installFuncVersionedLib, stringFunc)
|
||||
|
||||
BaseInstallBuilder = None
|
||||
|
||||
def InstallBuilderWrapper(env, target=None, source=None, dir=None, **kw):
|
||||
if target and dir:
|
||||
import SCons.Errors
|
||||
raise SCons.Errors.UserError("Both target and dir defined for Install(), only one may be defined.")
|
||||
if not dir:
|
||||
dir=target
|
||||
|
||||
import SCons.Script
|
||||
install_sandbox = SCons.Script.GetOption('install_sandbox')
|
||||
if install_sandbox:
|
||||
target_factory = DESTDIR_factory(env, install_sandbox)
|
||||
else:
|
||||
target_factory = env.fs
|
||||
|
||||
try:
|
||||
dnodes = env.arg2nodes(dir, target_factory.Dir)
|
||||
except TypeError:
|
||||
raise SCons.Errors.UserError("Target `%s' of Install() is a file, but should be a directory. Perhaps you have the Install() arguments backwards?" % str(dir))
|
||||
sources = env.arg2nodes(source, env.fs.Entry)
|
||||
tgt = []
|
||||
for dnode in dnodes:
|
||||
for src in sources:
|
||||
# Prepend './' so the lookup doesn't interpret an initial
|
||||
# '#' on the file name portion as meaning the Node should
|
||||
# be relative to the top-level SConstruct directory.
|
||||
target = env.fs.Entry('.'+os.sep+src.name, dnode)
|
||||
tgt.extend(BaseInstallBuilder(env, target, src, **kw))
|
||||
return tgt
|
||||
|
||||
|
||||
def InstallAsBuilderWrapper(env, target=None, source=None, **kw):
|
||||
result = []
|
||||
for src, tgt in map(lambda x, y: (x, y), source, target):
|
||||
result.extend(BaseInstallBuilder(env, tgt, src, **kw))
|
||||
return result
|
||||
|
||||
BaseVersionedInstallBuilder = None
|
||||
|
||||
|
||||
def InstallVersionedBuilderWrapper(env, target=None, source=None, dir=None, **kw):
|
||||
if target and dir:
|
||||
import SCons.Errors
|
||||
raise SCons.Errors.UserError("Both target and dir defined for Install(), only one may be defined.")
|
||||
if not dir:
|
||||
dir=target
|
||||
|
||||
import SCons.Script
|
||||
install_sandbox = SCons.Script.GetOption('install_sandbox')
|
||||
if install_sandbox:
|
||||
target_factory = DESTDIR_factory(env, install_sandbox)
|
||||
else:
|
||||
target_factory = env.fs
|
||||
|
||||
try:
|
||||
dnodes = env.arg2nodes(dir, target_factory.Dir)
|
||||
except TypeError:
|
||||
raise SCons.Errors.UserError("Target `%s' of Install() is a file, but should be a directory. Perhaps you have the Install() arguments backwards?" % str(dir))
|
||||
sources = env.arg2nodes(source, env.fs.Entry)
|
||||
tgt = []
|
||||
for dnode in dnodes:
|
||||
for src in sources:
|
||||
# Prepend './' so the lookup doesn't interpret an initial
|
||||
# '#' on the file name portion as meaning the Node should
|
||||
# be relative to the top-level SConstruct directory.
|
||||
target = env.fs.Entry('.'+os.sep+src.name, dnode)
|
||||
tgt.extend(BaseVersionedInstallBuilder(env, target, src, **kw))
|
||||
return tgt
|
||||
|
||||
added = None
|
||||
|
||||
|
||||
def generate(env):
|
||||
|
||||
from SCons.Script import AddOption, GetOption
|
||||
global added
|
||||
if not added:
|
||||
added = 1
|
||||
AddOption('--install-sandbox',
|
||||
dest='install_sandbox',
|
||||
type="string",
|
||||
action="store",
|
||||
help='A directory under which all installed files will be placed.')
|
||||
|
||||
global BaseInstallBuilder
|
||||
if BaseInstallBuilder is None:
|
||||
install_sandbox = GetOption('install_sandbox')
|
||||
if install_sandbox:
|
||||
target_factory = DESTDIR_factory(env, install_sandbox)
|
||||
else:
|
||||
target_factory = env.fs
|
||||
|
||||
BaseInstallBuilder = SCons.Builder.Builder(
|
||||
action = install_action,
|
||||
target_factory = target_factory.Entry,
|
||||
source_factory = env.fs.Entry,
|
||||
multi = 1,
|
||||
emitter = [ add_targets_to_INSTALLED_FILES, ],
|
||||
source_scanner = SCons.Scanner.Base( {}, name = 'Install', recursive = False ),
|
||||
name = 'InstallBuilder')
|
||||
|
||||
global BaseVersionedInstallBuilder
|
||||
if BaseVersionedInstallBuilder is None:
|
||||
install_sandbox = GetOption('install_sandbox')
|
||||
if install_sandbox:
|
||||
target_factory = DESTDIR_factory(env, install_sandbox)
|
||||
else:
|
||||
target_factory = env.fs
|
||||
|
||||
BaseVersionedInstallBuilder = SCons.Builder.Builder(
|
||||
action = installVerLib_action,
|
||||
target_factory = target_factory.Entry,
|
||||
source_factory = env.fs.Entry,
|
||||
multi = 1,
|
||||
emitter = [ add_versioned_targets_to_INSTALLED_FILES, ],
|
||||
name = 'InstallVersionedBuilder')
|
||||
|
||||
env['BUILDERS']['_InternalInstall'] = InstallBuilderWrapper
|
||||
env['BUILDERS']['_InternalInstallAs'] = InstallAsBuilderWrapper
|
||||
env['BUILDERS']['_InternalInstallVersionedLib'] = InstallVersionedBuilderWrapper
|
||||
|
||||
# We'd like to initialize this doing something like the following,
|
||||
# but there isn't yet support for a ${SOURCE.type} expansion that
|
||||
# will print "file" or "directory" depending on what's being
|
||||
# installed. For now we punt by not initializing it, and letting
|
||||
# the stringFunc() that we put in the action fall back to the
|
||||
# hand-crafted default string if it's not set.
|
||||
#
|
||||
#try:
|
||||
# env['INSTALLSTR']
|
||||
#except KeyError:
|
||||
# env['INSTALLSTR'] = 'Install ${SOURCE.type}: "$SOURCES" as "$TARGETS"'
|
||||
|
||||
try:
|
||||
env['INSTALL']
|
||||
except KeyError:
|
||||
env['INSTALL'] = copyFunc
|
||||
|
||||
try:
|
||||
env['INSTALLVERSIONEDLIB']
|
||||
except KeyError:
|
||||
env['INSTALLVERSIONEDLIB'] = copyFuncVersionedLib
|
||||
|
||||
def exists(env):
|
||||
return 1
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
613
scons-local-3.0.0/SCons/Tool/intelc.py
Normal file
613
scons-local-3.0.0/SCons/Tool/intelc.py
Normal file
@@ -0,0 +1,613 @@
|
||||
"""SCons.Tool.icl
|
||||
|
||||
Tool-specific initialization for the Intel C/C++ compiler.
|
||||
Supports Linux and Windows compilers, v7 and up.
|
||||
|
||||
There normally shouldn't be any need to import this module directly.
|
||||
It will usually be imported through the generic SCons.Tool.Tool()
|
||||
selection method.
|
||||
|
||||
"""
|
||||
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
from __future__ import division, print_function
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/intelc.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
import math, sys, os.path, glob, string, re
|
||||
|
||||
is_windows = sys.platform == 'win32'
|
||||
is_win64 = is_windows and (os.environ['PROCESSOR_ARCHITECTURE'] == 'AMD64' or
|
||||
('PROCESSOR_ARCHITEW6432' in os.environ and
|
||||
os.environ['PROCESSOR_ARCHITEW6432'] == 'AMD64'))
|
||||
is_linux = sys.platform.startswith('linux')
|
||||
is_mac = sys.platform == 'darwin'
|
||||
|
||||
if is_windows:
|
||||
import SCons.Tool.msvc
|
||||
elif is_linux:
|
||||
import SCons.Tool.gcc
|
||||
elif is_mac:
|
||||
import SCons.Tool.gcc
|
||||
import SCons.Util
|
||||
import SCons.Warnings
|
||||
|
||||
# Exceptions for this tool
|
||||
class IntelCError(SCons.Errors.InternalError):
|
||||
pass
|
||||
class MissingRegistryError(IntelCError): # missing registry entry
|
||||
pass
|
||||
class MissingDirError(IntelCError): # dir not found
|
||||
pass
|
||||
class NoRegistryModuleError(IntelCError): # can't read registry at all
|
||||
pass
|
||||
|
||||
def linux_ver_normalize(vstr):
|
||||
"""Normalize a Linux compiler version number.
|
||||
Intel changed from "80" to "9.0" in 2005, so we assume if the number
|
||||
is greater than 60 it's an old-style number and otherwise new-style.
|
||||
Always returns an old-style float like 80 or 90 for compatibility with Windows.
|
||||
Shades of Y2K!"""
|
||||
# Check for version number like 9.1.026: return 91.026
|
||||
# XXX needs to be updated for 2011+ versions (like 2011.11.344 which is compiler v12.1.5)
|
||||
m = re.match(r'([0-9]+)\.([0-9]+)\.([0-9]+)', vstr)
|
||||
if m:
|
||||
vmaj,vmin,build = m.groups()
|
||||
return float(vmaj) * 10. + float(vmin) + float(build) / 1000.;
|
||||
else:
|
||||
f = float(vstr)
|
||||
if is_windows:
|
||||
return f
|
||||
else:
|
||||
if f < 60: return f * 10.0
|
||||
else: return f
|
||||
|
||||
def check_abi(abi):
|
||||
"""Check for valid ABI (application binary interface) name,
|
||||
and map into canonical one"""
|
||||
if not abi:
|
||||
return None
|
||||
abi = abi.lower()
|
||||
# valid_abis maps input name to canonical name
|
||||
if is_windows:
|
||||
valid_abis = {'ia32' : 'ia32',
|
||||
'x86' : 'ia32',
|
||||
'ia64' : 'ia64',
|
||||
'em64t' : 'em64t',
|
||||
'amd64' : 'em64t'}
|
||||
if is_linux:
|
||||
valid_abis = {'ia32' : 'ia32',
|
||||
'x86' : 'ia32',
|
||||
'x86_64' : 'x86_64',
|
||||
'em64t' : 'x86_64',
|
||||
'amd64' : 'x86_64'}
|
||||
if is_mac:
|
||||
valid_abis = {'ia32' : 'ia32',
|
||||
'x86' : 'ia32',
|
||||
'x86_64' : 'x86_64',
|
||||
'em64t' : 'x86_64'}
|
||||
try:
|
||||
abi = valid_abis[abi]
|
||||
except KeyError:
|
||||
raise SCons.Errors.UserError("Intel compiler: Invalid ABI %s, valid values are %s"% \
|
||||
(abi, list(valid_abis.keys())))
|
||||
return abi
|
||||
|
||||
def vercmp(a, b):
|
||||
"""Compare strings as floats,
|
||||
but Intel changed Linux naming convention at 9.0"""
|
||||
return cmp(linux_ver_normalize(b), linux_ver_normalize(a))
|
||||
|
||||
def get_version_from_list(v, vlist):
|
||||
"""See if we can match v (string) in vlist (list of strings)
|
||||
Linux has to match in a fuzzy way."""
|
||||
if is_windows:
|
||||
# Simple case, just find it in the list
|
||||
if v in vlist: return v
|
||||
else: return None
|
||||
else:
|
||||
# Fuzzy match: normalize version number first, but still return
|
||||
# original non-normalized form.
|
||||
fuzz = 0.001
|
||||
for vi in vlist:
|
||||
if math.fabs(linux_ver_normalize(vi) - linux_ver_normalize(v)) < fuzz:
|
||||
return vi
|
||||
# Not found
|
||||
return None
|
||||
|
||||
def get_intel_registry_value(valuename, version=None, abi=None):
|
||||
"""
|
||||
Return a value from the Intel compiler registry tree. (Windows only)
|
||||
"""
|
||||
# Open the key:
|
||||
if is_win64:
|
||||
K = 'Software\\Wow6432Node\\Intel\\Compilers\\C++\\' + version + '\\'+abi.upper()
|
||||
else:
|
||||
K = 'Software\\Intel\\Compilers\\C++\\' + version + '\\'+abi.upper()
|
||||
try:
|
||||
k = SCons.Util.RegOpenKeyEx(SCons.Util.HKEY_LOCAL_MACHINE, K)
|
||||
except SCons.Util.RegError:
|
||||
# For version 13 and later, check UUID subkeys for valuename
|
||||
if is_win64:
|
||||
K = 'Software\\Wow6432Node\\Intel\\Suites\\' + version + "\\Defaults\\C++\\" + abi.upper()
|
||||
else:
|
||||
K = 'Software\\Intel\\Suites\\' + version + "\\Defaults\\C++\\" + abi.upper()
|
||||
try:
|
||||
k = SCons.Util.RegOpenKeyEx(SCons.Util.HKEY_LOCAL_MACHINE, K)
|
||||
uuid = SCons.Util.RegQueryValueEx(k, 'SubKey')[0]
|
||||
|
||||
if is_win64:
|
||||
K = 'Software\\Wow6432Node\\Intel\\Suites\\' + version + "\\" + uuid + "\\C++"
|
||||
else:
|
||||
K = 'Software\\Intel\\Suites\\' + version + "\\" + uuid + "\\C++"
|
||||
k = SCons.Util.RegOpenKeyEx(SCons.Util.HKEY_LOCAL_MACHINE, K)
|
||||
|
||||
try:
|
||||
v = SCons.Util.RegQueryValueEx(k, valuename)[0]
|
||||
return v # or v.encode('iso-8859-1', 'replace') to remove unicode?
|
||||
except SCons.Util.RegError:
|
||||
if abi.upper() == 'EM64T':
|
||||
abi = 'em64t_native'
|
||||
if is_win64:
|
||||
K = 'Software\\Wow6432Node\\Intel\\Suites\\' + version + "\\" + uuid + "\\C++\\" + abi.upper()
|
||||
else:
|
||||
K = 'Software\\Intel\\Suites\\' + version + "\\" + uuid + "\\C++\\" + abi.upper()
|
||||
k = SCons.Util.RegOpenKeyEx(SCons.Util.HKEY_LOCAL_MACHINE, K)
|
||||
|
||||
try:
|
||||
v = SCons.Util.RegQueryValueEx(k, valuename)[0]
|
||||
return v # or v.encode('iso-8859-1', 'replace') to remove unicode?
|
||||
except SCons.Util.RegError:
|
||||
raise MissingRegistryError("%s was not found in the registry, for Intel compiler version %s, abi='%s'"%(K, version,abi))
|
||||
|
||||
except SCons.Util.RegError:
|
||||
raise MissingRegistryError("%s was not found in the registry, for Intel compiler version %s, abi='%s'"%(K, version,abi))
|
||||
except SCons.Util.WinError:
|
||||
raise MissingRegistryError("%s was not found in the registry, for Intel compiler version %s, abi='%s'"%(K, version,abi))
|
||||
|
||||
# Get the value:
|
||||
try:
|
||||
v = SCons.Util.RegQueryValueEx(k, valuename)[0]
|
||||
return v # or v.encode('iso-8859-1', 'replace') to remove unicode?
|
||||
except SCons.Util.RegError:
|
||||
raise MissingRegistryError("%s\\%s was not found in the registry."%(K, valuename))
|
||||
|
||||
|
||||
def get_all_compiler_versions():
|
||||
"""Returns a sorted list of strings, like "70" or "80" or "9.0"
|
||||
with most recent compiler version first.
|
||||
"""
|
||||
versions=[]
|
||||
if is_windows:
|
||||
if is_win64:
|
||||
keyname = 'Software\\WoW6432Node\\Intel\\Compilers\\C++'
|
||||
else:
|
||||
keyname = 'Software\\Intel\\Compilers\\C++'
|
||||
try:
|
||||
k = SCons.Util.RegOpenKeyEx(SCons.Util.HKEY_LOCAL_MACHINE,
|
||||
keyname)
|
||||
except SCons.Util.WinError:
|
||||
# For version 13 or later, check for default instance UUID
|
||||
if is_win64:
|
||||
keyname = 'Software\\WoW6432Node\\Intel\\Suites'
|
||||
else:
|
||||
keyname = 'Software\\Intel\\Suites'
|
||||
try:
|
||||
k = SCons.Util.RegOpenKeyEx(SCons.Util.HKEY_LOCAL_MACHINE,
|
||||
keyname)
|
||||
except SCons.Util.WinError:
|
||||
return []
|
||||
i = 0
|
||||
versions = []
|
||||
try:
|
||||
while i < 100:
|
||||
subkey = SCons.Util.RegEnumKey(k, i) # raises EnvironmentError
|
||||
# Check that this refers to an existing dir.
|
||||
# This is not 100% perfect but should catch common
|
||||
# installation issues like when the compiler was installed
|
||||
# and then the install directory deleted or moved (rather
|
||||
# than uninstalling properly), so the registry values
|
||||
# are still there.
|
||||
if subkey == 'Defaults': # Ignore default instances
|
||||
i = i + 1
|
||||
continue
|
||||
ok = False
|
||||
for try_abi in ('IA32', 'IA32e', 'IA64', 'EM64T'):
|
||||
try:
|
||||
d = get_intel_registry_value('ProductDir', subkey, try_abi)
|
||||
except MissingRegistryError:
|
||||
continue # not found in reg, keep going
|
||||
if os.path.exists(d): ok = True
|
||||
if ok:
|
||||
versions.append(subkey)
|
||||
else:
|
||||
try:
|
||||
# Registry points to nonexistent dir. Ignore this
|
||||
# version.
|
||||
value = get_intel_registry_value('ProductDir', subkey, 'IA32')
|
||||
except MissingRegistryError as e:
|
||||
|
||||
# Registry key is left dangling (potentially
|
||||
# after uninstalling).
|
||||
|
||||
print("scons: *** Ignoring the registry key for the Intel compiler version %s.\n" \
|
||||
"scons: *** It seems that the compiler was uninstalled and that the registry\n" \
|
||||
"scons: *** was not cleaned up properly.\n" % subkey)
|
||||
else:
|
||||
print("scons: *** Ignoring "+str(value))
|
||||
|
||||
i = i + 1
|
||||
except EnvironmentError:
|
||||
# no more subkeys
|
||||
pass
|
||||
elif is_linux or is_mac:
|
||||
for d in glob.glob('/opt/intel_cc_*'):
|
||||
# Typical dir here is /opt/intel_cc_80.
|
||||
m = re.search(r'cc_(.*)$', d)
|
||||
if m:
|
||||
versions.append(m.group(1))
|
||||
for d in glob.glob('/opt/intel/cc*/*'):
|
||||
# Typical dir here is /opt/intel/cc/9.0 for IA32,
|
||||
# /opt/intel/cce/9.0 for EMT64 (AMD64)
|
||||
m = re.search(r'([0-9][0-9.]*)$', d)
|
||||
if m:
|
||||
versions.append(m.group(1))
|
||||
for d in glob.glob('/opt/intel/Compiler/*'):
|
||||
# Typical dir here is /opt/intel/Compiler/11.1
|
||||
m = re.search(r'([0-9][0-9.]*)$', d)
|
||||
if m:
|
||||
versions.append(m.group(1))
|
||||
for d in glob.glob('/opt/intel/composerxe-*'):
|
||||
# Typical dir here is /opt/intel/composerxe-2011.4.184
|
||||
m = re.search(r'([0-9][0-9.]*)$', d)
|
||||
if m:
|
||||
versions.append(m.group(1))
|
||||
for d in glob.glob('/opt/intel/composer_xe_*'):
|
||||
# Typical dir here is /opt/intel/composer_xe_2011_sp1.11.344
|
||||
# The _sp1 is useless, the installers are named 2011.9.x, 2011.10.x, 2011.11.x
|
||||
m = re.search(r'([0-9]{0,4})(?:_sp\d*)?\.([0-9][0-9.]*)$', d)
|
||||
if m:
|
||||
versions.append("%s.%s"%(m.group(1), m.group(2)))
|
||||
for d in glob.glob('/opt/intel/compilers_and_libraries_*'):
|
||||
# JPA: For the new version of Intel compiler 2016.1.
|
||||
m = re.search(r'([0-9]{0,4})(?:_sp\d*)?\.([0-9][0-9.]*)$', d)
|
||||
if m:
|
||||
versions.append("%s.%s"%(m.group(1), m.group(2)))
|
||||
|
||||
def keyfunc(str):
|
||||
"""Given a dot-separated version string, return a tuple of ints representing it."""
|
||||
return [int(x) for x in str.split('.')]
|
||||
# split into ints, sort, then remove dups
|
||||
return sorted(SCons.Util.unique(versions), key=keyfunc, reverse=True)
|
||||
|
||||
def get_intel_compiler_top(version, abi):
|
||||
"""
|
||||
Return the main path to the top-level dir of the Intel compiler,
|
||||
using the given version.
|
||||
The compiler will be in <top>/bin/icl.exe (icc on linux),
|
||||
the include dir is <top>/include, etc.
|
||||
"""
|
||||
|
||||
if is_windows:
|
||||
if not SCons.Util.can_read_reg:
|
||||
raise NoRegistryModuleError("No Windows registry module was found")
|
||||
top = get_intel_registry_value('ProductDir', version, abi)
|
||||
archdir={'x86_64': 'intel64',
|
||||
'amd64' : 'intel64',
|
||||
'em64t' : 'intel64',
|
||||
'x86' : 'ia32',
|
||||
'i386' : 'ia32',
|
||||
'ia32' : 'ia32'
|
||||
}[abi] # for v11 and greater
|
||||
# pre-11, icl was in Bin. 11 and later, it's in Bin/<abi> apparently.
|
||||
if not os.path.exists(os.path.join(top, "Bin", "icl.exe")) \
|
||||
and not os.path.exists(os.path.join(top, "Bin", abi, "icl.exe")) \
|
||||
and not os.path.exists(os.path.join(top, "Bin", archdir, "icl.exe")):
|
||||
raise MissingDirError("Can't find Intel compiler in %s"%(top))
|
||||
elif is_mac or is_linux:
|
||||
def find_in_2008style_dir(version):
|
||||
# first dir is new (>=9.0) style, second is old (8.0) style.
|
||||
dirs=('/opt/intel/cc/%s', '/opt/intel_cc_%s')
|
||||
if abi == 'x86_64':
|
||||
dirs=('/opt/intel/cce/%s',) # 'e' stands for 'em64t', aka x86_64 aka amd64
|
||||
top=None
|
||||
for d in dirs:
|
||||
if os.path.exists(os.path.join(d%version, "bin", "icc")):
|
||||
top = d%version
|
||||
break
|
||||
return top
|
||||
def find_in_2010style_dir(version):
|
||||
dirs=('/opt/intel/Compiler/%s/*'%version)
|
||||
# typically /opt/intel/Compiler/11.1/064 (then bin/intel64/icc)
|
||||
dirs=glob.glob(dirs)
|
||||
# find highest sub-version number by reverse sorting and picking first existing one.
|
||||
dirs.sort()
|
||||
dirs.reverse()
|
||||
top=None
|
||||
for d in dirs:
|
||||
if (os.path.exists(os.path.join(d, "bin", "ia32", "icc")) or
|
||||
os.path.exists(os.path.join(d, "bin", "intel64", "icc"))):
|
||||
top = d
|
||||
break
|
||||
return top
|
||||
def find_in_2011style_dir(version):
|
||||
# The 2011 (compiler v12) dirs are inconsistent, so just redo the search from
|
||||
# get_all_compiler_versions and look for a match (search the newest form first)
|
||||
top=None
|
||||
for d in glob.glob('/opt/intel/composer_xe_*'):
|
||||
# Typical dir here is /opt/intel/composer_xe_2011_sp1.11.344
|
||||
# The _sp1 is useless, the installers are named 2011.9.x, 2011.10.x, 2011.11.x
|
||||
m = re.search(r'([0-9]{0,4})(?:_sp\d*)?\.([0-9][0-9.]*)$', d)
|
||||
if m:
|
||||
cur_ver = "%s.%s"%(m.group(1), m.group(2))
|
||||
if cur_ver == version and \
|
||||
(os.path.exists(os.path.join(d, "bin", "ia32", "icc")) or
|
||||
os.path.exists(os.path.join(d, "bin", "intel64", "icc"))):
|
||||
top = d
|
||||
break
|
||||
if not top:
|
||||
for d in glob.glob('/opt/intel/composerxe-*'):
|
||||
# Typical dir here is /opt/intel/composerxe-2011.4.184
|
||||
m = re.search(r'([0-9][0-9.]*)$', d)
|
||||
if m and m.group(1) == version and \
|
||||
(os.path.exists(os.path.join(d, "bin", "ia32", "icc")) or
|
||||
os.path.exists(os.path.join(d, "bin", "intel64", "icc"))):
|
||||
top = d
|
||||
break
|
||||
return top
|
||||
def find_in_2016style_dir(version):
|
||||
# The 2016 (compiler v16) dirs are inconsistent from previous.
|
||||
top = None
|
||||
for d in glob.glob('/opt/intel/compilers_and_libraries_%s/linux'%version):
|
||||
if os.path.exists(os.path.join(d, "bin", "ia32", "icc")) or os.path.exists(os.path.join(d, "bin", "intel64", "icc")):
|
||||
top = d
|
||||
break
|
||||
return top
|
||||
|
||||
top = find_in_2016style_dir(version) or find_in_2011style_dir(version) or find_in_2010style_dir(version) or find_in_2008style_dir(version)
|
||||
# print "INTELC: top=",top
|
||||
if not top:
|
||||
raise MissingDirError("Can't find version %s Intel compiler in %s (abi='%s')"%(version,top, abi))
|
||||
return top
|
||||
|
||||
|
||||
def generate(env, version=None, abi=None, topdir=None, verbose=0):
|
||||
"""Add Builders and construction variables for Intel C/C++ compiler
|
||||
to an Environment.
|
||||
args:
|
||||
version: (string) compiler version to use, like "80"
|
||||
abi: (string) 'win32' or whatever Itanium version wants
|
||||
topdir: (string) compiler top dir, like
|
||||
"c:\Program Files\Intel\Compiler70"
|
||||
If topdir is used, version and abi are ignored.
|
||||
verbose: (int) if >0, prints compiler version used.
|
||||
"""
|
||||
if not (is_mac or is_linux or is_windows):
|
||||
# can't handle this platform
|
||||
return
|
||||
|
||||
if is_windows:
|
||||
SCons.Tool.msvc.generate(env)
|
||||
elif is_linux:
|
||||
SCons.Tool.gcc.generate(env)
|
||||
elif is_mac:
|
||||
SCons.Tool.gcc.generate(env)
|
||||
|
||||
# if version is unspecified, use latest
|
||||
vlist = get_all_compiler_versions()
|
||||
if not version:
|
||||
if vlist:
|
||||
version = vlist[0]
|
||||
else:
|
||||
# User may have specified '90' but we need to get actual dirname '9.0'.
|
||||
# get_version_from_list does that mapping.
|
||||
v = get_version_from_list(version, vlist)
|
||||
if not v:
|
||||
raise SCons.Errors.UserError("Invalid Intel compiler version %s: "%version + \
|
||||
"installed versions are %s"%(', '.join(vlist)))
|
||||
version = v
|
||||
|
||||
# if abi is unspecified, use ia32
|
||||
# alternatives are ia64 for Itanium, or amd64 or em64t or x86_64 (all synonyms here)
|
||||
abi = check_abi(abi)
|
||||
if abi is None:
|
||||
if is_mac or is_linux:
|
||||
# Check if we are on 64-bit linux, default to 64 then.
|
||||
uname_m = os.uname()[4]
|
||||
if uname_m == 'x86_64':
|
||||
abi = 'x86_64'
|
||||
else:
|
||||
abi = 'ia32'
|
||||
else:
|
||||
if is_win64:
|
||||
abi = 'em64t'
|
||||
else:
|
||||
abi = 'ia32'
|
||||
|
||||
if version and not topdir:
|
||||
try:
|
||||
topdir = get_intel_compiler_top(version, abi)
|
||||
except (SCons.Util.RegError, IntelCError):
|
||||
topdir = None
|
||||
|
||||
if not topdir:
|
||||
# Normally this is an error, but it might not be if the compiler is
|
||||
# on $PATH and the user is importing their env.
|
||||
class ICLTopDirWarning(SCons.Warnings.Warning):
|
||||
pass
|
||||
if (is_mac or is_linux) and not env.Detect('icc') or \
|
||||
is_windows and not env.Detect('icl'):
|
||||
|
||||
SCons.Warnings.enableWarningClass(ICLTopDirWarning)
|
||||
SCons.Warnings.warn(ICLTopDirWarning,
|
||||
"Failed to find Intel compiler for version='%s', abi='%s'"%
|
||||
(str(version), str(abi)))
|
||||
else:
|
||||
# should be cleaned up to say what this other version is
|
||||
# since in this case we have some other Intel compiler installed
|
||||
SCons.Warnings.enableWarningClass(ICLTopDirWarning)
|
||||
SCons.Warnings.warn(ICLTopDirWarning,
|
||||
"Can't find Intel compiler top dir for version='%s', abi='%s'"%
|
||||
(str(version), str(abi)))
|
||||
|
||||
if topdir:
|
||||
archdir={'x86_64': 'intel64',
|
||||
'amd64' : 'intel64',
|
||||
'em64t' : 'intel64',
|
||||
'x86' : 'ia32',
|
||||
'i386' : 'ia32',
|
||||
'ia32' : 'ia32'
|
||||
}[abi] # for v11 and greater
|
||||
if os.path.exists(os.path.join(topdir, 'bin', archdir)):
|
||||
bindir="bin/%s"%archdir
|
||||
libdir="lib/%s"%archdir
|
||||
else:
|
||||
bindir="bin"
|
||||
libdir="lib"
|
||||
if verbose:
|
||||
print("Intel C compiler: using version %s (%g), abi %s, in '%s/%s'"%\
|
||||
(repr(version), linux_ver_normalize(version),abi,topdir,bindir))
|
||||
if is_linux:
|
||||
# Show the actual compiler version by running the compiler.
|
||||
os.system('%s/%s/icc --version'%(topdir,bindir))
|
||||
if is_mac:
|
||||
# Show the actual compiler version by running the compiler.
|
||||
os.system('%s/%s/icc --version'%(topdir,bindir))
|
||||
|
||||
env['INTEL_C_COMPILER_TOP'] = topdir
|
||||
if is_linux:
|
||||
paths={'INCLUDE' : 'include',
|
||||
'LIB' : libdir,
|
||||
'PATH' : bindir,
|
||||
'LD_LIBRARY_PATH' : libdir}
|
||||
for p in list(paths.keys()):
|
||||
env.PrependENVPath(p, os.path.join(topdir, paths[p]))
|
||||
if is_mac:
|
||||
paths={'INCLUDE' : 'include',
|
||||
'LIB' : libdir,
|
||||
'PATH' : bindir,
|
||||
'LD_LIBRARY_PATH' : libdir}
|
||||
for p in list(paths.keys()):
|
||||
env.PrependENVPath(p, os.path.join(topdir, paths[p]))
|
||||
if is_windows:
|
||||
# env key reg valname default subdir of top
|
||||
paths=(('INCLUDE', 'IncludeDir', 'Include'),
|
||||
('LIB' , 'LibDir', 'Lib'),
|
||||
('PATH' , 'BinDir', 'Bin'))
|
||||
# We are supposed to ignore version if topdir is set, so set
|
||||
# it to the emptry string if it's not already set.
|
||||
if version is None:
|
||||
version = ''
|
||||
# Each path has a registry entry, use that or default to subdir
|
||||
for p in paths:
|
||||
try:
|
||||
path=get_intel_registry_value(p[1], version, abi)
|
||||
# These paths may have $(ICInstallDir)
|
||||
# which needs to be substituted with the topdir.
|
||||
path=path.replace('$(ICInstallDir)', topdir + os.sep)
|
||||
except IntelCError:
|
||||
# Couldn't get it from registry: use default subdir of topdir
|
||||
env.PrependENVPath(p[0], os.path.join(topdir, p[2]))
|
||||
else:
|
||||
env.PrependENVPath(p[0], path.split(os.pathsep))
|
||||
# print "ICL %s: %s, final=%s"%(p[0], path, str(env['ENV'][p[0]]))
|
||||
|
||||
if is_windows:
|
||||
env['CC'] = 'icl'
|
||||
env['CXX'] = 'icl'
|
||||
env['LINK'] = 'xilink'
|
||||
else:
|
||||
env['CC'] = 'icc'
|
||||
env['CXX'] = 'icpc'
|
||||
# Don't reset LINK here;
|
||||
# use smart_link which should already be here from link.py.
|
||||
#env['LINK'] = '$CC'
|
||||
env['AR'] = 'xiar'
|
||||
env['LD'] = 'xild' # not used by default
|
||||
|
||||
# This is not the exact (detailed) compiler version,
|
||||
# just the major version as determined above or specified
|
||||
# by the user. It is a float like 80 or 90, in normalized form for Linux
|
||||
# (i.e. even for Linux 9.0 compiler, still returns 90 rather than 9.0)
|
||||
if version:
|
||||
env['INTEL_C_COMPILER_VERSION']=linux_ver_normalize(version)
|
||||
|
||||
if is_windows:
|
||||
# Look for license file dir
|
||||
# in system environment, registry, and default location.
|
||||
envlicdir = os.environ.get("INTEL_LICENSE_FILE", '')
|
||||
K = ('SOFTWARE\Intel\Licenses')
|
||||
try:
|
||||
k = SCons.Util.RegOpenKeyEx(SCons.Util.HKEY_LOCAL_MACHINE, K)
|
||||
reglicdir = SCons.Util.RegQueryValueEx(k, "w_cpp")[0]
|
||||
except (AttributeError, SCons.Util.RegError):
|
||||
reglicdir = ""
|
||||
defaultlicdir = r'C:\Program Files\Common Files\Intel\Licenses'
|
||||
|
||||
licdir = None
|
||||
for ld in [envlicdir, reglicdir]:
|
||||
# If the string contains an '@', then assume it's a network
|
||||
# license (port@system) and good by definition.
|
||||
if ld and (ld.find('@') != -1 or os.path.exists(ld)):
|
||||
licdir = ld
|
||||
break
|
||||
if not licdir:
|
||||
licdir = defaultlicdir
|
||||
if not os.path.exists(licdir):
|
||||
class ICLLicenseDirWarning(SCons.Warnings.Warning):
|
||||
pass
|
||||
SCons.Warnings.enableWarningClass(ICLLicenseDirWarning)
|
||||
SCons.Warnings.warn(ICLLicenseDirWarning,
|
||||
"Intel license dir was not found."
|
||||
" Tried using the INTEL_LICENSE_FILE environment variable (%s), the registry (%s) and the default path (%s)."
|
||||
" Using the default path as a last resort."
|
||||
% (envlicdir, reglicdir, defaultlicdir))
|
||||
env['ENV']['INTEL_LICENSE_FILE'] = licdir
|
||||
|
||||
def exists(env):
|
||||
if not (is_mac or is_linux or is_windows):
|
||||
# can't handle this platform
|
||||
return 0
|
||||
|
||||
try:
|
||||
versions = get_all_compiler_versions()
|
||||
except (SCons.Util.RegError, IntelCError):
|
||||
versions = None
|
||||
detected = versions is not None and len(versions) > 0
|
||||
if not detected:
|
||||
# try env.Detect, maybe that will work
|
||||
if is_windows:
|
||||
return env.Detect('icl')
|
||||
elif is_linux:
|
||||
return env.Detect('icc')
|
||||
elif is_mac:
|
||||
return env.Detect('icc')
|
||||
return detected
|
||||
|
||||
# end of file
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
73
scons-local-3.0.0/SCons/Tool/ipkg.py
Normal file
73
scons-local-3.0.0/SCons/Tool/ipkg.py
Normal file
@@ -0,0 +1,73 @@
|
||||
"""SCons.Tool.ipkg
|
||||
|
||||
Tool-specific initialization for ipkg.
|
||||
|
||||
There normally shouldn't be any need to import this module directly.
|
||||
It will usually be imported through the generic SCons.Tool.Tool()
|
||||
selection method.
|
||||
|
||||
The ipkg tool calls the ipkg-build. Its only argument should be the
|
||||
packages fake_root.
|
||||
"""
|
||||
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/ipkg.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
import os
|
||||
|
||||
import SCons.Builder
|
||||
|
||||
def generate(env):
|
||||
"""Add Builders and construction variables for ipkg to an Environment."""
|
||||
try:
|
||||
bld = env['BUILDERS']['Ipkg']
|
||||
except KeyError:
|
||||
bld = SCons.Builder.Builder(action='$IPKGCOM',
|
||||
suffix='$IPKGSUFFIX',
|
||||
source_scanner=None,
|
||||
target_scanner=None)
|
||||
env['BUILDERS']['Ipkg'] = bld
|
||||
|
||||
|
||||
env['IPKG'] = 'ipkg-build'
|
||||
env['IPKGCOM'] = '$IPKG $IPKGFLAGS ${SOURCE}'
|
||||
|
||||
if env.WhereIs('id'):
|
||||
env['IPKGUSER'] = os.popen('id -un').read().strip()
|
||||
env['IPKGGROUP'] = os.popen('id -gn').read().strip()
|
||||
env['IPKGFLAGS'] = SCons.Util.CLVar('-o $IPKGUSER -g $IPKGGROUP')
|
||||
env['IPKGSUFFIX'] = '.ipk'
|
||||
|
||||
def exists(env):
|
||||
"""
|
||||
Can we find the tool
|
||||
"""
|
||||
return env.Detect('ipkg-build')
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
116
scons-local-3.0.0/SCons/Tool/jar.py
Normal file
116
scons-local-3.0.0/SCons/Tool/jar.py
Normal file
@@ -0,0 +1,116 @@
|
||||
"""SCons.Tool.jar
|
||||
|
||||
Tool-specific initialization for jar.
|
||||
|
||||
There normally shouldn't be any need to import this module directly.
|
||||
It will usually be imported through the generic SCons.Tool.Tool()
|
||||
selection method.
|
||||
|
||||
"""
|
||||
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/jar.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
import SCons.Subst
|
||||
import SCons.Util
|
||||
|
||||
def jarSources(target, source, env, for_signature):
|
||||
"""Only include sources that are not a manifest file."""
|
||||
try:
|
||||
env['JARCHDIR']
|
||||
except KeyError:
|
||||
jarchdir_set = False
|
||||
else:
|
||||
jarchdir_set = True
|
||||
jarchdir = env.subst('$JARCHDIR', target=target, source=source)
|
||||
if jarchdir:
|
||||
jarchdir = env.fs.Dir(jarchdir)
|
||||
result = []
|
||||
for src in source:
|
||||
contents = src.get_text_contents()
|
||||
if contents[:16] != "Manifest-Version":
|
||||
if jarchdir_set:
|
||||
_chdir = jarchdir
|
||||
else:
|
||||
try:
|
||||
_chdir = src.attributes.java_classdir
|
||||
except AttributeError:
|
||||
_chdir = None
|
||||
if _chdir:
|
||||
# If we are changing the dir with -C, then sources should
|
||||
# be relative to that directory.
|
||||
src = SCons.Subst.Literal(src.get_path(_chdir))
|
||||
result.append('-C')
|
||||
result.append(_chdir)
|
||||
result.append(src)
|
||||
return result
|
||||
|
||||
def jarManifest(target, source, env, for_signature):
|
||||
"""Look in sources for a manifest file, if any."""
|
||||
for src in source:
|
||||
contents = src.get_text_contents()
|
||||
if contents[:16] == "Manifest-Version":
|
||||
return src
|
||||
return ''
|
||||
|
||||
def jarFlags(target, source, env, for_signature):
|
||||
"""If we have a manifest, make sure that the 'm'
|
||||
flag is specified."""
|
||||
jarflags = env.subst('$JARFLAGS', target=target, source=source)
|
||||
for src in source:
|
||||
contents = src.get_text_contents()
|
||||
if contents[:16] == "Manifest-Version":
|
||||
if not 'm' in jarflags:
|
||||
return jarflags + 'm'
|
||||
break
|
||||
return jarflags
|
||||
|
||||
def generate(env):
|
||||
"""Add Builders and construction variables for jar to an Environment."""
|
||||
SCons.Tool.CreateJarBuilder(env)
|
||||
|
||||
env['JAR'] = 'jar'
|
||||
env['JARFLAGS'] = SCons.Util.CLVar('cf')
|
||||
env['_JARFLAGS'] = jarFlags
|
||||
env['_JARMANIFEST'] = jarManifest
|
||||
env['_JARSOURCES'] = jarSources
|
||||
env['_JARCOM'] = '$JAR $_JARFLAGS $TARGET $_JARMANIFEST $_JARSOURCES'
|
||||
env['JARCOM'] = "${TEMPFILE('$_JARCOM','$JARCOMSTR')}"
|
||||
env['JARSUFFIX'] = '.jar'
|
||||
|
||||
def exists(env):
|
||||
# As reported by Jan Nijtmans in issue #2730, the simple
|
||||
# return env.Detect('jar')
|
||||
# doesn't always work during initialization. For now, we
|
||||
# stop trying to detect an executable (analogous to the
|
||||
# javac Builder).
|
||||
# TODO: Come up with a proper detect() routine...and enable it.
|
||||
return 1
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
232
scons-local-3.0.0/SCons/Tool/javac.py
Normal file
232
scons-local-3.0.0/SCons/Tool/javac.py
Normal file
@@ -0,0 +1,232 @@
|
||||
"""SCons.Tool.javac
|
||||
|
||||
Tool-specific initialization for javac.
|
||||
|
||||
There normally shouldn't be any need to import this module directly.
|
||||
It will usually be imported through the generic SCons.Tool.Tool()
|
||||
selection method.
|
||||
|
||||
"""
|
||||
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/javac.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
import os
|
||||
import os.path
|
||||
|
||||
import SCons.Action
|
||||
import SCons.Builder
|
||||
from SCons.Node.FS import _my_normcase
|
||||
from SCons.Tool.JavaCommon import parse_java_file
|
||||
import SCons.Util
|
||||
|
||||
def classname(path):
|
||||
"""Turn a string (path name) into a Java class name."""
|
||||
return os.path.normpath(path).replace(os.sep, '.')
|
||||
|
||||
def emit_java_classes(target, source, env):
|
||||
"""Create and return lists of source java files
|
||||
and their corresponding target class files.
|
||||
"""
|
||||
java_suffix = env.get('JAVASUFFIX', '.java')
|
||||
class_suffix = env.get('JAVACLASSSUFFIX', '.class')
|
||||
|
||||
target[0].must_be_same(SCons.Node.FS.Dir)
|
||||
classdir = target[0]
|
||||
|
||||
s = source[0].rentry().disambiguate()
|
||||
if isinstance(s, SCons.Node.FS.File):
|
||||
sourcedir = s.dir.rdir()
|
||||
elif isinstance(s, SCons.Node.FS.Dir):
|
||||
sourcedir = s.rdir()
|
||||
else:
|
||||
raise SCons.Errors.UserError("Java source must be File or Dir, not '%s'" % s.__class__)
|
||||
|
||||
slist = []
|
||||
js = _my_normcase(java_suffix)
|
||||
for entry in source:
|
||||
entry = entry.rentry().disambiguate()
|
||||
if isinstance(entry, SCons.Node.FS.File):
|
||||
slist.append(entry)
|
||||
elif isinstance(entry, SCons.Node.FS.Dir):
|
||||
result = SCons.Util.OrderedDict()
|
||||
dirnode = entry.rdir()
|
||||
def find_java_files(arg, dirpath, filenames):
|
||||
java_files = sorted([n for n in filenames
|
||||
if _my_normcase(n).endswith(js)])
|
||||
mydir = dirnode.Dir(dirpath)
|
||||
java_paths = [mydir.File(f) for f in java_files]
|
||||
for jp in java_paths:
|
||||
arg[jp] = True
|
||||
for dirpath, dirnames, filenames in os.walk(dirnode.get_abspath()):
|
||||
find_java_files(result, dirpath, filenames)
|
||||
entry.walk(find_java_files, result)
|
||||
|
||||
slist.extend(list(result.keys()))
|
||||
else:
|
||||
raise SCons.Errors.UserError("Java source must be File or Dir, not '%s'" % entry.__class__)
|
||||
|
||||
version = env.get('JAVAVERSION', '1.4')
|
||||
full_tlist = []
|
||||
for f in slist:
|
||||
tlist = []
|
||||
source_file_based = True
|
||||
pkg_dir = None
|
||||
if not f.is_derived():
|
||||
pkg_dir, classes = parse_java_file(f.rfile().get_abspath(), version)
|
||||
if classes:
|
||||
source_file_based = False
|
||||
if pkg_dir:
|
||||
d = target[0].Dir(pkg_dir)
|
||||
p = pkg_dir + os.sep
|
||||
else:
|
||||
d = target[0]
|
||||
p = ''
|
||||
for c in classes:
|
||||
t = d.File(c + class_suffix)
|
||||
t.attributes.java_classdir = classdir
|
||||
t.attributes.java_sourcedir = sourcedir
|
||||
t.attributes.java_classname = classname(p + c)
|
||||
tlist.append(t)
|
||||
|
||||
if source_file_based:
|
||||
base = f.name[:-len(java_suffix)]
|
||||
if pkg_dir:
|
||||
t = target[0].Dir(pkg_dir).File(base + class_suffix)
|
||||
else:
|
||||
t = target[0].File(base + class_suffix)
|
||||
t.attributes.java_classdir = classdir
|
||||
t.attributes.java_sourcedir = f.dir
|
||||
t.attributes.java_classname = classname(base)
|
||||
tlist.append(t)
|
||||
|
||||
for t in tlist:
|
||||
t.set_specific_source([f])
|
||||
|
||||
full_tlist.extend(tlist)
|
||||
|
||||
return full_tlist, slist
|
||||
|
||||
JavaAction = SCons.Action.Action('$JAVACCOM', '$JAVACCOMSTR')
|
||||
|
||||
JavaBuilder = SCons.Builder.Builder(action = JavaAction,
|
||||
emitter = emit_java_classes,
|
||||
target_factory = SCons.Node.FS.Entry,
|
||||
source_factory = SCons.Node.FS.Entry)
|
||||
|
||||
class pathopt(object):
|
||||
"""
|
||||
Callable object for generating javac-style path options from
|
||||
a construction variable (e.g. -classpath, -sourcepath).
|
||||
"""
|
||||
def __init__(self, opt, var, default=None):
|
||||
self.opt = opt
|
||||
self.var = var
|
||||
self.default = default
|
||||
|
||||
def __call__(self, target, source, env, for_signature):
|
||||
path = env[self.var]
|
||||
if path and not SCons.Util.is_List(path):
|
||||
path = [path]
|
||||
if self.default:
|
||||
default = env[self.default]
|
||||
if default:
|
||||
if not SCons.Util.is_List(default):
|
||||
default = [default]
|
||||
path = path + default
|
||||
if path:
|
||||
return [self.opt, os.pathsep.join(map(str, path))]
|
||||
else:
|
||||
return []
|
||||
|
||||
def Java(env, target, source, *args, **kw):
|
||||
"""
|
||||
A pseudo-Builder wrapper around the separate JavaClass{File,Dir}
|
||||
Builders.
|
||||
"""
|
||||
if not SCons.Util.is_List(target):
|
||||
target = [target]
|
||||
if not SCons.Util.is_List(source):
|
||||
source = [source]
|
||||
|
||||
# Pad the target list with repetitions of the last element in the
|
||||
# list so we have a target for every source element.
|
||||
target = target + ([target[-1]] * (len(source) - len(target)))
|
||||
|
||||
java_suffix = env.subst('$JAVASUFFIX')
|
||||
result = []
|
||||
|
||||
for t, s in zip(target, source):
|
||||
if isinstance(s, SCons.Node.FS.Base):
|
||||
if isinstance(s, SCons.Node.FS.File):
|
||||
b = env.JavaClassFile
|
||||
else:
|
||||
b = env.JavaClassDir
|
||||
else:
|
||||
if os.path.isfile(s):
|
||||
b = env.JavaClassFile
|
||||
elif os.path.isdir(s):
|
||||
b = env.JavaClassDir
|
||||
elif s[-len(java_suffix):] == java_suffix:
|
||||
b = env.JavaClassFile
|
||||
else:
|
||||
b = env.JavaClassDir
|
||||
result.extend(b(t, s, *args, **kw))
|
||||
|
||||
return result
|
||||
|
||||
def generate(env):
|
||||
"""Add Builders and construction variables for javac to an Environment."""
|
||||
java_file = SCons.Tool.CreateJavaFileBuilder(env)
|
||||
java_class = SCons.Tool.CreateJavaClassFileBuilder(env)
|
||||
java_class_dir = SCons.Tool.CreateJavaClassDirBuilder(env)
|
||||
java_class.add_emitter(None, emit_java_classes)
|
||||
java_class.add_emitter(env.subst('$JAVASUFFIX'), emit_java_classes)
|
||||
java_class_dir.emitter = emit_java_classes
|
||||
|
||||
env.AddMethod(Java)
|
||||
|
||||
env['JAVAC'] = 'javac'
|
||||
env['JAVACFLAGS'] = SCons.Util.CLVar('')
|
||||
env['JAVABOOTCLASSPATH'] = []
|
||||
env['JAVACLASSPATH'] = []
|
||||
env['JAVASOURCEPATH'] = []
|
||||
env['_javapathopt'] = pathopt
|
||||
env['_JAVABOOTCLASSPATH'] = '${_javapathopt("-bootclasspath", "JAVABOOTCLASSPATH")} '
|
||||
env['_JAVACLASSPATH'] = '${_javapathopt("-classpath", "JAVACLASSPATH")} '
|
||||
env['_JAVASOURCEPATH'] = '${_javapathopt("-sourcepath", "JAVASOURCEPATH", "_JAVASOURCEPATHDEFAULT")} '
|
||||
env['_JAVASOURCEPATHDEFAULT'] = '${TARGET.attributes.java_sourcedir}'
|
||||
env['_JAVACCOM'] = '$JAVAC $JAVACFLAGS $_JAVABOOTCLASSPATH $_JAVACLASSPATH -d ${TARGET.attributes.java_classdir} $_JAVASOURCEPATH $SOURCES'
|
||||
env['JAVACCOM'] = "${TEMPFILE('$_JAVACCOM','$JAVACCOMSTR')}"
|
||||
env['JAVACLASSSUFFIX'] = '.class'
|
||||
env['JAVASUFFIX'] = '.java'
|
||||
|
||||
def exists(env):
|
||||
return 1
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
137
scons-local-3.0.0/SCons/Tool/javah.py
Normal file
137
scons-local-3.0.0/SCons/Tool/javah.py
Normal file
@@ -0,0 +1,137 @@
|
||||
"""SCons.Tool.javah
|
||||
|
||||
Tool-specific initialization for javah.
|
||||
|
||||
There normally shouldn't be any need to import this module directly.
|
||||
It will usually be imported through the generic SCons.Tool.Tool()
|
||||
selection method.
|
||||
|
||||
"""
|
||||
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/javah.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
import os.path
|
||||
|
||||
import SCons.Action
|
||||
import SCons.Builder
|
||||
import SCons.Node.FS
|
||||
import SCons.Tool.javac
|
||||
import SCons.Util
|
||||
|
||||
def emit_java_headers(target, source, env):
|
||||
"""Create and return lists of Java stub header files that will
|
||||
be created from a set of class files.
|
||||
"""
|
||||
class_suffix = env.get('JAVACLASSSUFFIX', '.class')
|
||||
classdir = env.get('JAVACLASSDIR')
|
||||
|
||||
if not classdir:
|
||||
try:
|
||||
s = source[0]
|
||||
except IndexError:
|
||||
classdir = '.'
|
||||
else:
|
||||
try:
|
||||
classdir = s.attributes.java_classdir
|
||||
except AttributeError:
|
||||
classdir = '.'
|
||||
classdir = env.Dir(classdir).rdir()
|
||||
|
||||
if str(classdir) == '.':
|
||||
c_ = None
|
||||
else:
|
||||
c_ = str(classdir) + os.sep
|
||||
|
||||
slist = []
|
||||
for src in source:
|
||||
try:
|
||||
classname = src.attributes.java_classname
|
||||
except AttributeError:
|
||||
classname = str(src)
|
||||
if c_ and classname[:len(c_)] == c_:
|
||||
classname = classname[len(c_):]
|
||||
if class_suffix and classname[-len(class_suffix):] == class_suffix:
|
||||
classname = classname[:-len(class_suffix)]
|
||||
classname = SCons.Tool.javac.classname(classname)
|
||||
s = src.rfile()
|
||||
s.attributes.java_classname = classname
|
||||
slist.append(s)
|
||||
|
||||
s = source[0].rfile()
|
||||
if not hasattr(s.attributes, 'java_classdir'):
|
||||
s.attributes.java_classdir = classdir
|
||||
|
||||
if target[0].__class__ is SCons.Node.FS.File:
|
||||
tlist = target
|
||||
else:
|
||||
if not isinstance(target[0], SCons.Node.FS.Dir):
|
||||
target[0].__class__ = SCons.Node.FS.Dir
|
||||
target[0]._morph()
|
||||
tlist = []
|
||||
for s in source:
|
||||
fname = s.attributes.java_classname.replace('.', '_') + '.h'
|
||||
t = target[0].File(fname)
|
||||
t.attributes.java_lookupdir = target[0]
|
||||
tlist.append(t)
|
||||
|
||||
return tlist, source
|
||||
|
||||
def JavaHOutFlagGenerator(target, source, env, for_signature):
|
||||
try:
|
||||
t = target[0]
|
||||
except (AttributeError, IndexError, TypeError):
|
||||
t = target
|
||||
try:
|
||||
return '-d ' + str(t.attributes.java_lookupdir)
|
||||
except AttributeError:
|
||||
return '-o ' + str(t)
|
||||
|
||||
def getJavaHClassPath(env,target, source, for_signature):
|
||||
path = "${SOURCE.attributes.java_classdir}"
|
||||
if 'JAVACLASSPATH' in env and env['JAVACLASSPATH']:
|
||||
path = SCons.Util.AppendPath(path, env['JAVACLASSPATH'])
|
||||
return "-classpath %s" % (path)
|
||||
|
||||
def generate(env):
|
||||
"""Add Builders and construction variables for javah to an Environment."""
|
||||
java_javah = SCons.Tool.CreateJavaHBuilder(env)
|
||||
java_javah.emitter = emit_java_headers
|
||||
|
||||
env['_JAVAHOUTFLAG'] = JavaHOutFlagGenerator
|
||||
env['JAVAH'] = 'javah'
|
||||
env['JAVAHFLAGS'] = SCons.Util.CLVar('')
|
||||
env['_JAVAHCLASSPATH'] = getJavaHClassPath
|
||||
env['JAVAHCOM'] = '$JAVAH $JAVAHFLAGS $_JAVAHOUTFLAG $_JAVAHCLASSPATH ${SOURCES.attributes.java_classname}'
|
||||
env['JAVACLASSSUFFIX'] = '.class'
|
||||
|
||||
def exists(env):
|
||||
return env.Detect('javah')
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
80
scons-local-3.0.0/SCons/Tool/latex.py
Normal file
80
scons-local-3.0.0/SCons/Tool/latex.py
Normal file
@@ -0,0 +1,80 @@
|
||||
"""SCons.Tool.latex
|
||||
|
||||
Tool-specific initialization for LaTeX.
|
||||
Generates .dvi files from .latex or .ltx files
|
||||
|
||||
There normally shouldn't be any need to import this module directly.
|
||||
It will usually be imported through the generic SCons.Tool.Tool()
|
||||
selection method.
|
||||
|
||||
"""
|
||||
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/latex.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
import SCons.Action
|
||||
import SCons.Defaults
|
||||
import SCons.Scanner.LaTeX
|
||||
import SCons.Util
|
||||
import SCons.Tool
|
||||
import SCons.Tool.tex
|
||||
|
||||
def LaTeXAuxFunction(target = None, source= None, env=None):
|
||||
result = SCons.Tool.tex.InternalLaTeXAuxAction( SCons.Tool.tex.LaTeXAction, target, source, env )
|
||||
if result != 0:
|
||||
SCons.Tool.tex.check_file_error_message(env['LATEX'])
|
||||
return result
|
||||
|
||||
LaTeXAuxAction = SCons.Action.Action(LaTeXAuxFunction,
|
||||
strfunction=SCons.Tool.tex.TeXLaTeXStrFunction)
|
||||
|
||||
def generate(env):
|
||||
"""Add Builders and construction variables for LaTeX to an Environment."""
|
||||
|
||||
env.AppendUnique(LATEXSUFFIXES=SCons.Tool.LaTeXSuffixes)
|
||||
|
||||
from . import dvi
|
||||
dvi.generate(env)
|
||||
|
||||
from . import pdf
|
||||
pdf.generate(env)
|
||||
|
||||
bld = env['BUILDERS']['DVI']
|
||||
bld.add_action('.ltx', LaTeXAuxAction)
|
||||
bld.add_action('.latex', LaTeXAuxAction)
|
||||
bld.add_emitter('.ltx', SCons.Tool.tex.tex_eps_emitter)
|
||||
bld.add_emitter('.latex', SCons.Tool.tex.tex_eps_emitter)
|
||||
|
||||
SCons.Tool.tex.generate_common(env)
|
||||
|
||||
def exists(env):
|
||||
SCons.Tool.tex.generate_darwin(env)
|
||||
return env.Detect('latex')
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
158
scons-local-3.0.0/SCons/Tool/ldc.py
Normal file
158
scons-local-3.0.0/SCons/Tool/ldc.py
Normal file
@@ -0,0 +1,158 @@
|
||||
from __future__ import print_function
|
||||
|
||||
"""SCons.Tool.ldc
|
||||
|
||||
Tool-specific initialization for the LDC compiler.
|
||||
(https://github.com/ldc-developers/ldc)
|
||||
|
||||
Developed by Russel Winder (russel@winder.org.uk)
|
||||
2012-05-09 onwards
|
||||
|
||||
Compiler variables:
|
||||
DC - The name of the D compiler to use. Defaults to ldc2.
|
||||
DPATH - List of paths to search for import modules.
|
||||
DVERSIONS - List of version tags to enable when compiling.
|
||||
DDEBUG - List of debug tags to enable when compiling.
|
||||
|
||||
Linker related variables:
|
||||
LIBS - List of library files to link in.
|
||||
DLINK - Name of the linker to use. Defaults to ldc2.
|
||||
DLINKFLAGS - List of linker flags.
|
||||
|
||||
Lib tool variables:
|
||||
DLIB - Name of the lib tool to use. Defaults to lib.
|
||||
DLIBFLAGS - List of flags to pass to the lib tool.
|
||||
LIBS - Same as for the linker. (libraries to pull into the .lib)
|
||||
"""
|
||||
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/ldc.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
import os
|
||||
import subprocess
|
||||
|
||||
import SCons.Action
|
||||
import SCons.Builder
|
||||
import SCons.Defaults
|
||||
import SCons.Scanner.D
|
||||
import SCons.Tool
|
||||
|
||||
import SCons.Tool.DCommon as DCommon
|
||||
|
||||
|
||||
def generate(env):
|
||||
static_obj, shared_obj = SCons.Tool.createObjBuilders(env)
|
||||
|
||||
static_obj.add_action('.d', SCons.Defaults.DAction)
|
||||
shared_obj.add_action('.d', SCons.Defaults.ShDAction)
|
||||
static_obj.add_emitter('.d', SCons.Defaults.StaticObjectEmitter)
|
||||
shared_obj.add_emitter('.d', SCons.Defaults.SharedObjectEmitter)
|
||||
|
||||
env['DC'] = env.Detect('ldc2') or 'ldc2'
|
||||
env['DCOM'] = '$DC $_DINCFLAGS $_DVERFLAGS $_DDEBUGFLAGS $_DFLAGS -c -of=$TARGET $SOURCES'
|
||||
env['_DINCFLAGS'] = '${_concat(DINCPREFIX, DPATH, DINCSUFFIX, __env__, RDirs, TARGET, SOURCE)}'
|
||||
env['_DVERFLAGS'] = '${_concat(DVERPREFIX, DVERSIONS, DVERSUFFIX, __env__)}'
|
||||
env['_DDEBUGFLAGS'] = '${_concat(DDEBUGPREFIX, DDEBUG, DDEBUGSUFFIX, __env__)}'
|
||||
env['_DFLAGS'] = '${_concat(DFLAGPREFIX, DFLAGS, DFLAGSUFFIX, __env__)}'
|
||||
|
||||
env['SHDC'] = '$DC'
|
||||
env['SHDCOM'] = '$DC $_DINCFLAGS $_DVERFLAGS $_DDEBUGFLAGS $_DFLAGS -c -relocation-model=pic -of=$TARGET $SOURCES'
|
||||
|
||||
env['DPATH'] = ['#/']
|
||||
env['DFLAGS'] = []
|
||||
env['DVERSIONS'] = []
|
||||
env['DDEBUG'] = []
|
||||
|
||||
if env['DC']:
|
||||
DCommon.addDPATHToEnv(env, env['DC'])
|
||||
|
||||
env['DINCPREFIX'] = '-I='
|
||||
env['DINCSUFFIX'] = ''
|
||||
env['DVERPREFIX'] = '-version='
|
||||
env['DVERSUFFIX'] = ''
|
||||
env['DDEBUGPREFIX'] = '-debug='
|
||||
env['DDEBUGSUFFIX'] = ''
|
||||
env['DFLAGPREFIX'] = '-'
|
||||
env['DFLAGSUFFIX'] = ''
|
||||
env['DFILESUFFIX'] = '.d'
|
||||
|
||||
env['DLINK'] = '$DC'
|
||||
env['DLINKFLAGS'] = SCons.Util.CLVar('')
|
||||
env['DLINKCOM'] = '$DLINK -of=$TARGET $DLINKFLAGS $__DRPATH $SOURCES $_DLIBDIRFLAGS $_DLIBFLAGS'
|
||||
|
||||
env['SHDLINK'] = '$DC'
|
||||
env['SHDLINKFLAGS'] = SCons.Util.CLVar('$DLINKFLAGS -shared -defaultlib=phobos2-ldc')
|
||||
|
||||
env['SHDLINKCOM'] = '$DLINK -of=$TARGET $SHDLINKFLAGS $__SHDLIBVERSIONFLAGS $__DRPATH $SOURCES $_DLIBDIRFLAGS $_DLIBFLAGS -L-ldruntime-ldc'
|
||||
|
||||
env['DLIBLINKPREFIX'] = '' if env['PLATFORM'] == 'win32' else '-L-l'
|
||||
env['DLIBLINKSUFFIX'] = '.lib' if env['PLATFORM'] == 'win32' else ''
|
||||
# env['_DLIBFLAGS'] = '${_concat(DLIBLINKPREFIX, LIBS, DLIBLINKSUFFIX, __env__, RDirs, TARGET, SOURCE)}'
|
||||
env['_DLIBFLAGS'] = '${_stripixes(DLIBLINKPREFIX, LIBS, DLIBLINKSUFFIX, LIBPREFIXES, LIBSUFFIXES, __env__)}'
|
||||
|
||||
env['DLIBDIRPREFIX'] = '-L-L'
|
||||
env['DLIBDIRSUFFIX'] = ''
|
||||
env['_DLIBDIRFLAGS'] = '${_concat(DLIBDIRPREFIX, LIBPATH, DLIBDIRSUFFIX, __env__, RDirs, TARGET, SOURCE)}'
|
||||
|
||||
env['DLIB'] = 'lib' if env['PLATFORM'] == 'win32' else 'ar cr'
|
||||
env['DLIBCOM'] = '$DLIB $_DLIBFLAGS {0}$TARGET $SOURCES $_DLIBFLAGS'.format('-c ' if env['PLATFORM'] == 'win32' else '')
|
||||
|
||||
# env['_DLIBFLAGS'] = '${_concat(DLIBFLAGPREFIX, DLIBFLAGS, DLIBFLAGSUFFIX, __env__)}'
|
||||
|
||||
env['DLIBFLAGPREFIX'] = '-'
|
||||
env['DLIBFLAGSUFFIX'] = ''
|
||||
|
||||
# __RPATH is set to $_RPATH in the platform specification if that
|
||||
# platform supports it.
|
||||
env['DRPATHPREFIX'] = '-L-Wl,-rpath,' if env['PLATFORM'] == 'darwin' else '-L-rpath='
|
||||
env['DRPATHSUFFIX'] = ''
|
||||
env['_DRPATH'] = '${_concat(DRPATHPREFIX, RPATH, DRPATHSUFFIX, __env__)}'
|
||||
|
||||
# Support for versioned libraries
|
||||
env['_SHDLIBVERSIONFLAGS'] = '$SHDLIBVERSIONFLAGS -L-soname=$_SHDLIBSONAME'
|
||||
env['_SHDLIBSONAME'] = '${DShLibSonameGenerator(__env__,TARGET)}'
|
||||
# NOTE: this is a quick hack, the soname will only work if there is
|
||||
# c/c++ linker loaded which provides callback for the ShLibSonameGenerator
|
||||
env['DShLibSonameGenerator'] = SCons.Tool.ShLibSonameGenerator
|
||||
# NOTE: this is only for further reference, currently $SHDLIBVERSION does
|
||||
# not work, the user must use $SHLIBVERSION
|
||||
env['SHDLIBVERSION'] = '$SHLIBVERSION'
|
||||
env['SHDLIBVERSIONFLAGS'] = []
|
||||
|
||||
env['BUILDERS']['ProgramAllAtOnce'] = SCons.Builder.Builder(
|
||||
action='$DC $_DINCFLAGS $_DVERFLAGS $_DDEBUGFLAGS $_DFLAGS -of=$TARGET $DLINKFLAGS $__DRPATH $SOURCES $_DLIBDIRFLAGS $_DLIBFLAGS',
|
||||
emitter=DCommon.allAtOnceEmitter,
|
||||
)
|
||||
|
||||
|
||||
def exists(env):
|
||||
return env.Detect('ldc2')
|
||||
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
97
scons-local-3.0.0/SCons/Tool/lex.py
Normal file
97
scons-local-3.0.0/SCons/Tool/lex.py
Normal file
@@ -0,0 +1,97 @@
|
||||
"""SCons.Tool.lex
|
||||
|
||||
Tool-specific initialization for lex.
|
||||
|
||||
There normally shouldn't be any need to import this module directly.
|
||||
It will usually be imported through the generic SCons.Tool.Tool()
|
||||
selection method.
|
||||
|
||||
"""
|
||||
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/lex.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
import os.path
|
||||
|
||||
import SCons.Action
|
||||
import SCons.Tool
|
||||
import SCons.Util
|
||||
|
||||
LexAction = SCons.Action.Action("$LEXCOM", "$LEXCOMSTR")
|
||||
|
||||
def lexEmitter(target, source, env):
|
||||
sourceBase, sourceExt = os.path.splitext(SCons.Util.to_String(source[0]))
|
||||
|
||||
if sourceExt == ".lm": # If using Objective-C
|
||||
target = [sourceBase + ".m"] # the extension is ".m".
|
||||
|
||||
# This emitter essentially tries to add to the target all extra
|
||||
# files generated by flex.
|
||||
|
||||
# Different options that are used to trigger the creation of extra files.
|
||||
fileGenOptions = ["--header-file=", "--tables-file="]
|
||||
|
||||
lexflags = env.subst("$LEXFLAGS", target=target, source=source)
|
||||
for option in SCons.Util.CLVar(lexflags):
|
||||
for fileGenOption in fileGenOptions:
|
||||
l = len(fileGenOption)
|
||||
if option[:l] == fileGenOption:
|
||||
# A file generating option is present, so add the
|
||||
# file name to the target list.
|
||||
fileName = option[l:].strip()
|
||||
target.append(fileName)
|
||||
return (target, source)
|
||||
|
||||
def generate(env):
|
||||
"""Add Builders and construction variables for lex to an Environment."""
|
||||
c_file, cxx_file = SCons.Tool.createCFileBuilders(env)
|
||||
|
||||
# C
|
||||
c_file.add_action(".l", LexAction)
|
||||
c_file.add_emitter(".l", lexEmitter)
|
||||
|
||||
c_file.add_action(".lex", LexAction)
|
||||
c_file.add_emitter(".lex", lexEmitter)
|
||||
|
||||
# Objective-C
|
||||
cxx_file.add_action(".lm", LexAction)
|
||||
cxx_file.add_emitter(".lm", lexEmitter)
|
||||
|
||||
# C++
|
||||
cxx_file.add_action(".ll", LexAction)
|
||||
cxx_file.add_emitter(".ll", lexEmitter)
|
||||
|
||||
env["LEX"] = env.Detect("flex") or "lex"
|
||||
env["LEXFLAGS"] = SCons.Util.CLVar("")
|
||||
env["LEXCOM"] = "$LEX $LEXFLAGS -t $SOURCES > $TARGET"
|
||||
|
||||
def exists(env):
|
||||
return env.Detect(["flex", "lex"])
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
331
scons-local-3.0.0/SCons/Tool/link.py
Normal file
331
scons-local-3.0.0/SCons/Tool/link.py
Normal file
@@ -0,0 +1,331 @@
|
||||
|
||||
"""SCons.Tool.link
|
||||
|
||||
Tool-specific initialization for the generic Posix linker.
|
||||
|
||||
There normally shouldn't be any need to import this module directly.
|
||||
It will usually be imported through the generic SCons.Tool.Tool()
|
||||
selection method.
|
||||
|
||||
"""
|
||||
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
from __future__ import print_function
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/link.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
import sys
|
||||
import re
|
||||
import os
|
||||
|
||||
import SCons.Tool
|
||||
import SCons.Util
|
||||
import SCons.Warnings
|
||||
|
||||
from SCons.Tool.FortranCommon import isfortran
|
||||
|
||||
from SCons.Tool.DCommon import isD
|
||||
|
||||
import SCons.Tool.cxx
|
||||
cplusplus = SCons.Tool.cxx
|
||||
# cplusplus = __import__(__package__+'.cxx', globals(), locals(), ['*'])
|
||||
|
||||
issued_mixed_link_warning = False
|
||||
|
||||
def smart_link(source, target, env, for_signature):
|
||||
has_cplusplus = cplusplus.iscplusplus(source)
|
||||
has_fortran = isfortran(env, source)
|
||||
has_d = isD(env, source)
|
||||
if has_cplusplus and has_fortran and not has_d:
|
||||
global issued_mixed_link_warning
|
||||
if not issued_mixed_link_warning:
|
||||
msg = "Using $CXX to link Fortran and C++ code together.\n\t" + \
|
||||
"This may generate a buggy executable if the '%s'\n\t" + \
|
||||
"compiler does not know how to deal with Fortran runtimes."
|
||||
SCons.Warnings.warn(SCons.Warnings.FortranCxxMixWarning,
|
||||
msg % env.subst('$CXX'))
|
||||
issued_mixed_link_warning = True
|
||||
return '$CXX'
|
||||
elif has_d:
|
||||
env['LINKCOM'] = env['DLINKCOM']
|
||||
env['SHLINKCOM'] = env['SHDLINKCOM']
|
||||
return '$DC'
|
||||
elif has_fortran:
|
||||
return '$FORTRAN'
|
||||
elif has_cplusplus:
|
||||
return '$CXX'
|
||||
return '$CC'
|
||||
|
||||
def _lib_emitter(target, source, env, **kw):
|
||||
Verbose = False
|
||||
if Verbose:
|
||||
print("_lib_emitter: target[0]={:r}".format(target[0].get_path()))
|
||||
for tgt in target:
|
||||
tgt.attributes.shared = 1
|
||||
|
||||
try:
|
||||
symlink_generator = kw['symlink_generator']
|
||||
except KeyError:
|
||||
pass
|
||||
else:
|
||||
if Verbose:
|
||||
print("_lib_emitter: symlink_generator={:r}".format(symlink_generator))
|
||||
symlinks = symlink_generator(env, target[0])
|
||||
if Verbose:
|
||||
print("_lib_emitter: symlinks={:r}".format(symlinks))
|
||||
|
||||
if symlinks:
|
||||
SCons.Tool.EmitLibSymlinks(env, symlinks, target[0])
|
||||
target[0].attributes.shliblinks = symlinks
|
||||
return (target, source)
|
||||
|
||||
def shlib_emitter(target, source, env):
|
||||
return _lib_emitter(target, source, env, symlink_generator = SCons.Tool.ShLibSymlinkGenerator)
|
||||
|
||||
def ldmod_emitter(target, source, env):
|
||||
return _lib_emitter(target, source, env, symlink_generator = SCons.Tool.LdModSymlinkGenerator)
|
||||
|
||||
# This is generic enough to be included here...
|
||||
def _versioned_lib_name(env, libnode, version, prefix, suffix, prefix_generator, suffix_generator, **kw):
|
||||
"""For libnode='/optional/dir/libfoo.so.X.Y.Z' it returns 'libfoo.so'"""
|
||||
Verbose = False
|
||||
|
||||
if Verbose:
|
||||
print("_versioned_lib_name: libnode={:r}".format(libnode.get_path()))
|
||||
print("_versioned_lib_name: version={:r}".format(version))
|
||||
print("_versioned_lib_name: prefix={:r}".format(prefix))
|
||||
print("_versioned_lib_name: suffix={:r}".format(suffix))
|
||||
print("_versioned_lib_name: suffix_generator={:r}".format(suffix_generator))
|
||||
|
||||
versioned_name = os.path.basename(libnode.get_path())
|
||||
if Verbose:
|
||||
print("_versioned_lib_name: versioned_name={:r}".format(versioned_name))
|
||||
|
||||
versioned_prefix = prefix_generator(env, **kw)
|
||||
versioned_suffix = suffix_generator(env, **kw)
|
||||
if Verbose:
|
||||
print("_versioned_lib_name: versioned_prefix={:r}".format(versioned_prefix))
|
||||
print("_versioned_lib_name: versioned_suffix={:r}".format(versioned_suffix))
|
||||
|
||||
versioned_prefix_re = '^' + re.escape(versioned_prefix)
|
||||
versioned_suffix_re = re.escape(versioned_suffix) + '$'
|
||||
name = re.sub(versioned_prefix_re, prefix, versioned_name)
|
||||
name = re.sub(versioned_suffix_re, suffix, name)
|
||||
if Verbose:
|
||||
print("_versioned_lib_name: name={:r}".format(name))
|
||||
return name
|
||||
|
||||
def _versioned_shlib_name(env, libnode, version, prefix, suffix, **kw):
|
||||
pg = SCons.Tool.ShLibPrefixGenerator
|
||||
sg = SCons.Tool.ShLibSuffixGenerator
|
||||
return _versioned_lib_name(env, libnode, version, prefix, suffix, pg, sg, **kw)
|
||||
|
||||
def _versioned_ldmod_name(env, libnode, version, prefix, suffix, **kw):
|
||||
pg = SCons.Tool.LdModPrefixGenerator
|
||||
sg = SCons.Tool.LdModSuffixGenerator
|
||||
return _versioned_lib_name(env, libnode, version, prefix, suffix, pg, sg, **kw)
|
||||
|
||||
def _versioned_lib_suffix(env, suffix, version):
|
||||
"""For suffix='.so' and version='0.1.2' it returns '.so.0.1.2'"""
|
||||
Verbose = False
|
||||
if Verbose:
|
||||
print("_versioned_lib_suffix: suffix={:r}".format(suffix))
|
||||
print("_versioned_lib_suffix: version={:r}".format(version))
|
||||
if not suffix.endswith(version):
|
||||
suffix = suffix + '.' + version
|
||||
if Verbose:
|
||||
print("_versioned_lib_suffix: return suffix={:r}".format(suffix))
|
||||
return suffix
|
||||
|
||||
def _versioned_lib_soname(env, libnode, version, prefix, suffix, name_func):
|
||||
"""For libnode='/optional/dir/libfoo.so.X.Y.Z' it returns 'libfoo.so.X'"""
|
||||
Verbose = False
|
||||
if Verbose:
|
||||
print("_versioned_lib_soname: version={:r}".format(version))
|
||||
name = name_func(env, libnode, version, prefix, suffix)
|
||||
if Verbose:
|
||||
print("_versioned_lib_soname: name={:r}".format(name))
|
||||
major = version.split('.')[0]
|
||||
soname = name + '.' + major
|
||||
if Verbose:
|
||||
print("_versioned_lib_soname: soname={:r}".format(soname))
|
||||
return soname
|
||||
|
||||
def _versioned_shlib_soname(env, libnode, version, prefix, suffix):
|
||||
return _versioned_lib_soname(env, libnode, version, prefix, suffix, _versioned_shlib_name)
|
||||
|
||||
def _versioned_ldmod_soname(env, libnode, version, prefix, suffix):
|
||||
return _versioned_lib_soname(env, libnode, version, prefix, suffix, _versioned_ldmod_name)
|
||||
|
||||
def _versioned_lib_symlinks(env, libnode, version, prefix, suffix, name_func, soname_func):
|
||||
"""Generate link names that should be created for a versioned shared lirbrary.
|
||||
Returns a dictionary in the form { linkname : linktarget }
|
||||
"""
|
||||
Verbose = False
|
||||
|
||||
if Verbose:
|
||||
print("_versioned_lib_symlinks: libnode={:r}".format(libnode.get_path()))
|
||||
print("_versioned_lib_symlinks: version={:r}".format(version))
|
||||
|
||||
if sys.platform.startswith('openbsd'):
|
||||
# OpenBSD uses x.y shared library versioning numbering convention
|
||||
# and doesn't use symlinks to backwards-compatible libraries
|
||||
if Verbose:
|
||||
print("_versioned_lib_symlinks: return symlinks={:r}".format(None))
|
||||
return None
|
||||
|
||||
linkdir = libnode.get_dir()
|
||||
if Verbose:
|
||||
print("_versioned_lib_symlinks: linkdir={:r}".format(linkdir.get_path()))
|
||||
|
||||
name = name_func(env, libnode, version, prefix, suffix)
|
||||
if Verbose:
|
||||
print("_versioned_lib_symlinks: name={:r}".format(name))
|
||||
|
||||
soname = soname_func(env, libnode, version, prefix, suffix)
|
||||
|
||||
link0 = env.fs.File(soname, linkdir)
|
||||
link1 = env.fs.File(name, linkdir)
|
||||
|
||||
# We create direct symlinks, not daisy-chained.
|
||||
if link0 == libnode:
|
||||
# This enables SHLIBVERSION without periods (e.g. SHLIBVERSION=1)
|
||||
symlinks = [ (link1, libnode) ]
|
||||
else:
|
||||
# This handles usual SHLIBVERSION, i.e. '1.2', '1.2.3', etc.
|
||||
symlinks = [ (link0, libnode), (link1, libnode) ]
|
||||
|
||||
if Verbose:
|
||||
print("_versioned_lib_symlinks: return symlinks={:r}".format(SCons.Tool.StringizeLibSymlinks(symlinks)))
|
||||
|
||||
return symlinks
|
||||
|
||||
def _versioned_shlib_symlinks(env, libnode, version, prefix, suffix):
|
||||
nf = _versioned_shlib_name
|
||||
sf = _versioned_shlib_soname
|
||||
return _versioned_lib_symlinks(env, libnode, version, prefix, suffix, nf, sf)
|
||||
|
||||
def _versioned_ldmod_symlinks(env, libnode, version, prefix, suffix):
|
||||
nf = _versioned_ldmod_name
|
||||
sf = _versioned_ldmod_soname
|
||||
return _versioned_lib_symlinks(env, libnode, version, prefix, suffix, nf, sf)
|
||||
|
||||
def _versioned_lib_callbacks():
|
||||
return {
|
||||
'VersionedShLibSuffix' : _versioned_lib_suffix,
|
||||
'VersionedLdModSuffix' : _versioned_lib_suffix,
|
||||
'VersionedShLibSymlinks' : _versioned_shlib_symlinks,
|
||||
'VersionedLdModSymlinks' : _versioned_ldmod_symlinks,
|
||||
'VersionedShLibName' : _versioned_shlib_name,
|
||||
'VersionedLdModName' : _versioned_ldmod_name,
|
||||
'VersionedShLibSoname' : _versioned_shlib_soname,
|
||||
'VersionedLdModSoname' : _versioned_ldmod_soname,
|
||||
}.copy()
|
||||
|
||||
def _setup_versioned_lib_variables(env, **kw):
|
||||
"""
|
||||
Setup all variables required by the versioning machinery
|
||||
"""
|
||||
|
||||
tool = None
|
||||
try: tool = kw['tool']
|
||||
except KeyError: pass
|
||||
|
||||
use_soname = False
|
||||
try: use_soname = kw['use_soname']
|
||||
except KeyError: pass
|
||||
|
||||
# The $_SHLIBVERSIONFLAGS define extra commandline flags used when
|
||||
# building VERSIONED shared libraries. It's always set, but used only
|
||||
# when VERSIONED library is built (see __SHLIBVERSIONFLAGS in SCons/Defaults.py).
|
||||
if use_soname:
|
||||
# If the linker uses SONAME, then we need this little automata
|
||||
if tool == 'sunlink':
|
||||
env['_SHLIBVERSIONFLAGS'] = '$SHLIBVERSIONFLAGS -h $_SHLIBSONAME'
|
||||
env['_LDMODULEVERSIONFLAGS'] = '$LDMODULEVERSIONFLAGS -h $_LDMODULESONAME'
|
||||
else:
|
||||
env['_SHLIBVERSIONFLAGS'] = '$SHLIBVERSIONFLAGS -Wl,-soname=$_SHLIBSONAME'
|
||||
env['_LDMODULEVERSIONFLAGS'] = '$LDMODULEVERSIONFLAGS -Wl,-soname=$_LDMODULESONAME'
|
||||
env['_SHLIBSONAME'] = '${ShLibSonameGenerator(__env__,TARGET)}'
|
||||
env['_LDMODULESONAME'] = '${LdModSonameGenerator(__env__,TARGET)}'
|
||||
env['ShLibSonameGenerator'] = SCons.Tool.ShLibSonameGenerator
|
||||
env['LdModSonameGenerator'] = SCons.Tool.LdModSonameGenerator
|
||||
else:
|
||||
env['_SHLIBVERSIONFLAGS'] = '$SHLIBVERSIONFLAGS'
|
||||
env['_LDMODULEVERSIONFLAGS'] = '$LDMODULEVERSIONFLAGS'
|
||||
|
||||
# LDOMDULVERSIONFLAGS should always default to $SHLIBVERSIONFLAGS
|
||||
env['LDMODULEVERSIONFLAGS'] = '$SHLIBVERSIONFLAGS'
|
||||
|
||||
|
||||
def generate(env):
|
||||
"""Add Builders and construction variables for gnulink to an Environment."""
|
||||
SCons.Tool.createSharedLibBuilder(env)
|
||||
SCons.Tool.createProgBuilder(env)
|
||||
|
||||
env['SHLINK'] = '$LINK'
|
||||
env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS -shared')
|
||||
env['SHLINKCOM'] = '$SHLINK -o $TARGET $SHLINKFLAGS $__SHLIBVERSIONFLAGS $__RPATH $SOURCES $_LIBDIRFLAGS $_LIBFLAGS'
|
||||
# don't set up the emitter, cause AppendUnique will generate a list
|
||||
# starting with None :-(
|
||||
env.Append(SHLIBEMITTER = [shlib_emitter])
|
||||
env['SMARTLINK'] = smart_link
|
||||
env['LINK'] = "$SMARTLINK"
|
||||
env['LINKFLAGS'] = SCons.Util.CLVar('')
|
||||
# __RPATH is only set to something ($_RPATH typically) on platforms that support it.
|
||||
env['LINKCOM'] = '$LINK -o $TARGET $LINKFLAGS $__RPATH $SOURCES $_LIBDIRFLAGS $_LIBFLAGS'
|
||||
env['LIBDIRPREFIX']='-L'
|
||||
env['LIBDIRSUFFIX']=''
|
||||
env['_LIBFLAGS']='${_stripixes(LIBLINKPREFIX, LIBS, LIBLINKSUFFIX, LIBPREFIXES, LIBSUFFIXES, __env__)}'
|
||||
env['LIBLINKPREFIX']='-l'
|
||||
env['LIBLINKSUFFIX']=''
|
||||
|
||||
if env['PLATFORM'] == 'hpux':
|
||||
env['SHLIBSUFFIX'] = '.sl'
|
||||
elif env['PLATFORM'] == 'aix':
|
||||
env['SHLIBSUFFIX'] = '.a'
|
||||
|
||||
# For most platforms, a loadable module is the same as a shared
|
||||
# library. Platforms which are different can override these, but
|
||||
# setting them the same means that LoadableModule works everywhere.
|
||||
SCons.Tool.createLoadableModuleBuilder(env)
|
||||
env['LDMODULE'] = '$SHLINK'
|
||||
env.Append(LDMODULEEMITTER = [ldmod_emitter])
|
||||
env['LDMODULEPREFIX'] = '$SHLIBPREFIX'
|
||||
env['LDMODULESUFFIX'] = '$SHLIBSUFFIX'
|
||||
env['LDMODULEFLAGS'] = '$SHLINKFLAGS'
|
||||
env['LDMODULECOM'] = '$LDMODULE -o $TARGET $LDMODULEFLAGS $__LDMODULEVERSIONFLAGS $__RPATH $SOURCES $_LIBDIRFLAGS $_LIBFLAGS'
|
||||
env['LDMODULEVERSION'] = '$SHLIBVERSION'
|
||||
env['LDMODULENOVERSIONSYMLINKS'] = '$SHLIBNOVERSIONSYMLINKS'
|
||||
|
||||
def exists(env):
|
||||
# This module isn't really a Tool on its own, it's common logic for
|
||||
# other linkers.
|
||||
return None
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
113
scons-local-3.0.0/SCons/Tool/linkloc.py
Normal file
113
scons-local-3.0.0/SCons/Tool/linkloc.py
Normal file
@@ -0,0 +1,113 @@
|
||||
"""SCons.Tool.linkloc
|
||||
|
||||
Tool specification for the LinkLoc linker for the Phar Lap ETS embedded
|
||||
operating system.
|
||||
|
||||
There normally shouldn't be any need to import this module directly.
|
||||
It will usually be imported through the generic SCons.Tool.Tool()
|
||||
selection method.
|
||||
|
||||
"""
|
||||
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/linkloc.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
import os.path
|
||||
import re
|
||||
|
||||
import SCons.Action
|
||||
import SCons.Defaults
|
||||
import SCons.Errors
|
||||
import SCons.Tool
|
||||
import SCons.Util
|
||||
|
||||
from SCons.Tool.MSCommon import msvs_exists, merge_default_version
|
||||
from SCons.Tool.PharLapCommon import addPharLapPaths
|
||||
|
||||
_re_linker_command = re.compile(r'(\s)@\s*([^\s]+)')
|
||||
|
||||
def repl_linker_command(m):
|
||||
# Replaces any linker command file directives (e.g. "@foo.lnk") with
|
||||
# the actual contents of the file.
|
||||
try:
|
||||
with open(m.group(2), "r") as f:
|
||||
return m.group(1) + f.read()
|
||||
except IOError:
|
||||
# the linker should return an error if it can't
|
||||
# find the linker command file so we will remain quiet.
|
||||
# However, we will replace the @ with a # so we will not continue
|
||||
# to find it with recursive substitution
|
||||
return m.group(1) + '#' + m.group(2)
|
||||
|
||||
class LinklocGenerator(object):
|
||||
def __init__(self, cmdline):
|
||||
self.cmdline = cmdline
|
||||
|
||||
def __call__(self, env, target, source, for_signature):
|
||||
if for_signature:
|
||||
# Expand the contents of any linker command files recursively
|
||||
subs = 1
|
||||
strsub = env.subst(self.cmdline, target=target, source=source)
|
||||
while subs:
|
||||
strsub, subs = _re_linker_command.subn(repl_linker_command, strsub)
|
||||
return strsub
|
||||
else:
|
||||
return "${TEMPFILE('" + self.cmdline + "')}"
|
||||
|
||||
def generate(env):
|
||||
"""Add Builders and construction variables for ar to an Environment."""
|
||||
SCons.Tool.createSharedLibBuilder(env)
|
||||
SCons.Tool.createProgBuilder(env)
|
||||
|
||||
env['SUBST_CMD_FILE'] = LinklocGenerator
|
||||
env['SHLINK'] = '$LINK'
|
||||
env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS')
|
||||
env['SHLINKCOM'] = '${SUBST_CMD_FILE("$SHLINK $SHLINKFLAGS $_LIBDIRFLAGS $_LIBFLAGS -dll $TARGET $SOURCES")}'
|
||||
env['SHLIBEMITTER']= None
|
||||
env['LDMODULEEMITTER']= None
|
||||
env['LINK'] = "linkloc"
|
||||
env['LINKFLAGS'] = SCons.Util.CLVar('')
|
||||
env['LINKCOM'] = '${SUBST_CMD_FILE("$LINK $LINKFLAGS $_LIBDIRFLAGS $_LIBFLAGS -exe $TARGET $SOURCES")}'
|
||||
env['LIBDIRPREFIX']='-libpath '
|
||||
env['LIBDIRSUFFIX']=''
|
||||
env['LIBLINKPREFIX']='-lib '
|
||||
env['LIBLINKSUFFIX']='$LIBSUFFIX'
|
||||
|
||||
# Set-up ms tools paths for default version
|
||||
merge_default_version(env)
|
||||
|
||||
addPharLapPaths(env)
|
||||
|
||||
def exists(env):
|
||||
if msvs_exists():
|
||||
return env.Detect('linkloc')
|
||||
else:
|
||||
return 0
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
63
scons-local-3.0.0/SCons/Tool/m4.py
Normal file
63
scons-local-3.0.0/SCons/Tool/m4.py
Normal file
@@ -0,0 +1,63 @@
|
||||
"""SCons.Tool.m4
|
||||
|
||||
Tool-specific initialization for m4.
|
||||
|
||||
There normally shouldn't be any need to import this module directly.
|
||||
It will usually be imported through the generic SCons.Tool.Tool()
|
||||
selection method.
|
||||
|
||||
"""
|
||||
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/m4.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
import SCons.Action
|
||||
import SCons.Builder
|
||||
import SCons.Util
|
||||
|
||||
def generate(env):
|
||||
"""Add Builders and construction variables for m4 to an Environment."""
|
||||
M4Action = SCons.Action.Action('$M4COM', '$M4COMSTR')
|
||||
bld = SCons.Builder.Builder(action = M4Action, src_suffix = '.m4')
|
||||
|
||||
env['BUILDERS']['M4'] = bld
|
||||
|
||||
# .m4 files might include other files, and it would be pretty hard
|
||||
# to write a scanner for it, so let's just cd to the dir of the m4
|
||||
# file and run from there.
|
||||
# The src_suffix setup is like so: file.c.m4 -> file.c,
|
||||
# file.cpp.m4 -> file.cpp etc.
|
||||
env['M4'] = 'm4'
|
||||
env['M4FLAGS'] = SCons.Util.CLVar('-E')
|
||||
env['M4COM'] = 'cd ${SOURCE.rsrcdir} && $M4 $M4FLAGS < ${SOURCE.file} > ${TARGET.abspath}'
|
||||
|
||||
def exists(env):
|
||||
return env.Detect('m4')
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
77
scons-local-3.0.0/SCons/Tool/masm.py
Normal file
77
scons-local-3.0.0/SCons/Tool/masm.py
Normal file
@@ -0,0 +1,77 @@
|
||||
"""SCons.Tool.masm
|
||||
|
||||
Tool-specific initialization for the Microsoft Assembler.
|
||||
|
||||
There normally shouldn't be any need to import this module directly.
|
||||
It will usually be imported through the generic SCons.Tool.Tool()
|
||||
selection method.
|
||||
|
||||
"""
|
||||
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/masm.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
import SCons.Defaults
|
||||
import SCons.Tool
|
||||
import SCons.Util
|
||||
|
||||
ASSuffixes = ['.s', '.asm', '.ASM']
|
||||
ASPPSuffixes = ['.spp', '.SPP', '.sx']
|
||||
if SCons.Util.case_sensitive_suffixes('.s', '.S'):
|
||||
ASPPSuffixes.extend(['.S'])
|
||||
else:
|
||||
ASSuffixes.extend(['.S'])
|
||||
|
||||
def generate(env):
|
||||
"""Add Builders and construction variables for masm to an Environment."""
|
||||
static_obj, shared_obj = SCons.Tool.createObjBuilders(env)
|
||||
|
||||
for suffix in ASSuffixes:
|
||||
static_obj.add_action(suffix, SCons.Defaults.ASAction)
|
||||
shared_obj.add_action(suffix, SCons.Defaults.ASAction)
|
||||
static_obj.add_emitter(suffix, SCons.Defaults.StaticObjectEmitter)
|
||||
shared_obj.add_emitter(suffix, SCons.Defaults.SharedObjectEmitter)
|
||||
|
||||
for suffix in ASPPSuffixes:
|
||||
static_obj.add_action(suffix, SCons.Defaults.ASPPAction)
|
||||
shared_obj.add_action(suffix, SCons.Defaults.ASPPAction)
|
||||
static_obj.add_emitter(suffix, SCons.Defaults.StaticObjectEmitter)
|
||||
shared_obj.add_emitter(suffix, SCons.Defaults.SharedObjectEmitter)
|
||||
|
||||
env['AS'] = 'ml'
|
||||
env['ASFLAGS'] = SCons.Util.CLVar('/nologo')
|
||||
env['ASPPFLAGS'] = '$ASFLAGS'
|
||||
env['ASCOM'] = '$AS $ASFLAGS /c /Fo$TARGET $SOURCES'
|
||||
env['ASPPCOM'] = '$CC $ASPPFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS /c /Fo$TARGET $SOURCES'
|
||||
env['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME'] = 1
|
||||
|
||||
def exists(env):
|
||||
return env.Detect('ml')
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
88
scons-local-3.0.0/SCons/Tool/midl.py
Normal file
88
scons-local-3.0.0/SCons/Tool/midl.py
Normal file
@@ -0,0 +1,88 @@
|
||||
"""SCons.Tool.midl
|
||||
|
||||
Tool-specific initialization for midl (Microsoft IDL compiler).
|
||||
|
||||
There normally shouldn't be any need to import this module directly.
|
||||
It will usually be imported through the generic SCons.Tool.Tool()
|
||||
selection method.
|
||||
|
||||
"""
|
||||
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/midl.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
import SCons.Action
|
||||
import SCons.Builder
|
||||
import SCons.Defaults
|
||||
import SCons.Scanner.IDL
|
||||
import SCons.Util
|
||||
|
||||
from .MSCommon import msvc_exists
|
||||
|
||||
def midl_emitter(target, source, env):
|
||||
"""Produces a list of outputs from the MIDL compiler"""
|
||||
base, _ = SCons.Util.splitext(str(target[0]))
|
||||
tlb = target[0]
|
||||
incl = base + '.h'
|
||||
interface = base + '_i.c'
|
||||
targets = [tlb, incl, interface]
|
||||
|
||||
midlcom = env['MIDLCOM']
|
||||
|
||||
if midlcom.find('/proxy') != -1:
|
||||
proxy = base + '_p.c'
|
||||
targets.append(proxy)
|
||||
if midlcom.find('/dlldata') != -1:
|
||||
dlldata = base + '_data.c'
|
||||
targets.append(dlldata)
|
||||
|
||||
return (targets, source)
|
||||
|
||||
idl_scanner = SCons.Scanner.IDL.IDLScan()
|
||||
|
||||
midl_action = SCons.Action.Action('$MIDLCOM', '$MIDLCOMSTR')
|
||||
|
||||
midl_builder = SCons.Builder.Builder(action = midl_action,
|
||||
src_suffix = '.idl',
|
||||
suffix='.tlb',
|
||||
emitter = midl_emitter,
|
||||
source_scanner = idl_scanner)
|
||||
|
||||
def generate(env):
|
||||
"""Add Builders and construction variables for midl to an Environment."""
|
||||
|
||||
env['MIDL'] = 'MIDL.EXE'
|
||||
env['MIDLFLAGS'] = SCons.Util.CLVar('/nologo')
|
||||
env['MIDLCOM'] = '$MIDL $MIDLFLAGS /tlb ${TARGETS[0]} /h ${TARGETS[1]} /iid ${TARGETS[2]} /proxy ${TARGETS[3]} /dlldata ${TARGETS[4]} $SOURCE 2> NUL'
|
||||
env['BUILDERS']['TypeLibrary'] = midl_builder
|
||||
|
||||
def exists(env):
|
||||
return msvc_exists()
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
182
scons-local-3.0.0/SCons/Tool/mingw.py
Normal file
182
scons-local-3.0.0/SCons/Tool/mingw.py
Normal file
@@ -0,0 +1,182 @@
|
||||
"""SCons.Tool.gcc
|
||||
|
||||
Tool-specific initialization for MinGW (http://www.mingw.org/)
|
||||
|
||||
There normally shouldn't be any need to import this module directly.
|
||||
It will usually be imported through the generic SCons.Tool.Tool()
|
||||
selection method.
|
||||
|
||||
"""
|
||||
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/mingw.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
import os
|
||||
import os.path
|
||||
|
||||
import SCons.Action
|
||||
import SCons.Builder
|
||||
import SCons.Defaults
|
||||
import SCons.Tool
|
||||
import SCons.Util
|
||||
|
||||
# This is what we search for to find mingw:
|
||||
key_program = 'mingw32-gcc'
|
||||
|
||||
def find(env):
|
||||
# First search in the SCons path
|
||||
path=env.WhereIs(key_program)
|
||||
if (path):
|
||||
return path
|
||||
# then the OS path:
|
||||
path=SCons.Util.WhereIs(key_program)
|
||||
if (path):
|
||||
return path
|
||||
|
||||
# If that doesn't work try default location for mingw
|
||||
save_path=env['ENV']['PATH']
|
||||
env.AppendENVPath('PATH',r'c:\MinGW\bin')
|
||||
path =env.WhereIs(key_program)
|
||||
if not path:
|
||||
env['ENV']['PATH']=save_path
|
||||
return path
|
||||
|
||||
def shlib_generator(target, source, env, for_signature):
|
||||
cmd = SCons.Util.CLVar(['$SHLINK', '$SHLINKFLAGS'])
|
||||
|
||||
dll = env.FindIxes(target, 'SHLIBPREFIX', 'SHLIBSUFFIX')
|
||||
if dll: cmd.extend(['-o', dll])
|
||||
|
||||
cmd.extend(['$SOURCES', '$_LIBDIRFLAGS', '$_LIBFLAGS'])
|
||||
|
||||
implib = env.FindIxes(target, 'LIBPREFIX', 'LIBSUFFIX')
|
||||
if implib: cmd.append('-Wl,--out-implib,'+implib.get_string(for_signature))
|
||||
|
||||
def_target = env.FindIxes(target, 'WINDOWSDEFPREFIX', 'WINDOWSDEFSUFFIX')
|
||||
insert_def = env.subst("$WINDOWS_INSERT_DEF")
|
||||
if not insert_def in ['', '0', 0] and def_target: \
|
||||
cmd.append('-Wl,--output-def,'+def_target.get_string(for_signature))
|
||||
|
||||
return [cmd]
|
||||
|
||||
def shlib_emitter(target, source, env):
|
||||
dll = env.FindIxes(target, 'SHLIBPREFIX', 'SHLIBSUFFIX')
|
||||
no_import_lib = env.get('no_import_lib', 0)
|
||||
|
||||
if not dll:
|
||||
raise SCons.Errors.UserError("A shared library should have exactly one target with the suffix: %s Target(s) are:%s" % \
|
||||
(env.subst("$SHLIBSUFFIX"), ",".join([str(t) for t in target])))
|
||||
|
||||
if not no_import_lib and \
|
||||
not env.FindIxes(target, 'LIBPREFIX', 'LIBSUFFIX'):
|
||||
|
||||
# Create list of target libraries as strings
|
||||
targetStrings=env.ReplaceIxes(dll,
|
||||
'SHLIBPREFIX', 'SHLIBSUFFIX',
|
||||
'LIBPREFIX', 'LIBSUFFIX')
|
||||
|
||||
# Now add file nodes to target list
|
||||
target.append(env.fs.File(targetStrings))
|
||||
|
||||
# Append a def file target if there isn't already a def file target
|
||||
# or a def file source or the user has explicitly asked for the target
|
||||
# to be emitted.
|
||||
def_source = env.FindIxes(source, 'WINDOWSDEFPREFIX', 'WINDOWSDEFSUFFIX')
|
||||
def_target = env.FindIxes(target, 'WINDOWSDEFPREFIX', 'WINDOWSDEFSUFFIX')
|
||||
skip_def_insert = env.subst("$WINDOWS_INSERT_DEF") in ['', '0', 0]
|
||||
if not def_source and not def_target and not skip_def_insert:
|
||||
# Create list of target libraries and def files as strings
|
||||
targetStrings=env.ReplaceIxes(dll,
|
||||
'SHLIBPREFIX', 'SHLIBSUFFIX',
|
||||
'WINDOWSDEFPREFIX', 'WINDOWSDEFSUFFIX')
|
||||
|
||||
# Now add file nodes to target list
|
||||
target.append(env.fs.File(targetStrings))
|
||||
|
||||
return (target, source)
|
||||
|
||||
|
||||
shlib_action = SCons.Action.Action(shlib_generator, generator=1)
|
||||
|
||||
res_action = SCons.Action.Action('$RCCOM', '$RCCOMSTR')
|
||||
|
||||
res_builder = SCons.Builder.Builder(action=res_action, suffix='.o',
|
||||
source_scanner=SCons.Tool.SourceFileScanner)
|
||||
SCons.Tool.SourceFileScanner.add_scanner('.rc', SCons.Defaults.CScan)
|
||||
|
||||
def generate(env):
|
||||
mingw = find(env)
|
||||
if mingw:
|
||||
dir = os.path.dirname(mingw)
|
||||
env.PrependENVPath('PATH', dir )
|
||||
|
||||
|
||||
# Most of mingw is the same as gcc and friends...
|
||||
gnu_tools = ['gcc', 'g++', 'gnulink', 'ar', 'gas', 'gfortran', 'm4']
|
||||
for tool in gnu_tools:
|
||||
SCons.Tool.Tool(tool)(env)
|
||||
|
||||
#... but a few things differ:
|
||||
env['CC'] = 'gcc'
|
||||
env['SHCCFLAGS'] = SCons.Util.CLVar('$CCFLAGS')
|
||||
env['CXX'] = 'g++'
|
||||
env['SHCXXFLAGS'] = SCons.Util.CLVar('$CXXFLAGS')
|
||||
env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS -shared')
|
||||
env['SHLINKCOM'] = shlib_action
|
||||
env['LDMODULECOM'] = shlib_action
|
||||
env.Append(SHLIBEMITTER = [shlib_emitter])
|
||||
env.Append(LDMODULEEMITTER = [shlib_emitter])
|
||||
env['AS'] = 'as'
|
||||
|
||||
env['WIN32DEFPREFIX'] = ''
|
||||
env['WIN32DEFSUFFIX'] = '.def'
|
||||
env['WINDOWSDEFPREFIX'] = '${WIN32DEFPREFIX}'
|
||||
env['WINDOWSDEFSUFFIX'] = '${WIN32DEFSUFFIX}'
|
||||
|
||||
env['SHOBJSUFFIX'] = '.o'
|
||||
env['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME'] = 1
|
||||
|
||||
env['RC'] = 'windres'
|
||||
env['RCFLAGS'] = SCons.Util.CLVar('')
|
||||
env['RCINCFLAGS'] = '$( ${_concat(RCINCPREFIX, CPPPATH, RCINCSUFFIX, __env__, RDirs, TARGET, SOURCE)} $)'
|
||||
env['RCINCPREFIX'] = '--include-dir '
|
||||
env['RCINCSUFFIX'] = ''
|
||||
env['RCCOM'] = '$RC $_CPPDEFFLAGS $RCINCFLAGS ${RCINCPREFIX} ${SOURCE.dir} $RCFLAGS -i $SOURCE -o $TARGET'
|
||||
env['BUILDERS']['RES'] = res_builder
|
||||
|
||||
# Some setting from the platform also have to be overridden:
|
||||
env['OBJSUFFIX'] = '.o'
|
||||
env['LIBPREFIX'] = 'lib'
|
||||
env['LIBSUFFIX'] = '.a'
|
||||
env['PROGSUFFIX'] = '.exe'
|
||||
|
||||
def exists(env):
|
||||
return find(env)
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
108
scons-local-3.0.0/SCons/Tool/msgfmt.py
Normal file
108
scons-local-3.0.0/SCons/Tool/msgfmt.py
Normal file
@@ -0,0 +1,108 @@
|
||||
""" msgfmt tool """
|
||||
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/msgfmt.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
from SCons.Builder import BuilderBase
|
||||
#############################################################################
|
||||
class _MOFileBuilder(BuilderBase):
|
||||
""" The builder class for `MO` files.
|
||||
|
||||
The reason for this builder to exists and its purpose is quite simillar
|
||||
as for `_POFileBuilder`. This time, we extend list of sources, not targets,
|
||||
and call `BuilderBase._execute()` only once (as we assume single-target
|
||||
here).
|
||||
"""
|
||||
|
||||
def _execute(self, env, target, source, *args, **kw):
|
||||
# Here we add support for 'LINGUAS_FILE' keyword. Emitter is not suitable
|
||||
# in this case, as it is called too late (after multiple sources
|
||||
# are handled single_source builder.
|
||||
import SCons.Util
|
||||
from SCons.Tool.GettextCommon import _read_linguas_from_files
|
||||
linguas_files = None
|
||||
if 'LINGUAS_FILE' in env and env['LINGUAS_FILE'] is not None:
|
||||
linguas_files = env['LINGUAS_FILE']
|
||||
# This should prevent from endless recursion.
|
||||
env['LINGUAS_FILE'] = None
|
||||
# We read only languages. Suffixes shall be added automatically.
|
||||
linguas = _read_linguas_from_files(env, linguas_files)
|
||||
if SCons.Util.is_List(source):
|
||||
source.extend(linguas)
|
||||
elif source is not None:
|
||||
source = [source] + linguas
|
||||
else:
|
||||
source = linguas
|
||||
result = BuilderBase._execute(self,env,target,source,*args, **kw)
|
||||
if linguas_files is not None:
|
||||
env['LINGUAS_FILE'] = linguas_files
|
||||
return result
|
||||
#############################################################################
|
||||
|
||||
#############################################################################
|
||||
def _create_mo_file_builder(env, **kw):
|
||||
""" Create builder object for `MOFiles` builder """
|
||||
import SCons.Action
|
||||
# FIXME: What factory use for source? Ours or their?
|
||||
kw['action'] = SCons.Action.Action('$MSGFMTCOM','$MSGFMTCOMSTR')
|
||||
kw['suffix'] = '$MOSUFFIX'
|
||||
kw['src_suffix'] = '$POSUFFIX'
|
||||
kw['src_builder'] = '_POUpdateBuilder'
|
||||
kw['single_source'] = True
|
||||
return _MOFileBuilder(**kw)
|
||||
#############################################################################
|
||||
|
||||
#############################################################################
|
||||
def generate(env,**kw):
|
||||
""" Generate `msgfmt` tool """
|
||||
import SCons.Util
|
||||
from SCons.Tool.GettextCommon import _detect_msgfmt
|
||||
try:
|
||||
env['MSGFMT'] = _detect_msgfmt(env)
|
||||
except:
|
||||
env['MSGFMT'] = 'msgfmt'
|
||||
env.SetDefault(
|
||||
MSGFMTFLAGS = [ SCons.Util.CLVar('-c') ],
|
||||
MSGFMTCOM = '$MSGFMT $MSGFMTFLAGS -o $TARGET $SOURCE',
|
||||
MSGFMTCOMSTR = '',
|
||||
MOSUFFIX = ['.mo'],
|
||||
POSUFFIX = ['.po']
|
||||
)
|
||||
env.Append( BUILDERS = { 'MOFiles' : _create_mo_file_builder(env) } )
|
||||
#############################################################################
|
||||
|
||||
#############################################################################
|
||||
def exists(env):
|
||||
""" Check if the tool exists """
|
||||
from SCons.Tool.GettextCommon import _msgfmt_exists
|
||||
try:
|
||||
return _msgfmt_exists(env)
|
||||
except:
|
||||
return False
|
||||
#############################################################################
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
120
scons-local-3.0.0/SCons/Tool/msginit.py
Normal file
120
scons-local-3.0.0/SCons/Tool/msginit.py
Normal file
@@ -0,0 +1,120 @@
|
||||
""" msginit tool
|
||||
|
||||
Tool specific initialization of msginit tool.
|
||||
"""
|
||||
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/msginit.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
import SCons.Warnings
|
||||
import SCons.Builder
|
||||
import re
|
||||
|
||||
#############################################################################
|
||||
def _optional_no_translator_flag(env):
|
||||
""" Return '--no-translator' flag if we run *msginit(1)* in non-interactive
|
||||
mode."""
|
||||
import SCons.Util
|
||||
if 'POAUTOINIT' in env:
|
||||
autoinit = env['POAUTOINIT']
|
||||
else:
|
||||
autoinit = False
|
||||
if autoinit:
|
||||
return [SCons.Util.CLVar('--no-translator')]
|
||||
else:
|
||||
return [SCons.Util.CLVar('')]
|
||||
#############################################################################
|
||||
|
||||
#############################################################################
|
||||
def _POInitBuilder(env, **kw):
|
||||
""" Create builder object for `POInit` builder. """
|
||||
import SCons.Action
|
||||
from SCons.Tool.GettextCommon import _init_po_files, _POFileBuilder
|
||||
action = SCons.Action.Action(_init_po_files, None)
|
||||
return _POFileBuilder(env, action=action, target_alias='$POCREATE_ALIAS')
|
||||
#############################################################################
|
||||
|
||||
#############################################################################
|
||||
from SCons.Environment import _null
|
||||
#############################################################################
|
||||
def _POInitBuilderWrapper(env, target=None, source=_null, **kw):
|
||||
""" Wrapper for _POFileBuilder. We use it to make user's life easier.
|
||||
|
||||
This wrapper checks for `$POTDOMAIN` construction variable (or override in
|
||||
`**kw`) and treats it appropriatelly.
|
||||
"""
|
||||
if source is _null:
|
||||
if 'POTDOMAIN' in kw:
|
||||
domain = kw['POTDOMAIN']
|
||||
elif 'POTDOMAIN' in env:
|
||||
domain = env['POTDOMAIN']
|
||||
else:
|
||||
domain = 'messages'
|
||||
source = [ domain ] # NOTE: Suffix shall be appended automatically
|
||||
return env._POInitBuilder(target, source, **kw)
|
||||
#############################################################################
|
||||
|
||||
#############################################################################
|
||||
def generate(env,**kw):
|
||||
""" Generate the `msginit` tool """
|
||||
import SCons.Util
|
||||
from SCons.Tool.GettextCommon import _detect_msginit
|
||||
try:
|
||||
env['MSGINIT'] = _detect_msginit(env)
|
||||
except:
|
||||
env['MSGINIT'] = 'msginit'
|
||||
msginitcom = '$MSGINIT ${_MSGNoTranslator(__env__)} -l ${_MSGINITLOCALE}' \
|
||||
+ ' $MSGINITFLAGS -i $SOURCE -o $TARGET'
|
||||
# NOTE: We set POTSUFFIX here, in case the 'xgettext' is not loaded
|
||||
# (sometimes we really don't need it)
|
||||
env.SetDefault(
|
||||
POSUFFIX = ['.po'],
|
||||
POTSUFFIX = ['.pot'],
|
||||
_MSGINITLOCALE = '${TARGET.filebase}',
|
||||
_MSGNoTranslator = _optional_no_translator_flag,
|
||||
MSGINITCOM = msginitcom,
|
||||
MSGINITCOMSTR = '',
|
||||
MSGINITFLAGS = [ ],
|
||||
POAUTOINIT = False,
|
||||
POCREATE_ALIAS = 'po-create'
|
||||
)
|
||||
env.Append( BUILDERS = { '_POInitBuilder' : _POInitBuilder(env) } )
|
||||
env.AddMethod(_POInitBuilderWrapper, 'POInit')
|
||||
env.AlwaysBuild(env.Alias('$POCREATE_ALIAS'))
|
||||
#############################################################################
|
||||
|
||||
#############################################################################
|
||||
def exists(env):
|
||||
""" Check if the tool exists """
|
||||
from SCons.Tool.GettextCommon import _msginit_exists
|
||||
try:
|
||||
return _msginit_exists(env)
|
||||
except:
|
||||
return False
|
||||
#############################################################################
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
104
scons-local-3.0.0/SCons/Tool/msgmerge.py
Normal file
104
scons-local-3.0.0/SCons/Tool/msgmerge.py
Normal file
@@ -0,0 +1,104 @@
|
||||
""" msgmerget tool
|
||||
|
||||
Tool specific initialization for `msgmerge` tool.
|
||||
"""
|
||||
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/msgmerge.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
#############################################################################
|
||||
def _update_or_init_po_files(target, source, env):
|
||||
""" Action function for `POUpdate` builder """
|
||||
import SCons.Action
|
||||
from SCons.Tool.GettextCommon import _init_po_files
|
||||
for tgt in target:
|
||||
if tgt.rexists():
|
||||
action = SCons.Action.Action('$MSGMERGECOM', '$MSGMERGECOMSTR')
|
||||
else:
|
||||
action = _init_po_files
|
||||
status = action([tgt], source, env)
|
||||
if status : return status
|
||||
return 0
|
||||
#############################################################################
|
||||
|
||||
#############################################################################
|
||||
def _POUpdateBuilder(env, **kw):
|
||||
""" Create an object of `POUpdate` builder """
|
||||
import SCons.Action
|
||||
from SCons.Tool.GettextCommon import _POFileBuilder
|
||||
action = SCons.Action.Action(_update_or_init_po_files, None)
|
||||
return _POFileBuilder(env, action=action, target_alias='$POUPDATE_ALIAS')
|
||||
#############################################################################
|
||||
|
||||
#############################################################################
|
||||
from SCons.Environment import _null
|
||||
#############################################################################
|
||||
def _POUpdateBuilderWrapper(env, target=None, source=_null, **kw):
|
||||
""" Wrapper for `POUpdate` builder - make user's life easier """
|
||||
if source is _null:
|
||||
if 'POTDOMAIN' in kw:
|
||||
domain = kw['POTDOMAIN']
|
||||
elif 'POTDOMAIN' in env and env['POTDOMAIN']:
|
||||
domain = env['POTDOMAIN']
|
||||
else:
|
||||
domain = 'messages'
|
||||
source = [ domain ] # NOTE: Suffix shall be appended automatically
|
||||
return env._POUpdateBuilder(target, source, **kw)
|
||||
#############################################################################
|
||||
|
||||
#############################################################################
|
||||
def generate(env,**kw):
|
||||
""" Generate the `xgettext` tool """
|
||||
from SCons.Tool.GettextCommon import _detect_msgmerge
|
||||
try:
|
||||
env['MSGMERGE'] = _detect_msgmerge(env)
|
||||
except:
|
||||
env['MSGMERGE'] = 'msgmerge'
|
||||
env.SetDefault(
|
||||
POTSUFFIX = ['.pot'],
|
||||
POSUFFIX = ['.po'],
|
||||
MSGMERGECOM = '$MSGMERGE $MSGMERGEFLAGS --update $TARGET $SOURCE',
|
||||
MSGMERGECOMSTR = '',
|
||||
MSGMERGEFLAGS = [ ],
|
||||
POUPDATE_ALIAS = 'po-update'
|
||||
)
|
||||
env.Append(BUILDERS = { '_POUpdateBuilder':_POUpdateBuilder(env) })
|
||||
env.AddMethod(_POUpdateBuilderWrapper, 'POUpdate')
|
||||
env.AlwaysBuild(env.Alias('$POUPDATE_ALIAS'))
|
||||
#############################################################################
|
||||
|
||||
#############################################################################
|
||||
def exists(env):
|
||||
""" Check if the tool exists """
|
||||
from SCons.Tool.GettextCommon import _msgmerge_exists
|
||||
try:
|
||||
return _msgmerge_exists(env)
|
||||
except:
|
||||
return False
|
||||
#############################################################################
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
64
scons-local-3.0.0/SCons/Tool/mslib.py
Normal file
64
scons-local-3.0.0/SCons/Tool/mslib.py
Normal file
@@ -0,0 +1,64 @@
|
||||
"""SCons.Tool.mslib
|
||||
|
||||
Tool-specific initialization for lib (MicroSoft library archiver).
|
||||
|
||||
There normally shouldn't be any need to import this module directly.
|
||||
It will usually be imported through the generic SCons.Tool.Tool()
|
||||
selection method.
|
||||
|
||||
"""
|
||||
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/mslib.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
import SCons.Defaults
|
||||
import SCons.Tool
|
||||
import SCons.Tool.msvs
|
||||
import SCons.Tool.msvc
|
||||
import SCons.Util
|
||||
|
||||
from .MSCommon import msvc_exists, msvc_setup_env_once
|
||||
|
||||
def generate(env):
|
||||
"""Add Builders and construction variables for lib to an Environment."""
|
||||
SCons.Tool.createStaticLibBuilder(env)
|
||||
|
||||
# Set-up ms tools paths
|
||||
msvc_setup_env_once(env)
|
||||
|
||||
env['AR'] = 'lib'
|
||||
env['ARFLAGS'] = SCons.Util.CLVar('/nologo')
|
||||
env['ARCOM'] = "${TEMPFILE('$AR $ARFLAGS /OUT:$TARGET $SOURCES','$ARCOMSTR')}"
|
||||
env['LIBPREFIX'] = ''
|
||||
env['LIBSUFFIX'] = '.lib'
|
||||
|
||||
def exists(env):
|
||||
return msvc_exists()
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
337
scons-local-3.0.0/SCons/Tool/mslink.py
Normal file
337
scons-local-3.0.0/SCons/Tool/mslink.py
Normal file
@@ -0,0 +1,337 @@
|
||||
"""SCons.Tool.mslink
|
||||
|
||||
Tool-specific initialization for the Microsoft linker.
|
||||
|
||||
There normally shouldn't be any need to import this module directly.
|
||||
It will usually be imported through the generic SCons.Tool.Tool()
|
||||
selection method.
|
||||
|
||||
"""
|
||||
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
from __future__ import print_function
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/mslink.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
import os.path
|
||||
|
||||
import SCons.Action
|
||||
import SCons.Defaults
|
||||
import SCons.Errors
|
||||
import SCons.Platform.win32
|
||||
import SCons.Tool
|
||||
import SCons.Tool.msvc
|
||||
import SCons.Tool.msvs
|
||||
import SCons.Util
|
||||
|
||||
from .MSCommon import msvc_setup_env_once, msvc_exists
|
||||
|
||||
def pdbGenerator(env, target, source, for_signature):
|
||||
try:
|
||||
return ['/PDB:%s' % target[0].attributes.pdb, '/DEBUG']
|
||||
except (AttributeError, IndexError):
|
||||
return None
|
||||
|
||||
def _dllTargets(target, source, env, for_signature, paramtp):
|
||||
listCmd = []
|
||||
dll = env.FindIxes(target, '%sPREFIX' % paramtp, '%sSUFFIX' % paramtp)
|
||||
if dll: listCmd.append("/out:%s"%dll.get_string(for_signature))
|
||||
|
||||
implib = env.FindIxes(target, 'LIBPREFIX', 'LIBSUFFIX')
|
||||
if implib: listCmd.append("/implib:%s"%implib.get_string(for_signature))
|
||||
|
||||
return listCmd
|
||||
|
||||
def _dllSources(target, source, env, for_signature, paramtp):
|
||||
listCmd = []
|
||||
|
||||
deffile = env.FindIxes(source, "WINDOWSDEFPREFIX", "WINDOWSDEFSUFFIX")
|
||||
for src in source:
|
||||
# Check explicitly for a non-None deffile so that the __cmp__
|
||||
# method of the base SCons.Util.Proxy class used for some Node
|
||||
# proxies doesn't try to use a non-existent __dict__ attribute.
|
||||
if deffile and src == deffile:
|
||||
# Treat this source as a .def file.
|
||||
listCmd.append("/def:%s" % src.get_string(for_signature))
|
||||
else:
|
||||
# Just treat it as a generic source file.
|
||||
listCmd.append(src)
|
||||
return listCmd
|
||||
|
||||
def windowsShlinkTargets(target, source, env, for_signature):
|
||||
return _dllTargets(target, source, env, for_signature, 'SHLIB')
|
||||
|
||||
def windowsShlinkSources(target, source, env, for_signature):
|
||||
return _dllSources(target, source, env, for_signature, 'SHLIB')
|
||||
|
||||
def _windowsLdmodTargets(target, source, env, for_signature):
|
||||
"""Get targets for loadable modules."""
|
||||
return _dllTargets(target, source, env, for_signature, 'LDMODULE')
|
||||
|
||||
def _windowsLdmodSources(target, source, env, for_signature):
|
||||
"""Get sources for loadable modules."""
|
||||
return _dllSources(target, source, env, for_signature, 'LDMODULE')
|
||||
|
||||
def _dllEmitter(target, source, env, paramtp):
|
||||
"""Common implementation of dll emitter."""
|
||||
SCons.Tool.msvc.validate_vars(env)
|
||||
|
||||
extratargets = []
|
||||
extrasources = []
|
||||
|
||||
dll = env.FindIxes(target, '%sPREFIX' % paramtp, '%sSUFFIX' % paramtp)
|
||||
no_import_lib = env.get('no_import_lib', 0)
|
||||
|
||||
if not dll:
|
||||
raise SCons.Errors.UserError('A shared library should have exactly one target with the suffix: %s' % env.subst('$%sSUFFIX' % paramtp))
|
||||
|
||||
insert_def = env.subst("$WINDOWS_INSERT_DEF")
|
||||
if not insert_def in ['', '0', 0] and \
|
||||
not env.FindIxes(source, "WINDOWSDEFPREFIX", "WINDOWSDEFSUFFIX"):
|
||||
|
||||
# append a def file to the list of sources
|
||||
extrasources.append(
|
||||
env.ReplaceIxes(dll,
|
||||
'%sPREFIX' % paramtp, '%sSUFFIX' % paramtp,
|
||||
"WINDOWSDEFPREFIX", "WINDOWSDEFSUFFIX"))
|
||||
|
||||
version_num, suite = SCons.Tool.msvs.msvs_parse_version(env.get('MSVS_VERSION', '6.0'))
|
||||
if version_num >= 8.0 and \
|
||||
(env.get('WINDOWS_INSERT_MANIFEST', 0) or env.get('WINDOWS_EMBED_MANIFEST', 0)):
|
||||
# MSVC 8 and above automatically generate .manifest files that must be installed
|
||||
extratargets.append(
|
||||
env.ReplaceIxes(dll,
|
||||
'%sPREFIX' % paramtp, '%sSUFFIX' % paramtp,
|
||||
"WINDOWSSHLIBMANIFESTPREFIX", "WINDOWSSHLIBMANIFESTSUFFIX"))
|
||||
|
||||
if 'PDB' in env and env['PDB']:
|
||||
pdb = env.arg2nodes('$PDB', target=target, source=source)[0]
|
||||
extratargets.append(pdb)
|
||||
target[0].attributes.pdb = pdb
|
||||
|
||||
if version_num >= 11.0 and env.get('PCH', 0):
|
||||
# MSVC 11 and above need the PCH object file to be added to the link line,
|
||||
# otherwise you get link error LNK2011.
|
||||
pchobj = SCons.Util.splitext(str(env['PCH']))[0] + '.obj'
|
||||
# print "prog_emitter, version %s, appending pchobj %s"%(version_num, pchobj)
|
||||
if pchobj not in extrasources:
|
||||
extrasources.append(pchobj)
|
||||
|
||||
if not no_import_lib and \
|
||||
not env.FindIxes(target, "LIBPREFIX", "LIBSUFFIX"):
|
||||
# Append an import library to the list of targets.
|
||||
extratargets.append(
|
||||
env.ReplaceIxes(dll,
|
||||
'%sPREFIX' % paramtp, '%sSUFFIX' % paramtp,
|
||||
"LIBPREFIX", "LIBSUFFIX"))
|
||||
# and .exp file is created if there are exports from a DLL
|
||||
extratargets.append(
|
||||
env.ReplaceIxes(dll,
|
||||
'%sPREFIX' % paramtp, '%sSUFFIX' % paramtp,
|
||||
"WINDOWSEXPPREFIX", "WINDOWSEXPSUFFIX"))
|
||||
|
||||
return (target+extratargets, source+extrasources)
|
||||
|
||||
def windowsLibEmitter(target, source, env):
|
||||
return _dllEmitter(target, source, env, 'SHLIB')
|
||||
|
||||
def ldmodEmitter(target, source, env):
|
||||
"""Emitter for loadable modules.
|
||||
|
||||
Loadable modules are identical to shared libraries on Windows, but building
|
||||
them is subject to different parameters (LDMODULE*).
|
||||
"""
|
||||
return _dllEmitter(target, source, env, 'LDMODULE')
|
||||
|
||||
def prog_emitter(target, source, env):
|
||||
SCons.Tool.msvc.validate_vars(env)
|
||||
|
||||
extratargets = []
|
||||
extrasources = []
|
||||
|
||||
exe = env.FindIxes(target, "PROGPREFIX", "PROGSUFFIX")
|
||||
if not exe:
|
||||
raise SCons.Errors.UserError("An executable should have exactly one target with the suffix: %s" % env.subst("$PROGSUFFIX"))
|
||||
|
||||
version_num, suite = SCons.Tool.msvs.msvs_parse_version(env.get('MSVS_VERSION', '6.0'))
|
||||
if version_num >= 8.0 and \
|
||||
(env.get('WINDOWS_INSERT_MANIFEST', 0) or env.get('WINDOWS_EMBED_MANIFEST', 0)):
|
||||
# MSVC 8 and above automatically generate .manifest files that have to be installed
|
||||
extratargets.append(
|
||||
env.ReplaceIxes(exe,
|
||||
"PROGPREFIX", "PROGSUFFIX",
|
||||
"WINDOWSPROGMANIFESTPREFIX", "WINDOWSPROGMANIFESTSUFFIX"))
|
||||
|
||||
if 'PDB' in env and env['PDB']:
|
||||
pdb = env.arg2nodes('$PDB', target=target, source=source)[0]
|
||||
extratargets.append(pdb)
|
||||
target[0].attributes.pdb = pdb
|
||||
|
||||
if version_num >= 11.0 and env.get('PCH', 0):
|
||||
# MSVC 11 and above need the PCH object file to be added to the link line,
|
||||
# otherwise you get link error LNK2011.
|
||||
pchobj = SCons.Util.splitext(str(env['PCH']))[0] + '.obj'
|
||||
# print("prog_emitter, version %s, appending pchobj %s"%(version_num, pchobj))
|
||||
if pchobj not in extrasources:
|
||||
extrasources.append(pchobj)
|
||||
|
||||
return (target+extratargets,source+extrasources)
|
||||
|
||||
def RegServerFunc(target, source, env):
|
||||
if 'register' in env and env['register']:
|
||||
ret = regServerAction([target[0]], [source[0]], env)
|
||||
if ret:
|
||||
raise SCons.Errors.UserError("Unable to register %s" % target[0])
|
||||
else:
|
||||
print("Registered %s sucessfully" % target[0])
|
||||
return ret
|
||||
return 0
|
||||
|
||||
# These are the actual actions run to embed the manifest.
|
||||
# They are only called from the Check versions below.
|
||||
embedManifestExeAction = SCons.Action.Action('$MTEXECOM')
|
||||
embedManifestDllAction = SCons.Action.Action('$MTSHLIBCOM')
|
||||
|
||||
def embedManifestDllCheck(target, source, env):
|
||||
"""Function run by embedManifestDllCheckAction to check for existence of manifest
|
||||
and other conditions, and embed the manifest by calling embedManifestDllAction if so."""
|
||||
if env.get('WINDOWS_EMBED_MANIFEST', 0):
|
||||
manifestSrc = target[0].get_abspath() + '.manifest'
|
||||
if os.path.exists(manifestSrc):
|
||||
ret = (embedManifestDllAction) ([target[0]],None,env)
|
||||
if ret:
|
||||
raise SCons.Errors.UserError("Unable to embed manifest into %s" % (target[0]))
|
||||
return ret
|
||||
else:
|
||||
print('(embed: no %s.manifest found; not embedding.)'%str(target[0]))
|
||||
return 0
|
||||
|
||||
def embedManifestExeCheck(target, source, env):
|
||||
"""Function run by embedManifestExeCheckAction to check for existence of manifest
|
||||
and other conditions, and embed the manifest by calling embedManifestExeAction if so."""
|
||||
if env.get('WINDOWS_EMBED_MANIFEST', 0):
|
||||
manifestSrc = target[0].get_abspath() + '.manifest'
|
||||
if os.path.exists(manifestSrc):
|
||||
ret = (embedManifestExeAction) ([target[0]],None,env)
|
||||
if ret:
|
||||
raise SCons.Errors.UserError("Unable to embed manifest into %s" % (target[0]))
|
||||
return ret
|
||||
else:
|
||||
print('(embed: no %s.manifest found; not embedding.)'%str(target[0]))
|
||||
return 0
|
||||
|
||||
embedManifestDllCheckAction = SCons.Action.Action(embedManifestDllCheck, None)
|
||||
embedManifestExeCheckAction = SCons.Action.Action(embedManifestExeCheck, None)
|
||||
|
||||
regServerAction = SCons.Action.Action("$REGSVRCOM", "$REGSVRCOMSTR")
|
||||
regServerCheck = SCons.Action.Action(RegServerFunc, None)
|
||||
shlibLinkAction = SCons.Action.Action('${TEMPFILE("$SHLINK $SHLINKFLAGS $_SHLINK_TARGETS $_LIBDIRFLAGS $_LIBFLAGS $_PDB $_SHLINK_SOURCES", "$SHLINKCOMSTR")}', '$SHLINKCOMSTR')
|
||||
compositeShLinkAction = shlibLinkAction + regServerCheck + embedManifestDllCheckAction
|
||||
ldmodLinkAction = SCons.Action.Action('${TEMPFILE("$LDMODULE $LDMODULEFLAGS $_LDMODULE_TARGETS $_LIBDIRFLAGS $_LIBFLAGS $_PDB $_LDMODULE_SOURCES", "$LDMODULECOMSTR")}', '$LDMODULECOMSTR')
|
||||
compositeLdmodAction = ldmodLinkAction + regServerCheck + embedManifestDllCheckAction
|
||||
exeLinkAction = SCons.Action.Action('${TEMPFILE("$LINK $LINKFLAGS /OUT:$TARGET.windows $_LIBDIRFLAGS $_LIBFLAGS $_PDB $SOURCES.windows", "$LINKCOMSTR")}', '$LINKCOMSTR')
|
||||
compositeLinkAction = exeLinkAction + embedManifestExeCheckAction
|
||||
|
||||
def generate(env):
|
||||
"""Add Builders and construction variables for ar to an Environment."""
|
||||
SCons.Tool.createSharedLibBuilder(env)
|
||||
SCons.Tool.createProgBuilder(env)
|
||||
|
||||
env['SHLINK'] = '$LINK'
|
||||
env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS /dll')
|
||||
env['_SHLINK_TARGETS'] = windowsShlinkTargets
|
||||
env['_SHLINK_SOURCES'] = windowsShlinkSources
|
||||
env['SHLINKCOM'] = compositeShLinkAction
|
||||
env.Append(SHLIBEMITTER = [windowsLibEmitter])
|
||||
env.Append(LDMODULEEMITTER = [windowsLibEmitter])
|
||||
env['LINK'] = 'link'
|
||||
env['LINKFLAGS'] = SCons.Util.CLVar('/nologo')
|
||||
env['_PDB'] = pdbGenerator
|
||||
env['LINKCOM'] = compositeLinkAction
|
||||
env.Append(PROGEMITTER = [prog_emitter])
|
||||
env['LIBDIRPREFIX']='/LIBPATH:'
|
||||
env['LIBDIRSUFFIX']=''
|
||||
env['LIBLINKPREFIX']=''
|
||||
env['LIBLINKSUFFIX']='$LIBSUFFIX'
|
||||
|
||||
env['WIN32DEFPREFIX'] = ''
|
||||
env['WIN32DEFSUFFIX'] = '.def'
|
||||
env['WIN32_INSERT_DEF'] = 0
|
||||
env['WINDOWSDEFPREFIX'] = '${WIN32DEFPREFIX}'
|
||||
env['WINDOWSDEFSUFFIX'] = '${WIN32DEFSUFFIX}'
|
||||
env['WINDOWS_INSERT_DEF'] = '${WIN32_INSERT_DEF}'
|
||||
|
||||
env['WIN32EXPPREFIX'] = ''
|
||||
env['WIN32EXPSUFFIX'] = '.exp'
|
||||
env['WINDOWSEXPPREFIX'] = '${WIN32EXPPREFIX}'
|
||||
env['WINDOWSEXPSUFFIX'] = '${WIN32EXPSUFFIX}'
|
||||
|
||||
env['WINDOWSSHLIBMANIFESTPREFIX'] = ''
|
||||
env['WINDOWSSHLIBMANIFESTSUFFIX'] = '${SHLIBSUFFIX}.manifest'
|
||||
env['WINDOWSPROGMANIFESTPREFIX'] = ''
|
||||
env['WINDOWSPROGMANIFESTSUFFIX'] = '${PROGSUFFIX}.manifest'
|
||||
|
||||
env['REGSVRACTION'] = regServerCheck
|
||||
env['REGSVR'] = os.path.join(SCons.Platform.win32.get_system_root(),'System32','regsvr32')
|
||||
env['REGSVRFLAGS'] = '/s '
|
||||
env['REGSVRCOM'] = '$REGSVR $REGSVRFLAGS ${TARGET.windows}'
|
||||
|
||||
env['WINDOWS_EMBED_MANIFEST'] = 0
|
||||
env['MT'] = 'mt'
|
||||
#env['MTFLAGS'] = ['-hashupdate']
|
||||
env['MTFLAGS'] = SCons.Util.CLVar('/nologo')
|
||||
# Note: use - here to prevent build failure if no manifest produced.
|
||||
# This seems much simpler than a fancy system using a function action to see
|
||||
# if the manifest actually exists before trying to run mt with it.
|
||||
env['MTEXECOM'] = '-$MT $MTFLAGS -manifest ${TARGET}.manifest $_MANIFEST_SOURCES -outputresource:$TARGET;1'
|
||||
env['MTSHLIBCOM'] = '-$MT $MTFLAGS -manifest ${TARGET}.manifest $_MANIFEST_SOURCES -outputresource:$TARGET;2'
|
||||
# TODO Future work garyo 27-Feb-11
|
||||
env['_MANIFEST_SOURCES'] = None # _windowsManifestSources
|
||||
|
||||
# Set-up ms tools paths
|
||||
msvc_setup_env_once(env)
|
||||
|
||||
|
||||
# Loadable modules are on Windows the same as shared libraries, but they
|
||||
# are subject to different build parameters (LDMODULE* variables).
|
||||
# Therefore LDMODULE* variables correspond as much as possible to
|
||||
# SHLINK*/SHLIB* ones.
|
||||
SCons.Tool.createLoadableModuleBuilder(env)
|
||||
env['LDMODULE'] = '$SHLINK'
|
||||
env['LDMODULEPREFIX'] = '$SHLIBPREFIX'
|
||||
env['LDMODULESUFFIX'] = '$SHLIBSUFFIX'
|
||||
env['LDMODULEFLAGS'] = '$SHLINKFLAGS'
|
||||
env['_LDMODULE_TARGETS'] = _windowsLdmodTargets
|
||||
env['_LDMODULE_SOURCES'] = _windowsLdmodSources
|
||||
env['LDMODULEEMITTER'] = [ldmodEmitter]
|
||||
env['LDMODULECOM'] = compositeLdmodAction
|
||||
|
||||
def exists(env):
|
||||
return msvc_exists()
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
50
scons-local-3.0.0/SCons/Tool/mssdk.py
Normal file
50
scons-local-3.0.0/SCons/Tool/mssdk.py
Normal file
@@ -0,0 +1,50 @@
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/mssdk.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
"""engine.SCons.Tool.mssdk
|
||||
|
||||
Tool-specific initialization for Microsoft SDKs, both Platform
|
||||
SDKs and Windows SDKs.
|
||||
|
||||
There normally shouldn't be any need to import this module directly.
|
||||
It will usually be imported through the generic SCons.Tool.Tool()
|
||||
selection method.
|
||||
"""
|
||||
|
||||
from .MSCommon import mssdk_exists, \
|
||||
mssdk_setup_env
|
||||
|
||||
def generate(env):
|
||||
"""Add construction variables for an MS SDK to an Environment."""
|
||||
mssdk_setup_env(env)
|
||||
|
||||
def exists(env):
|
||||
return mssdk_exists()
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
295
scons-local-3.0.0/SCons/Tool/msvc.py
Normal file
295
scons-local-3.0.0/SCons/Tool/msvc.py
Normal file
@@ -0,0 +1,295 @@
|
||||
"""engine.SCons.Tool.msvc
|
||||
|
||||
Tool-specific initialization for Microsoft Visual C/C++.
|
||||
|
||||
There normally shouldn't be any need to import this module directly.
|
||||
It will usually be imported through the generic SCons.Tool.Tool()
|
||||
selection method.
|
||||
|
||||
"""
|
||||
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/msvc.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
import os.path
|
||||
import re
|
||||
import sys
|
||||
|
||||
import SCons.Action
|
||||
import SCons.Builder
|
||||
import SCons.Errors
|
||||
import SCons.Platform.win32
|
||||
import SCons.Tool
|
||||
import SCons.Tool.msvs
|
||||
import SCons.Util
|
||||
import SCons.Warnings
|
||||
import SCons.Scanner.RC
|
||||
|
||||
from .MSCommon import msvc_exists, msvc_setup_env_once, msvc_version_to_maj_min
|
||||
|
||||
CSuffixes = ['.c', '.C']
|
||||
CXXSuffixes = ['.cc', '.cpp', '.cxx', '.c++', '.C++']
|
||||
|
||||
def validate_vars(env):
|
||||
"""Validate the PCH and PCHSTOP construction variables."""
|
||||
if 'PCH' in env and env['PCH']:
|
||||
if 'PCHSTOP' not in env:
|
||||
raise SCons.Errors.UserError("The PCHSTOP construction must be defined if PCH is defined.")
|
||||
if not SCons.Util.is_String(env['PCHSTOP']):
|
||||
raise SCons.Errors.UserError("The PCHSTOP construction variable must be a string: %r"%env['PCHSTOP'])
|
||||
|
||||
def msvc_set_PCHPDBFLAGS(env):
|
||||
"""
|
||||
Set appropriate PCHPDBFLAGS for the MSVC version being used.
|
||||
"""
|
||||
if env.get('MSVC_VERSION',False):
|
||||
maj, min = msvc_version_to_maj_min(env['MSVC_VERSION'])
|
||||
if maj < 8:
|
||||
env['PCHPDBFLAGS'] = SCons.Util.CLVar(['${(PDB and "/Yd") or ""}'])
|
||||
else:
|
||||
env['PCHPDBFLAGS'] = ''
|
||||
else:
|
||||
# Default if we can't determine which version of MSVC we're using
|
||||
env['PCHPDBFLAGS'] = SCons.Util.CLVar(['${(PDB and "/Yd") or ""}'])
|
||||
|
||||
|
||||
def pch_emitter(target, source, env):
|
||||
"""Adds the object file target."""
|
||||
|
||||
validate_vars(env)
|
||||
|
||||
pch = None
|
||||
obj = None
|
||||
|
||||
for t in target:
|
||||
if SCons.Util.splitext(str(t))[1] == '.pch':
|
||||
pch = t
|
||||
if SCons.Util.splitext(str(t))[1] == '.obj':
|
||||
obj = t
|
||||
|
||||
if not obj:
|
||||
obj = SCons.Util.splitext(str(pch))[0]+'.obj'
|
||||
|
||||
target = [pch, obj] # pch must be first, and obj second for the PCHCOM to work
|
||||
|
||||
return (target, source)
|
||||
|
||||
def object_emitter(target, source, env, parent_emitter):
|
||||
"""Sets up the PCH dependencies for an object file."""
|
||||
|
||||
validate_vars(env)
|
||||
|
||||
parent_emitter(target, source, env)
|
||||
|
||||
# Add a dependency, but only if the target (e.g. 'Source1.obj')
|
||||
# doesn't correspond to the pre-compiled header ('Source1.pch').
|
||||
# If the basenames match, then this was most likely caused by
|
||||
# someone adding the source file to both the env.PCH() and the
|
||||
# env.Program() calls, and adding the explicit dependency would
|
||||
# cause a cycle on the .pch file itself.
|
||||
#
|
||||
# See issue #2505 for a discussion of what to do if it turns
|
||||
# out this assumption causes trouble in the wild:
|
||||
# http://scons.tigris.org/issues/show_bug.cgi?id=2505
|
||||
if 'PCH' in env:
|
||||
pch = env['PCH']
|
||||
if str(target[0]) != SCons.Util.splitext(str(pch))[0] + '.obj':
|
||||
env.Depends(target, pch)
|
||||
|
||||
return (target, source)
|
||||
|
||||
def static_object_emitter(target, source, env):
|
||||
return object_emitter(target, source, env,
|
||||
SCons.Defaults.StaticObjectEmitter)
|
||||
|
||||
def shared_object_emitter(target, source, env):
|
||||
return object_emitter(target, source, env,
|
||||
SCons.Defaults.SharedObjectEmitter)
|
||||
|
||||
pch_action = SCons.Action.Action('$PCHCOM', '$PCHCOMSTR')
|
||||
pch_builder = SCons.Builder.Builder(action=pch_action, suffix='.pch',
|
||||
emitter=pch_emitter,
|
||||
source_scanner=SCons.Tool.SourceFileScanner)
|
||||
|
||||
|
||||
# Logic to build .rc files into .res files (resource files)
|
||||
res_scanner = SCons.Scanner.RC.RCScan()
|
||||
res_action = SCons.Action.Action('$RCCOM', '$RCCOMSTR')
|
||||
res_builder = SCons.Builder.Builder(action=res_action,
|
||||
src_suffix='.rc',
|
||||
suffix='.res',
|
||||
src_builder=[],
|
||||
source_scanner=res_scanner)
|
||||
|
||||
def msvc_batch_key(action, env, target, source):
|
||||
"""
|
||||
Returns a key to identify unique batches of sources for compilation.
|
||||
|
||||
If batching is enabled (via the $MSVC_BATCH setting), then all
|
||||
target+source pairs that use the same action, defined by the same
|
||||
environment, and have the same target and source directories, will
|
||||
be batched.
|
||||
|
||||
Returning None specifies that the specified target+source should not
|
||||
be batched with other compilations.
|
||||
"""
|
||||
|
||||
# Fixing MSVC_BATCH mode. Previous if did not work when MSVC_BATCH
|
||||
# was set to False. This new version should work better.
|
||||
# Note we need to do the env.subst so $MSVC_BATCH can be a reference to
|
||||
# another construction variable, which is why we test for False and 0
|
||||
# as strings.
|
||||
if not 'MSVC_BATCH' in env or env.subst('$MSVC_BATCH') in ('0', 'False', '', None):
|
||||
# We're not using batching; return no key.
|
||||
return None
|
||||
t = target[0]
|
||||
s = source[0]
|
||||
if os.path.splitext(t.name)[0] != os.path.splitext(s.name)[0]:
|
||||
# The base names are different, so this *must* be compiled
|
||||
# separately; return no key.
|
||||
return None
|
||||
return (id(action), id(env), t.dir, s.dir)
|
||||
|
||||
def msvc_output_flag(target, source, env, for_signature):
|
||||
"""
|
||||
Returns the correct /Fo flag for batching.
|
||||
|
||||
If batching is disabled or there's only one source file, then we
|
||||
return an /Fo string that specifies the target explicitly. Otherwise,
|
||||
we return an /Fo string that just specifies the first target's
|
||||
directory (where the Visual C/C++ compiler will put the .obj files).
|
||||
"""
|
||||
|
||||
# Fixing MSVC_BATCH mode. Previous if did not work when MSVC_BATCH
|
||||
# was set to False. This new version should work better. Removed
|
||||
# len(source)==1 as batch mode can compile only one file
|
||||
# (and it also fixed problem with compiling only one changed file
|
||||
# with batch mode enabled)
|
||||
if not 'MSVC_BATCH' in env or env.subst('$MSVC_BATCH') in ('0', 'False', '', None):
|
||||
return '/Fo$TARGET'
|
||||
else:
|
||||
# The Visual C/C++ compiler requires a \ at the end of the /Fo
|
||||
# option to indicate an output directory. We use os.sep here so
|
||||
# that the test(s) for this can be run on non-Windows systems
|
||||
# without having a hard-coded backslash mess up command-line
|
||||
# argument parsing.
|
||||
return '/Fo${TARGET.dir}' + os.sep
|
||||
|
||||
CAction = SCons.Action.Action("$CCCOM", "$CCCOMSTR",
|
||||
batch_key=msvc_batch_key,
|
||||
targets='$CHANGED_TARGETS')
|
||||
ShCAction = SCons.Action.Action("$SHCCCOM", "$SHCCCOMSTR",
|
||||
batch_key=msvc_batch_key,
|
||||
targets='$CHANGED_TARGETS')
|
||||
CXXAction = SCons.Action.Action("$CXXCOM", "$CXXCOMSTR",
|
||||
batch_key=msvc_batch_key,
|
||||
targets='$CHANGED_TARGETS')
|
||||
ShCXXAction = SCons.Action.Action("$SHCXXCOM", "$SHCXXCOMSTR",
|
||||
batch_key=msvc_batch_key,
|
||||
targets='$CHANGED_TARGETS')
|
||||
|
||||
def generate(env):
|
||||
"""Add Builders and construction variables for MSVC++ to an Environment."""
|
||||
static_obj, shared_obj = SCons.Tool.createObjBuilders(env)
|
||||
|
||||
# TODO(batch): shouldn't reach in to cmdgen this way; necessary
|
||||
# for now to bypass the checks in Builder.DictCmdGenerator.__call__()
|
||||
# and allow .cc and .cpp to be compiled in the same command line.
|
||||
static_obj.cmdgen.source_ext_match = False
|
||||
shared_obj.cmdgen.source_ext_match = False
|
||||
|
||||
for suffix in CSuffixes:
|
||||
static_obj.add_action(suffix, CAction)
|
||||
shared_obj.add_action(suffix, ShCAction)
|
||||
static_obj.add_emitter(suffix, static_object_emitter)
|
||||
shared_obj.add_emitter(suffix, shared_object_emitter)
|
||||
|
||||
for suffix in CXXSuffixes:
|
||||
static_obj.add_action(suffix, CXXAction)
|
||||
shared_obj.add_action(suffix, ShCXXAction)
|
||||
static_obj.add_emitter(suffix, static_object_emitter)
|
||||
shared_obj.add_emitter(suffix, shared_object_emitter)
|
||||
|
||||
env['CCPDBFLAGS'] = SCons.Util.CLVar(['${(PDB and "/Z7") or ""}'])
|
||||
env['CCPCHFLAGS'] = SCons.Util.CLVar(['${(PCH and "/Yu%s \\\"/Fp%s\\\""%(PCHSTOP or "",File(PCH))) or ""}'])
|
||||
env['_MSVC_OUTPUT_FLAG'] = msvc_output_flag
|
||||
env['_CCCOMCOM'] = '$CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS $CCPCHFLAGS $CCPDBFLAGS'
|
||||
env['CC'] = 'cl'
|
||||
env['CCFLAGS'] = SCons.Util.CLVar('/nologo')
|
||||
env['CFLAGS'] = SCons.Util.CLVar('')
|
||||
env['CCCOM'] = '${TEMPFILE("$CC $_MSVC_OUTPUT_FLAG /c $CHANGED_SOURCES $CFLAGS $CCFLAGS $_CCCOMCOM","$CCCOMSTR")}'
|
||||
env['SHCC'] = '$CC'
|
||||
env['SHCCFLAGS'] = SCons.Util.CLVar('$CCFLAGS')
|
||||
env['SHCFLAGS'] = SCons.Util.CLVar('$CFLAGS')
|
||||
env['SHCCCOM'] = '${TEMPFILE("$SHCC $_MSVC_OUTPUT_FLAG /c $CHANGED_SOURCES $SHCFLAGS $SHCCFLAGS $_CCCOMCOM","$SHCCCOMSTR")}'
|
||||
env['CXX'] = '$CC'
|
||||
env['CXXFLAGS'] = SCons.Util.CLVar('$( /TP $)')
|
||||
env['CXXCOM'] = '${TEMPFILE("$CXX $_MSVC_OUTPUT_FLAG /c $CHANGED_SOURCES $CXXFLAGS $CCFLAGS $_CCCOMCOM","$CXXCOMSTR")}'
|
||||
env['SHCXX'] = '$CXX'
|
||||
env['SHCXXFLAGS'] = SCons.Util.CLVar('$CXXFLAGS')
|
||||
env['SHCXXCOM'] = '${TEMPFILE("$SHCXX $_MSVC_OUTPUT_FLAG /c $CHANGED_SOURCES $SHCXXFLAGS $SHCCFLAGS $_CCCOMCOM","$SHCXXCOMSTR")}'
|
||||
env['CPPDEFPREFIX'] = '/D'
|
||||
env['CPPDEFSUFFIX'] = ''
|
||||
env['INCPREFIX'] = '/I'
|
||||
env['INCSUFFIX'] = ''
|
||||
# env.Append(OBJEMITTER = [static_object_emitter])
|
||||
# env.Append(SHOBJEMITTER = [shared_object_emitter])
|
||||
env['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME'] = 1
|
||||
|
||||
env['RC'] = 'rc'
|
||||
env['RCFLAGS'] = SCons.Util.CLVar('')
|
||||
env['RCSUFFIXES']=['.rc','.rc2']
|
||||
env['RCCOM'] = '$RC $_CPPDEFFLAGS $_CPPINCFLAGS $RCFLAGS /fo$TARGET $SOURCES'
|
||||
env['BUILDERS']['RES'] = res_builder
|
||||
env['OBJPREFIX'] = ''
|
||||
env['OBJSUFFIX'] = '.obj'
|
||||
env['SHOBJPREFIX'] = '$OBJPREFIX'
|
||||
env['SHOBJSUFFIX'] = '$OBJSUFFIX'
|
||||
|
||||
# Set-up ms tools paths
|
||||
msvc_setup_env_once(env)
|
||||
|
||||
env['CFILESUFFIX'] = '.c'
|
||||
env['CXXFILESUFFIX'] = '.cc'
|
||||
|
||||
msvc_set_PCHPDBFLAGS(env)
|
||||
|
||||
|
||||
env['PCHCOM'] = '$CXX /Fo${TARGETS[1]} $CXXFLAGS $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS /c $SOURCES /Yc$PCHSTOP /Fp${TARGETS[0]} $CCPDBFLAGS $PCHPDBFLAGS'
|
||||
env['BUILDERS']['PCH'] = pch_builder
|
||||
|
||||
if 'ENV' not in env:
|
||||
env['ENV'] = {}
|
||||
if 'SystemRoot' not in env['ENV']: # required for dlls in the winsxs folders
|
||||
env['ENV']['SystemRoot'] = SCons.Platform.win32.get_system_root()
|
||||
|
||||
def exists(env):
|
||||
return msvc_exists()
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
1999
scons-local-3.0.0/SCons/Tool/msvs.py
Normal file
1999
scons-local-3.0.0/SCons/Tool/msvs.py
Normal file
File diff suppressed because it is too large
Load Diff
207
scons-local-3.0.0/SCons/Tool/mwcc.py
Normal file
207
scons-local-3.0.0/SCons/Tool/mwcc.py
Normal file
@@ -0,0 +1,207 @@
|
||||
"""SCons.Tool.mwcc
|
||||
|
||||
Tool-specific initialization for the Metrowerks CodeWarrior compiler.
|
||||
|
||||
There normally shouldn't be any need to import this module directly.
|
||||
It will usually be imported through the generic SCons.Tool.Tool()
|
||||
selection method.
|
||||
"""
|
||||
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/mwcc.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
import os
|
||||
import os.path
|
||||
|
||||
import SCons.Util
|
||||
|
||||
def set_vars(env):
|
||||
"""Set MWCW_VERSION, MWCW_VERSIONS, and some codewarrior environment vars
|
||||
|
||||
MWCW_VERSIONS is set to a list of objects representing installed versions
|
||||
|
||||
MWCW_VERSION is set to the version object that will be used for building.
|
||||
MWCW_VERSION can be set to a string during Environment
|
||||
construction to influence which version is chosen, otherwise
|
||||
the latest one from MWCW_VERSIONS is used.
|
||||
|
||||
Returns true if at least one version is found, false otherwise
|
||||
"""
|
||||
desired = env.get('MWCW_VERSION', '')
|
||||
|
||||
# return right away if the variables are already set
|
||||
if isinstance(desired, MWVersion):
|
||||
return 1
|
||||
elif desired is None:
|
||||
return 0
|
||||
|
||||
versions = find_versions()
|
||||
version = None
|
||||
|
||||
if desired:
|
||||
for v in versions:
|
||||
if str(v) == desired:
|
||||
version = v
|
||||
elif versions:
|
||||
version = versions[-1]
|
||||
|
||||
env['MWCW_VERSIONS'] = versions
|
||||
env['MWCW_VERSION'] = version
|
||||
|
||||
if version is None:
|
||||
return 0
|
||||
|
||||
env.PrependENVPath('PATH', version.clpath)
|
||||
env.PrependENVPath('PATH', version.dllpath)
|
||||
ENV = env['ENV']
|
||||
ENV['CWFolder'] = version.path
|
||||
ENV['LM_LICENSE_FILE'] = version.license
|
||||
plus = lambda x: '+%s' % x
|
||||
ENV['MWCIncludes'] = os.pathsep.join(map(plus, version.includes))
|
||||
ENV['MWLibraries'] = os.pathsep.join(map(plus, version.libs))
|
||||
return 1
|
||||
|
||||
|
||||
def find_versions():
|
||||
"""Return a list of MWVersion objects representing installed versions"""
|
||||
versions = []
|
||||
|
||||
### This function finds CodeWarrior by reading from the registry on
|
||||
### Windows. Some other method needs to be implemented for other
|
||||
### platforms, maybe something that calls env.WhereIs('mwcc')
|
||||
|
||||
if SCons.Util.can_read_reg:
|
||||
try:
|
||||
HLM = SCons.Util.HKEY_LOCAL_MACHINE
|
||||
product = 'SOFTWARE\\Metrowerks\\CodeWarrior\\Product Versions'
|
||||
product_key = SCons.Util.RegOpenKeyEx(HLM, product)
|
||||
|
||||
i = 0
|
||||
while True:
|
||||
name = product + '\\' + SCons.Util.RegEnumKey(product_key, i)
|
||||
name_key = SCons.Util.RegOpenKeyEx(HLM, name)
|
||||
|
||||
try:
|
||||
version = SCons.Util.RegQueryValueEx(name_key, 'VERSION')
|
||||
path = SCons.Util.RegQueryValueEx(name_key, 'PATH')
|
||||
mwv = MWVersion(version[0], path[0], 'Win32-X86')
|
||||
versions.append(mwv)
|
||||
except SCons.Util.RegError:
|
||||
pass
|
||||
|
||||
i = i + 1
|
||||
|
||||
except SCons.Util.RegError:
|
||||
pass
|
||||
|
||||
return versions
|
||||
|
||||
|
||||
class MWVersion(object):
|
||||
def __init__(self, version, path, platform):
|
||||
self.version = version
|
||||
self.path = path
|
||||
self.platform = platform
|
||||
self.clpath = os.path.join(path, 'Other Metrowerks Tools',
|
||||
'Command Line Tools')
|
||||
self.dllpath = os.path.join(path, 'Bin')
|
||||
|
||||
# The Metrowerks tools don't store any configuration data so they
|
||||
# are totally dumb when it comes to locating standard headers,
|
||||
# libraries, and other files, expecting all the information
|
||||
# to be handed to them in environment variables. The members set
|
||||
# below control what information scons injects into the environment
|
||||
|
||||
### The paths below give a normal build environment in CodeWarrior for
|
||||
### Windows, other versions of CodeWarrior might need different paths.
|
||||
|
||||
msl = os.path.join(path, 'MSL')
|
||||
support = os.path.join(path, '%s Support' % platform)
|
||||
|
||||
self.license = os.path.join(path, 'license.dat')
|
||||
self.includes = [msl, support]
|
||||
self.libs = [msl, support]
|
||||
|
||||
def __str__(self):
|
||||
return self.version
|
||||
|
||||
|
||||
CSuffixes = ['.c', '.C']
|
||||
CXXSuffixes = ['.cc', '.cpp', '.cxx', '.c++', '.C++']
|
||||
|
||||
|
||||
def generate(env):
|
||||
"""Add Builders and construction variables for the mwcc to an Environment."""
|
||||
import SCons.Defaults
|
||||
import SCons.Tool
|
||||
|
||||
set_vars(env)
|
||||
|
||||
static_obj, shared_obj = SCons.Tool.createObjBuilders(env)
|
||||
|
||||
for suffix in CSuffixes:
|
||||
static_obj.add_action(suffix, SCons.Defaults.CAction)
|
||||
shared_obj.add_action(suffix, SCons.Defaults.ShCAction)
|
||||
|
||||
for suffix in CXXSuffixes:
|
||||
static_obj.add_action(suffix, SCons.Defaults.CXXAction)
|
||||
shared_obj.add_action(suffix, SCons.Defaults.ShCXXAction)
|
||||
|
||||
env['CCCOMFLAGS'] = '$CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -nolink -o $TARGET $SOURCES'
|
||||
|
||||
env['CC'] = 'mwcc'
|
||||
env['CCCOM'] = '$CC $CFLAGS $CCFLAGS $CCCOMFLAGS'
|
||||
|
||||
env['CXX'] = 'mwcc'
|
||||
env['CXXCOM'] = '$CXX $CXXFLAGS $CCCOMFLAGS'
|
||||
|
||||
env['SHCC'] = '$CC'
|
||||
env['SHCCFLAGS'] = '$CCFLAGS'
|
||||
env['SHCFLAGS'] = '$CFLAGS'
|
||||
env['SHCCCOM'] = '$SHCC $SHCFLAGS $SHCCFLAGS $CCCOMFLAGS'
|
||||
|
||||
env['SHCXX'] = '$CXX'
|
||||
env['SHCXXFLAGS'] = '$CXXFLAGS'
|
||||
env['SHCXXCOM'] = '$SHCXX $SHCXXFLAGS $CCCOMFLAGS'
|
||||
|
||||
env['CFILESUFFIX'] = '.c'
|
||||
env['CXXFILESUFFIX'] = '.cpp'
|
||||
env['CPPDEFPREFIX'] = '-D'
|
||||
env['CPPDEFSUFFIX'] = ''
|
||||
env['INCPREFIX'] = '-I'
|
||||
env['INCSUFFIX'] = ''
|
||||
|
||||
#env['PCH'] = ?
|
||||
#env['PCHSTOP'] = ?
|
||||
|
||||
|
||||
def exists(env):
|
||||
return set_vars(env)
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
108
scons-local-3.0.0/SCons/Tool/mwld.py
Normal file
108
scons-local-3.0.0/SCons/Tool/mwld.py
Normal file
@@ -0,0 +1,108 @@
|
||||
"""SCons.Tool.mwld
|
||||
|
||||
Tool-specific initialization for the Metrowerks CodeWarrior linker.
|
||||
|
||||
There normally shouldn't be any need to import this module directly.
|
||||
It will usually be imported through the generic SCons.Tool.Tool()
|
||||
selection method.
|
||||
"""
|
||||
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/mwld.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
import SCons.Tool
|
||||
|
||||
|
||||
def generate(env):
|
||||
"""Add Builders and construction variables for lib to an Environment."""
|
||||
SCons.Tool.createStaticLibBuilder(env)
|
||||
SCons.Tool.createSharedLibBuilder(env)
|
||||
SCons.Tool.createProgBuilder(env)
|
||||
|
||||
env['AR'] = 'mwld'
|
||||
env['ARCOM'] = '$AR $ARFLAGS -library -o $TARGET $SOURCES'
|
||||
|
||||
env['LIBDIRPREFIX'] = '-L'
|
||||
env['LIBDIRSUFFIX'] = ''
|
||||
env['LIBLINKPREFIX'] = '-l'
|
||||
env['LIBLINKSUFFIX'] = '.lib'
|
||||
|
||||
env['LINK'] = 'mwld'
|
||||
env['LINKCOM'] = '$LINK $LINKFLAGS -o $TARGET $SOURCES $_LIBDIRFLAGS $_LIBFLAGS'
|
||||
|
||||
env['SHLINK'] = '$LINK'
|
||||
env['SHLINKFLAGS'] = '$LINKFLAGS'
|
||||
env['SHLINKCOM'] = shlib_action
|
||||
env['SHLIBEMITTER']= shlib_emitter
|
||||
env['LDMODULEEMITTER']= shlib_emitter
|
||||
|
||||
|
||||
def exists(env):
|
||||
import SCons.Tool.mwcc
|
||||
return SCons.Tool.mwcc.set_vars(env)
|
||||
|
||||
|
||||
def shlib_generator(target, source, env, for_signature):
|
||||
cmd = ['$SHLINK', '$SHLINKFLAGS', '-shared']
|
||||
|
||||
no_import_lib = env.get('no_import_lib', 0)
|
||||
if no_import_lib: cmd.extend('-noimplib')
|
||||
|
||||
dll = env.FindIxes(target, 'SHLIBPREFIX', 'SHLIBSUFFIX')
|
||||
if dll: cmd.extend(['-o', dll])
|
||||
|
||||
implib = env.FindIxes(target, 'LIBPREFIX', 'LIBSUFFIX')
|
||||
if implib: cmd.extend(['-implib', implib.get_string(for_signature)])
|
||||
|
||||
cmd.extend(['$SOURCES', '$_LIBDIRFLAGS', '$_LIBFLAGS'])
|
||||
|
||||
return [cmd]
|
||||
|
||||
|
||||
def shlib_emitter(target, source, env):
|
||||
dll = env.FindIxes(target, 'SHLIBPREFIX', 'SHLIBSUFFIX')
|
||||
no_import_lib = env.get('no_import_lib', 0)
|
||||
|
||||
if not dll:
|
||||
raise SCons.Errors.UserError("A shared library should have exactly one target with the suffix: %s" % env.subst("$SHLIBSUFFIX"))
|
||||
|
||||
if not no_import_lib and \
|
||||
not env.FindIxes(target, 'LIBPREFIX', 'LIBSUFFIX'):
|
||||
|
||||
# Append an import library to the list of targets.
|
||||
target.append(env.ReplaceIxes(dll,
|
||||
'SHLIBPREFIX', 'SHLIBSUFFIX',
|
||||
'LIBPREFIX', 'LIBSUFFIX'))
|
||||
|
||||
return target, source
|
||||
|
||||
|
||||
shlib_action = SCons.Action.Action(shlib_generator, generator=1)
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
72
scons-local-3.0.0/SCons/Tool/nasm.py
Normal file
72
scons-local-3.0.0/SCons/Tool/nasm.py
Normal file
@@ -0,0 +1,72 @@
|
||||
"""SCons.Tool.nasm
|
||||
|
||||
Tool-specific initialization for nasm, the famous Netwide Assembler.
|
||||
|
||||
There normally shouldn't be any need to import this module directly.
|
||||
It will usually be imported through the generic SCons.Tool.Tool()
|
||||
selection method.
|
||||
|
||||
"""
|
||||
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/nasm.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
import SCons.Defaults
|
||||
import SCons.Tool
|
||||
import SCons.Util
|
||||
|
||||
ASSuffixes = ['.s', '.asm', '.ASM']
|
||||
ASPPSuffixes = ['.spp', '.SPP', '.sx']
|
||||
if SCons.Util.case_sensitive_suffixes('.s', '.S'):
|
||||
ASPPSuffixes.extend(['.S'])
|
||||
else:
|
||||
ASSuffixes.extend(['.S'])
|
||||
|
||||
def generate(env):
|
||||
"""Add Builders and construction variables for nasm to an Environment."""
|
||||
static_obj, shared_obj = SCons.Tool.createObjBuilders(env)
|
||||
|
||||
for suffix in ASSuffixes:
|
||||
static_obj.add_action(suffix, SCons.Defaults.ASAction)
|
||||
static_obj.add_emitter(suffix, SCons.Defaults.StaticObjectEmitter)
|
||||
|
||||
for suffix in ASPPSuffixes:
|
||||
static_obj.add_action(suffix, SCons.Defaults.ASPPAction)
|
||||
static_obj.add_emitter(suffix, SCons.Defaults.StaticObjectEmitter)
|
||||
|
||||
env['AS'] = 'nasm'
|
||||
env['ASFLAGS'] = SCons.Util.CLVar('')
|
||||
env['ASPPFLAGS'] = '$ASFLAGS'
|
||||
env['ASCOM'] = '$AS $ASFLAGS -o $TARGET $SOURCES'
|
||||
env['ASPPCOM'] = '$CC $ASPPFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -c -o $TARGET $SOURCES'
|
||||
|
||||
def exists(env):
|
||||
return env.Detect('nasm')
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
311
scons-local-3.0.0/SCons/Tool/packaging/__init__.py
Normal file
311
scons-local-3.0.0/SCons/Tool/packaging/__init__.py
Normal file
@@ -0,0 +1,311 @@
|
||||
"""SCons.Tool.Packaging
|
||||
|
||||
SCons Packaging Tool.
|
||||
"""
|
||||
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/packaging/__init__.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
import SCons.Environment
|
||||
from SCons.Variables import *
|
||||
from SCons.Errors import *
|
||||
from SCons.Util import is_List, make_path_relative
|
||||
from SCons.Warnings import warn, Warning
|
||||
|
||||
import os, imp
|
||||
import SCons.Defaults
|
||||
|
||||
__all__ = [ 'src_targz', 'src_tarbz2', 'src_zip', 'tarbz2', 'targz', 'zip', 'rpm', 'msi', 'ipk' ]
|
||||
|
||||
#
|
||||
# Utility and Builder function
|
||||
#
|
||||
def Tag(env, target, source, *more_tags, **kw_tags):
|
||||
""" Tag a file with the given arguments, just sets the accordingly named
|
||||
attribute on the file object.
|
||||
|
||||
TODO: FIXME
|
||||
"""
|
||||
if not target:
|
||||
target=source
|
||||
first_tag=None
|
||||
else:
|
||||
first_tag=source
|
||||
|
||||
if first_tag:
|
||||
kw_tags[first_tag[0]] = ''
|
||||
|
||||
if len(kw_tags) == 0 and len(more_tags) == 0:
|
||||
raise UserError("No tags given.")
|
||||
|
||||
# XXX: sanity checks
|
||||
for x in more_tags:
|
||||
kw_tags[x] = ''
|
||||
|
||||
if not SCons.Util.is_List(target):
|
||||
target=[target]
|
||||
else:
|
||||
# hmm, sometimes the target list, is a list of a list
|
||||
# make sure it is flattened prior to processing.
|
||||
# TODO: perhaps some bug ?!?
|
||||
target=env.Flatten(target)
|
||||
|
||||
for t in target:
|
||||
for (k,v) in kw_tags.items():
|
||||
# all file tags have to start with PACKAGING_, so we can later
|
||||
# differentiate between "normal" object attributes and the
|
||||
# packaging attributes. As the user should not be bothered with
|
||||
# that, the prefix will be added here if missing.
|
||||
if k[:10] != 'PACKAGING_':
|
||||
k='PACKAGING_'+k
|
||||
t.Tag(k, v)
|
||||
|
||||
def Package(env, target=None, source=None, **kw):
|
||||
""" Entry point for the package tool.
|
||||
"""
|
||||
# check if we need to find the source files ourself
|
||||
if not source:
|
||||
source = env.FindInstalledFiles()
|
||||
|
||||
if len(source)==0:
|
||||
raise UserError("No source for Package() given")
|
||||
|
||||
# decide which types of packages shall be built. Can be defined through
|
||||
# four mechanisms: command line argument, keyword argument,
|
||||
# environment argument and default selection( zip or tar.gz ) in that
|
||||
# order.
|
||||
try: kw['PACKAGETYPE']=env['PACKAGETYPE']
|
||||
except KeyError: pass
|
||||
|
||||
if not kw.get('PACKAGETYPE'):
|
||||
from SCons.Script import GetOption
|
||||
kw['PACKAGETYPE'] = GetOption('package_type')
|
||||
|
||||
if kw['PACKAGETYPE'] == None:
|
||||
if 'Tar' in env['BUILDERS']:
|
||||
kw['PACKAGETYPE']='targz'
|
||||
elif 'Zip' in env['BUILDERS']:
|
||||
kw['PACKAGETYPE']='zip'
|
||||
else:
|
||||
raise UserError("No type for Package() given")
|
||||
|
||||
PACKAGETYPE=kw['PACKAGETYPE']
|
||||
if not is_List(PACKAGETYPE):
|
||||
PACKAGETYPE=PACKAGETYPE.split(',')
|
||||
|
||||
# load the needed packagers.
|
||||
def load_packager(type):
|
||||
try:
|
||||
file,path,desc=imp.find_module(type, __path__)
|
||||
return imp.load_module(type, file, path, desc)
|
||||
except ImportError as e:
|
||||
raise EnvironmentError("packager %s not available: %s"%(type,str(e)))
|
||||
|
||||
packagers=list(map(load_packager, PACKAGETYPE))
|
||||
|
||||
# set up targets and the PACKAGEROOT
|
||||
try:
|
||||
# fill up the target list with a default target name until the PACKAGETYPE
|
||||
# list is of the same size as the target list.
|
||||
if not target: target = []
|
||||
|
||||
size_diff = len(PACKAGETYPE)-len(target)
|
||||
default_name = "%(NAME)s-%(VERSION)s"
|
||||
|
||||
if size_diff>0:
|
||||
default_target = default_name%kw
|
||||
target.extend( [default_target]*size_diff )
|
||||
|
||||
if 'PACKAGEROOT' not in kw:
|
||||
kw['PACKAGEROOT'] = default_name%kw
|
||||
|
||||
except KeyError as e:
|
||||
raise SCons.Errors.UserError( "Missing Packagetag '%s'"%e.args[0] )
|
||||
|
||||
# setup the source files
|
||||
source=env.arg2nodes(source, env.fs.Entry)
|
||||
|
||||
# call the packager to setup the dependencies.
|
||||
targets=[]
|
||||
try:
|
||||
for packager in packagers:
|
||||
t=[target.pop(0)]
|
||||
t=packager.package(env,t,source, **kw)
|
||||
targets.extend(t)
|
||||
|
||||
assert( len(target) == 0 )
|
||||
|
||||
except KeyError as e:
|
||||
raise SCons.Errors.UserError( "Missing Packagetag '%s' for %s packager"\
|
||||
% (e.args[0],packager.__name__) )
|
||||
except TypeError as e:
|
||||
# this exception means that a needed argument for the packager is
|
||||
# missing. As our packagers get their "tags" as named function
|
||||
# arguments we need to find out which one is missing.
|
||||
from inspect import getargspec
|
||||
args,varargs,varkw,defaults=getargspec(packager.package)
|
||||
if defaults!=None:
|
||||
args=args[:-len(defaults)] # throw away arguments with default values
|
||||
args.remove('env')
|
||||
args.remove('target')
|
||||
args.remove('source')
|
||||
# now remove any args for which we have a value in kw.
|
||||
args=[x for x in args if x not in kw]
|
||||
|
||||
if len(args)==0:
|
||||
raise # must be a different error, so re-raise
|
||||
elif len(args)==1:
|
||||
raise SCons.Errors.UserError( "Missing Packagetag '%s' for %s packager"\
|
||||
% (args[0],packager.__name__) )
|
||||
else:
|
||||
raise SCons.Errors.UserError( "Missing Packagetags '%s' for %s packager"\
|
||||
% (", ".join(args),packager.__name__) )
|
||||
|
||||
target=env.arg2nodes(target, env.fs.Entry)
|
||||
targets.extend(env.Alias( 'package', targets ))
|
||||
return targets
|
||||
|
||||
#
|
||||
# SCons tool initialization functions
|
||||
#
|
||||
|
||||
added = None
|
||||
|
||||
def generate(env):
|
||||
from SCons.Script import AddOption
|
||||
global added
|
||||
if not added:
|
||||
added = 1
|
||||
AddOption('--package-type',
|
||||
dest='package_type',
|
||||
default=None,
|
||||
type="string",
|
||||
action="store",
|
||||
help='The type of package to create.')
|
||||
|
||||
try:
|
||||
env['BUILDERS']['Package']
|
||||
env['BUILDERS']['Tag']
|
||||
except KeyError:
|
||||
env['BUILDERS']['Package'] = Package
|
||||
env['BUILDERS']['Tag'] = Tag
|
||||
|
||||
def exists(env):
|
||||
return 1
|
||||
|
||||
# XXX
|
||||
def options(opts):
|
||||
opts.AddVariables(
|
||||
EnumVariable( 'PACKAGETYPE',
|
||||
'the type of package to create.',
|
||||
None, allowed_values=list(map( str, __all__ )),
|
||||
ignorecase=2
|
||||
)
|
||||
)
|
||||
|
||||
#
|
||||
# Internal utility functions
|
||||
#
|
||||
|
||||
def copy_attr(f1, f2):
|
||||
""" copies the special packaging file attributes from f1 to f2.
|
||||
"""
|
||||
copyit = lambda x: not hasattr(f2, x) and x[:10] == 'PACKAGING_'
|
||||
if f1._tags:
|
||||
pattrs = [tag for tag in f1._tags if copyit(tag)]
|
||||
for attr in pattrs:
|
||||
f2.Tag(attr, f1.GetTag(attr))
|
||||
|
||||
def putintopackageroot(target, source, env, pkgroot, honor_install_location=1):
|
||||
""" Uses the CopyAs builder to copy all source files to the directory given
|
||||
in pkgroot.
|
||||
|
||||
If honor_install_location is set and the copied source file has an
|
||||
PACKAGING_INSTALL_LOCATION attribute, the PACKAGING_INSTALL_LOCATION is
|
||||
used as the new name of the source file under pkgroot.
|
||||
|
||||
The source file will not be copied if it is already under the the pkgroot
|
||||
directory.
|
||||
|
||||
All attributes of the source file will be copied to the new file.
|
||||
"""
|
||||
# make sure the packageroot is a Dir object.
|
||||
if SCons.Util.is_String(pkgroot): pkgroot=env.Dir(pkgroot)
|
||||
if not SCons.Util.is_List(source): source=[source]
|
||||
|
||||
new_source = []
|
||||
for file in source:
|
||||
if SCons.Util.is_String(file): file = env.File(file)
|
||||
|
||||
if file.is_under(pkgroot):
|
||||
new_source.append(file)
|
||||
else:
|
||||
if file.GetTag('PACKAGING_INSTALL_LOCATION') and\
|
||||
honor_install_location:
|
||||
new_name=make_path_relative(file.GetTag('PACKAGING_INSTALL_LOCATION'))
|
||||
else:
|
||||
new_name=make_path_relative(file.get_path())
|
||||
|
||||
new_file=pkgroot.File(new_name)
|
||||
new_file=env.CopyAs(new_file, file)[0]
|
||||
copy_attr(file, new_file)
|
||||
new_source.append(new_file)
|
||||
|
||||
return (target, new_source)
|
||||
|
||||
def stripinstallbuilder(target, source, env):
|
||||
""" Strips the install builder action from the source list and stores
|
||||
the final installation location as the "PACKAGING_INSTALL_LOCATION" of
|
||||
the source of the source file. This effectively removes the final installed
|
||||
files from the source list while remembering the installation location.
|
||||
|
||||
It also warns about files which have no install builder attached.
|
||||
"""
|
||||
def has_no_install_location(file):
|
||||
return not (file.has_builder() and\
|
||||
hasattr(file.builder, 'name') and\
|
||||
(file.builder.name=="InstallBuilder" or\
|
||||
file.builder.name=="InstallAsBuilder"))
|
||||
|
||||
if len([src for src in source if has_no_install_location(src)]):
|
||||
warn(Warning, "there are files to package which have no\
|
||||
InstallBuilder attached, this might lead to irreproducible packages")
|
||||
|
||||
n_source=[]
|
||||
for s in source:
|
||||
if has_no_install_location(s):
|
||||
n_source.append(s)
|
||||
else:
|
||||
for ss in s.sources:
|
||||
n_source.append(ss)
|
||||
copy_attr(s, ss)
|
||||
ss.Tag('PACKAGING_INSTALL_LOCATION', s.get_path())
|
||||
|
||||
return (target, n_source)
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
185
scons-local-3.0.0/SCons/Tool/packaging/ipk.py
Normal file
185
scons-local-3.0.0/SCons/Tool/packaging/ipk.py
Normal file
@@ -0,0 +1,185 @@
|
||||
"""SCons.Tool.Packaging.ipk
|
||||
"""
|
||||
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/packaging/ipk.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
import SCons.Builder
|
||||
import SCons.Node.FS
|
||||
import os
|
||||
|
||||
from SCons.Tool.packaging import stripinstallbuilder, putintopackageroot
|
||||
|
||||
def package(env, target, source, PACKAGEROOT, NAME, VERSION, DESCRIPTION,
|
||||
SUMMARY, X_IPK_PRIORITY, X_IPK_SECTION, SOURCE_URL,
|
||||
X_IPK_MAINTAINER, X_IPK_DEPENDS, **kw):
|
||||
""" This function prepares the packageroot directory for packaging with the
|
||||
ipkg builder.
|
||||
"""
|
||||
SCons.Tool.Tool('ipkg').generate(env)
|
||||
|
||||
# setup the Ipkg builder
|
||||
bld = env['BUILDERS']['Ipkg']
|
||||
target, source = stripinstallbuilder(target, source, env)
|
||||
target, source = putintopackageroot(target, source, env, PACKAGEROOT)
|
||||
|
||||
# This should be overrideable from the construction environment,
|
||||
# which it is by using ARCHITECTURE=.
|
||||
# Guessing based on what os.uname() returns at least allows it
|
||||
# to work for both i386 and x86_64 Linux systems.
|
||||
archmap = {
|
||||
'i686' : 'i386',
|
||||
'i586' : 'i386',
|
||||
'i486' : 'i386',
|
||||
}
|
||||
|
||||
buildarchitecture = os.uname()[4]
|
||||
buildarchitecture = archmap.get(buildarchitecture, buildarchitecture)
|
||||
|
||||
if 'ARCHITECTURE' in kw:
|
||||
buildarchitecture = kw['ARCHITECTURE']
|
||||
|
||||
# setup the kw to contain the mandatory arguments to this function.
|
||||
# do this before calling any builder or setup function
|
||||
loc=locals()
|
||||
del loc['kw']
|
||||
kw.update(loc)
|
||||
del kw['source'], kw['target'], kw['env']
|
||||
|
||||
# generate the specfile
|
||||
specfile = gen_ipk_dir(PACKAGEROOT, source, env, kw)
|
||||
|
||||
# override the default target.
|
||||
if str(target[0])=="%s-%s"%(NAME, VERSION):
|
||||
target=[ "%s_%s_%s.ipk"%(NAME, VERSION, buildarchitecture) ]
|
||||
|
||||
# now apply the Ipkg builder
|
||||
return bld(env, target, specfile, **kw)
|
||||
|
||||
def gen_ipk_dir(proot, source, env, kw):
|
||||
# make sure the packageroot is a Dir object.
|
||||
if SCons.Util.is_String(proot): proot=env.Dir(proot)
|
||||
|
||||
# create the specfile builder
|
||||
s_bld=SCons.Builder.Builder(
|
||||
action = build_specfiles,
|
||||
)
|
||||
|
||||
# create the specfile targets
|
||||
spec_target=[]
|
||||
control=proot.Dir('CONTROL')
|
||||
spec_target.append(control.File('control'))
|
||||
spec_target.append(control.File('conffiles'))
|
||||
spec_target.append(control.File('postrm'))
|
||||
spec_target.append(control.File('prerm'))
|
||||
spec_target.append(control.File('postinst'))
|
||||
spec_target.append(control.File('preinst'))
|
||||
|
||||
# apply the builder to the specfile targets
|
||||
s_bld(env, spec_target, source, **kw)
|
||||
|
||||
# the packageroot directory does now contain the specfiles.
|
||||
return proot
|
||||
|
||||
def build_specfiles(source, target, env):
|
||||
""" Filter the targets for the needed files and use the variables in env
|
||||
to create the specfile.
|
||||
"""
|
||||
#
|
||||
# At first we care for the CONTROL/control file, which is the main file for ipk.
|
||||
#
|
||||
# For this we need to open multiple files in random order, so we store into
|
||||
# a dict so they can be easily accessed.
|
||||
#
|
||||
#
|
||||
opened_files={}
|
||||
def open_file(needle, haystack):
|
||||
try:
|
||||
return opened_files[needle]
|
||||
except KeyError:
|
||||
file=filter(lambda x: x.get_path().rfind(needle)!=-1, haystack)[0]
|
||||
opened_files[needle]=open(file.get_abspath(), 'w')
|
||||
return opened_files[needle]
|
||||
|
||||
control_file=open_file('control', target)
|
||||
|
||||
if 'X_IPK_DESCRIPTION' not in env:
|
||||
env['X_IPK_DESCRIPTION']="%s\n %s"%(env['SUMMARY'],
|
||||
env['DESCRIPTION'].replace('\n', '\n '))
|
||||
|
||||
|
||||
content = """
|
||||
Package: $NAME
|
||||
Version: $VERSION
|
||||
Priority: $X_IPK_PRIORITY
|
||||
Section: $X_IPK_SECTION
|
||||
Source: $SOURCE_URL
|
||||
Architecture: $ARCHITECTURE
|
||||
Maintainer: $X_IPK_MAINTAINER
|
||||
Depends: $X_IPK_DEPENDS
|
||||
Description: $X_IPK_DESCRIPTION
|
||||
"""
|
||||
|
||||
control_file.write(env.subst(content))
|
||||
|
||||
#
|
||||
# now handle the various other files, which purpose it is to set post-,
|
||||
# pre-scripts and mark files as config files.
|
||||
#
|
||||
# We do so by filtering the source files for files which are marked with
|
||||
# the "config" tag and afterwards we do the same for x_ipk_postrm,
|
||||
# x_ipk_prerm, x_ipk_postinst and x_ipk_preinst tags.
|
||||
#
|
||||
# The first one will write the name of the file into the file
|
||||
# CONTROL/configfiles, the latter add the content of the x_ipk_* variable
|
||||
# into the same named file.
|
||||
#
|
||||
for f in [x for x in source if 'PACKAGING_CONFIG' in dir(x)]:
|
||||
config=open_file('conffiles')
|
||||
config.write(f.PACKAGING_INSTALL_LOCATION)
|
||||
config.write('\n')
|
||||
|
||||
for str in 'POSTRM PRERM POSTINST PREINST'.split():
|
||||
name="PACKAGING_X_IPK_%s"%str
|
||||
for f in [x for x in source if name in dir(x)]:
|
||||
file=open_file(name)
|
||||
file.write(env[str])
|
||||
|
||||
#
|
||||
# close all opened files
|
||||
for f in list(opened_files.values()):
|
||||
f.close()
|
||||
|
||||
# call a user specified function
|
||||
if 'CHANGE_SPECFILE' in env:
|
||||
content += env['CHANGE_SPECFILE'](target)
|
||||
|
||||
return 0
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
527
scons-local-3.0.0/SCons/Tool/packaging/msi.py
Normal file
527
scons-local-3.0.0/SCons/Tool/packaging/msi.py
Normal file
@@ -0,0 +1,527 @@
|
||||
"""SCons.Tool.packaging.msi
|
||||
|
||||
The msi packager.
|
||||
"""
|
||||
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/packaging/msi.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
import os
|
||||
import SCons
|
||||
from SCons.Action import Action
|
||||
from SCons.Builder import Builder
|
||||
|
||||
from xml.dom.minidom import *
|
||||
from xml.sax.saxutils import escape
|
||||
|
||||
from SCons.Tool.packaging import stripinstallbuilder
|
||||
|
||||
#
|
||||
# Utility functions
|
||||
#
|
||||
def convert_to_id(s, id_set):
|
||||
""" Some parts of .wxs need an Id attribute (for example: The File and
|
||||
Directory directives. The charset is limited to A-Z, a-z, digits,
|
||||
underscores, periods. Each Id must begin with a letter or with a
|
||||
underscore. Google for "CNDL0015" for information about this.
|
||||
|
||||
Requirements:
|
||||
* the string created must only contain chars from the target charset.
|
||||
* the string created must have a minimal editing distance from the
|
||||
original string.
|
||||
* the string created must be unique for the whole .wxs file.
|
||||
|
||||
Observation:
|
||||
* There are 62 chars in the charset.
|
||||
|
||||
Idea:
|
||||
* filter out forbidden characters. Check for a collision with the help
|
||||
of the id_set. Add the number of the number of the collision at the
|
||||
end of the created string. Furthermore care for a correct start of
|
||||
the string.
|
||||
"""
|
||||
charset = 'ABCDEFGHIJKLMNOPQRSTUVWXYabcdefghijklmnopqrstuvwxyz0123456789_.'
|
||||
if s[0] in '0123456789.':
|
||||
s += '_'+s
|
||||
id = [c for c in s if c in charset]
|
||||
|
||||
# did we already generate an id for this file?
|
||||
try:
|
||||
return id_set[id][s]
|
||||
except KeyError:
|
||||
# no we did not, so initialize with the id
|
||||
if id not in id_set: id_set[id] = { s : id }
|
||||
# there is a collision, generate an id which is unique by appending
|
||||
# the collision number
|
||||
else: id_set[id][s] = id + str(len(id_set[id]))
|
||||
|
||||
return id_set[id][s]
|
||||
|
||||
def is_dos_short_file_name(file):
|
||||
""" Examine if the given file is in the 8.3 form.
|
||||
"""
|
||||
fname, ext = os.path.splitext(file)
|
||||
proper_ext = len(ext) == 0 or (2 <= len(ext) <= 4) # the ext contains the dot
|
||||
proper_fname = file.isupper() and len(fname) <= 8
|
||||
|
||||
return proper_ext and proper_fname
|
||||
|
||||
def gen_dos_short_file_name(file, filename_set):
|
||||
""" See http://support.microsoft.com/default.aspx?scid=kb;en-us;Q142982
|
||||
|
||||
These are no complete 8.3 dos short names. The ~ char is missing and
|
||||
replaced with one character from the filename. WiX warns about such
|
||||
filenames, since a collision might occur. Google for "CNDL1014" for
|
||||
more information.
|
||||
"""
|
||||
# guard this to not confuse the generation
|
||||
if is_dos_short_file_name(file):
|
||||
return file
|
||||
|
||||
fname, ext = os.path.splitext(file) # ext contains the dot
|
||||
|
||||
# first try if it suffices to convert to upper
|
||||
file = file.upper()
|
||||
if is_dos_short_file_name(file):
|
||||
return file
|
||||
|
||||
# strip forbidden characters.
|
||||
forbidden = '."/[]:;=, '
|
||||
fname = [c for c in fname if c not in forbidden]
|
||||
|
||||
# check if we already generated a filename with the same number:
|
||||
# thisis1.txt, thisis2.txt etc.
|
||||
duplicate, num = not None, 1
|
||||
while duplicate:
|
||||
shortname = "%s%s" % (fname[:8-len(str(num))].upper(),\
|
||||
str(num))
|
||||
if len(ext) >= 2:
|
||||
shortname = "%s%s" % (shortname, ext[:4].upper())
|
||||
|
||||
duplicate, num = shortname in filename_set, num+1
|
||||
|
||||
assert( is_dos_short_file_name(shortname) ), 'shortname is %s, longname is %s' % (shortname, file)
|
||||
filename_set.append(shortname)
|
||||
return shortname
|
||||
|
||||
def create_feature_dict(files):
|
||||
""" X_MSI_FEATURE and doc FileTag's can be used to collect files in a
|
||||
hierarchy. This function collects the files into this hierarchy.
|
||||
"""
|
||||
dict = {}
|
||||
|
||||
def add_to_dict( feature, file ):
|
||||
if not SCons.Util.is_List( feature ):
|
||||
feature = [ feature ]
|
||||
|
||||
for f in feature:
|
||||
if f not in dict:
|
||||
dict[ f ] = [ file ]
|
||||
else:
|
||||
dict[ f ].append( file )
|
||||
|
||||
for file in files:
|
||||
if hasattr( file, 'PACKAGING_X_MSI_FEATURE' ):
|
||||
add_to_dict(file.PACKAGING_X_MSI_FEATURE, file)
|
||||
elif hasattr( file, 'PACKAGING_DOC' ):
|
||||
add_to_dict( 'PACKAGING_DOC', file )
|
||||
else:
|
||||
add_to_dict( 'default', file )
|
||||
|
||||
return dict
|
||||
|
||||
def generate_guids(root):
|
||||
""" generates globally unique identifiers for parts of the xml which need
|
||||
them.
|
||||
|
||||
Component tags have a special requirement. Their UUID is only allowed to
|
||||
change if the list of their contained resources has changed. This allows
|
||||
for clean removal and proper updates.
|
||||
|
||||
To handle this requirement, the uuid is generated with an md5 hashing the
|
||||
whole subtree of a xml node.
|
||||
"""
|
||||
from hashlib import md5
|
||||
|
||||
# specify which tags need a guid and in which attribute this should be stored.
|
||||
needs_id = { 'Product' : 'Id',
|
||||
'Package' : 'Id',
|
||||
'Component' : 'Guid',
|
||||
}
|
||||
|
||||
# find all XMl nodes matching the key, retrieve their attribute, hash their
|
||||
# subtree, convert hash to string and add as a attribute to the xml node.
|
||||
for (key,value) in needs_id.items():
|
||||
node_list = root.getElementsByTagName(key)
|
||||
attribute = value
|
||||
for node in node_list:
|
||||
hash = md5(node.toxml()).hexdigest()
|
||||
hash_str = '%s-%s-%s-%s-%s' % ( hash[:8], hash[8:12], hash[12:16], hash[16:20], hash[20:] )
|
||||
node.attributes[attribute] = hash_str
|
||||
|
||||
|
||||
|
||||
def string_wxsfile(target, source, env):
|
||||
return "building WiX file %s"%( target[0].path )
|
||||
|
||||
def build_wxsfile(target, source, env):
|
||||
""" Compiles a .wxs file from the keywords given in env['msi_spec'] and
|
||||
by analyzing the tree of source nodes and their tags.
|
||||
"""
|
||||
file = open(target[0].get_abspath(), 'w')
|
||||
|
||||
try:
|
||||
# Create a document with the Wix root tag
|
||||
doc = Document()
|
||||
root = doc.createElement( 'Wix' )
|
||||
root.attributes['xmlns']='http://schemas.microsoft.com/wix/2003/01/wi'
|
||||
doc.appendChild( root )
|
||||
|
||||
filename_set = [] # this is to circumvent duplicates in the shortnames
|
||||
id_set = {} # this is to circumvent duplicates in the ids
|
||||
|
||||
# Create the content
|
||||
build_wxsfile_header_section(root, env)
|
||||
build_wxsfile_file_section(root, source, env['NAME'], env['VERSION'], env['VENDOR'], filename_set, id_set)
|
||||
generate_guids(root)
|
||||
build_wxsfile_features_section(root, source, env['NAME'], env['VERSION'], env['SUMMARY'], id_set)
|
||||
build_wxsfile_default_gui(root)
|
||||
build_license_file(target[0].get_dir(), env)
|
||||
|
||||
# write the xml to a file
|
||||
file.write( doc.toprettyxml() )
|
||||
|
||||
# call a user specified function
|
||||
if 'CHANGE_SPECFILE' in env:
|
||||
env['CHANGE_SPECFILE'](target, source)
|
||||
|
||||
except KeyError as e:
|
||||
raise SCons.Errors.UserError( '"%s" package field for MSI is missing.' % e.args[0] )
|
||||
|
||||
#
|
||||
# setup function
|
||||
#
|
||||
def create_default_directory_layout(root, NAME, VERSION, VENDOR, filename_set):
|
||||
""" Create the wix default target directory layout and return the innermost
|
||||
directory.
|
||||
|
||||
We assume that the XML tree delivered in the root argument already contains
|
||||
the Product tag.
|
||||
|
||||
Everything is put under the PFiles directory property defined by WiX.
|
||||
After that a directory with the 'VENDOR' tag is placed and then a
|
||||
directory with the name of the project and its VERSION. This leads to the
|
||||
following TARGET Directory Layout:
|
||||
C:\<PFiles>\<Vendor>\<Projectname-Version>\
|
||||
Example: C:\Programme\Company\Product-1.2\
|
||||
"""
|
||||
doc = Document()
|
||||
d1 = doc.createElement( 'Directory' )
|
||||
d1.attributes['Id'] = 'TARGETDIR'
|
||||
d1.attributes['Name'] = 'SourceDir'
|
||||
|
||||
d2 = doc.createElement( 'Directory' )
|
||||
d2.attributes['Id'] = 'ProgramFilesFolder'
|
||||
d2.attributes['Name'] = 'PFiles'
|
||||
|
||||
d3 = doc.createElement( 'Directory' )
|
||||
d3.attributes['Id'] = 'VENDOR_folder'
|
||||
d3.attributes['Name'] = escape( gen_dos_short_file_name( VENDOR, filename_set ) )
|
||||
d3.attributes['LongName'] = escape( VENDOR )
|
||||
|
||||
d4 = doc.createElement( 'Directory' )
|
||||
project_folder = "%s-%s" % ( NAME, VERSION )
|
||||
d4.attributes['Id'] = 'MY_DEFAULT_FOLDER'
|
||||
d4.attributes['Name'] = escape( gen_dos_short_file_name( project_folder, filename_set ) )
|
||||
d4.attributes['LongName'] = escape( project_folder )
|
||||
|
||||
d1.childNodes.append( d2 )
|
||||
d2.childNodes.append( d3 )
|
||||
d3.childNodes.append( d4 )
|
||||
|
||||
root.getElementsByTagName('Product')[0].childNodes.append( d1 )
|
||||
|
||||
return d4
|
||||
|
||||
#
|
||||
# mandatory and optional file tags
|
||||
#
|
||||
def build_wxsfile_file_section(root, files, NAME, VERSION, VENDOR, filename_set, id_set):
|
||||
""" Builds the Component sections of the wxs file with their included files.
|
||||
|
||||
Files need to be specified in 8.3 format and in the long name format, long
|
||||
filenames will be converted automatically.
|
||||
|
||||
Features are specficied with the 'X_MSI_FEATURE' or 'DOC' FileTag.
|
||||
"""
|
||||
root = create_default_directory_layout( root, NAME, VERSION, VENDOR, filename_set )
|
||||
components = create_feature_dict( files )
|
||||
factory = Document()
|
||||
|
||||
def get_directory( node, dir ):
|
||||
""" Returns the node under the given node representing the directory.
|
||||
|
||||
Returns the component node if dir is None or empty.
|
||||
"""
|
||||
if dir == '' or not dir:
|
||||
return node
|
||||
|
||||
Directory = node
|
||||
dir_parts = dir.split(os.path.sep)
|
||||
|
||||
# to make sure that our directory ids are unique, the parent folders are
|
||||
# consecutively added to upper_dir
|
||||
upper_dir = ''
|
||||
|
||||
# walk down the xml tree finding parts of the directory
|
||||
dir_parts = [d for d in dir_parts if d != '']
|
||||
for d in dir_parts[:]:
|
||||
already_created = [c for c in Directory.childNodes
|
||||
if c.nodeName == 'Directory'
|
||||
and c.attributes['LongName'].value == escape(d)]
|
||||
|
||||
if already_created != []:
|
||||
Directory = already_created[0]
|
||||
dir_parts.remove(d)
|
||||
upper_dir += d
|
||||
else:
|
||||
break
|
||||
|
||||
for d in dir_parts:
|
||||
nDirectory = factory.createElement( 'Directory' )
|
||||
nDirectory.attributes['LongName'] = escape( d )
|
||||
nDirectory.attributes['Name'] = escape( gen_dos_short_file_name( d, filename_set ) )
|
||||
upper_dir += d
|
||||
nDirectory.attributes['Id'] = convert_to_id( upper_dir, id_set )
|
||||
|
||||
Directory.childNodes.append( nDirectory )
|
||||
Directory = nDirectory
|
||||
|
||||
return Directory
|
||||
|
||||
for file in files:
|
||||
drive, path = os.path.splitdrive( file.PACKAGING_INSTALL_LOCATION )
|
||||
filename = os.path.basename( path )
|
||||
dirname = os.path.dirname( path )
|
||||
|
||||
h = {
|
||||
# tagname : default value
|
||||
'PACKAGING_X_MSI_VITAL' : 'yes',
|
||||
'PACKAGING_X_MSI_FILEID' : convert_to_id(filename, id_set),
|
||||
'PACKAGING_X_MSI_LONGNAME' : filename,
|
||||
'PACKAGING_X_MSI_SHORTNAME' : gen_dos_short_file_name(filename, filename_set),
|
||||
'PACKAGING_X_MSI_SOURCE' : file.get_path(),
|
||||
}
|
||||
|
||||
# fill in the default tags given above.
|
||||
for k,v in [ (k, v) for (k,v) in h.items() if not hasattr(file, k) ]:
|
||||
setattr( file, k, v )
|
||||
|
||||
File = factory.createElement( 'File' )
|
||||
File.attributes['LongName'] = escape( file.PACKAGING_X_MSI_LONGNAME )
|
||||
File.attributes['Name'] = escape( file.PACKAGING_X_MSI_SHORTNAME )
|
||||
File.attributes['Source'] = escape( file.PACKAGING_X_MSI_SOURCE )
|
||||
File.attributes['Id'] = escape( file.PACKAGING_X_MSI_FILEID )
|
||||
File.attributes['Vital'] = escape( file.PACKAGING_X_MSI_VITAL )
|
||||
|
||||
# create the <Component> Tag under which this file should appear
|
||||
Component = factory.createElement('Component')
|
||||
Component.attributes['DiskId'] = '1'
|
||||
Component.attributes['Id'] = convert_to_id( filename, id_set )
|
||||
|
||||
# hang the component node under the root node and the file node
|
||||
# under the component node.
|
||||
Directory = get_directory( root, dirname )
|
||||
Directory.childNodes.append( Component )
|
||||
Component.childNodes.append( File )
|
||||
|
||||
#
|
||||
# additional functions
|
||||
#
|
||||
def build_wxsfile_features_section(root, files, NAME, VERSION, SUMMARY, id_set):
|
||||
""" This function creates the <features> tag based on the supplied xml tree.
|
||||
|
||||
This is achieved by finding all <component>s and adding them to a default target.
|
||||
|
||||
It should be called after the tree has been built completly. We assume
|
||||
that a MY_DEFAULT_FOLDER Property is defined in the wxs file tree.
|
||||
|
||||
Furthermore a top-level with the name and VERSION of the software will be created.
|
||||
|
||||
An PACKAGING_X_MSI_FEATURE can either be a string, where the feature
|
||||
DESCRIPTION will be the same as its title or a Tuple, where the first
|
||||
part will be its title and the second its DESCRIPTION.
|
||||
"""
|
||||
factory = Document()
|
||||
Feature = factory.createElement('Feature')
|
||||
Feature.attributes['Id'] = 'complete'
|
||||
Feature.attributes['ConfigurableDirectory'] = 'MY_DEFAULT_FOLDER'
|
||||
Feature.attributes['Level'] = '1'
|
||||
Feature.attributes['Title'] = escape( '%s %s' % (NAME, VERSION) )
|
||||
Feature.attributes['Description'] = escape( SUMMARY )
|
||||
Feature.attributes['Display'] = 'expand'
|
||||
|
||||
for (feature, files) in create_feature_dict(files).items():
|
||||
SubFeature = factory.createElement('Feature')
|
||||
SubFeature.attributes['Level'] = '1'
|
||||
|
||||
if SCons.Util.is_Tuple(feature):
|
||||
SubFeature.attributes['Id'] = convert_to_id( feature[0], id_set )
|
||||
SubFeature.attributes['Title'] = escape(feature[0])
|
||||
SubFeature.attributes['Description'] = escape(feature[1])
|
||||
else:
|
||||
SubFeature.attributes['Id'] = convert_to_id( feature, id_set )
|
||||
if feature=='default':
|
||||
SubFeature.attributes['Description'] = 'Main Part'
|
||||
SubFeature.attributes['Title'] = 'Main Part'
|
||||
elif feature=='PACKAGING_DOC':
|
||||
SubFeature.attributes['Description'] = 'Documentation'
|
||||
SubFeature.attributes['Title'] = 'Documentation'
|
||||
else:
|
||||
SubFeature.attributes['Description'] = escape(feature)
|
||||
SubFeature.attributes['Title'] = escape(feature)
|
||||
|
||||
# build the componentrefs. As one of the design decision is that every
|
||||
# file is also a component we walk the list of files and create a
|
||||
# reference.
|
||||
for f in files:
|
||||
ComponentRef = factory.createElement('ComponentRef')
|
||||
ComponentRef.attributes['Id'] = convert_to_id( os.path.basename(f.get_path()), id_set )
|
||||
SubFeature.childNodes.append(ComponentRef)
|
||||
|
||||
Feature.childNodes.append(SubFeature)
|
||||
|
||||
root.getElementsByTagName('Product')[0].childNodes.append(Feature)
|
||||
|
||||
def build_wxsfile_default_gui(root):
|
||||
""" This function adds a default GUI to the wxs file
|
||||
"""
|
||||
factory = Document()
|
||||
Product = root.getElementsByTagName('Product')[0]
|
||||
|
||||
UIRef = factory.createElement('UIRef')
|
||||
UIRef.attributes['Id'] = 'WixUI_Mondo'
|
||||
Product.childNodes.append(UIRef)
|
||||
|
||||
UIRef = factory.createElement('UIRef')
|
||||
UIRef.attributes['Id'] = 'WixUI_ErrorProgressText'
|
||||
Product.childNodes.append(UIRef)
|
||||
|
||||
def build_license_file(directory, spec):
|
||||
""" Creates a License.rtf file with the content of "X_MSI_LICENSE_TEXT"
|
||||
in the given directory
|
||||
"""
|
||||
name, text = '', ''
|
||||
|
||||
try:
|
||||
name = spec['LICENSE']
|
||||
text = spec['X_MSI_LICENSE_TEXT']
|
||||
except KeyError:
|
||||
pass # ignore this as X_MSI_LICENSE_TEXT is optional
|
||||
|
||||
if name!='' or text!='':
|
||||
file = open( os.path.join(directory.get_path(), 'License.rtf'), 'w' )
|
||||
file.write('{\\rtf')
|
||||
if text!='':
|
||||
file.write(text.replace('\n', '\\par '))
|
||||
else:
|
||||
file.write(name+'\\par\\par')
|
||||
file.write('}')
|
||||
file.close()
|
||||
|
||||
#
|
||||
# mandatory and optional package tags
|
||||
#
|
||||
def build_wxsfile_header_section(root, spec):
|
||||
""" Adds the xml file node which define the package meta-data.
|
||||
"""
|
||||
# Create the needed DOM nodes and add them at the correct position in the tree.
|
||||
factory = Document()
|
||||
Product = factory.createElement( 'Product' )
|
||||
Package = factory.createElement( 'Package' )
|
||||
|
||||
root.childNodes.append( Product )
|
||||
Product.childNodes.append( Package )
|
||||
|
||||
# set "mandatory" default values
|
||||
if 'X_MSI_LANGUAGE' not in spec:
|
||||
spec['X_MSI_LANGUAGE'] = '1033' # select english
|
||||
|
||||
# mandatory sections, will throw a KeyError if the tag is not available
|
||||
Product.attributes['Name'] = escape( spec['NAME'] )
|
||||
Product.attributes['Version'] = escape( spec['VERSION'] )
|
||||
Product.attributes['Manufacturer'] = escape( spec['VENDOR'] )
|
||||
Product.attributes['Language'] = escape( spec['X_MSI_LANGUAGE'] )
|
||||
Package.attributes['Description'] = escape( spec['SUMMARY'] )
|
||||
|
||||
# now the optional tags, for which we avoid the KeyErrror exception
|
||||
if 'DESCRIPTION' in spec:
|
||||
Package.attributes['Comments'] = escape( spec['DESCRIPTION'] )
|
||||
|
||||
if 'X_MSI_UPGRADE_CODE' in spec:
|
||||
Package.attributes['X_MSI_UPGRADE_CODE'] = escape( spec['X_MSI_UPGRADE_CODE'] )
|
||||
|
||||
# We hardcode the media tag as our current model cannot handle it.
|
||||
Media = factory.createElement('Media')
|
||||
Media.attributes['Id'] = '1'
|
||||
Media.attributes['Cabinet'] = 'default.cab'
|
||||
Media.attributes['EmbedCab'] = 'yes'
|
||||
root.getElementsByTagName('Product')[0].childNodes.append(Media)
|
||||
|
||||
# this builder is the entry-point for .wxs file compiler.
|
||||
wxs_builder = Builder(
|
||||
action = Action( build_wxsfile, string_wxsfile ),
|
||||
ensure_suffix = '.wxs' )
|
||||
|
||||
def package(env, target, source, PACKAGEROOT, NAME, VERSION,
|
||||
DESCRIPTION, SUMMARY, VENDOR, X_MSI_LANGUAGE, **kw):
|
||||
# make sure that the Wix Builder is in the environment
|
||||
SCons.Tool.Tool('wix').generate(env)
|
||||
|
||||
# get put the keywords for the specfile compiler. These are the arguments
|
||||
# given to the package function and all optional ones stored in kw, minus
|
||||
# the the source, target and env one.
|
||||
loc = locals()
|
||||
del loc['kw']
|
||||
kw.update(loc)
|
||||
del kw['source'], kw['target'], kw['env']
|
||||
|
||||
# strip the install builder from the source files
|
||||
target, source = stripinstallbuilder(target, source, env)
|
||||
|
||||
# put the arguments into the env and call the specfile builder.
|
||||
env['msi_spec'] = kw
|
||||
specfile = wxs_builder(* [env, target, source], **kw)
|
||||
|
||||
# now call the WiX Tool with the built specfile added as a source.
|
||||
msifile = env.WiX(target, specfile)
|
||||
|
||||
# return the target and source tuple.
|
||||
return (msifile, source+[specfile])
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
349
scons-local-3.0.0/SCons/Tool/packaging/rpm.py
Normal file
349
scons-local-3.0.0/SCons/Tool/packaging/rpm.py
Normal file
@@ -0,0 +1,349 @@
|
||||
"""SCons.Tool.Packaging.rpm
|
||||
|
||||
The rpm packager.
|
||||
"""
|
||||
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/packaging/rpm.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
import os
|
||||
|
||||
import SCons.Builder
|
||||
import SCons.Tool.rpmutils
|
||||
|
||||
from SCons.Environment import OverrideEnvironment
|
||||
from SCons.Tool.packaging import stripinstallbuilder, src_targz
|
||||
from SCons.Errors import UserError
|
||||
|
||||
def package(env, target, source, PACKAGEROOT, NAME, VERSION,
|
||||
PACKAGEVERSION, DESCRIPTION, SUMMARY, X_RPM_GROUP, LICENSE,
|
||||
**kw):
|
||||
# initialize the rpm tool
|
||||
SCons.Tool.Tool('rpm').generate(env)
|
||||
|
||||
bld = env['BUILDERS']['Rpm']
|
||||
|
||||
# Generate a UserError whenever the target name has been set explicitly,
|
||||
# since rpm does not allow for controlling it. This is detected by
|
||||
# checking if the target has been set to the default by the Package()
|
||||
# Environment function.
|
||||
if str(target[0])!="%s-%s"%(NAME, VERSION):
|
||||
raise UserError( "Setting target is not supported for rpm." )
|
||||
else:
|
||||
# This should be overridable from the construction environment,
|
||||
# which it is by using ARCHITECTURE=.
|
||||
buildarchitecture = SCons.Tool.rpmutils.defaultMachine()
|
||||
|
||||
if 'ARCHITECTURE' in kw:
|
||||
buildarchitecture = kw['ARCHITECTURE']
|
||||
|
||||
fmt = '%s-%s-%s.%s.rpm'
|
||||
srcrpm = fmt % (NAME, VERSION, PACKAGEVERSION, 'src')
|
||||
binrpm = fmt % (NAME, VERSION, PACKAGEVERSION, buildarchitecture)
|
||||
|
||||
target = [ srcrpm, binrpm ]
|
||||
|
||||
# get the correct arguments into the kw hash
|
||||
loc=locals()
|
||||
del loc['kw']
|
||||
kw.update(loc)
|
||||
del kw['source'], kw['target'], kw['env']
|
||||
|
||||
# if no "SOURCE_URL" tag is given add a default one.
|
||||
if 'SOURCE_URL' not in kw:
|
||||
kw['SOURCE_URL']=(str(target[0])+".tar.gz").replace('.rpm', '')
|
||||
|
||||
# mangle the source and target list for the rpmbuild
|
||||
env = OverrideEnvironment(env, kw)
|
||||
target, source = stripinstallbuilder(target, source, env)
|
||||
target, source = addspecfile(target, source, env)
|
||||
target, source = collectintargz(target, source, env)
|
||||
|
||||
# now call the rpm builder to actually build the packet.
|
||||
return bld(env, target, source, **kw)
|
||||
|
||||
def collectintargz(target, source, env):
|
||||
""" Puts all source files into a tar.gz file. """
|
||||
# the rpm tool depends on a source package, until this is changed
|
||||
# this hack needs to be here that tries to pack all sources in.
|
||||
sources = env.FindSourceFiles()
|
||||
|
||||
# filter out the target we are building the source list for.
|
||||
sources = [s for s in sources if s not in target]
|
||||
|
||||
# find the .spec file for rpm and add it since it is not necessarily found
|
||||
# by the FindSourceFiles function.
|
||||
sources.extend( [s for s in source if str(s).rfind('.spec')!=-1] )
|
||||
# sort to keep sources from changing order across builds
|
||||
sources.sort()
|
||||
|
||||
# as the source contains the url of the source package this rpm package
|
||||
# is built from, we extract the target name
|
||||
tarball = (str(target[0])+".tar.gz").replace('.rpm', '')
|
||||
try:
|
||||
tarball = env['SOURCE_URL'].split('/')[-1]
|
||||
except KeyError as e:
|
||||
raise SCons.Errors.UserError( "Missing PackageTag '%s' for RPM packager" % e.args[0] )
|
||||
|
||||
tarball = src_targz.package(env, source=sources, target=tarball,
|
||||
PACKAGEROOT=env['PACKAGEROOT'], )
|
||||
|
||||
return (target, tarball)
|
||||
|
||||
def addspecfile(target, source, env):
|
||||
specfile = "%s-%s" % (env['NAME'], env['VERSION'])
|
||||
|
||||
bld = SCons.Builder.Builder(action = build_specfile,
|
||||
suffix = '.spec',
|
||||
target_factory = SCons.Node.FS.File)
|
||||
|
||||
source.extend(bld(env, specfile, source))
|
||||
|
||||
return (target,source)
|
||||
|
||||
def build_specfile(target, source, env):
|
||||
""" Builds a RPM specfile from a dictionary with string metadata and
|
||||
by analyzing a tree of nodes.
|
||||
"""
|
||||
file = open(target[0].get_abspath(), 'w')
|
||||
|
||||
try:
|
||||
file.write( build_specfile_header(env) )
|
||||
file.write( build_specfile_sections(env) )
|
||||
file.write( build_specfile_filesection(env, source) )
|
||||
file.close()
|
||||
|
||||
# call a user specified function
|
||||
if 'CHANGE_SPECFILE' in env:
|
||||
env['CHANGE_SPECFILE'](target, source)
|
||||
|
||||
except KeyError as e:
|
||||
raise SCons.Errors.UserError( '"%s" package field for RPM is missing.' % e.args[0] )
|
||||
|
||||
|
||||
#
|
||||
# mandatory and optional package tag section
|
||||
#
|
||||
def build_specfile_sections(spec):
|
||||
""" Builds the sections of a rpm specfile.
|
||||
"""
|
||||
str = ""
|
||||
|
||||
mandatory_sections = {
|
||||
'DESCRIPTION' : '\n%%description\n%s\n\n', }
|
||||
|
||||
str = str + SimpleTagCompiler(mandatory_sections).compile( spec )
|
||||
|
||||
optional_sections = {
|
||||
'DESCRIPTION_' : '%%description -l %s\n%s\n\n',
|
||||
'CHANGELOG' : '%%changelog\n%s\n\n',
|
||||
'X_RPM_PREINSTALL' : '%%pre\n%s\n\n',
|
||||
'X_RPM_POSTINSTALL' : '%%post\n%s\n\n',
|
||||
'X_RPM_PREUNINSTALL' : '%%preun\n%s\n\n',
|
||||
'X_RPM_POSTUNINSTALL' : '%%postun\n%s\n\n',
|
||||
'X_RPM_VERIFY' : '%%verify\n%s\n\n',
|
||||
|
||||
# These are for internal use but could possibly be overridden
|
||||
'X_RPM_PREP' : '%%prep\n%s\n\n',
|
||||
'X_RPM_BUILD' : '%%build\n%s\n\n',
|
||||
'X_RPM_INSTALL' : '%%install\n%s\n\n',
|
||||
'X_RPM_CLEAN' : '%%clean\n%s\n\n',
|
||||
}
|
||||
|
||||
# Default prep, build, install and clean rules
|
||||
# TODO: optimize those build steps, to not compile the project a second time
|
||||
if 'X_RPM_PREP' not in spec:
|
||||
spec['X_RPM_PREP'] = '[ -n "$RPM_BUILD_ROOT" -a "$RPM_BUILD_ROOT" != / ] && rm -rf "$RPM_BUILD_ROOT"' + '\n%setup -q'
|
||||
|
||||
if 'X_RPM_BUILD' not in spec:
|
||||
spec['X_RPM_BUILD'] = '[ ! -e "$RPM_BUILD_ROOT" -a "$RPM_BUILD_ROOT" != / ] && mkdir "$RPM_BUILD_ROOT"'
|
||||
|
||||
if 'X_RPM_INSTALL' not in spec:
|
||||
spec['X_RPM_INSTALL'] = 'scons --install-sandbox="$RPM_BUILD_ROOT" "$RPM_BUILD_ROOT"'
|
||||
|
||||
if 'X_RPM_CLEAN' not in spec:
|
||||
spec['X_RPM_CLEAN'] = '[ -n "$RPM_BUILD_ROOT" -a "$RPM_BUILD_ROOT" != / ] && rm -rf "$RPM_BUILD_ROOT"'
|
||||
|
||||
str = str + SimpleTagCompiler(optional_sections, mandatory=0).compile( spec )
|
||||
|
||||
return str
|
||||
|
||||
def build_specfile_header(spec):
|
||||
""" Builds all sections but the %file of a rpm specfile
|
||||
"""
|
||||
str = ""
|
||||
|
||||
# first the mandatory sections
|
||||
mandatory_header_fields = {
|
||||
'NAME' : '%%define name %s\nName: %%{name}\n',
|
||||
'VERSION' : '%%define version %s\nVersion: %%{version}\n',
|
||||
'PACKAGEVERSION' : '%%define release %s\nRelease: %%{release}\n',
|
||||
'X_RPM_GROUP' : 'Group: %s\n',
|
||||
'SUMMARY' : 'Summary: %s\n',
|
||||
'LICENSE' : 'License: %s\n', }
|
||||
|
||||
str = str + SimpleTagCompiler(mandatory_header_fields).compile( spec )
|
||||
|
||||
# now the optional tags
|
||||
optional_header_fields = {
|
||||
'VENDOR' : 'Vendor: %s\n',
|
||||
'X_RPM_URL' : 'Url: %s\n',
|
||||
'SOURCE_URL' : 'Source: %s\n',
|
||||
'SUMMARY_' : 'Summary(%s): %s\n',
|
||||
'X_RPM_DISTRIBUTION' : 'Distribution: %s\n',
|
||||
'X_RPM_ICON' : 'Icon: %s\n',
|
||||
'X_RPM_PACKAGER' : 'Packager: %s\n',
|
||||
'X_RPM_GROUP_' : 'Group(%s): %s\n',
|
||||
|
||||
'X_RPM_REQUIRES' : 'Requires: %s\n',
|
||||
'X_RPM_PROVIDES' : 'Provides: %s\n',
|
||||
'X_RPM_CONFLICTS' : 'Conflicts: %s\n',
|
||||
'X_RPM_BUILDREQUIRES' : 'BuildRequires: %s\n',
|
||||
|
||||
'X_RPM_SERIAL' : 'Serial: %s\n',
|
||||
'X_RPM_EPOCH' : 'Epoch: %s\n',
|
||||
'X_RPM_AUTOREQPROV' : 'AutoReqProv: %s\n',
|
||||
'X_RPM_EXCLUDEARCH' : 'ExcludeArch: %s\n',
|
||||
'X_RPM_EXCLUSIVEARCH' : 'ExclusiveArch: %s\n',
|
||||
'X_RPM_PREFIX' : 'Prefix: %s\n',
|
||||
|
||||
# internal use
|
||||
'X_RPM_BUILDROOT' : 'BuildRoot: %s\n', }
|
||||
|
||||
# fill in default values:
|
||||
# Adding a BuildRequires renders the .rpm unbuildable under System, which
|
||||
# are not managed by rpm, since the database to resolve this dependency is
|
||||
# missing (take Gentoo as an example)
|
||||
# if not s.has_key('x_rpm_BuildRequires'):
|
||||
# s['x_rpm_BuildRequires'] = 'scons'
|
||||
|
||||
if 'X_RPM_BUILDROOT' not in spec:
|
||||
spec['X_RPM_BUILDROOT'] = '%{_tmppath}/%{name}-%{version}-%{release}'
|
||||
|
||||
str = str + SimpleTagCompiler(optional_header_fields, mandatory=0).compile( spec )
|
||||
return str
|
||||
|
||||
#
|
||||
# mandatory and optional file tags
|
||||
#
|
||||
def build_specfile_filesection(spec, files):
|
||||
""" builds the %file section of the specfile
|
||||
"""
|
||||
str = '%files\n'
|
||||
|
||||
if 'X_RPM_DEFATTR' not in spec:
|
||||
spec['X_RPM_DEFATTR'] = '(-,root,root)'
|
||||
|
||||
str = str + '%%defattr %s\n' % spec['X_RPM_DEFATTR']
|
||||
|
||||
supported_tags = {
|
||||
'PACKAGING_CONFIG' : '%%config %s',
|
||||
'PACKAGING_CONFIG_NOREPLACE' : '%%config(noreplace) %s',
|
||||
'PACKAGING_DOC' : '%%doc %s',
|
||||
'PACKAGING_UNIX_ATTR' : '%%attr %s',
|
||||
'PACKAGING_LANG_' : '%%lang(%s) %s',
|
||||
'PACKAGING_X_RPM_VERIFY' : '%%verify %s',
|
||||
'PACKAGING_X_RPM_DIR' : '%%dir %s',
|
||||
'PACKAGING_X_RPM_DOCDIR' : '%%docdir %s',
|
||||
'PACKAGING_X_RPM_GHOST' : '%%ghost %s', }
|
||||
|
||||
for file in files:
|
||||
# build the tagset
|
||||
tags = {}
|
||||
for k in list(supported_tags.keys()):
|
||||
try:
|
||||
v = file.GetTag(k)
|
||||
if v:
|
||||
tags[k] = v
|
||||
except AttributeError:
|
||||
pass
|
||||
|
||||
# compile the tagset
|
||||
str = str + SimpleTagCompiler(supported_tags, mandatory=0).compile( tags )
|
||||
|
||||
str = str + ' '
|
||||
str = str + file.GetTag('PACKAGING_INSTALL_LOCATION')
|
||||
str = str + '\n\n'
|
||||
|
||||
return str
|
||||
|
||||
class SimpleTagCompiler(object):
|
||||
""" This class is a simple string substition utility:
|
||||
the replacement specfication is stored in the tagset dictionary, something
|
||||
like:
|
||||
{ "abc" : "cdef %s ",
|
||||
"abc_" : "cdef %s %s" }
|
||||
|
||||
the compile function gets a value dictionary, which may look like:
|
||||
{ "abc" : "ghij",
|
||||
"abc_gh" : "ij" }
|
||||
|
||||
The resulting string will be:
|
||||
"cdef ghij cdef gh ij"
|
||||
"""
|
||||
def __init__(self, tagset, mandatory=1):
|
||||
self.tagset = tagset
|
||||
self.mandatory = mandatory
|
||||
|
||||
def compile(self, values):
|
||||
""" Compiles the tagset and returns a str containing the result
|
||||
"""
|
||||
def is_international(tag):
|
||||
return tag.endswith('_')
|
||||
|
||||
def get_country_code(tag):
|
||||
return tag[-2:]
|
||||
|
||||
def strip_country_code(tag):
|
||||
return tag[:-2]
|
||||
|
||||
replacements = list(self.tagset.items())
|
||||
|
||||
str = ""
|
||||
domestic = [t for t in replacements if not is_international(t[0])]
|
||||
for key, replacement in domestic:
|
||||
try:
|
||||
str = str + replacement % values[key]
|
||||
except KeyError as e:
|
||||
if self.mandatory:
|
||||
raise e
|
||||
|
||||
international = [t for t in replacements if is_international(t[0])]
|
||||
for key, replacement in international:
|
||||
try:
|
||||
x = [t for t in values.items() if strip_country_code(t[0]) == key]
|
||||
int_values_for_key = [(get_country_code(t[0]),t[1]) for t in x]
|
||||
for v in int_values_for_key:
|
||||
str = str + replacement % v
|
||||
except KeyError as e:
|
||||
if self.mandatory:
|
||||
raise e
|
||||
|
||||
return str
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
43
scons-local-3.0.0/SCons/Tool/packaging/src_tarbz2.py
Normal file
43
scons-local-3.0.0/SCons/Tool/packaging/src_tarbz2.py
Normal file
@@ -0,0 +1,43 @@
|
||||
"""SCons.Tool.Packaging.tarbz2
|
||||
|
||||
The tarbz2 SRC packager.
|
||||
"""
|
||||
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/packaging/src_tarbz2.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
from SCons.Tool.packaging import putintopackageroot
|
||||
|
||||
def package(env, target, source, PACKAGEROOT, **kw):
|
||||
bld = env['BUILDERS']['Tar']
|
||||
bld.set_suffix('.tar.bz2')
|
||||
target, source = putintopackageroot(target, source, env, PACKAGEROOT, honor_install_location=0)
|
||||
return bld(env, target, source, TARFLAGS='-jc')
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
43
scons-local-3.0.0/SCons/Tool/packaging/src_targz.py
Normal file
43
scons-local-3.0.0/SCons/Tool/packaging/src_targz.py
Normal file
@@ -0,0 +1,43 @@
|
||||
"""SCons.Tool.Packaging.targz
|
||||
|
||||
The targz SRC packager.
|
||||
"""
|
||||
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/packaging/src_targz.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
from SCons.Tool.packaging import putintopackageroot
|
||||
|
||||
def package(env, target, source, PACKAGEROOT, **kw):
|
||||
bld = env['BUILDERS']['Tar']
|
||||
bld.set_suffix('.tar.gz')
|
||||
target, source = putintopackageroot(target, source, env, PACKAGEROOT, honor_install_location=0)
|
||||
return bld(env, target, source, TARFLAGS='-zc')
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
43
scons-local-3.0.0/SCons/Tool/packaging/src_zip.py
Normal file
43
scons-local-3.0.0/SCons/Tool/packaging/src_zip.py
Normal file
@@ -0,0 +1,43 @@
|
||||
"""SCons.Tool.Packaging.zip
|
||||
|
||||
The zip SRC packager.
|
||||
"""
|
||||
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/packaging/src_zip.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
from SCons.Tool.packaging import putintopackageroot
|
||||
|
||||
def package(env, target, source, PACKAGEROOT, **kw):
|
||||
bld = env['BUILDERS']['Zip']
|
||||
bld.set_suffix('.zip')
|
||||
target, source = putintopackageroot(target, source, env, PACKAGEROOT, honor_install_location=0)
|
||||
return bld(env, target, source)
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
44
scons-local-3.0.0/SCons/Tool/packaging/tarbz2.py
Normal file
44
scons-local-3.0.0/SCons/Tool/packaging/tarbz2.py
Normal file
@@ -0,0 +1,44 @@
|
||||
"""SCons.Tool.Packaging.tarbz2
|
||||
|
||||
The tarbz2 SRC packager.
|
||||
"""
|
||||
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/packaging/tarbz2.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
from SCons.Tool.packaging import stripinstallbuilder, putintopackageroot
|
||||
|
||||
def package(env, target, source, PACKAGEROOT, **kw):
|
||||
bld = env['BUILDERS']['Tar']
|
||||
bld.set_suffix('.tar.gz')
|
||||
target, source = putintopackageroot(target, source, env, PACKAGEROOT)
|
||||
target, source = stripinstallbuilder(target, source, env)
|
||||
return bld(env, target, source, TARFLAGS='-jc')
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
44
scons-local-3.0.0/SCons/Tool/packaging/targz.py
Normal file
44
scons-local-3.0.0/SCons/Tool/packaging/targz.py
Normal file
@@ -0,0 +1,44 @@
|
||||
"""SCons.Tool.Packaging.targz
|
||||
|
||||
The targz SRC packager.
|
||||
"""
|
||||
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/packaging/targz.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
from SCons.Tool.packaging import stripinstallbuilder, putintopackageroot
|
||||
|
||||
def package(env, target, source, PACKAGEROOT, **kw):
|
||||
bld = env['BUILDERS']['Tar']
|
||||
bld.set_suffix('.tar.gz')
|
||||
target, source = stripinstallbuilder(target, source, env)
|
||||
target, source = putintopackageroot(target, source, env, PACKAGEROOT)
|
||||
return bld(env, target, source, TARFLAGS='-zc')
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
44
scons-local-3.0.0/SCons/Tool/packaging/zip.py
Normal file
44
scons-local-3.0.0/SCons/Tool/packaging/zip.py
Normal file
@@ -0,0 +1,44 @@
|
||||
"""SCons.Tool.Packaging.zip
|
||||
|
||||
The zip SRC packager.
|
||||
"""
|
||||
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/packaging/zip.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
from SCons.Tool.packaging import stripinstallbuilder, putintopackageroot
|
||||
|
||||
def package(env, target, source, PACKAGEROOT, **kw):
|
||||
bld = env['BUILDERS']['Zip']
|
||||
bld.set_suffix('.zip')
|
||||
target, source = stripinstallbuilder(target, source, env)
|
||||
target, source = putintopackageroot(target, source, env, PACKAGEROOT)
|
||||
return bld(env, target, source)
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
78
scons-local-3.0.0/SCons/Tool/pdf.py
Normal file
78
scons-local-3.0.0/SCons/Tool/pdf.py
Normal file
@@ -0,0 +1,78 @@
|
||||
"""SCons.Tool.pdf
|
||||
|
||||
Common PDF Builder definition for various other Tool modules that use it.
|
||||
Add an explicit action to run epstopdf to convert .eps files to .pdf
|
||||
|
||||
"""
|
||||
|
||||
#
|
||||
# Copyright (c) 2001 - 2017 The SCons Foundation
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
|
||||
__revision__ = "src/engine/SCons/Tool/pdf.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog"
|
||||
|
||||
import SCons.Builder
|
||||
import SCons.Tool
|
||||
|
||||
PDFBuilder = None
|
||||
|
||||
EpsPdfAction = SCons.Action.Action('$EPSTOPDFCOM', '$EPSTOPDFCOMSTR')
|
||||
|
||||
def generate(env):
|
||||
try:
|
||||
env['BUILDERS']['PDF']
|
||||
except KeyError:
|
||||
global PDFBuilder
|
||||
if PDFBuilder is None:
|
||||
PDFBuilder = SCons.Builder.Builder(action = {},
|
||||
source_scanner = SCons.Tool.PDFLaTeXScanner,
|
||||
prefix = '$PDFPREFIX',
|
||||
suffix = '$PDFSUFFIX',
|
||||
emitter = {},
|
||||
source_ext_match = None,
|
||||
single_source=True)
|
||||
env['BUILDERS']['PDF'] = PDFBuilder
|
||||
|
||||
env['PDFPREFIX'] = ''
|
||||
env['PDFSUFFIX'] = '.pdf'
|
||||
|
||||
# put the epstopdf builder in this routine so we can add it after
|
||||
# the pdftex builder so that one is the default for no source suffix
|
||||
def generate2(env):
|
||||
bld = env['BUILDERS']['PDF']
|
||||
#bld.add_action('.ps', EpsPdfAction) # this is covered by direct Ghostcript action in gs.py
|
||||
bld.add_action('.eps', EpsPdfAction)
|
||||
|
||||
env['EPSTOPDF'] = 'epstopdf'
|
||||
env['EPSTOPDFFLAGS'] = SCons.Util.CLVar('')
|
||||
env['EPSTOPDFCOM'] = '$EPSTOPDF $EPSTOPDFFLAGS ${SOURCE} --outfile=${TARGET}'
|
||||
|
||||
def exists(env):
|
||||
# This only puts a skeleton Builder in place, so if someone
|
||||
# references this Tool directly, it's always "available."
|
||||
return 1
|
||||
|
||||
# Local Variables:
|
||||
# tab-width:4
|
||||
# indent-tabs-mode:nil
|
||||
# End:
|
||||
# vim: set expandtab tabstop=4 shiftwidth=4:
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user