Belle II Software  release-05-01-25
sym_link.py
1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
3 
4 import os
5 import errno
6 from SCons.Script import GetOption
7 from SCons.Builder import Builder
8 
9 # define relpath for python < 2.6
10 if not hasattr(os.path, 'relpath'):
11 
12  def relpath(path, start=os.path.curdir):
13  """Return a relative version of a path"""
14 
15  if not path:
16  raise ValueError('no path specified')
17 
18  start_list = os.path.abspath(start).split(os.path.sep)
19  path_list = os.path.abspath(path).split(os.path.sep)
20 
21  # Work out how much of the filepath is shared by start and path.
22  i = len(os.path.commonprefix([start_list, path_list]))
23 
24  rel_list = [os.path.pardir] * (len(start_list) - i) + path_list[i:]
25  if not rel_list:
26  return os.path.curdir
27  return os.path.join(*rel_list)
28 
29  os.path.relpath = relpath
30 
31 
32 def create_symlink(target, source, env):
33  """Create a symbolic link from source to target"""
34 
35  source = os.path.relpath(source, os.path.dirname(target))
36  try:
37  os.symlink(source, target)
38  except OSError as e:
39  # target might exist if source was moved!
40  if e.errno == errno.EEXIST:
41  os.remove(target)
42  os.symlink(source, target)
43  else:
44  raise e
45  return 0
46 
47 
48 copy_file = Builder(action='cp -pf $SOURCE $TARGET')
49 copy_file.action.cmdstr = '${COPYCOMSTR}'
50 
51 
52 def generate(env):
53  if not GetOption('no-symlink'):
54  env['INSTALL'] = create_symlink
55  env['BUILDERS']['Copy'] = copy_file
56 
57 
58 def exists(env):
59  return True
Script