summaryrefslogtreecommitdiff
path: root/bootstrap.py
diff options
context:
space:
mode:
Diffstat (limited to 'bootstrap.py')
-rwxr-xr-xbootstrap.py108
1 files changed, 54 insertions, 54 deletions
diff --git a/bootstrap.py b/bootstrap.py
index 58fde15..1629636 100755
--- a/bootstrap.py
+++ b/bootstrap.py
@@ -1,6 +1,6 @@
#!/usr/bin/env python
#
-# Copyright (c) 2001 - 2017 The SCons Foundation
+# Copyright (c) 2001 - 2019 The SCons Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -21,6 +21,7 @@
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
+from __future__ import print_function
import os
import os.path
@@ -74,15 +75,24 @@ the following SCons options:
"eaten" by the bootstrap.py script.
"""
-def parseManifestLines(basedir, lines):
- """ Scans the single lines of a MANIFEST file,
- and returns the list of source files.
- Has basic support for recursive globs '**',
- filename wildcards of the form '*.xml' and
- comment lines, starting with a '#'.
+def parseManifestLines(basedir, manifest):
+ """
+ Scans a MANIFEST file, and returns the list of source files.
+
+ Has basic support for recursive globs '**',
+ filename wildcards of the form '*.xml' and
+ comment lines, starting with a '#'.
+
+ :param basedir: base path to find files in. Note this does not
+ run in an SCons context so path must not need
+ further processing (e.g. no '#' signs)
+ :param manifest: path to manifest file
+ :returns: list of files
"""
sources = []
basewd = os.path.abspath(basedir)
+ with open(manifest) as m:
+ lines = m.readlines()
for l in lines:
if l.startswith('#'):
# Skip comments
@@ -107,38 +117,38 @@ def parseManifestLines(basedir, lines):
def main():
script_dir = os.path.abspath(os.path.dirname(__file__))
-
+
bootstrap_dir = os.path.join(script_dir, 'bootstrap')
-
+
pass_through_args = []
update_only = None
-
+
requires_an_argument = 'bootstrap.py: %s requires an argument\n'
-
+
search = [script_dir]
-
- def find(file, search=search):
- for dir in search:
- f = os.path.join(dir, file)
- if os.path.exists(f):
- return os.path.normpath(f)
- sys.stderr.write("could not find `%s' in search path:\n" % file)
+
+ def find(filename, search=search):
+ for dir_name in search:
+ filepath = os.path.join(dir_name, filename)
+ if os.path.exists(filepath):
+ return os.path.normpath(filepath)
+ sys.stderr.write("could not find `%s' in search path:\n" % filename)
sys.stderr.write("\t" + "\n\t".join(search) + "\n")
sys.exit(2)
-
+
def must_copy(dst, src):
if not os.path.exists(dst):
return 1
return not filecmp.cmp(dst,src)
-
+
# Note: We don't use the getopt module to process the command-line
# arguments because we'd have to teach it about all of the SCons options.
-
+
command_line_args = sys.argv[1:]
-
+
while command_line_args:
arg = command_line_args.pop(0)
-
+
if arg == '--bootstrap_dir':
try:
bootstrap_dir = command_line_args.pop(0)
@@ -147,11 +157,9 @@ def main():
sys.exit(1)
elif arg[:16] == '--bootstrap_dir=':
bootstrap_dir = arg[16:]
-
elif arg == '--bootstrap_force':
def must_copy(dst, src):
return 1
-
elif arg == '--bootstrap_src':
try:
search.insert(0, command_line_args.pop(0))
@@ -160,10 +168,8 @@ def main():
sys.exit(1)
elif arg[:16] == '--bootstrap_src=':
search.insert(0, arg[16:])
-
elif arg == '--bootstrap_update':
update_only = 1
-
elif arg in ('-C', '--directory'):
try:
dir = command_line_args.pop(0)
@@ -176,51 +182,45 @@ def main():
os.chdir(arg[2:])
elif arg[:12] == '--directory=':
os.chdir(arg[12:])
-
else:
pass_through_args.append(arg)
-
-
+
scons_py = os.path.join('src', 'script', 'scons.py')
src_engine = os.path.join('src', 'engine')
MANIFEST_in = find(os.path.join(src_engine, 'MANIFEST.in'))
- MANIFEST_xml_in = find(os.path.join(src_engine, 'MANIFEST-xml.in'))
manifest_files = [os.path.join(src_engine, x)
- for x in parseManifestLines(os.path.join(script_dir, src_engine),
- open(MANIFEST_in).readlines())]
-
- manifest_xml_files = [os.path.join(src_engine, x)
- for x in parseManifestLines(os.path.join(script_dir, src_engine),
- open(MANIFEST_xml_in).readlines())]
- files = [ scons_py ] + manifest_files + manifest_xml_files
-
- for file in files:
- src = find(file)
- dst = os.path.join(bootstrap_dir, file)
+ for x in parseManifestLines(os.path.join(script_dir, src_engine),
+ MANIFEST_in)]
+
+ files = [scons_py] + manifest_files
+
+ for filename in files:
+ src = find(filename)
+ dst = os.path.join(bootstrap_dir, filename)
if must_copy(dst, src):
dir = os.path.split(dst)[0]
if not os.path.isdir(dir):
os.makedirs(dir)
- try: os.unlink(dst)
- except: pass
+ try:
+ os.unlink(dst)
+ except Exception as e:
+ pass
+
+ shutil.copyfile(src, dst)
- shutil.copyfile(src,dst)
-
if update_only:
sys.exit(0)
-
- args = [
- sys.executable,
- os.path.join(bootstrap_dir, scons_py)
- ] + pass_through_args
-
+
+ args = [sys.executable, os.path.join(bootstrap_dir, scons_py)] + pass_through_args
+
sys.stdout.write(" ".join(args) + '\n')
sys.stdout.flush()
-
+
os.environ['SCONS_LIB_DIR'] = os.path.join(bootstrap_dir, src_engine)
-
+
sys.exit(subprocess.Popen(args, env=os.environ).wait())
+
if __name__ == "__main__":
main()