diff --git a/3.0.1.tar.gz b/3.0.1.tar.gz
deleted file mode 100644
index aa1880c..0000000
--- a/3.0.1.tar.gz
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:37b2d8ba2b869a397cf0007026b793230a97d6aa9545db9568755cd282dd5f53
-size 5481813
diff --git a/_multibuild b/_multibuild
deleted file mode 100644
index fcc7b97..0000000
--- a/_multibuild
+++ /dev/null
@@ -1,3 +0,0 @@
-
- test
-
diff --git a/fix-jN-for-python-37.patch b/fix-jN-for-python-37.patch
deleted file mode 100644
index 0ef2559..0000000
--- a/fix-jN-for-python-37.patch
+++ /dev/null
@@ -1,26 +0,0 @@
---- 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']
diff --git a/fix-rpm-tests-for-newer-rpmbuild.patch b/fix-rpm-tests-for-newer-rpmbuild.patch
deleted file mode 100644
index a706eae..0000000
--- a/fix-rpm-tests-for-newer-rpmbuild.patch
+++ /dev/null
@@ -1,114 +0,0 @@
---- 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')
diff --git a/grep-filter-list.txt b/grep-filter-list.txt
deleted file mode 100644
index e9e4f7a..0000000
--- a/grep-filter-list.txt
+++ /dev/null
@@ -1,329 +0,0 @@
-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
diff --git a/no_deprecated_asserts.patch b/no_deprecated_asserts.patch
deleted file mode 100644
index 6602bef..0000000
--- a/no_deprecated_asserts.patch
+++ /dev/null
@@ -1,400 +0,0 @@
-From 9864e8bf0a69f6aa35bb6af794da9988b1bbc50b Mon Sep 17 00:00:00 2001
-From: Mats Wichmann
-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
----
- 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)
-
-
diff --git a/no_time-clock.patch b/no_time-clock.patch
deleted file mode 100644
index 3d28f6c..0000000
--- a/no_time-clock.patch
+++ /dev/null
@@ -1,31 +0,0 @@
---- 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)
diff --git a/removed_splitunc.patch b/removed_splitunc.patch
deleted file mode 100644
index 68b37c7..0000000
--- a/removed_splitunc.patch
+++ /dev/null
@@ -1,39 +0,0 @@
---- 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:]
-
diff --git a/replace-imp-with-importlib.patch b/replace-imp-with-importlib.patch
new file mode 100644
index 0000000..f19323c
--- /dev/null
+++ b/replace-imp-with-importlib.patch
@@ -0,0 +1,318 @@
+From 01a444c023fbc109d0ad1a563c80e3a98c067cb8 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Mat=C4=9Bj=20Cepl?=
+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
diff --git a/replace_TestSuite_main.patch b/replace_TestSuite_main.patch
deleted file mode 100644
index 2f845f9..0000000
--- a/replace_TestSuite_main.patch
+++ /dev/null
@@ -1,713 +0,0 @@
---- 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
diff --git a/scons-3.0.0-fix-install.patch b/scons-3.0.0-fix-install.patch
index 6dda448..e2fbdfa 100644
--- a/scons-3.0.0-fix-install.patch
+++ b/scons-3.0.0-fix-install.patch
@@ -2,8 +2,8 @@
setup.py | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
---- a/src/setup.py
-+++ b/src/setup.py
+--- a/setup.py
++++ b/setup.py
@@ -376,7 +376,7 @@ class install_data(_install_data):
if is_win32:
dir = 'Doc'
diff --git a/scons-3.0.1.tar.gz b/scons-3.0.1.tar.gz
new file mode 100644
index 0000000..396bd0c
--- /dev/null
+++ b/scons-3.0.1.tar.gz
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:24475e38d39c19683bc88054524df018fe6949d70fbd4c69e298d39a0269f173
+size 634815
diff --git a/scons.changes b/scons.changes
index ca4d0f8..3e53a68 100644
--- a/scons.changes
+++ b/scons.changes
@@ -1,31 +1,3 @@
--------------------------------------------------------------------
-Thu Oct 11 10:30:44 UTC 2018 - Matěj Cepl
-
-- Switch off more failing tests.
-
--------------------------------------------------------------------
-Mon Oct 8 12:01:14 UTC 2018 - Matěj Cepl
-
-- 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
diff --git a/scons.spec b/scons.spec
index ef5ff6b..bdc2918 100644
--- a/scons.spec
+++ b/scons.spec
@@ -12,75 +12,27 @@
# license that conforms to the Open Source Definition (Version 1.9)
# published by the Open Source Initiative.
-# Please submit bugfixes or comments via https://bugs.opensuse.org/
+# Please submit bugfixes or comments via http://bugs.opensuse.org/
#
-%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
+Name: scons
Version: 3.0.1
Release: 0
Summary: Replacement for Make
License: MIT
Group: Development/Tools/Building
URL: http://www.scons.org/
-Source0: https://github.com/SCons/%{modname}/archive/%{version}.tar.gz
+Source0: http://prdownloads.sourceforge.net/scons/%{name}-%{version}.tar.gz
#http://www.scons.org/doc/%%{version}/HTML/scons-user.html
Source1: scons-user.html-%{version}.tar.bz2
-# Adjust to exclude all failing tests
-Source2: grep-filter-list.txt
-# Upstream compatibilitt patches
-Patch0: no_deprecated_asserts.patch
-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
+# Sets _mandir to _datadir/man instead of _prefix/man
+Patch0: %{name}-3.0.0-fix-install.patch
+Patch1: replace-imp-with-importlib.patch
+BuildRequires: fdupes
+BuildRequires: python3-devel >= 3.5
Requires: python3-base >= 3.5
-%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
+BuildArch: noarch
%description
SCons is a make replacement that provides a range of enhanced features,
@@ -90,49 +42,27 @@ provides itself as well as the features. SCons allows you to use the
full power of Python to control compilation.
%prep
-%setup -q -n %{modname}-%{version}
-%autopatch -p1
+%setup -q -a1
+%patch0 -p1
+%patch1 -p1
-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 -e '/QT_LIBPATH = os.path.join.*QTDIR/s/lib/%{_lib}/' engine/SCons/Tool/qt.py
-cp %{SOURCE2} grep-filter-list.txt
+sed -i 's|%{_bindir}/env python|%{_bindir}/python3|' script/*
%build
-python3 bootstrap.py build/scons
-cd build/scons
-%py3_build
+export CFLAGS="%{optflags}"
+%python3_build
%install
-%if !%{with test}
-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
+%python3_install
+%fdupes %{buildroot}%{_bindir}
%files
-%license LICENSE
-%doc src/CHANGES.txt README.rst src/RELEASE.txt
-%if !%{with test}
+%license LICENSE.txt
+%doc CHANGES.txt README.txt RELEASE.txt scons-user.html
%{_bindir}/*
-%{python3_sitelib}/SCons
-%{python3_sitelib}/%{modname}*.egg-info
+%{_libexecdir}/scons-%{version}
%{_mandir}/man1/*%{ext_man}
-%endif
%changelog
diff --git a/stop_custom_OrderedDict.patch b/stop_custom_OrderedDict.patch
deleted file mode 100644
index 79cb72c..0000000
--- a/stop_custom_OrderedDict.patch
+++ /dev/null
@@ -1,162 +0,0 @@
-From 2180ff6d0388162586fff59e066bc1e3e4bb9600 Mon Sep 17 00:00:00 2001
-From: Mats Wichmann
-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
----
- 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