annotate libcxx/utils/merge_archives.py @ 181:df311c476dd5

CreateIdentifierInfo in ParseCbC (not yet worked)
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sun, 31 May 2020 12:30:11 +0900
parents 0572611fdcc8
children 2e18cbf3894f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 #!/usr/bin/env python
anatofuz
parents:
diff changeset
2 #===----------------------------------------------------------------------===##
anatofuz
parents:
diff changeset
3 #
anatofuz
parents:
diff changeset
4 # Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
anatofuz
parents:
diff changeset
5 # See https://llvm.org/LICENSE.txt for license information.
anatofuz
parents:
diff changeset
6 # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
anatofuz
parents:
diff changeset
7 #
anatofuz
parents:
diff changeset
8 #===----------------------------------------------------------------------===##
anatofuz
parents:
diff changeset
9
anatofuz
parents:
diff changeset
10 from argparse import ArgumentParser
anatofuz
parents:
diff changeset
11 from ctypes.util import find_library
anatofuz
parents:
diff changeset
12 import distutils.spawn
anatofuz
parents:
diff changeset
13 import glob
anatofuz
parents:
diff changeset
14 import tempfile
anatofuz
parents:
diff changeset
15 import os
anatofuz
parents:
diff changeset
16 import shutil
anatofuz
parents:
diff changeset
17 import subprocess
anatofuz
parents:
diff changeset
18 import signal
anatofuz
parents:
diff changeset
19 import sys
anatofuz
parents:
diff changeset
20
anatofuz
parents:
diff changeset
21 temp_directory_root = None
anatofuz
parents:
diff changeset
22 def exit_with_cleanups(status):
anatofuz
parents:
diff changeset
23 if temp_directory_root is not None:
anatofuz
parents:
diff changeset
24 shutil.rmtree(temp_directory_root)
anatofuz
parents:
diff changeset
25 sys.exit(status)
anatofuz
parents:
diff changeset
26
anatofuz
parents:
diff changeset
27 def print_and_exit(msg):
anatofuz
parents:
diff changeset
28 sys.stderr.write(msg + '\n')
anatofuz
parents:
diff changeset
29 exit_with_cleanups(1)
anatofuz
parents:
diff changeset
30
anatofuz
parents:
diff changeset
31 def find_and_diagnose_missing(lib, search_paths):
anatofuz
parents:
diff changeset
32 if os.path.exists(lib):
anatofuz
parents:
diff changeset
33 return os.path.abspath(lib)
anatofuz
parents:
diff changeset
34 if not lib.startswith('lib') or not lib.endswith('.a'):
anatofuz
parents:
diff changeset
35 print_and_exit(("input file '%s' not not name a static library. "
anatofuz
parents:
diff changeset
36 "It should start with 'lib' and end with '.a") % lib)
anatofuz
parents:
diff changeset
37 for sp in search_paths:
anatofuz
parents:
diff changeset
38 assert type(sp) is list and len(sp) == 1
anatofuz
parents:
diff changeset
39 path = os.path.join(sp[0], lib)
anatofuz
parents:
diff changeset
40 if os.path.exists(path):
anatofuz
parents:
diff changeset
41 return os.path.abspath(path)
anatofuz
parents:
diff changeset
42 print_and_exit("input '%s' does not exist" % lib)
anatofuz
parents:
diff changeset
43
anatofuz
parents:
diff changeset
44
anatofuz
parents:
diff changeset
45 def execute_command(cmd, cwd=None):
anatofuz
parents:
diff changeset
46 """
anatofuz
parents:
diff changeset
47 Execute a command, capture and return its output.
anatofuz
parents:
diff changeset
48 """
anatofuz
parents:
diff changeset
49 kwargs = {
anatofuz
parents:
diff changeset
50 'stdin': subprocess.PIPE,
anatofuz
parents:
diff changeset
51 'stdout': subprocess.PIPE,
anatofuz
parents:
diff changeset
52 'stderr': subprocess.PIPE,
anatofuz
parents:
diff changeset
53 'cwd': cwd,
anatofuz
parents:
diff changeset
54 'universal_newlines': True
anatofuz
parents:
diff changeset
55 }
anatofuz
parents:
diff changeset
56 p = subprocess.Popen(cmd, **kwargs)
anatofuz
parents:
diff changeset
57 out, err = p.communicate()
anatofuz
parents:
diff changeset
58 exitCode = p.wait()
anatofuz
parents:
diff changeset
59 if exitCode == -signal.SIGINT:
anatofuz
parents:
diff changeset
60 raise KeyboardInterrupt
anatofuz
parents:
diff changeset
61 return out, err, exitCode
anatofuz
parents:
diff changeset
62
anatofuz
parents:
diff changeset
63
anatofuz
parents:
diff changeset
64 def execute_command_verbose(cmd, cwd=None, verbose=False):
anatofuz
parents:
diff changeset
65 """
anatofuz
parents:
diff changeset
66 Execute a command and print its output on failure.
anatofuz
parents:
diff changeset
67 """
anatofuz
parents:
diff changeset
68 out, err, exitCode = execute_command(cmd, cwd=cwd)
anatofuz
parents:
diff changeset
69 if exitCode != 0 or verbose:
anatofuz
parents:
diff changeset
70 report = "Command: %s\n" % ' '.join(["'%s'" % a for a in cmd])
anatofuz
parents:
diff changeset
71 if exitCode != 0:
anatofuz
parents:
diff changeset
72 report += "Exit Code: %d\n" % exitCode
anatofuz
parents:
diff changeset
73 if out:
anatofuz
parents:
diff changeset
74 report += "Standard Output:\n--\n%s--" % out
anatofuz
parents:
diff changeset
75 if err:
anatofuz
parents:
diff changeset
76 report += "Standard Error:\n--\n%s--" % err
anatofuz
parents:
diff changeset
77 if exitCode != 0:
anatofuz
parents:
diff changeset
78 report += "\n\nFailed!"
anatofuz
parents:
diff changeset
79 sys.stderr.write('%s\n' % report)
anatofuz
parents:
diff changeset
80 if exitCode != 0:
anatofuz
parents:
diff changeset
81 exit_with_cleanups(exitCode)
anatofuz
parents:
diff changeset
82 return out
anatofuz
parents:
diff changeset
83
anatofuz
parents:
diff changeset
84 def main():
anatofuz
parents:
diff changeset
85 parser = ArgumentParser(
anatofuz
parents:
diff changeset
86 description="Merge multiple archives into a single library")
anatofuz
parents:
diff changeset
87 parser.add_argument(
anatofuz
parents:
diff changeset
88 '-v', '--verbose', dest='verbose', action='store_true', default=False)
anatofuz
parents:
diff changeset
89 parser.add_argument(
anatofuz
parents:
diff changeset
90 '-o', '--output', dest='output', required=True,
anatofuz
parents:
diff changeset
91 help='The output file. stdout is used if not given',
anatofuz
parents:
diff changeset
92 type=str, action='store')
anatofuz
parents:
diff changeset
93 parser.add_argument(
anatofuz
parents:
diff changeset
94 '-L', dest='search_paths',
anatofuz
parents:
diff changeset
95 help='Paths to search for the libraries along', action='append',
anatofuz
parents:
diff changeset
96 nargs=1)
anatofuz
parents:
diff changeset
97 parser.add_argument(
anatofuz
parents:
diff changeset
98 '--ar', dest='ar_exe', required=False,
anatofuz
parents:
diff changeset
99 help='The ar executable to use, finds \'ar\' in the path if not given',
anatofuz
parents:
diff changeset
100 type=str, action='store')
anatofuz
parents:
diff changeset
101 parser.add_argument(
anatofuz
parents:
diff changeset
102 '--use-libtool', dest='use_libtool', action='store_true', default=False)
anatofuz
parents:
diff changeset
103 parser.add_argument(
anatofuz
parents:
diff changeset
104 '--libtool', dest='libtool_exe', required=False,
anatofuz
parents:
diff changeset
105 help='The libtool executable to use, finds \'libtool\' in the path if not given',
anatofuz
parents:
diff changeset
106 type=str, action='store')
anatofuz
parents:
diff changeset
107 parser.add_argument(
anatofuz
parents:
diff changeset
108 'archives', metavar='archives', nargs='+',
anatofuz
parents:
diff changeset
109 help='The archives to merge')
anatofuz
parents:
diff changeset
110
anatofuz
parents:
diff changeset
111 args = parser.parse_args()
anatofuz
parents:
diff changeset
112
anatofuz
parents:
diff changeset
113 ar_exe = args.ar_exe
anatofuz
parents:
diff changeset
114 if not ar_exe:
anatofuz
parents:
diff changeset
115 ar_exe = distutils.spawn.find_executable('ar')
anatofuz
parents:
diff changeset
116 if not ar_exe:
anatofuz
parents:
diff changeset
117 print_and_exit("failed to find 'ar' executable")
anatofuz
parents:
diff changeset
118
anatofuz
parents:
diff changeset
119 if args.use_libtool:
anatofuz
parents:
diff changeset
120 libtool_exe = args.libtool_exe
anatofuz
parents:
diff changeset
121 if not libtool_exe:
anatofuz
parents:
diff changeset
122 libtool_exe = distutils.spawn.find_executable('libtool')
anatofuz
parents:
diff changeset
123 if not libtool_exe:
anatofuz
parents:
diff changeset
124 print_and_exit("failed to find 'libtool' executable")
anatofuz
parents:
diff changeset
125
anatofuz
parents:
diff changeset
126 if len(args.archives) < 2:
anatofuz
parents:
diff changeset
127 print_and_exit('fewer than 2 inputs provided')
anatofuz
parents:
diff changeset
128 archives = [find_and_diagnose_missing(ar, args.search_paths)
anatofuz
parents:
diff changeset
129 for ar in args.archives]
anatofuz
parents:
diff changeset
130 print ('Merging archives: %s' % archives)
anatofuz
parents:
diff changeset
131 if not os.path.exists(os.path.dirname(args.output)):
anatofuz
parents:
diff changeset
132 print_and_exit("output path doesn't exist: '%s'" % args.output)
anatofuz
parents:
diff changeset
133
anatofuz
parents:
diff changeset
134 global temp_directory_root
anatofuz
parents:
diff changeset
135 temp_directory_root = tempfile.mkdtemp('.libcxx.merge.archives')
anatofuz
parents:
diff changeset
136
anatofuz
parents:
diff changeset
137 files = []
anatofuz
parents:
diff changeset
138 for arc in archives:
anatofuz
parents:
diff changeset
139 execute_command_verbose([ar_exe, 'x', arc],
anatofuz
parents:
diff changeset
140 cwd=temp_directory_root, verbose=args.verbose)
anatofuz
parents:
diff changeset
141 out = execute_command_verbose([ar_exe, 't', arc])
anatofuz
parents:
diff changeset
142 files.extend(out.splitlines())
anatofuz
parents:
diff changeset
143
anatofuz
parents:
diff changeset
144 if args.use_libtool:
anatofuz
parents:
diff changeset
145 files = [f for f in files if not f.startswith('__.SYMDEF')]
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
146 execute_command_verbose([libtool_exe, '-static', '-o', args.output, '-s'] + files,
150
anatofuz
parents:
diff changeset
147 cwd=temp_directory_root, verbose=args.verbose)
anatofuz
parents:
diff changeset
148 else:
anatofuz
parents:
diff changeset
149 execute_command_verbose([ar_exe, 'rcs', args.output] + files,
anatofuz
parents:
diff changeset
150 cwd=temp_directory_root, verbose=args.verbose)
anatofuz
parents:
diff changeset
151
anatofuz
parents:
diff changeset
152
anatofuz
parents:
diff changeset
153 if __name__ == '__main__':
anatofuz
parents:
diff changeset
154 main()
anatofuz
parents:
diff changeset
155 exit_with_cleanups(0)