Accepting request 641268 from devel:tools:building

OBS-URL: https://build.opensuse.org/request/show/641268
OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/scons?expand=0&rev=37
This commit is contained in:
Dominique Leuenberger 2018-10-12 11:09:37 +00:00 committed by Git OBS Bridge
commit 94be1ed579
15 changed files with 1941 additions and 344 deletions

3
3.0.1.tar.gz Normal file
View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:37b2d8ba2b869a397cf0007026b793230a97d6aa9545db9568755cd282dd5f53
size 5481813

3
_multibuild Normal file
View File

@ -0,0 +1,3 @@
<multibuild>
<package>test</package>
</multibuild>

View File

@ -0,0 +1,26 @@
--- a/src/engine/SCons/Script/Main.py
+++ b/src/engine/SCons/Script/Main.py
@@ -1253,7 +1253,11 @@ def _build_targets(fs, options, targets,
BuildTask.options = options
- python_has_threads = sysconfig.get_config_var('WITH_THREAD')
+ # As of 3.7, python removed support for threadless platforms.
+ # See https://www.python.org/dev/peps/pep-0011/
+ is_37_or_later = sys.version_info.major > 3 or \
+ sys.version_info.major == 3 and sys.version_info.minor >= 7
+ python_has_threads = sysconfig.get_config_var('WITH_THREAD') or is_37_or_later
# to check if python configured with threads.
global num_jobs
num_jobs = options.num_jobs
--- a/runtest.py
+++ b/runtest.py
@@ -781,7 +781,7 @@ tests_passing = 0
tests_failing = 0
-def run_test(t, io_lock, async=True):
+def run_test(t, io_lock, run_async=True):
global tests_completed, tests_passing, tests_failing
header = ""
command_args = ['-tt']

View File

@ -0,0 +1,114 @@
--- a/src/engine/SCons/Tool/packaging/rpm.py
+++ b/src/engine/SCons/Tool/packaging/rpm.py
@@ -51,10 +51,9 @@ def package(env, target, source, PACKAGE
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=.
+ # Deduce the build architecture, but allow it to be overridden
+ # by setting ARCHITECTURE in the construction env.
buildarchitecture = SCons.Tool.rpmutils.defaultMachine()
-
if 'ARCHITECTURE' in kw:
buildarchitecture = kw['ARCHITECTURE']
@@ -126,20 +125,18 @@ 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)
+ with open(target[0].get_abspath(), 'w') as file:
+ try:
+ file.write(build_specfile_header(env))
+ file.write(build_specfile_sections(env))
+ file.write(build_specfile_filesection(env, source))
+
+ # 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] )
+ except KeyError as e:
+ raise SCons.Errors.UserError('"%s" package field for RPM is missing.' % e.args[0])
#
@@ -201,7 +198,8 @@ def build_specfile_header(spec):
'PACKAGEVERSION' : '%%define release %s\nRelease: %%{release}\n',
'X_RPM_GROUP' : 'Group: %s\n',
'SUMMARY' : 'Summary: %s\n',
- 'LICENSE' : 'License: %s\n', }
+ 'LICENSE' : 'License: %s\n',
+ }
str = str + SimpleTagCompiler(mandatory_header_fields).compile( spec )
@@ -211,6 +209,7 @@ def build_specfile_header(spec):
'X_RPM_URL' : 'Url: %s\n',
'SOURCE_URL' : 'Source: %s\n',
'SUMMARY_' : 'Summary(%s): %s\n',
+ 'ARCHITECTURE' : 'BuildArch: %s\n',
'X_RPM_DISTRIBUTION' : 'Distribution: %s\n',
'X_RPM_ICON' : 'Icon: %s\n',
'X_RPM_PACKAGER' : 'Packager: %s\n',
@@ -229,19 +228,33 @@ def build_specfile_header(spec):
'X_RPM_PREFIX' : 'Prefix: %s\n',
# internal use
- 'X_RPM_BUILDROOT' : 'BuildRoot: %s\n', }
+ 'X_RPM_BUILDROOT' : 'BuildRoot: %s\n',
+ }
# fill in default values:
- # Adding a BuildRequires renders the .rpm unbuildable under System, which
+ # Adding a BuildRequires renders the .rpm unbuildable under systems 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_BUILDREQUIRES' not in spec:
+ # spec['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 )
+
+ # Add any extra specfile definitions the user may have supplied.
+ # These flags get no processing, they are just added.
+ # github #3164: if we don't turn off debug package generation
+ # the tests which build packages all fail. If there are no
+ # extra flags, default to adding this one. If the user wants
+ # to turn this back on, supply the flag set to None.
+
+ if 'X_RPM_EXTRADEFS' not in spec:
+ spec['X_RPM_EXTRADEFS'] = ['%global debug_package %{nil}']
+ for extra in spec['X_RPM_EXTRADEFS']:
+ str += extra + '\n'
+
return str
#
--- a/src/engine/SCons/Tool/packaging/tarbz2.py
+++ b/src/engine/SCons/Tool/packaging/tarbz2.py
@@ -32,7 +32,7 @@ from SCons.Tool.packaging import stripin
def package(env, target, source, PACKAGEROOT, **kw):
bld = env['BUILDERS']['Tar']
- bld.set_suffix('.tar.gz')
+ bld.set_suffix('.tar.bz2')
target, source = putintopackageroot(target, source, env, PACKAGEROOT)
target, source = stripinstallbuilder(target, source, env)
return bld(env, target, source, TARFLAGS='-jc')

329
grep-filter-list.txt Normal file
View File

