1
    2
    3
    4
    5
    6
    7
    8
    9
   10
   11
   12
   13
   14
   15
   16
   17
   18
   19
   20
   21
   22
   23
   24
   25
   26
   27
   28
   29
   30
   31
   32
   33
   34
   35
   36
   37
   38
   39
   40
   41
   42
   43
   44
   45
   46
   47
   48
   49
   50
   51
   52
   53
   54
   55
   56
   57
   58
   59
   60

build / config / mac / package_framework.py [blame]

# Copyright 2016 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import argparse
import errno
import os
import shutil
import sys

def Main():
  parser = argparse.ArgumentParser(description='Create Mac Framework symlinks')
  parser.add_argument('--framework', action='store', type=str, required=True)
  parser.add_argument('--version', action='store', type=str)
  parser.add_argument('--contents', action='store', type=str, nargs='+')
  parser.add_argument('--stamp', action='store', type=str, required=True)
  args = parser.parse_args()

  VERSIONS = 'Versions'
  CURRENT = 'Current'

  # Ensure the Foo.framework/Versions/A/ directory exists and create the
  # Foo.framework/Versions/Current symlink to it.
  if args.version:
    try:
      os.makedirs(os.path.join(args.framework, VERSIONS, args.version), 0o755)
    except OSError as e:
      if e.errno != errno.EEXIST:
        raise e
    _Relink(os.path.join(args.version),
            os.path.join(args.framework, VERSIONS, CURRENT))

  # Establish the top-level symlinks in the framework bundle. The dest of
  # the symlinks may not exist yet.
  if args.contents:
    for item in args.contents:
      _Relink(os.path.join(VERSIONS, CURRENT, item),
              os.path.join(args.framework, item))

  # Write out a stamp file.
  if args.stamp:
    with open(args.stamp, 'w') as f:
      f.write(str(args))

  return 0


def _Relink(dest, link):
  """Creates a symlink to |dest| named |link|. If |link| already exists,
  it is overwritten."""
  try:
    os.remove(link)
  except OSError as e:
    if e.errno != errno.ENOENT:
      shutil.rmtree(link)
  os.symlink(dest, link)


if __name__ == '__main__':
  sys.exit(Main())