diff options
Diffstat (limited to 'bootstrap.py')
| -rwxr-xr-x | bootstrap.py | 108 | 
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()  | 
