Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 # Copyright 2016 The Chromium Authors. All rights reserved. | |
| 2 # Use of this source code is governed by a BSD-style license that can be | |
| 3 # found in the LICENSE file. | |
| 4 | |
| 5 import os.path | |
| 6 import shutil | |
| 7 import subprocess | |
| 8 import sys | |
| 9 | |
| 10 | |
| 11 """Populate the compiler-provided portions of the fusl sysroot. | |
| 12 | |
| 13 In particular, crtbegin.o, crtend.o, and libgcc.a must be copied from | |
| 14 the host sysroot to our sysroot. | |
| 15 """ | |
| 16 | |
| 17 SYSROOT_ARTEFACTS = [ | |
| 18 'crtbegin.o', | |
|
viettrungluu
2016/02/01 21:15:55
I think we mostly format Python code with a 2-spac
| |
| 19 'crtend.o', | |
| 20 'libgcc.a', | |
| 21 ] | |
| 22 | |
| 23 | |
| 24 def parse_clang_dirs(clang): | |
| 25 """Parse the output of |clang -print-search-dirs|. | |
| 26 | |
| 27 This is used to find library search paths. One line of the output | |
| 28 is formatted something like: | |
| 29 | |
| 30 libraries: =/usr/lib/gcc/4.8:/lib:/usr/lib | |
| 31 | |
| 32 This functions strips the 'libraries: =' prefix and splits on the | |
| 33 colon, returning the list: | |
| 34 | |
| 35 [ '/usr/lib/gcc/4.8', '/lib', '/usr/lib' ] | |
| 36 | |
| 37 """ | |
| 38 | |
| 39 clang_search_dirs = subprocess.check_output([clang, '-print-search-dirs']) | |
| 40 | |
| 41 library_line = None | |
| 42 library_line_prefix = 'libraries: =' | |
| 43 for line in clang_search_dirs.split('\n'): | |
| 44 if line.startswith(library_line_prefix): | |
| 45 prefix_length = len(library_line_prefix) | |
| 46 library_line = line[prefix_length:] | |
| 47 break | |
| 48 assert(library_line) | |
| 49 return library_line.split(':') | |
| 50 | |
| 51 | |
| 52 def try_populate(library_path, target): | |
| 53 """Returns whether this path contained all the libs and we were able | |
| 54 to copy them.""" | |
| 55 | |
| 56 # Check that everything is here. | |
|
viettrungluu
2016/02/01 21:15:55
Is it possible to find some things, but not all? (
kulakowski
2016/02/01 21:29:29
Ah, yeah. Didn't think too much about it, since in
| |
| 57 for artefact in SYSROOT_ARTEFACTS: | |
|
viettrungluu
2016/02/01 21:15:55
In 'merika, "we" spell artifact with an "i".
kulakowski
2016/02/01 21:29:29
Done.
| |
| 58 path = os.path.join(library_path, artefact) | |
| 59 if not os.path.isfile(path): | |
| 60 return False | |
| 61 | |
| 62 # All here, so copy! | |
| 63 for artefact in SYSROOT_ARTEFACTS: | |
| 64 source = os.path.join(library_path, artefact) | |
| 65 shutil.copy(source, target) | |
| 66 | |
| 67 return True | |
| 68 | |
| 69 | |
| 70 def main(): | |
| 71 clang = sys.argv[1] | |
| 72 target = sys.argv[2] | |
| 73 | |
| 74 library_paths = parse_clang_dirs(clang) | |
| 75 for library_path in library_paths: | |
| 76 if try_populate(library_path, target): | |
| 77 # If we successfully populated with one path, we are done. | |
| 78 exit(0) | |
| 79 | |
| 80 # No path had what we needed, so fail. | |
| 81 exit(1) | |
| 82 | |
| 83 | |
| 84 if __name__ == '__main__': | |
| 85 main() | |
| OLD | NEW |