@ -0,0 +1,329 @@
src/engine/SCons/ActionTests.py
src/engine/SCons/dblite.py
src/engine/SCons/EnvironmentValuesTest.py
src/engine/SCons/Options/__init__.py
src/engine/SCons/Platform/aix.py
src/engine/SCons/Platform/cygwin.py
src/engine/SCons/Platform/darwin.py
src/engine/SCons/Platform/hpux.py
src/engine/SCons/Platform/irix.py
src/engine/SCons/Platform/os2.py
src/engine/SCons/Platform/sunos.py
src/engine/SCons/SConfTests.py
src/engine/SCons/Script/__init__.py
src/engine/SCons/Script/SConscript.py
src/engine/SCons/Tool/aixcc.py
src/engine/SCons/Tool/aixf77.py
src/engine/SCons/Tool/aixlink.py
src/engine/SCons/Tool/applelink.py
src/engine/SCons/Tool/cvf.py
src/engine/SCons/Tool/cyglink.py
src/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/extensions/docbook.py
src/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/extensions/xslt.py
src/engine/SCons/Tool/f03.py
src/engine/SCons/Tool/f08.py
src/engine/SCons/Tool/f95.py
src/engine/SCons/Tool/gcc.py
src/engine/SCons/Tool/gfortran.py
src/engine/SCons/Tool/gnulink.py
src/engine/SCons/Tool/gxx.py
src/engine/SCons/Tool/hpcc.py
src/engine/SCons/Tool/hplink.py
src/engine/SCons/Tool/icc.py
src/engine/SCons/Tool/ifl.py
src/engine/SCons/Tool/ifort.py
src/engine/SCons/Tool/midl.py
src/engine/SCons/Tool/MSCommon/arch.py
src/engine/SCons/Tool/MSCommon/netframework.py
src/engine/SCons/Tool/MSCommon/sdk.py
src/engine/SCons/Tool/MSCommon/vc.py
src/engine/SCons/Tool/MSCommon/vs.py
src/engine/SCons/Tool/mslib.py
src/engine/SCons/Tool/mslink.py
src/engine/SCons/Tool/mssdk.py
src/engine/SCons/Tool/msvc.py
src/engine/SCons/Tool/msvs.py
src/engine/SCons/Tool/sgicc.py
src/engine/SCons/Tool/sgilink.py
src/engine/SCons/Tool/suncc.py
src/engine/SCons/Tool/sunf77.py
src/engine/SCons/Tool/sunf90.py
src/engine/SCons/Tool/sunf95.py
src/engine/SCons/Tool/sunlink.py
src/engine/SCons/Tool/textfile.py
src/engine/SCons/Tool/386asm.py
src/engine/SCons/UtilTests.py
src/engine/SCons/Variables/__init__.py
src/script/scons-configure-cache.py
src/script/sconsign.py
src/script/scons-time.py
src/setup.py
src/test_files.py
src/test_interrupts.py
src/test_pychecker.py
src/test_setup.py
src/test_strings.py
test/Actions/pre-post-fixture/work4/build.py
test/AS/fixture/myas_args.py
test/AS/fixture/myas.py
test/AS/ml.py
test/AS/nasm.py
test/CC/CCVERSION-fixture/versioned.py
test/Configure/implicit-cache.py
test/CPPDEFINES/scan.py
test/D/AllAtOnce/sconstest-dmd.py
test/D/AllAtOnce/sconstest-gdc.py
test/D/AllAtOnce/sconstest-ldc.py
test/D/CoreScanner/sconstest-dmd.py
test/D/CoreScanner/sconstest-gdc.py
test/D/CoreScanner/sconstest-ldc.py
test/D/DMD.py
test/D/DMD2_Alt.py
test/D/DMD2.py
test/Deprecated/SourceSignatures/no-csigs.py
test/D/GDC_Alt.py
test/D/GDC.py
test/D/HelloWorld/CompileAndLinkOneStep/sconstest-dmd.py
test/D/HelloWorld/CompileAndLinkOneStep/sconstest-gdc.py
test/D/HelloWorld/CompileAndLinkOneStep/sconstest-ldc.py
test/D/HelloWorld/CompileThenLinkTwoSteps/sconstest-dmd.py
test/D/HelloWorld/CompileThenLinkTwoSteps/sconstest-gdc.py
test/D/HelloWorld/CompileThenLinkTwoSteps/sconstest-ldc.py
test/D/HSTeoh/sconstest-arLibIssue_dmd.py
test/D/HSTeoh/sconstest-arLibIssue_gdc.py
test/D/HSTeoh/sconstest-arLibIssue_ldc.py
test/D/HSTeoh/sconstest-libCompileOptions_dmd.py
test/D/HSTeoh/sconstest-libCompileOptions_gdc.py
test/D/HSTeoh/sconstest-libCompileOptions_ldc.py
test/D/HSTeoh/sconstest-linkingProblem_dmd.py
test/D/HSTeoh/sconstest-linkingProblem_gdc.py
test/D/HSTeoh/sconstest-linkingProblem_ldc.py
test/D/HSTeoh/sconstest-singleStringCannotBeMultipleOptions_dmd.py
test/D/HSTeoh/sconstest-singleStringCannotBeMultipleOptions_gdc.py
test/D/HSTeoh/sconstest-singleStringCannotBeMultipleOptions_ldc.py
test/D/Issues/2939_Ariovistus/sconstest-correctLinkOptions_dmd.py
test/D/Issues/2939_Ariovistus/sconstest-correctLinkOptions_gdc.py
test/D/Issues/2939_Ariovistus/sconstest-correctLinkOptions_ldc.py
test/D/Issues/2940_Ariovistus/sconstest-correctLinkOptions_dmd.py
test/D/Issues/2940_Ariovistus/sconstest-correctLinkOptions_gdc.py
test/D/Issues/2940_Ariovistus/sconstest-correctLinkOptions_ldc.py
test/D/LDC_Alt.py
test/D/LDC.py
test/D/MixedDAndC/sconstest-dmd.py
test/D/MixedDAndC/sconstest-gdc.py
test/D/MixedDAndC/sconstest-ldc.py
test/Docbook/basedir/htmlhelp/htmlhelp_cmd.py
test/Docbook/basedir/htmlhelp/htmlhelp.py
test/Docbook/basedir/htmlchunked/htmlchunked_cmd.py
test/Docbook/basedir/htmlchunked/htmlchunked.py
test/Docbook/basedir/slideshtml/slideshtml_cmd.py
test/Docbook/basedir/slideshtml/slideshtml.py
test/Docbook/basic/epub/epub_cmd.py
test/Docbook/basic/htmlhelp/htmlhelp_cmd.py
test/Docbook/basic/html/html_cmd.py
test/Docbook/basic/htmlchunked/htmlchunked_cmd.py
test/Docbook/basic/slideshtml/slideshtml_cmd.py
test/Docbook/basic/slideshtml/slideshtml.py
test/Docbook/basic/xinclude/xinclude.py
test/Docbook/dependencies/xinclude/xinclude.py
test/Docbook/rootname/htmlhelp/htmlhelp.py
test/Docbook/rootname/htmlchunked/htmlchunked.py
test/Docbook/rootname/slideshtml/slideshtml.py
test/D/Scanner.py
test/D/SharedObjects/sconstest-dmd.py
test/D/SharedObjects/sconstest-gdc.py
test/D/SharedObjects/sconstest-ldc.py
test/DVIPDF/makeindex.py
test/DVIPS/DVIPS.py
test/Errors/preparation.py
test/fixture/mycompile.py
test/fixture/mylink.py
test/fixture/myrewrite.py
test/Fortran/fixture/myfortran_flags.py
test/Fortran/fixture/myfortran.py
test/Fortran/FORTRANPATH.py
test/Fortran/F77PATH.py
test/Fortran/F90PATH.py
test/IDL/midl.py
test/Install/non-ascii-name.py
test/Intel/icpc-link.py
test/Interactive/implicit-VariantDir.py
test/Interactive/variant_dir.py
test/Java/DerivedSourceTest.py
test/Java/JARFLAGS.py
test/Java/JARCHDIR.py
test/Java/JAR.py
test/Java/JAVABOOTCLASSPATH.py
test/Java/JAVACFLAGS.py
test/Java/JAVACLASSPATH.py
test/Java/JAVAH.py
test/Java/JAVASOURCEPATH.py
test/Java/Java-1.4.py
test/Java/Java-1.5.py
test/Java/Java-1.6.py
test/Java/multi-step.py
test/Java/nested-classes.py
test/Java/no-JARCHDIR.py
test/Java/RMIC.py
test/Java/source-files.py
test/Java/swig-dependencies.py
test/LEX/live.py
test/long-lines/signature.py
test/MinGW/MinGWSharedLibrary.py
test/MinGW/WINDOWS_INSERT_DEF.py
test/MSVC/batch-longlines.py
test/MSVC/embed-manifest.py
test/MSVC/hierarchical.py
test/MSVC/msvc.py
test/MSVC/MSVC_UWP_APP.py
test/MSVC/multiple-pdb.py
test/MSVC/pdb-manifest.py
test/MSVC/pdb-VariantDir-path.py
test/MSVC/pch-basics.py
test/MSVC/PCH-source.py
test/MSVC/pch-spaces-subdir.py
test/MSVC/PCHSTOP-errors.py
test/MSVC/query_vcbat.py
test/MSVC/TARGET_ARCH.py
test/MSVS/common-prefix.py
test/MSVS/CPPPATH-Dirs.py
test/MSVS/runfile.py
test/MSVS/vs-10.0-exec.py
test/MSVS/vs-10.0Exp-exec.py
test/MSVS/vs-10.0-scc-files.py
test/MSVS/vs-10.0-scc-legacy-files.py
test/MSVS/vs-11.0-exec.py
test/MSVS/vs-11.0Exp-exec.py
test/MSVS/vs-11.0-scc-files.py
test/MSVS/vs-11.0-scc-legacy-files.py
test/MSVS/vs-14.0-exec.py
test/MSVS/vs-14.0Exp-exec.py
test/MSVS/vs-14.0-scc-files.py
test/MSVS/vs-14.0-scc-legacy-files.py
test/MSVS/vs-6.0-exec.py
test/MSVS/vs-7.0-exec.py
test/MSVS/vs-7.0-scc-files.py
test/MSVS/vs-7.0-scc-legacy-files.py
test/MSVS/vs-7.1-exec.py
test/MSVS/vs-7.1-scc-files.py
test/MSVS/vs-7.1-scc-legacy-files.py
test/MSVS/vs-8.0-exec.py
test/MSVS/vs-8.0Exp-exec.py
test/MSVS/vs-8.0-scc-files.py
test/MSVS/vs-8.0-scc-legacy-files.py
test/MSVS/vs-9.0-exec.py
test/MSVS/vs-9.0Exp-exec.py
test/MSVS/vs-9.0-scc-files.py
test/MSVS/vs-9.0-scc-legacy-files.py
test/option--tree.py
test/packaging/ipkg.py
test/packaging/msi/explicit-target.py
test/packaging/msi/file-placement.py
test/packaging/msi/package.py
test/packaging/multiple-packages-at-once.py
test/packaging/option--package-type.py
test/packaging/rpm/cleanup.py
test/packaging/rpm/internationalization.py
test/packaging/rpm/multipackage.py
test/packaging/rpm/package.py
test/packaging/rpm/tagging.py
test/packaging/zip.py
test/PharLap.py
test/print_statement.py
test/QT/copied-env.py
test/QT/CPPPATH-appended.py
test/QT/CPPPATH.py
test/QT/generated-ui.py
test/QT/installed.py
test/QT/manual.py
test/QT/moc-from-header.py
test/QT/QTFLAGS.py
test/QT/source-from-ui.py
test/QT/Tool.py
test/QT/up-to-date.py
test/Repository/JavaH.py
test/Repository/Java.py
test/Repository/RMIC.py
test/Rpcgen/live.py
test/SConsignFile/use-dbhash.py
test/SConsignFile/use-dbm.py
test/SConsignFile/use-dumbdbm.py
test/SConsignFile/use-gdbm.py
test/sconsign/script/bad.py
test/sconsign/script/Configure.py
test/sconsign/script/dblite.py
test/sconsign/script/no-SConsignFile.py
test/sconsign/script/SConsignFile.py
test/sconsign/script/Signatures.py
test/scons-time/run/aegis.py
test/scons-time/run/config/python.py
test/scons-time/run/option/python.py
test/SWIG/build-dir.py
test/SWIG/generated_swigfile.py
test/SWIG/implicit-dependencies.py
test/SWIG/live.py
test/SWIG/module-deduced-name.py
test/SWIG/module-parens.py
test/SWIG/module-quoted.py
test/SWIG/module-spaces.py
test/SWIG/noproxy.py
test/SWIG/recursive-includes-cpp.py
test/SWIG/remove-modules.py
test/SWIG/subdir.py
test/SWIG/SWIGOUTDIR.py
test/SWIG/SWIGOUTDIR-python.py
test/SWIG/SWIGPATH.py
test/SWIG/SWIG.py
test/TEX/auxiliaries.py
test/TEX/biber_biblatex.py
test/TEX/biber_biblatex2.py
test/TEX/biblatex_plain.py
test/TEX/biblatex.py
test/TEX/bibliography.py
test/TEX/bibtex-latex-rerun.py
test/TEX/clean.py
test/TEX/configure.py
test/TEX/dryrun.py
test/TEX/eps_graphics.py
test/TEX/eps_graphics2.py
test/TEX/generated_files.py
test/TEX/glossaries.py
test/TEX/glossary.py
test/TEX/input_docClass.py
test/TEX/lstinputlisting.py
test/TEX/makeindex.py
test/TEX/multibib.py
test/TEX/multi-line_include_options.py
test/TEX/multiple_include.py
test/TEX/multiple_include_subdir.py
test/TEX/multi-run.py
test/TEX/newglossary.py
test/TEX/nomencl.py
test/TEX/PDF_single_source.py
test/TEX/recursive_scanner_dependencies_import.py
test/TEX/recursive_scanner_dependencies_input.py
test/TEX/rename_result.py
test/TEX/subdir-as-include.py
test/TEX/subdir-input.py
test/TEX/subdir_variantdir_include.py
test/TEX/subdir_variantdir_include2.py
test/TEX/subdir_variantdir_input.py
test/TEX/synctex.py
test/TEX/TEX.py
test/TEX/usepackage.py
test/TEX/variant_dir_bibunit.py
test/TEX/variant_dir_dup0.py
test/TEX/variant_dir_newglossary.py
test/TEX/variant_dir.py
test/TEX/variant_dir_style_dup0.py
test/timestamp-fallback.py
test/toolpath/relative_import/image/tools/TestTool1/__init__.py
test/toolpath/relative_import/image/tools/TestTool1/TestTool1_2/__init__.py
test/Win32/bad-drive.py
test/Win32/default-drive.py
test/Win32/file-is-type-not-func.py
test/Win32/mingw.py
test/Win32/scons-bat-error.py
test/Win32/win32pathmadness.py
test/YACC/YACC-fixture/myyacc.py
test/YACC/YACCFLAGS-fixture/myyacc.py

400
no_deprecated_asserts.patch Normal file
View File

