diff options
Diffstat (limited to 'src/engine/SCons')
-rw-r--r-- | src/engine/SCons/Node/FS.py | 9 | ||||
-rw-r--r-- | src/engine/SCons/Script/Main.py | 18 | ||||
-rw-r--r-- | src/engine/SCons/Tool/intelc.py | 4 | ||||
-rw-r--r-- | src/engine/SCons/Tool/link.py | 15 | ||||
-rw-r--r-- | src/engine/SCons/Tool/msvs.py | 14 | ||||
-rw-r--r-- | src/engine/SCons/Tool/sunc++.py | 34 | ||||
-rw-r--r-- | src/engine/SCons/Warnings.py | 6 |
7 files changed, 73 insertions, 27 deletions
diff --git a/src/engine/SCons/Node/FS.py b/src/engine/SCons/Node/FS.py index b154e34..99ae822 100644 --- a/src/engine/SCons/Node/FS.py +++ b/src/engine/SCons/Node/FS.py @@ -2150,12 +2150,14 @@ class File(Base): def Entry(self, name): """Create an entry node named 'name' relative to the SConscript directory of this file.""" - return self.cwd.Entry(name) + cwd = self.cwd or self.fs._cwd + return cwd.Entry(name) def Dir(self, name, create=True): """Create a directory node named 'name' relative to the SConscript directory of this file.""" - return self.cwd.Dir(name, create) + cwd = self.cwd or self.fs._cwd + return cwd.Dir(name, create) def Dirs(self, pathlist): """Create a list of directories relative to the SConscript @@ -2165,7 +2167,8 @@ class File(Base): def File(self, name): """Create a file node named 'name' relative to the SConscript directory of this file.""" - return self.cwd.File(name) + cwd = self.cwd or self.fs._cwd + return cwd.File(name) #def generate_build_dict(self): # """Return an appropriate dictionary of values for building diff --git a/src/engine/SCons/Script/Main.py b/src/engine/SCons/Script/Main.py index 75d0117..ec00737 100644 --- a/src/engine/SCons/Script/Main.py +++ b/src/engine/SCons/Script/Main.py @@ -195,14 +195,17 @@ class BuildTask(SCons.Taskmaster.Task): def do_failed(self, status=2): _BuildFailures.append(self.exception[1]) global exit_status + global this_build_status if self.options.ignore_errors: SCons.Taskmaster.Task.executed(self) elif self.options.keep_going: SCons.Taskmaster.Task.fail_continue(self) exit_status = status + this_build_status = status else: SCons.Taskmaster.Task.fail_stop(self) exit_status = status + this_build_status = status def executed(self): t = self.targets[0] @@ -384,7 +387,9 @@ class QuestionTask(SCons.Taskmaster.Task): if self.targets[0].get_state() != SCons.Node.up_to_date or \ (self.top and not self.targets[0].exists()): global exit_status + global this_build_status exit_status = 1 + this_build_status = 1 self.tm.stop() def executed(self): @@ -428,7 +433,8 @@ print_stacktrace = 0 print_time = 0 sconscript_time = 0 cumulative_command_time = 0 -exit_status = 0 # exit status, assume success by default +exit_status = 0 # final exit status, assume success by default +this_build_status = 0 # "exit status" of an individual build num_jobs = None delayed_warnings = [] @@ -714,6 +720,7 @@ def version_string(label, module): def _main(parser): global exit_status + global this_build_status options = parser.values @@ -727,6 +734,7 @@ def _main(parser): default_warnings = [ SCons.Warnings.CorruptSConsignWarning, SCons.Warnings.DeprecatedWarning, SCons.Warnings.DuplicateEnvironmentWarning, + SCons.Warnings.LinkWarning, SCons.Warnings.MissingSConscriptWarning, SCons.Warnings.NoMD5ModuleWarning, SCons.Warnings.NoMetaclassSupportWarning, @@ -734,6 +742,7 @@ def _main(parser): SCons.Warnings.NoParallelSupportWarning, SCons.Warnings.MisleadingKeywordsWarning, SCons.Warnings.StackSizeWarning, ] + for warning in default_warnings: SCons.Warnings.enableWarningClass(warning) SCons.Warnings._warningOut = _scons_internal_warning @@ -974,6 +983,9 @@ def _main(parser): def _build_targets(fs, options, targets, target_top): + global this_build_status + this_build_status = 0 + progress_display.set_mode(not (options.no_progress or options.silent)) display.set_mode(not options.silent) SCons.Action.print_actions = not options.silent @@ -1143,9 +1155,11 @@ def _build_targets(fs, options, targets, target_top): if jobs.were_interrupted(): progress_display("scons: Build interrupted.") global exit_status + global this_build_status exit_status = 2 + this_build_status = 2 - if exit_status: + if this_build_status: progress_display("scons: " + failure_message) else: progress_display("scons: " + closing_message) diff --git a/src/engine/SCons/Tool/intelc.py b/src/engine/SCons/Tool/intelc.py index 020a6f7..d6f19c2 100644 --- a/src/engine/SCons/Tool/intelc.py +++ b/src/engine/SCons/Tool/intelc.py @@ -101,8 +101,8 @@ def check_abi(abi): valid_abis = {'ia32' : 'ia32', 'x86' : 'ia32', 'ia64' : 'ia64', - 'em64t' : 'ia32e', - 'amd64' : 'ia32e'} + 'em64t' : 'em64t', + 'amd64' : 'em64t'} if is_linux: valid_abis = {'ia32' : 'ia32', 'x86' : 'ia32', diff --git a/src/engine/SCons/Tool/link.py b/src/engine/SCons/Tool/link.py index 866df08..4522ba1 100644 --- a/src/engine/SCons/Tool/link.py +++ b/src/engine/SCons/Tool/link.py @@ -36,18 +36,27 @@ __revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__" import SCons.Defaults import SCons.Tool import SCons.Util -import SCons.Errors +import SCons.Warnings from SCons.Tool.FortranCommon import isfortran cplusplus = __import__('c++', 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) if has_cplusplus and has_fortran: - raise SCons.Errors.InternalError( - "Sorry, scons cannot yet link c++ and fortran code together.") + 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 % repr(env.subst('$CXX'))) + issued_mixed_link_warning = True + return '$CXX' elif has_fortran: return '$FORTRAN' elif has_cplusplus: diff --git a/src/engine/SCons/Tool/msvs.py b/src/engine/SCons/Tool/msvs.py index ca1b5f6..e9d73da 100644 --- a/src/engine/SCons/Tool/msvs.py +++ b/src/engine/SCons/Tool/msvs.py @@ -1393,14 +1393,12 @@ def get_msvs_install_dirs(version = None, vs8suite = None): # since version numbers aren't really floats... aa = a[1:] bb = b[1:] - aal = aa.split('.') - bbl = bb.split('.') - c = int(bbl[0]) - int(aal[0]) - if c == 0: - c = int(bbl[1]) - int(aal[1]) - if c == 0: - c = int(bbl[2]) - int(aal[2]) - return c + aal = string.split(aa, '.') + bbl = string.split(bb, '.') + # 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) installed_framework_versions.sort(versrt) diff --git a/src/engine/SCons/Tool/sunc++.py b/src/engine/SCons/Tool/sunc++.py index 36316cb..95b4516 100644 --- a/src/engine/SCons/Tool/sunc++.py +++ b/src/engine/SCons/Tool/sunc++.py @@ -42,21 +42,37 @@ cplusplus = __import__('c++', globals(), locals(), []) # use the package installer tool lslpp to figure out where cppc and what # version of it is installed def get_cppc(env): - cppcPath = env.get('CXX', None) + cxx = env.get('CXX', None) + if cxx: + cppcPath = os.path.dirname(cxx) + else: + cppcPath = None + cppcVersion = None pkginfo = env.subst('$PKGINFO') pkgchk = env.subst('$PKGCHK') - for package in ['SPROcpl']: - cmd = "%s -l %s 2>/dev/null | grep '^ *VERSION:'" % (pkginfo, package) - line = os.popen(cmd).readline() - if line: - cppcVersion = line.split()[-1] - cmd = "%s -l %s 2>/dev/null | grep '^Pathname:.*/bin/CC$' | grep -v '/SC[0-9]*\.[0-9]*/'" % (pkgchk, package) + def look_pkg_db(pkginfo=pkginfo, pkgchk=pkgchk): + version = None + path = None + for package in ['SPROcpl']: + cmd = "%s -l %s 2>/dev/null | grep '^ *VERSION:'" % (pkginfo, package) line = os.popen(cmd).readline() - cppcPath = os.path.dirname(line.split()[-1]) - break + if line: + version = line.split()[-1] + cmd = "%s -l %s 2>/dev/null | grep '^Pathname:.*/bin/CC$' | grep -v '/SC[0-9]*\.[0-9]*/'" % (pkgchk, package) + line = os.popen(cmd).readline() + if line: + path = os.path.dirname(line.split()[-1]) + break + + return path, version + + path, version = look_pkg_db() + if path and version: + cppcPath, cppcVersion = path, version + return (cppcPath, 'CC', 'CC', cppcVersion) def generate(env): diff --git a/src/engine/SCons/Warnings.py b/src/engine/SCons/Warnings.py index c9b8a26..5af9263 100644 --- a/src/engine/SCons/Warnings.py +++ b/src/engine/SCons/Warnings.py @@ -64,6 +64,9 @@ class DeprecatedTargetSignaturesWarning(DeprecatedWarning): class DuplicateEnvironmentWarning(Warning): pass +class LinkWarning(Warning): + pass + class MisleadingKeywordsWarning(Warning): pass @@ -91,6 +94,9 @@ class ReservedVariableWarning(Warning): class StackSizeWarning(Warning): pass +class FortranCxxMixWarning(LinkWarning): + pass + _warningAsException = 0 # The below is a list of 2-tuples. The first element is a class object. |