@ -0,0 +1,400 @@
From 9864e8bf0a69f6aa35bb6af794da9988b1bbc50b Mon Sep 17 00:00:00 2001
From: Mats Wichmann <mats@linux.com>
Date: Tue, 25 Sep 2018 17:48:03 -0600
Subject: [PATCH] Stop using deprecated unittest asserts
failUnless and failIf have been deprecated since 2.7 and 3.1,
the docs call them aliases that exist for historical reasons.
In Python 3.7, the default DeprecationWarnings make things
very noisy, so flip these to assertTrue and assertFalse.
Signed-off-by: Mats Wichmann <mats@linux.com>
---
src/CHANGES.txt | 1 +
src/engine/SCons/JobTests.py | 70 ++++++++++++------------
src/engine/SCons/Scanner/CTests.py | 2 +-
src/engine/SCons/Scanner/DTests.py | 2 +-
src/engine/SCons/Scanner/FortranTests.py | 2 +-
src/engine/SCons/Scanner/IDLTests.py | 2 +-
src/engine/SCons/Scanner/LaTeXTests.py | 2 +-
src/engine/SCons/Scanner/RCTests.py | 2 +-
src/engine/SCons/Scanner/ScannerTests.py | 52 +++++++++---------
9 files changed, 68 insertions(+), 67 deletions(-)
--- a/src/engine/SCons/JobTests.py
+++ b/src/engine/SCons/JobTests.py
@@ -75,7 +75,7 @@ class Task(object):
return True
def execute(self):
- self.taskmaster.test_case.failUnless(self.was_prepared,
+ self.taskmaster.test_case.assertTrue(self.was_prepared,
"the task wasn't prepared")
self.taskmaster.guard.acquire()
@@ -93,17 +93,17 @@ class Task(object):
def executed(self):
self.taskmaster.num_executed = self.taskmaster.num_executed + 1
- self.taskmaster.test_case.failUnless(self.was_prepared,
+ self.taskmaster.test_case.assertTrue(self.was_prepared,
"the task wasn't prepared")
- self.taskmaster.test_case.failUnless(self.was_executed,
+ self.taskmaster.test_case.assertTrue(self.was_executed,
"the task wasn't really executed")
- self.taskmaster.test_case.failUnless(isinstance(self, Task),
+ self.taskmaster.test_case.assertTrue(isinstance(self, Task),
"the task wasn't really a Task instance")
def failed(self):
self.taskmaster.num_failed = self.taskmaster.num_failed + 1
self.taskmaster.stop = 1
- self.taskmaster.test_case.failUnless(self.was_prepared,
+ self.taskmaster.test_case.assertTrue(self.was_prepared,
"the task wasn't prepared")
def postprocess(self):
@@ -135,17 +135,17 @@ class ExceptionTask(object):
def executed(self):
self.taskmaster.num_executed = self.taskmaster.num_executed + 1
- self.taskmaster.test_case.failUnless(self.was_prepared,
+ self.taskmaster.test_case.assertTrue(self.was_prepared,
"the task wasn't prepared")
- self.taskmaster.test_case.failUnless(self.was_executed,
+ self.taskmaster.test_case.assertTrue(self.was_executed,
"the task wasn't really executed")
- self.taskmaster.test_case.failUnless(self.__class__ is Task,
+ self.taskmaster.test_case.assertTrue(self.__class__ is Task,
"the task wasn't really a Task instance")
def failed(self):
self.taskmaster.num_failed = self.taskmaster.num_failed + 1
self.taskmaster.stop = 1
- self.taskmaster.test_case.failUnless(self.was_prepared,
+ self.taskmaster.test_case.assertTrue(self.was_prepared,
"the task wasn't prepared")
def postprocess(self):
@@ -228,15 +228,15 @@ class ParallelTestCase(unittest.TestCase
jobs = SCons.Job.Jobs(num_jobs, taskmaster)
jobs.run()
- self.failUnless(not taskmaster.tasks_were_serial(),
+ self.assertTrue(not taskmaster.tasks_were_serial(),
"the tasks were not executed in parallel")
- self.failUnless(taskmaster.all_tasks_are_executed(),
+ self.assertTrue(taskmaster.all_tasks_are_executed(),
"all the tests were not executed")
- self.failUnless(taskmaster.all_tasks_are_iterated(),
+ self.assertTrue(taskmaster.all_tasks_are_iterated(),
"all the tests were not iterated over")
- self.failUnless(taskmaster.all_tasks_are_postprocessed(),
+ self.assertTrue(taskmaster.all_tasks_are_postprocessed(),
"all the tests were not postprocessed")
- self.failIf(taskmaster.num_failed,
+ self.assertFalse(taskmaster.num_failed,
"some task(s) failed to execute")
# Verify that parallel jobs will pull all of the completed tasks
@@ -291,15 +291,15 @@ class SerialTestCase(unittest.TestCase):
jobs = SCons.Job.Jobs(1, taskmaster)
jobs.run()
- self.failUnless(taskmaster.tasks_were_serial(),
+ self.assertTrue(taskmaster.tasks_were_serial(),
"the tasks were not executed in series")
- self.failUnless(taskmaster.all_tasks_are_executed(),
+ self.assertTrue(taskmaster.all_tasks_are_executed(),
"all the tests were not executed")
- self.failUnless(taskmaster.all_tasks_are_iterated(),
+ self.assertTrue(taskmaster.all_tasks_are_iterated(),
"all the tests were not iterated over")
- self.failUnless(taskmaster.all_tasks_are_postprocessed(),
+ self.assertTrue(taskmaster.all_tasks_are_postprocessed(),
"all the tests were not postprocessed")
- self.failIf(taskmaster.num_failed,
+ self.assertFalse(taskmaster.num_failed,
"some task(s) failed to execute")
class NoParallelTestCase(unittest.TestCase):
@@ -312,18 +312,18 @@ class NoParallelTestCase(unittest.TestCa
try:
taskmaster = Taskmaster(num_tasks, self, RandomTask)
jobs = SCons.Job.Jobs(2, taskmaster)
- self.failUnless(jobs.num_jobs == 1,
+ self.assertTrue(jobs.num_jobs == 1,
"unexpected number of jobs %d" % jobs.num_jobs)
jobs.run()
- self.failUnless(taskmaster.tasks_were_serial(),
+ self.assertTrue(taskmaster.tasks_were_serial(),
"the tasks were not executed in series")
- self.failUnless(taskmaster.all_tasks_are_executed(),
+ self.assertTrue(taskmaster.all_tasks_are_executed(),
"all the tests were not executed")
- self.failUnless(taskmaster.all_tasks_are_iterated(),
+ self.assertTrue(taskmaster.all_tasks_are_iterated(),
"all the tests were not iterated over")
- self.failUnless(taskmaster.all_tasks_are_postprocessed(),
+ self.assertTrue(taskmaster.all_tasks_are_postprocessed(),
"all the tests were not postprocessed")
- self.failIf(taskmaster.num_failed,
+ self.assertFalse(taskmaster.num_failed,
"some task(s) failed to execute")
finally:
SCons.Job.Parallel = save_Parallel
@@ -337,13 +337,13 @@ class SerialExceptionTestCase(unittest.T
jobs = SCons.Job.Jobs(1, taskmaster)
jobs.run()
- self.failIf(taskmaster.num_executed,
+ self.assertFalse(taskmaster.num_executed,
"a task was executed")
- self.failUnless(taskmaster.num_iterated == 1,
+ self.assertTrue(taskmaster.num_iterated == 1,
"exactly one task should have been iterated")
- self.failUnless(taskmaster.num_failed == 1,
+ self.assertTrue(taskmaster.num_failed == 1,
"exactly one task should have failed")
- self.failUnless(taskmaster.num_postprocessed == 1,
+ self.assertTrue(taskmaster.num_postprocessed == 1,
"exactly one task should have been postprocessed")
class ParallelExceptionTestCase(unittest.TestCase):
@@ -354,13 +354,13 @@ class ParallelExceptionTestCase(unittest
jobs = SCons.Job.Jobs(num_jobs, taskmaster)
jobs.run()
- self.failIf(taskmaster.num_executed,
+ self.assertFalse(taskmaster.num_executed,
"a task was executed")
- self.failUnless(taskmaster.num_iterated >= 1,
+ self.assertTrue(taskmaster.num_iterated >= 1,
"one or more task should have been iterated")
- self.failUnless(taskmaster.num_failed >= 1,
+ self.assertTrue(taskmaster.num_failed >= 1,
"one or more tasks should have failed")
- self.failUnless(taskmaster.num_postprocessed >= 1,
+ self.assertTrue(taskmaster.num_postprocessed >= 1,
"one or more tasks should have been postprocessed")
#---------------------------------------------------------------------
@@ -491,10 +491,10 @@ class _SConsTaskTest(unittest.TestCase):
for N in testnodes:
state = N.get_state()
- self.failUnless(state in [SCons.Node.no_state, N.expect_to_be],
+ self.assertTrue(state in [SCons.Node.no_state, N.expect_to_be],
"Node %s got unexpected result: %s" % (N, state))
- self.failUnless([N for N in testnodes if N.get_state()],
+ self.assertTrue([N for N in testnodes if N.get_state()],
"no nodes ran at all.")
--- a/src/engine/SCons/Scanner/CTests.py
+++ b/src/engine/SCons/Scanner/CTests.py
@@ -218,7 +218,7 @@ def deps_match(self, deps, headers):
global my_normpath
scanned = list(map(my_normpath, list(map(str, deps))))
expect = list(map(my_normpath, headers))
- self.failUnless(scanned == expect, "expect %s != scanned %s" % (expect, scanned))
+ self.assertTrue(scanned == expect, "expect %s != scanned %s" % (expect, scanned))
# define some tests:
--- a/src/engine/SCons/Scanner/DTests.py
+++ b/src/engine/SCons/Scanner/DTests.py
@@ -80,7 +80,7 @@ def deps_match(self, deps, headers):
global my_normpath
scanned = list(map(my_normpath, list(map(str, deps))))
expect = list(map(my_normpath, headers))
- self.failUnless(scanned == expect, "expect %s != scanned %s" % (expect, scanned))
+ self.assertTrue(scanned == expect, "expect %s != scanned %s" % (expect, scanned))
"""
Examples from https://dlang.org/spec/module.html
--- a/src/engine/SCons/Scanner/FortranTests.py
+++ b/src/engine/SCons/Scanner/FortranTests.py
@@ -258,7 +258,7 @@ class DummyEnvironment(object):
def deps_match(self, deps, headers):
scanned = list(map(os.path.normpath, list(map(str, deps))))
expect = list(map(os.path.normpath, headers))
- self.failUnless(scanned == expect, "expect %s != scanned %s" % (expect, scanned))
+ self.assertTrue(scanned == expect, "expect %s != scanned %s" % (expect, scanned))
# define some tests:
--- a/src/engine/SCons/Scanner/IDLTests.py
+++ b/src/engine/SCons/Scanner/IDLTests.py
@@ -243,7 +243,7 @@ if os.path.normcase('foo') == os.path.no
def deps_match(self, deps, headers):
scanned = list(map(my_normpath, list(map(str, deps))))
expect = list(map(my_normpath, headers))
- self.failUnless(scanned == expect, "expect %s != scanned %s" % (expect, scanned))
+ self.assertTrue(scanned == expect, "expect %s != scanned %s" % (expect, scanned))
# define some tests:
--- a/src/engine/SCons/Scanner/LaTeXTests.py
+++ b/src/engine/SCons/Scanner/LaTeXTests.py
@@ -123,7 +123,7 @@ def deps_match(self, deps, headers):
global my_normpath
scanned = list(map(my_normpath, list(map(str, deps))))
expect = list(map(my_normpath, headers))
- self.failUnless(scanned == expect, "expect %s != scanned %s" % (expect, scanned))
+ self.assertTrue(scanned == expect, "expect %s != scanned %s" % (expect, scanned))
class LaTeXScannerTestCase1(unittest.TestCase):
--- a/src/engine/SCons/Scanner/RCTests.py
+++ b/src/engine/SCons/Scanner/RCTests.py
@@ -117,7 +117,7 @@ if os.path.normcase('foo') == os.path.no
def deps_match(self, deps, headers):
scanned = sorted(map(my_normpath, list(map(str, deps))))
expect = sorted(map(my_normpath, headers))
- self.failUnless(scanned == expect, "expect %s != scanned %s" % (expect, scanned))
+ self.assertTrue(scanned == expect, "expect %s != scanned %s" % (expect, scanned))
# define some tests:
--- a/src/engine/SCons/Scanner/ScannerTests.py
+++ b/src/engine/SCons/Scanner/ScannerTests.py
@@ -132,16 +132,16 @@ class BaseTestCase(unittest.TestCase):
scanned = scanner(filename, env, path)
scanned_strs = [str(x) for x in scanned]
- self.failUnless(self.filename == filename, "the filename was passed incorrectly")
- self.failUnless(self.env == env, "the environment was passed incorrectly")
- self.failUnless(scanned_strs == deps, "the dependencies were returned incorrectly")
+ self.assertTrue(self.filename == filename, "the filename was passed incorrectly")
+ self.assertTrue(self.env == env, "the environment was passed incorrectly")
+ self.assertTrue(scanned_strs == deps, "the dependencies were returned incorrectly")
for d in scanned:
- self.failUnless(not isinstance(d, str), "got a string in the dependencies")
+ self.assertTrue(not isinstance(d, str), "got a string in the dependencies")
if len(args) > 0:
- self.failUnless(self.arg == args[0], "the argument was passed incorrectly")
+ self.assertTrue(self.arg == args[0], "the argument was passed incorrectly")
else:
- self.failIf(hasattr(self, "arg"), "an argument was given when it shouldn't have been")
+ self.assertFalse(hasattr(self, "arg"), "an argument was given when it shouldn't have been")
def test___call__dict(self):
"""Test calling Scanner.Base objects with a dictionary"""
@@ -245,7 +245,7 @@ class BaseTestCase(unittest.TestCase):
dict[s] = 777
i = hash(id(s))
h = hash(list(dict.keys())[0])
- self.failUnless(h == i,
+ self.assertTrue(h == i,
"hash Scanner base class expected %s, got %s" % (i, h))
def test_scan_check(self):
@@ -260,7 +260,7 @@ class BaseTestCase(unittest.TestCase):
self.checked = {}
path = s.path(env)
scanned = s(DummyNode('x'), env, path)
- self.failUnless(self.checked['x'] == 1,
+ self.assertTrue(self.checked['x'] == 1,
"did not call check function")
def test_recursive(self):
@@ -269,42 +269,42 @@ class BaseTestCase(unittest.TestCase):
s = SCons.Scanner.Base(function = self.func)
n = s.recurse_nodes(nodes)
- self.failUnless(n == [],
+ self.assertTrue(n == [],
"default behavior returned nodes: %s" % n)
s = SCons.Scanner.Base(function = self.func, recursive = None)
n = s.recurse_nodes(nodes)
- self.failUnless(n == [],
+ self.assertTrue(n == [],
"recursive = None returned nodes: %s" % n)
s = SCons.Scanner.Base(function = self.func, recursive = 1)
n = s.recurse_nodes(nodes)
- self.failUnless(n == n,
+ self.assertTrue(n == n,
"recursive = 1 didn't return all nodes: %s" % n)
def odd_only(nodes):
return [n for n in nodes if n % 2]
s = SCons.Scanner.Base(function = self.func, recursive = odd_only)
n = s.recurse_nodes(nodes)
- self.failUnless(n == [1, 3],
+ self.assertTrue(n == [1, 3],
"recursive = 1 didn't return all nodes: %s" % n)
def test_get_skeys(self):
"""Test the Scanner.Base get_skeys() method"""
s = SCons.Scanner.Base(function = self.func)
sk = s.get_skeys()
- self.failUnless(sk == [],
+ self.assertTrue(sk == [],
"did not initialize to expected []")
s = SCons.Scanner.Base(function = self.func, skeys = ['.1', '.2'])
sk = s.get_skeys()
- self.failUnless(sk == ['.1', '.2'],
+ self.assertTrue(sk == ['.1', '.2'],
"sk was %s, not ['.1', '.2']")
s = SCons.Scanner.Base(function = self.func, skeys = '$LIST')
env = DummyEnvironment(LIST = ['.3', '.4'])
sk = s.get_skeys(env)
- self.failUnless(sk == ['.3', '.4'],
+ self.assertTrue(sk == ['.3', '.4'],
"sk was %s, not ['.3', '.4']")
def test_select(self):
@@ -432,19 +432,19 @@ class CurrentTestCase(unittest.TestCase)
path = s.path(env)
hnb = HasNoBuilder()
s(hnb, env, path)
- self.failUnless(hnb.called_has_builder, "did not call has_builder()")
- self.failUnless(not hnb.called_is_up_to_date, "did call is_up_to_date()")
- self.failUnless(hnb.func_called, "did not call func()")
+ self.assertTrue(hnb.called_has_builder, "did not call has_builder()")
+ self.assertTrue(not hnb.called_is_up_to_date, "did call is_up_to_date()")
+ self.assertTrue(hnb.func_called, "did not call func()")
inc = IsNotCurrent()
s(inc, env, path)
- self.failUnless(inc.called_has_builder, "did not call has_builder()")
- self.failUnless(inc.called_is_up_to_date, "did not call is_up_to_date()")
- self.failUnless(not inc.func_called, "did call func()")
+ self.assertTrue(inc.called_has_builder, "did not call has_builder()")
+ self.assertTrue(inc.called_is_up_to_date, "did not call is_up_to_date()")
+ self.assertTrue(not inc.func_called, "did call func()")
ic = IsCurrent()
s(ic, env, path)
- self.failUnless(ic.called_has_builder, "did not call has_builder()")
- self.failUnless(ic.called_is_up_to_date, "did not call is_up_to_date()")
- self.failUnless(ic.func_called, "did not call func()")
+ self.assertTrue(ic.called_has_builder, "did not call has_builder()")
+ self.assertTrue(ic.called_is_up_to_date, "did not call is_up_to_date()")
+ self.assertTrue(ic.func_called, "did not call func()")
class ClassicTestCase(unittest.TestCase):
@@ -566,7 +566,7 @@ class ClassicTestCase(unittest.TestCase)
s = SCons.Scanner.Classic("Test", [], None, "", function=self.func, recursive=1)
n = s.recurse_nodes(nodes)
- self.failUnless(n == n,
+ self.assertTrue(n == n,
"recursive = 1 didn't return all nodes: %s" % n)
def odd_only(nodes):
@@ -574,7 +574,7 @@ class ClassicTestCase(unittest.TestCase)
s = SCons.Scanner.Classic("Test", [], None, "", function=self.func, recursive=odd_only)
n = s.recurse_nodes(nodes)
- self.failUnless(n == [1, 3],
+ self.assertTrue(n == [1, 3],
"recursive = 1 didn't return all nodes: %s" % n)

31
no_time-clock.patch Normal file
View File

@ -0,0 +1,31 @@
--- a/runtest.py
+++ b/runtest.py
@@ -92,8 +92,10 @@ try:
import threading
try: # python3
from queue import Queue
+ PY3=True
except ImportError as e: # python2
from Queue import Queue
+ PY3=False
threading_ok = True
except ImportError:
print("Can't import threading or queue")
@@ -764,10 +766,13 @@ os.environ["python_executable"] = python
# but time.time() does a better job on Linux systems, so let that be
# the non-Windows default.
-if sys.platform == 'win32':
- time_func = time.clock
-else:
- time_func = time.time
+try:
+ time_func = time.perf_counter
+except AttributeError:
+ if sys.platform == 'win32':
+ time_func = time.clock
+ else:
+ time_func = time.time
if print_times:
print_time_func = lambda fmt, time: sys.stdout.write(fmt % time)

39
removed_splitunc.patch Normal file
View File

@ -0,0 +1,39 @@
--- a/src/engine/SCons/Node/FS.py
+++ b/src/engine/SCons/Node/FS.py
@@ -132,7 +132,10 @@ def initialize_do_splitdrive():
global do_splitdrive
global has_unc
drive, path = os.path.splitdrive('X:/foo')
- has_unc = hasattr(os.path, 'splitunc')
+ # splitunc is removed from python 3.7 and newer
+ # so we can also just test if splitdrive works with UNC
+ has_unc = (hasattr(os.path, 'splitunc')
+ or os.path.splitdrive(r'\\split\drive\test')[0] == r'\\split\drive')
do_splitdrive = not not drive or has_unc
--- a/src/engine/SCons/Node/FSTests.py
+++ b/src/engine/SCons/Node/FSTests.py
@@ -605,7 +605,7 @@ class VariantDirTestCase(unittest.TestCa
print("File `%s' alter_targets() `%s' != expected `%s'" % (f, tp, expect))
errors = errors + 1
- self.failIf(errors)
+ self.assertFalse(errors)
class BaseTestCase(_tempdirTestCase):
def test_stat(self):
@@ -1657,7 +1657,12 @@ class FSTestCase(_tempdirTestCase):
import ntpath
x = test.workpath(*dirs)
drive, path = ntpath.splitdrive(x)
- unc, path = ntpath.splitunc(path)
+ try:
+ unc, path = ntpath.splitunc(path)
+ except AttributeError:
+ # could be python 3.7 or newer, make sure splitdrive can do UNC
+ assert ntpath.splitdrive(r'\\split\drive\test')[0] == r'\\split\drive'
+ pass
path = strip_slash(path)
return '//' + path[1:]

View File

@ -1,318 +0,0 @@
From 01a444c023fbc109d0ad1a563c80e3a98c067cb8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Mat=C4=9Bj=20Cepl?= <mcepl@cepl.eu>
Date: Wed, 25 Jul 2018 12:25:03 +0200
Subject: [PATCH] Replace use of imp library with importlib.
imp library has been deprecated since 3.4 and in 3.7 it finally breaks
builds.
Presrving compatibility with python >= 2.7.
---
src/CHANGES.txt | 3 +
src/engine/SCons/Platform/__init__.py | 13 +--
src/engine/SCons/Script/Main.py | 95 ++++++++++++++-------
src/engine/SCons/Tool/__init__.py | 5 +-
src/engine/SCons/Tool/packaging/__init__.py | 29 +++++--
src/engine/SCons/Util.py | 2 +
src/engine/SCons/compat/__init__.py | 8 +-
7 files changed, 102 insertions(+), 53 deletions(-)
--- a/engine/SCons/Platform/__init__.py
+++ b/engine/SCons/Platform/__init__.py
@@ -47,14 +47,15 @@ __revision__ = "src/engine/SCons/Platfor
import SCons.compat
-import imp
import os
+import importlib
import sys
import tempfile
import SCons.Errors
import SCons.Subst
import SCons.Tool
+import SCons.Util
def platform_default():
@@ -100,13 +101,7 @@ def platform_module(name = platform_defa
eval(full_name)
else:
try:
- file, path, desc = imp.find_module(name,
- sys.modules['SCons.Platform'].__path__)
- try:
- mod = imp.load_module(full_name, file, path, desc)
- finally:
- if file:
- file.close()
+ mod = importlib.import_module(full_name)
except ImportError:
try:
import zipimport
@@ -114,7 +109,7 @@ def platform_module(name = platform_defa
mod = importer.load_module(full_name)
except ImportError:
raise SCons.Errors.UserError("No platform named '%s'" % name)
- setattr(SCons.Platform, name, mod)
+ setattr(SCons.Platform, name, mod)
return sys.modules[full_name]
def DefaultToolList(platform, env):
--- a/engine/SCons/Script/Main.py
+++ b/engine/SCons/Script/Main.py
@@ -711,54 +711,89 @@ def _load_site_scons_dir(topdir, site_di
sys.path = [os.path.abspath(site_dir)] + sys.path
site_init_file = os.path.join(site_dir, site_init_filename)
site_tools_dir = os.path.join(site_dir, site_tools_dirname)
- if os.path.exists(site_init_file):
- import imp, re
- try:
+
+ if SCons.Util.PY2 or SCons.Util.PY34:
+ if os.path.exists(site_init_file):
+ import imp, re
try:
- fp, pathname, description = imp.find_module(site_init_modname,
- [site_dir])
- # Load the file into SCons.Script namespace. This is
- # opaque and clever; m is the module object for the
- # SCons.Script module, and the exec ... in call executes a
- # file (or string containing code) in the context of the
- # module's dictionary, so anything that code defines ends
- # up adding to that module. This is really short, but all
- # the error checking makes it longer.
+ try:
+ fp, pathname, description = imp.find_module(site_init_modname,
+ [site_dir])
+ # Load the file into SCons.Script namespace. This is
+ # opaque and clever; m is the module object for the
+ # SCons.Script module, and the exec ... in call executes a
+ # file (or string containing code) in the context of the
+ # module's dictionary, so anything that code defines ends
+ # up adding to that module. This is really short, but all
+ # the error checking makes it longer.
+ try:
+ m = sys.modules['SCons.Script']
+ except Exception as e:
+ fmt = 'cannot import site_init.py: missing SCons.Script module {}'
+ raise SCons.Errors.InternalError(fmt.format(repr(e)))
+ try:
+ sfx = description[0]
+ modname = os.path.basename(pathname)[:-len(sfx)]
+ site_m = {"__file__": pathname, "__name__": modname, "__doc__": None}
+ re_special = re.compile("__[^_]+__")
+ for k in list(m.__dict__.keys()):
+ if not re_special.match(k):
+ site_m[k] = m.__dict__[k]
+
+ # This is the magic.
+ exec(compile(fp.read(), fp.name, 'exec'), site_m)
+ except KeyboardInterrupt:
+ raise
+ except Exception as e:
+ fmt = '*** Error loading site_init file %s:\n'
+ sys.stderr.write(fmt % repr(site_init_file))
+ raise
+ else:
+ for k in site_m:
+ if not re_special.match(k):
+ m.__dict__[k] = site_m[k]
+ except KeyboardInterrupt:
+ raise
+ except ImportError as e:
+ fmt = '*** cannot import site init file %s:\n'
+ sys.stderr.write(fmt % repr(site_init_file))
+ raise
+ finally:
+ if fp:
+ fp.close()
+ else: # Python >= 3.5
+ if os.path.exists(site_init_file):
+ import importlib.util, importlib.machinery
+ try:
+ loader_details = (
+ importlib.machinery.ExtensionFileLoader,
+ importlib.machinery.EXTENSION_SUFFIXES
+ )
+ finder = importlib.machinery.FileFinder(site_dir,
+ loader_details)
+ spec = finder.find_spec(site_init_modname)
try:
m = sys.modules['SCons.Script']
except Exception as e:
fmt = 'cannot import site_init.py: missing SCons.Script module %s'
raise SCons.Errors.InternalError(fmt % repr(e))
try:
- sfx = description[0]
- modname = os.path.basename(pathname)[:-len(sfx)]
- site_m = {"__file__": pathname, "__name__": modname, "__doc__": None}
- re_special = re.compile("__[^_]+__")
- for k in list(m.__dict__.keys()):
- if not re_special.match(k):
- site_m[k] = m.__dict__[k]
-
+ mod = importlib.util.module_from_spec(spec)
# This is the magic.
- exec(compile(fp.read(), fp.name, 'exec'), site_m)
+ exec(mod.__loader__.get_code(mod.__name__), m.__dict__)
except KeyboardInterrupt:
raise
except Exception as e:
- fmt = '*** Error loading site_init file %s:\n'
- sys.stderr.write(fmt % repr(site_init_file))
+ fmt = '*** Error loading site_init file {}:\n'
+ sys.stderr.write(fmt.format(repr(site_init_file)))
raise
- else:
- for k in site_m:
- if not re_special.match(k):
- m.__dict__[k] = site_m[k]
except KeyboardInterrupt:
raise
except ImportError as e:
fmt = '*** cannot import site init file %s:\n'
sys.stderr.write(fmt % repr(site_init_file))
raise
- finally:
- if fp:
- fp.close()
+
if os.path.exists(site_tools_dir):
# prepend to DefaultToolpath
SCons.Tool.DefaultToolpath.insert(0, os.path.abspath(site_tools_dir))
--- a/engine/SCons/Tool/__init__.py
+++ b/engine/SCons/Tool/__init__.py
@@ -54,6 +54,7 @@ import SCons.Scanner.D
import SCons.Scanner.LaTeX
import SCons.Scanner.Prog
import SCons.Scanner.SWIG
+import SCons.Util
import collections
DefaultToolpath=[]
@@ -136,7 +137,7 @@ class Tool(object):
sys.path = self.toolpath + sys.path
# sys.stderr.write("Tool:%s\nPATH:%s\n"%(self.name,sys.path))
- if sys.version_info[0] < 3 or (sys.version_info[0] == 3 and sys.version_info[1] in (0,1,2,3,4)):
+ if SCons.Util.PY2 or SCons.Util.PY34:
# Py 2 code
try:
try:
@@ -238,7 +239,7 @@ class Tool(object):
setattr(SCons.Tool, self.name, module)
found_module = module
-
+
if found_module is not None:
sys.path = oldpythonpath
return found_module
--- a/engine/SCons/Tool/packaging/__init__.py
+++ b/engine/SCons/Tool/packaging/__init__.py
@@ -30,10 +30,10 @@ __revision__ = "src/engine/SCons/Tool/pa
import SCons.Environment
from SCons.Variables import *
from SCons.Errors import *
-from SCons.Util import is_List, make_path_relative
+from SCons.Util import is_List, is_String, make_path_relative, PY2, PY34
from SCons.Warnings import warn, Warning
-import os, imp
+import os
import SCons.Defaults
__all__ = [ 'src_targz', 'src_tarbz2', 'src_zip', 'tarbz2', 'targz', 'zip', 'rpm', 'msi', 'ipk' ]
@@ -63,7 +63,7 @@ def Tag(env, target, source, *more_tags,
for x in more_tags:
kw_tags[x] = ''
- if not SCons.Util.is_List(target):
+ if not is_List(target):
target=[target]
else:
# hmm, sometimes the target list, is a list of a list
@@ -117,8 +117,21 @@ def Package(env, target=None, source=Non
# 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)
+ if PY2 or PY34:
+ import imp
+ file,path,desc=imp.find_module(type, __path__)
+ return imp.load_module(type, file, path, desc)
+ else:
+ import importlib.util, importlib.machinery
+ loader_details = (
+ importlib.machinery.ExtensionFileLoader,
+ importlib.machinery.EXTENSION_SUFFIXES
+ )
+ finder = importlib.machinery.FileFinder(__path__,
+ loader_details)
+ spec = finder.find_spec(type)
+ mod = importlib.util.module_from_spec(spec)
+ spec.loader.exec_module(mod)
except ImportError as e:
raise EnvironmentError("packager %s not available: %s"%(type,str(e)))
@@ -251,12 +264,12 @@ def putintopackageroot(target, source, e
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]
+ if is_String(pkgroot): pkgroot=env.Dir(pkgroot)
+ if not is_List(source): source=[source]
new_source = []
for file in source:
- if SCons.Util.is_String(file): file = env.File(file)
+ if is_String(file): file = env.File(file)
if file.is_under(pkgroot):
new_source.append(file)
--- a/engine/SCons/Util.py
+++ b/engine/SCons/Util.py
@@ -35,6 +35,8 @@ import codecs
import pprint
PY3 = sys.version_info[0] == 3
+PY2 = sys.version_info[0] == 2
+PY34 = sys.version_info[0] == 3 and sys.version_info[1] <= 4
try:
from UserDict import UserDict
--- a/engine/SCons/compat/__init__.py
+++ b/engine/SCons/compat/__init__.py
@@ -61,7 +61,7 @@ __revision__ = "src/engine/SCons/compat/
import os
import sys
-import imp # Use the "imp" module to protect imports from fixers.
+import importlib # Use the "importlib" module to protect imports from fixers.
PYPY = hasattr(sys, 'pypy_translation_info')
@@ -71,8 +71,8 @@ def import_as(module, name):
Imports the specified module (from our local directory) as the
specified name, returning the loaded module object.
"""
- dir = os.path.split(__file__)[0]
- return imp.load_module(name, *imp.find_module(module, [dir]))
+ sys.modules[name] = importlib.import_module(module)
+ return sys.modules[name]
def rename_module(new, old):
@@ -81,7 +81,7 @@ def rename_module(new, old):
Used for purely cosmetic name changes in Python 3.x.
"""
try:
- sys.modules[new] = imp.load_module(old, *imp.find_module(old))
+ sys.modules[new] = importlib.import_module(old)
return True
except ImportError:
return False

View File

@ -0,0 +1,713 @@
--- a/src/engine/SCons/ActionTests.py
+++ b/src/engine/SCons/ActionTests.py
@@ -47,7 +47,6 @@ import SCons.Environment
import SCons.Errors
import TestCmd
-import TestUnit
# Initial setup of the common environment for all tests,
# a temporary working directory containing a
--- a/src/engine/SCons/CacheDirTests.py
+++ b/src/engine/SCons/CacheDirTests.py
@@ -29,7 +29,6 @@ import sys
import unittest
from TestCmd import TestCmd
-import TestUnit
import SCons.CacheDir
@@ -287,16 +286,7 @@ class FileTestCase(BaseTestCase):
SCons.CacheDir.CacheRetrieveSilent = save_CacheRetrieveSilent
if __name__ == "__main__":
- suite = unittest.TestSuite()
- tclasses = [
- CacheDirTestCase,
- FileTestCase,
- ]
- for tclass in tclasses:
- names = unittest.getTestCaseNames(tclass, 'test_')
- suite.addTests(list(map(tclass, names)))
- TestUnit.run(suite)
-
+ unittest.main()
# Local Variables:
# tab-width:4
# indent-tabs-mode:nil
--- a/src/engine/SCons/DefaultsTests.py
+++ b/src/engine/SCons/DefaultsTests.py
@@ -32,7 +32,6 @@ import unittest
from collections import UserDict
import TestCmd
-import TestUnit
import SCons.Errors
@@ -77,13 +76,7 @@ class DefaultsTestCase(unittest.TestCase
if __name__ == "__main__":
- suite = unittest.TestSuite()
- tclasses = [ DefaultsTestCase,
- ]
- for tclass in tclasses:
- names = unittest.getTestCaseNames(tclass, 'test_')
- suite.addTests(list(map(tclass, names)))
- TestUnit.run(suite)
+ unittest.main()
# Local Variables:
# tab-width:4
--- a/src/engine/SCons/ErrorsTests.py
+++ b/src/engine/SCons/ErrorsTests.py
@@ -26,8 +26,6 @@ __revision__ = "__FILE__ __REVISION__ __
import sys
import unittest
-import TestUnit
-
import SCons.Errors
@@ -101,8 +99,7 @@ class ErrorsTestCase(unittest.TestCase):
assert e.node == "node"
if __name__ == "__main__":
- suite = unittest.makeSuite(ErrorsTestCase, 'test_')
- TestUnit.run(suite)
+ unittest.main()
# Local Variables:
# tab-width:4
--- a/src/engine/SCons/ExecutorTests.py
+++ b/src/engine/SCons/ExecutorTests.py
@@ -26,8 +26,6 @@ __revision__ = "__FILE__ __REVISION__ __
import sys
import unittest
-import TestUnit
-
import SCons.Executor
@@ -483,12 +481,7 @@ class ExecutorTestCase(unittest.TestCase
if __name__ == "__main__":
- suite = unittest.TestSuite()
- tclasses = [ ExecutorTestCase ]
- for tclass in tclasses:
- names = unittest.getTestCaseNames(tclass, 'test_')
- suite.addTests(list(map(tclass, names)))
- TestUnit.run(suite)
+ unittest.main()
# Local Variables:
# tab-width:4
--- a/src/engine/SCons/MemoizeTests.py
+++ b/src/engine/SCons/MemoizeTests.py
@@ -26,8 +26,6 @@ __revision__ = "__FILE__ __REVISION__ __
import sys
import unittest
-import TestUnit
-
import SCons.Memoize
# Enable memoization counting
@@ -165,15 +163,7 @@ class CountValueTestCase(unittest.TestCa
if __name__ == "__main__":
- suite = unittest.TestSuite()
- tclasses = [
- CountDictTestCase,
- CountValueTestCase,
- ]
- for tclass in tclasses:
- names = unittest.getTestCaseNames(tclass, 'test_')
- suite.addTests(list(map(tclass, names)))
- TestUnit.run(suite)
+ unittest.main()
# Local Variables:
# tab-width:4
--- a/src/engine/SCons/Node/AliasTests.py
+++ b/src/engine/SCons/Node/AliasTests.py
@@ -26,8 +26,6 @@ __revision__ = "__FILE__ __REVISION__ __
import sys
import unittest
-import TestUnit
-
import SCons.Errors
import SCons.Node.Alias
@@ -113,16 +111,7 @@ class AliasBuildInfoTestCase(unittest.Te
bi = SCons.Node.Alias.AliasBuildInfo()
if __name__ == "__main__":
- suite = unittest.TestSuite()
- tclasses = [
- AliasTestCase,
- AliasBuildInfoTestCase,
- AliasNodeInfoTestCase,
- ]
- for tclass in tclasses:
- names = unittest.getTestCaseNames(tclass, 'test_')
- suite.addTests(list(map(tclass, names)))
- TestUnit.run(suite)
+ unittest.main()
# Local Variables:
# tab-width:4
--- a/src/engine/SCons/Node/NodeTests.py
+++ b/src/engine/SCons/Node/NodeTests.py
@@ -30,8 +30,6 @@ import re
import sys
import unittest
-import TestUnit
-
import SCons.Errors
import SCons.Node
import SCons.Util
@@ -1349,15 +1347,7 @@ class NodeListTestCase(unittest.TestCase
if __name__ == "__main__":
- suite = unittest.TestSuite()
- tclasses = [ BuildInfoBaseTestCase,
- NodeInfoBaseTestCase,
- NodeTestCase,
- NodeListTestCase ]
- for tclass in tclasses:
- names = unittest.getTestCaseNames(tclass, 'test_')
- suite.addTests(list(map(tclass, names)))
- TestUnit.run(suite)
+ unittest.main()
# Local Variables:
# tab-width:4
--- a/src/engine/SCons/Node/PythonTests.py
+++ b/src/engine/SCons/Node/PythonTests.py
@@ -26,8 +26,6 @@ __revision__ = "__FILE__ __REVISION__ __
import sys
import unittest
-import TestUnit
-
import SCons.Errors
import SCons.Node.Python
@@ -113,16 +111,7 @@ class ValueBuildInfoTestCase(unittest.Te
bi = SCons.Node.Python.ValueBuildInfo()
if __name__ == "__main__":
- suite = unittest.TestSuite()
- tclasses = [
- ValueTestCase,
- ValueBuildInfoTestCase,
- ValueNodeInfoTestCase,
- ]
- for tclass in tclasses:
- names = unittest.getTestCaseNames(tclass, 'test_')
- suite.addTests(list(map(tclass, names)))
- TestUnit.run(suite)
+ unittest.main()
# Local Variables:
# tab-width:4
--- a/src/engine/SCons/Platform/PlatformTests.py
+++ b/src/engine/SCons/Platform/PlatformTests.py
@@ -28,8 +28,6 @@ import SCons.compat
import collections
import unittest
-import TestUnit
-
import SCons.Errors
import SCons.Platform
import SCons.Environment
@@ -204,17 +202,8 @@ class PlatformEscapeTestCase(unittest.Te
if __name__ == "__main__":
- suite = unittest.TestSuite()
-
- tclasses = [ PlatformTestCase,
- TempFileMungeTestCase,
- PlatformEscapeTestCase,
- ]
- for tclass in tclasses:
- names = unittest.getTestCaseNames(tclass, 'test_')
- suite.addTests(list(map(tclass, names)))
+ unittest.main()
- TestUnit.run(suite)
# Local Variables:
# tab-width:4
--- a/src/engine/SCons/SConfTests.py
+++ b/src/engine/SCons/SConfTests.py
@@ -33,8 +33,6 @@ from types import *
import unittest
import TestCmd
-import TestUnit
-
sys.stdout = io.StringIO()
--- a/src/engine/SCons/Scanner/DTests.py
+++ b/src/engine/SCons/Scanner/DTests.py
@@ -26,7 +26,6 @@ __revision__ = "__FILE__ __REVISION__ __
import unittest
import TestCmd
-import TestUnit
import SCons.Scanner.D
@@ -266,14 +265,7 @@ class DScannerTestCase(unittest.TestCase
self.helper('multiline.d', ['A.d'])
if __name__ == "__main__":
- suite = unittest.TestSuite()
- tclasses = [
- DScannerTestCase,
- ]
- for tclass in tclasses:
- names = unittest.getTestCaseNames(tclass, 'test_')
- suite.addTests(list(map(tclass, names)))
- TestUnit.run(suite)
+ unittest.main()
# Local Variables:
# tab-width:4
--- a/src/engine/SCons/Scanner/DirTests.py
+++ b/src/engine/SCons/Scanner/DirTests.py
@@ -28,7 +28,6 @@ import sys
import unittest
import TestCmd
-import TestUnit
import SCons.Node.FS
import SCons.Scanner.Dir
@@ -121,14 +120,8 @@ class DirEntryScannerTestCase(DirScanner
sss = list(map(str, deps))
assert sss == [], sss
-def suite():
- suite = unittest.TestSuite()
- suite.addTest(DirScannerTestCase())
- suite.addTest(DirEntryScannerTestCase())
- return suite
-
if __name__ == "__main__":
- TestUnit.run(suite())
+ unittest.main()
# Local Variables:
# tab-width:4
--- a/src/engine/SCons/Scanner/LaTeXTests.py
+++ b/src/engine/SCons/Scanner/LaTeXTests.py
@@ -31,7 +31,6 @@ import sys
import unittest
import TestCmd
-import TestUnit
import SCons.Node.FS
import SCons.Scanner.LaTeX
@@ -156,16 +155,8 @@ class LaTeXScannerTestCase3(unittest.Tes
files = ['inc5.xyz', 'subdir/inc4.eps']
deps_match(self, deps, files)
-
-def suite():
- suite = unittest.TestSuite()
- suite.addTest(LaTeXScannerTestCase1())
- suite.addTest(LaTeXScannerTestCase2())
- suite.addTest(LaTeXScannerTestCase3())
- return suite
-
if __name__ == "__main__":
- TestUnit.run(suite())
+ unittest.main()
# Local Variables:
# tab-width:4
--- a/src/engine/SCons/Scanner/ProgTests.py
+++ b/src/engine/SCons/Scanner/ProgTests.py
@@ -28,7 +28,6 @@ import sys
import unittest
import TestCmd
-import TestUnit
import SCons.Node.FS
import SCons.Scanner.Prog
@@ -274,7 +273,7 @@ def suite():
return suite
if __name__ == "__main__":
- TestUnit.run(suite())
+ unittest.main()
# Local Variables:
# tab-width:4
--- a/src/engine/SCons/Scanner/RCTests.py
+++ b/src/engine/SCons/Scanner/RCTests.py
@@ -29,7 +29,6 @@ import collections
import os
import TestCmd
-import TestUnit
import SCons.Scanner.RC
import SCons.Node.FS
@@ -167,7 +166,7 @@ def suite():
return suite
if __name__ == "__main__":
- TestUnit.run(suite())
+ unittest.main()
# Local Variables:
# tab-width:4
--- a/src/engine/SCons/Script/MainTests.py
+++ b/src/engine/SCons/Script/MainTests.py
@@ -25,8 +25,6 @@ __revision__ = "__FILE__ __REVISION__ __
import unittest
-import TestUnit
-
import SCons.Errors
import SCons.Script.Main
@@ -41,12 +39,7 @@ import SCons.Script.Main
# of private functionality.
if __name__ == "__main__":
- suite = unittest.TestSuite()
- tclasses = []
- for tclass in tclasses:
- names = unittest.getTestCaseNames(tclass, 'test_')
- suite.addTests(list(map(tclass, names)))
- TestUnit.run(suite)
+ unittest.main()
# Local Variables:
# tab-width:4
--- a/src/engine/SCons/SubstTests.py
+++ b/src/engine/SCons/SubstTests.py
@@ -32,8 +32,6 @@ import unittest
from collections import UserDict
-import TestUnit
-
import SCons.Errors
from SCons.Subst import *
@@ -1243,21 +1241,7 @@ class subst_dict_TestCase(unittest.TestC
assert SOURCES == ['s3', 'v-rstr-s4', 'v-s5'], SOURCES
if __name__ == "__main__":
- suite = unittest.TestSuite()
- tclasses = [
- CLVar_TestCase,
- LiteralTestCase,
- SpecialAttrWrapperTestCase,
- quote_spaces_TestCase,
- scons_subst_TestCase,
- scons_subst_list_TestCase,
- scons_subst_once_TestCase,
- subst_dict_TestCase,
- ]
- for tclass in tclasses:
- names = unittest.getTestCaseNames(tclass, 'test_')
- suite.addTests(list(map(tclass, names)))
- TestUnit.run(suite)
+ unittest.main()
# Local Variables:
# tab-width:4
--- a/src/engine/SCons/TaskmasterTests.py
+++ b/src/engine/SCons/TaskmasterTests.py
@@ -30,7 +30,6 @@ import copy
import sys
import unittest
-import TestUnit
import SCons.Taskmaster
import SCons.Errors
@@ -1239,8 +1238,7 @@ Taskmaster: No candidate anymore.
if __name__ == "__main__":
- suite = unittest.makeSuite(TaskmasterTestCase, 'test_')
- TestUnit.run(suite)
+ unittest.main()
# Local Variables:
# tab-width:4
--- a/src/engine/SCons/Tool/JavaCommonTests.py
+++ b/src/engine/SCons/Tool/JavaCommonTests.py
@@ -27,8 +27,6 @@ import os.path
import sys
import unittest
-import TestUnit
-
import SCons.Scanner.IDL
import SCons.Tool.JavaCommon
@@ -568,12 +566,7 @@ public class Foo
if __name__ == "__main__":
- suite = unittest.TestSuite()
- tclasses = [ parse_javaTestCase ]
- for tclass in tclasses:
- names = unittest.getTestCaseNames(tclass, 'test_')
- suite.addTests(list(map(tclass, names)))
- TestUnit.run(suite)
+ unittest.main()
# Local Variables:
# tab-width:4
--- a/src/engine/SCons/Tool/javacTests.py
+++ b/src/engine/SCons/Tool/javacTests.py
@@ -24,8 +24,6 @@
import os
import unittest
-import TestUnit
-
import SCons.Tool.javac
class DummyNode(object):
@@ -40,14 +38,14 @@ class pathoptTestCase(unittest.TestCase)
popt = SCons.Tool.javac.pathopt('-foopath', 'FOOPATH')
env = {'FOOPATH': path}
actual = popt(None, None, env, None)
- self.assertEquals(expect, actual)
+ self.assertEqual(expect, actual)
def assert_pathopt_default(self, expect, path, default):
popt = SCons.Tool.javac.pathopt('-foopath', 'FOOPATH', default='DPATH')
env = {'FOOPATH': path,
'DPATH': default}
actual = popt(None, None, env, None)
- self.assertEquals(expect, actual)
+ self.assertEqual(expect, actual)
def test_unset(self):
self.assert_pathopt([], None)
@@ -101,5 +99,4 @@ class pathoptTestCase(unittest.TestCase)
'')
if __name__ == "__main__":
- suite = unittest.makeSuite(pathoptTestCase, 'test_')
- TestUnit.run(suite)
+ unittest.main()
--- a/src/engine/SCons/Tool/wixTests.py
+++ b/src/engine/SCons/Tool/wixTests.py
@@ -33,7 +33,6 @@ from SCons.Tool.wix import *
from SCons.Environment import Environment
import TestCmd
-import TestUnit
# create fake candle and light, so the tool's exists() method will succeed
@@ -53,8 +52,7 @@ class WixTestCase(unittest.TestCase):
assert env.subst('$WIXSRCSUF') == '.wxs'
if __name__ == "__main__":
- suite = unittest.makeSuite(WixTestCase, 'test_')
- TestUnit.run(suite)
+ unittest.main()
# Local Variables:
# tab-width:4
--- a/src/engine/SCons/UtilTests.py
+++ b/src/engine/SCons/UtilTests.py
@@ -32,7 +32,6 @@ import unittest
from collections import UserDict, UserList, UserString
import TestCmd
-import TestUnit
import SCons.Errors
--- a/src/engine/SCons/Variables/BoolVariableTests.py
+++ b/src/engine/SCons/Variables/BoolVariableTests.py
@@ -26,8 +26,6 @@ __revision__ = "__FILE__ __REVISION__ __
import sys
import unittest
-import TestUnit
-
import SCons.Errors
import SCons.Variables
@@ -118,8 +116,7 @@ class BoolVariableTestCase(unittest.Test
if __name__ == "__main__":
- suite = unittest.makeSuite(BoolVariableTestCase, 'test_')
- TestUnit.run(suite)
+ unittest.main()
# Local Variables:
# tab-width:4
--- a/src/engine/SCons/Variables/EnumVariableTests.py
+++ b/src/engine/SCons/Variables/EnumVariableTests.py
@@ -26,8 +26,6 @@ __revision__ = "__FILE__ __REVISION__ __
import sys
import unittest
-import TestUnit
-
import SCons.Errors
import SCons.Variables
@@ -195,8 +193,7 @@ class EnumVariableTestCase(unittest.Test
if __name__ == "__main__":
- suite = unittest.makeSuite(EnumVariableTestCase, 'test_')
- TestUnit.run(suite)
+ unittest.main()
# Local Variables:
# tab-width:4
--- a/src/engine/SCons/Variables/ListVariableTests.py
+++ b/src/engine/SCons/Variables/ListVariableTests.py
@@ -27,8 +27,6 @@ import copy
import sys
import unittest
-import TestUnit
-
import SCons.Errors
import SCons.Variables
@@ -125,8 +123,7 @@ class ListVariableTestCase(unittest.Test
n = l.__class__(copy.copy(l))
if __name__ == "__main__":
- suite = unittest.makeSuite(ListVariableTestCase, 'test_')
- TestUnit.run(suite)
+ unittest.main()
# Local Variables:
# tab-width:4
--- a/src/engine/SCons/Variables/PackageVariableTests.py
+++ b/src/engine/SCons/Variables/PackageVariableTests.py
@@ -30,8 +30,6 @@ import SCons.Errors
import SCons.Variables
import TestCmd
-import TestUnit
-
class PackageVariableTestCase(unittest.TestCase):
def test_PackageVariable(self):
@@ -115,8 +113,7 @@ class PackageVariableTestCase(unittest.T
if __name__ == "__main__":
- suite = unittest.makeSuite(PackageVariableTestCase, 'test_')
- TestUnit.run(suite)
+ unittest.main()
# Local Variables:
# tab-width:4
--- a/src/engine/SCons/Variables/PathVariableTests.py
+++ b/src/engine/SCons/Variables/PathVariableTests.py
@@ -31,8 +31,6 @@ import SCons.Errors
import SCons.Variables
import TestCmd
-import TestUnit
-
class PathVariableTestCase(unittest.TestCase):
def test_PathVariable(self):
@@ -228,8 +226,7 @@ class PathVariableTestCase(unittest.Test
if __name__ == "__main__":
- suite = unittest.makeSuite(PathVariableTestCase, 'test_')
- TestUnit.run(suite)
+ unittest.main()
# Local Variables:
# tab-width:4
--- a/src/engine/SCons/Variables/VariablesTests.py
+++ b/src/engine/SCons/Variables/VariablesTests.py
@@ -27,7 +27,6 @@ import sys
import unittest
import TestSCons
-import TestUnit
import SCons.Variables
import SCons.Subst
@@ -60,7 +59,9 @@ def check(key, value, env):
def checkSave(file, expected):
gdict = {}
ldict = {}
- exec(open(file, 'r').read(), gdict, ldict)
+ with open(file, 'r') as f:
+ exec(f.read(), gdict, ldict)
+
assert expected == ldict, "%s\n...not equal to...\n%s" % (expected, ldict)
class VariablesTestCase(unittest.TestCase):
@@ -690,13 +691,7 @@ class UnknownVariablesTestCase(unittest.
if __name__ == "__main__":
- suite = unittest.TestSuite()
- tclasses = [ VariablesTestCase,
- UnknownVariablesTestCase ]
- for tclass in tclasses:
- names = unittest.getTestCaseNames(tclass, 'test_')
- suite.addTests(list(map(tclass, names)))
- TestUnit.run(suite)
+ unittest.main()
# Local Variables:
# tab-width:4
--- a/src/engine/SCons/WarningsTests.py
+++ b/src/engine/SCons/WarningsTests.py
@@ -26,8 +26,6 @@ __revision__ = "__FILE__ __REVISION__ __
import sys
import unittest
-import TestUnit
-
import SCons.Warnings
class TestOutput(object):
@@ -127,8 +125,7 @@ class WarningsTestCase(unittest.TestCase
assert to.out == "Foo", to.out
if __name__ == "__main__":
- suite = unittest.makeSuite(WarningsTestCase, 'test_')
- TestUnit.run(suite)
+ unittest.main()
# Local Variables:
# tab-width:4

View File

@ -2,8 +2,8 @@
setup.py | 4 ++-- setup.py | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-) 1 file changed, 2 insertions(+), 2 deletions(-)
--- a/setup.py --- a/src/setup.py
+++ b/setup.py +++ b/src/setup.py
@@ -376,7 +376,7 @@ class install_data(_install_data): @@ -376,7 +376,7 @@ class install_data(_install_data):
if is_win32: if is_win32:
dir = 'Doc' dir = 'Doc'

View File

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:24475e38d39c19683bc88054524df018fe6949d70fbd4c69e298d39a0269f173
size 634815

View File

@ -1,3 +1,31 @@
-------------------------------------------------------------------
Thu Oct 11 10:30:44 UTC 2018 - Matěj Cepl <mcepl@suse.com>
- Switch off more failing tests.
-------------------------------------------------------------------
Mon Oct 8 12:01:14 UTC 2018 - Matěj Cepl <mcepl@suse.com>
- Make package not to be noarch (bsc#1109755)
-------------------------------------------------------------------
Fri Oct 5 01:35:18 CEST 2018 - mcepl@suse.com
- Make package multibuild for separate testing
- Block failing tests (and block %check section completely on
non-Intel archs, as the tests are apparently not designed for
that).
- Fix patches from the upstream to improve compatbiilty:
fix-jN-for-python-37.patch
fix-rpm-tests-for-newer-rpmbuild.patch
no_deprecated_asserts.patch
no_time-clock.patch
removed_splitunc.patch
replace_TestSuite_main.patch
stop_custom_OrderedDict.patch
- Remove replace-imp-with-importlib.patch for now (to stabilize
the package first)
------------------------------------------------------------------- -------------------------------------------------------------------
Wed Jul 25 12:10:25 UTC 2018 - mcepl@suse.com Wed Jul 25 12:10:25 UTC 2018 - mcepl@suse.com

View File

@ -12,27 +12,75 @@
# license that conforms to the Open Source Definition (Version 1.9) # license that conforms to the Open Source Definition (Version 1.9)
# published by the Open Source Initiative. # published by the Open Source Initiative.
# Please submit bugfixes or comments via http://bugs.opensuse.org/ # Please submit bugfixes or comments via https://bugs.opensuse.org/
# #
Name: scons %define modname scons
%global flavor @BUILD_FLAVOR@%{nil}
%bcond_with test
# Tests on non-Intel archs have too many failing tests
# https://pairlist4.pair.net/pipermail/scons-users/2018-October/007311.html
%ifnarch aarch64 armv7l ppc64 ppc64le s390x
%if "%{flavor}" == "test"
%bcond_without test
%endif
%endif
%if %{with test}
Name: %{modname}-%{flavor}
%else
Name: %{modname}
%endif
Version: 3.0.1 Version: 3.0.1
Release: 0 Release: 0
Summary: Replacement for Make Summary: Replacement for Make
License: MIT License: MIT
Group: Development/Tools/Building Group: Development/Tools/Building
URL: http://www.scons.org/ URL: http://www.scons.org/
Source0: http://prdownloads.sourceforge.net/scons/%{name}-%{version}.tar.gz Source0: https://github.com/SCons/%{modname}/archive/%{version}.tar.gz
#http://www.scons.org/doc/%%{version}/HTML/scons-user.html #http://www.scons.org/doc/%%{version}/HTML/scons-user.html
Source1: scons-user.html-%{version}.tar.bz2 Source1: scons-user.html-%{version}.tar.bz2
# Sets _mandir to _datadir/man instead of _prefix/man # Adjust to exclude all failing tests
Patch0: %{name}-3.0.0-fix-install.patch Source2: grep-filter-list.txt
Patch1: replace-imp-with-importlib.patch # Upstream compatibilitt patches
BuildRequires: fdupes Patch0: no_deprecated_asserts.patch
BuildRequires: python3-devel >= 3.5 Patch1: removed_splitunc.patch
Patch2: fix-jN-for-python-37.patch
Patch3: replace_TestSuite_main.patch
Patch4: stop_custom_OrderedDict.patch
Patch5: no_time-clock.patch
# Specific fixes
Patch6: fix-rpm-tests-for-newer-rpmbuild.patch
# Patch7: replace-imp-with-importlib.patch
# Local modification
Patch8: scons-3.0.0-fix-install.patch
BuildRequires: grep
BuildRequires: python3-base >= 3.5
BuildRequires: python3-lxml
Requires: python3-base >= 3.5 Requires: python3-base >= 3.5
BuildArch: noarch %if %{with test}
# For tests
BuildRequires: clang
BuildRequires: docbook-xsl-pdf2index
BuildRequires: docbook5-xsl-stylesheets
BuildRequires: gcc-c++
BuildRequires: libxml2-devel
BuildRequires: libxslt-devel
BuildRequires: libxslt-tools
BuildRequires: xmlgraphics-fop
# texlive texlive-latex3 biber texmaker ghostscript
BuildRequires: autoconf
BuildRequires: automake
BuildRequires: bison
BuildRequires: git
BuildRequires: libtool
BuildRequires: pcre-devel
BuildRequires: subversion
BuildRequires: swig
%endif
%description %description
SCons is a make replacement that provides a range of enhanced features, SCons is a make replacement that provides a range of enhanced features,
@ -42,27 +90,49 @@ provides itself as well as the features. SCons allows you to use the
full power of Python to control compilation. full power of Python to control compilation.
%prep %prep
%setup -q -a1 %setup -q -n %{modname}-%{version}
%patch0 -p1 %autopatch -p1
%patch1 -p1
sed -i -e '/QT_LIBPATH = os.path.join.*QTDIR/s/lib/%{_lib}/' engine/SCons/Tool/qt.py sed -i -e '/QT_LIBPATH = os.path.join.*QTDIR/s/lib/%{_lib}/' \
src/engine/SCons/Tool/qt.py
sed -i 's|%{_bindir}/env python|%{_bindir}/python3|' src/script/*
sed -i 's|%{_bindir}/env python|%{_bindir}/python3|' script/* cp %{SOURCE2} grep-filter-list.txt
%build %build
export CFLAGS="%{optflags}" python3 bootstrap.py build/scons
%python3_build cd build/scons
%py3_build
%install %install
%python3_install %if !%{with test}
%fdupes %{buildroot}%{_bindir} cd build/scons
ls -lh build/lib
%py3_install \
--standard-lib \
--no-install-bat \
--no-version-script \
--install-scripts=%{_bindir} \
--record installed_files.txt
%endif
%check
%if %{with test}
TEMP_FILE=$(mktemp --tmpdir %{modname}-test.XXXXXX)
trap 'rm -f -- "$TEMP_FILE"' INT TERM HUP EXIT
find src/ test/ -name \*.py \
| grep -F -v -f grep-filter-list.txt >$TEMP_FILE
python3 runtest.py -f $TEMP_FILE
%endif
%files %files
%license LICENSE.txt %license LICENSE
%doc CHANGES.txt README.txt RELEASE.txt scons-user.html %doc src/CHANGES.txt README.rst src/RELEASE.txt
%if !%{with test}
%{_bindir}/* %{_bindir}/*
%{_libexecdir}/scons-%{version} %{python3_sitelib}/SCons
%{python3_sitelib}/%{modname}*.egg-info
%{_mandir}/man1/*%{ext_man} %{_mandir}/man1/*%{ext_man}
%endif
%changelog %changelog

View File

@ -0,0 +1,162 @@
From 2180ff6d0388162586fff59e066bc1e3e4bb9600 Mon Sep 17 00:00:00 2001
From: Mats Wichmann <mats@linux.com>
Date: Sun, 26 Aug 2018 22:54:00 -0600
Subject: [PATCH] Stop using custom OrderedDict
OrdredDict is in the standard library for all supported Python versions
(2.7 and 3.5+) and has improvements over the ActiveState recipe version
of OrderedDict we have been using. Switch to importing from collections
instead of getting it from SCons.Util (tests already did this).
At the same time, reorganize the Util.py imports - import Iterable
from collections.abc if possible (it is deprecated to import
it from collections, will stop working in 3.8); try getting the
User{Dict,List,String} from collections if possible - that is, try the
3.x way first.
Signed-off-by: Mats Wichmann <mats@linux.com>
---
src/engine/SCons/Action.py | 3 +-
src/engine/SCons/Tool/javac.py | 3 +-
src/engine/SCons/Util.py | 74 +++++-----------------------------
3 files changed, 13 insertions(+), 67 deletions(-)
--- a/src/engine/SCons/Action.py
+++ b/src/engine/SCons/Action.py
@@ -107,6 +107,7 @@ import sys
import subprocess
import itertools
import inspect
+from collections import OrderedDict
import SCons.Debug
from SCons.Debug import logInstanceCreation
@@ -1289,7 +1290,7 @@ class ListAction(ActionBase):
return result
def get_varlist(self, target, source, env, executor=None):
- result = SCons.Util.OrderedDict()
+ result = OrderedDict()
for act in self.list:
for var in act.get_varlist(target, source, env, executor):
result[var] = True
--- a/src/engine/SCons/Tool/javac.py
+++ b/src/engine/SCons/Tool/javac.py
@@ -34,6 +34,7 @@ __revision__ = "__FILE__ __REVISION__ __
import os
import os.path
+from collections import OrderedDict
import SCons.Action
import SCons.Builder
@@ -70,7 +71,7 @@ def emit_java_classes(target, source, en
if isinstance(entry, SCons.Node.FS.File):
slist.append(entry)
elif isinstance(entry, SCons.Node.FS.Dir):
- result = SCons.Util.OrderedDict()
+ result = OrderedDict()
dirnode = entry.rdir()
def find_java_files(arg, dirpath, filenames):
java_files = sorted([n for n in filenames
--- a/src/engine/SCons/Util.py
+++ b/src/engine/SCons/Util.py
@@ -37,21 +37,18 @@ import pprint
PY3 = sys.version_info[0] == 3
try:
+ from collections import UserDict, UserList, UserString
+except ImportError:
from UserDict import UserDict
-except ImportError as e:
- from collections import UserDict
-
-try:
from UserList import UserList
-except ImportError as e:
- from collections import UserList
-
-from collections import Iterable
+ from UserString import UserString
try:
- from UserString import UserString
-except ImportError as e:
- from collections import UserString
+ from collections.abc import Iterable
+except ImportError:
+ from collections import Iterable
+
+from collections import OrderedDict
# Don't "from types import ..." these because we need to get at the
# types module later to look for UnicodeType.
@@ -63,7 +60,7 @@ MethodType = types.MethodType
FunctionType = types.FunctionType
try:
- unicode
+ _ = type(unicode)
except NameError:
UnicodeType = str
else:
@@ -1034,59 +1031,6 @@ class CLVar(UserList):
def __str__(self):
return ' '.join(self.data)
-# A dictionary that preserves the order in which items are added.
-# Submitted by David Benjamin to ActiveState's Python Cookbook web site:
-# http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/107747
-# Including fixes/enhancements from the follow-on discussions.
-class OrderedDict(UserDict):
- def __init__(self, dict = None):
- self._keys = []
- UserDict.__init__(self, dict)
-
- def __delitem__(self, key):
- UserDict.__delitem__(self, key)
- self._keys.remove(key)
-
- def __setitem__(self, key, item):
- UserDict.__setitem__(self, key, item)
- if key not in self._keys: self._keys.append(key)
-
- def clear(self):
- UserDict.clear(self)
- self._keys = []
-
- def copy(self):
- dict = OrderedDict()
- dict.update(self)
- return dict
-
- def items(self):
- return list(zip(self._keys, list(self.values())))
-
- def keys(self):
- return self._keys[:]
-
- def popitem(self):
- try:
- key = self._keys[-1]
- except IndexError:
- raise KeyError('dictionary is empty')
-
- val = self[key]
- del self[key]
-
- return (key, val)
-
- def setdefault(self, key, failobj = None):
- UserDict.setdefault(self, key, failobj)
- if key not in self._keys: self._keys.append(key)
-
- def update(self, dict):
- for (key, val) in dict.items():
- self.__setitem__(key, val)
-
- def values(self):
- return list(map(self.get, self._keys))
class Selector(OrderedDict):
"""A callable ordered dictionary that maps file suffixes to