3 # Copyright 2014 The Chromium Authors. All rights reserved.
4 # Use of this source code is governed by a BSD-style license that can be
5 # found in the LICENSE file.
7 """Pack relocations in a library (or copy unchanged).
9 If --enable-packing and --configuration-name=='Release', invoke the
10 relocation_packer tool to pack the .rel.dyn or .rela.dyn section in the given
11 library files. This step is inserted after the libraries are stripped.
13 If --enable-packing is zero, the script copies files verbatim, with no
14 attempt to pack relocations.
16 Any library listed in --exclude-packing-list is also copied verbatim,
17 irrespective of any --enable-packing setting. Typically this would be
18 'libchromium_android_linker.so'.
28 from util
import build_utils
30 def PackLibraryRelocations(android_pack_relocations
, library_path
, output_path
):
31 shutil
.copy(library_path
, output_path
)
32 pack_command
= [android_pack_relocations
, output_path
]
33 build_utils
.CheckOutput(pack_command
)
36 def CopyLibraryUnchanged(library_path
, output_path
):
37 shutil
.copy(library_path
, output_path
)
41 args
= build_utils
.ExpandFileArgs(args
)
42 parser
= optparse
.OptionParser()
43 build_utils
.AddDepfileOption(parser
)
44 parser
.add_option('--clear-dir', action
='store_true',
45 help='If set, the destination directory will be deleted '
46 'before copying files to it. This is highly recommended to '
47 'ensure that no stale files are left in the directory.')
49 parser
.add_option('--configuration-name',
51 help='Gyp configuration name (i.e. Debug, Release)')
52 parser
.add_option('--enable-packing',
54 help=('Pack relocations if 1 and configuration name is \'Release\','
55 ' otherwise plain file copy'))
56 parser
.add_option('--exclude-packing-list',
58 help='Names of any libraries explicitly not packed')
59 parser
.add_option('--android-pack-relocations',
60 help='Path to the relocations packer binary')
61 parser
.add_option('--stripped-libraries-dir',
62 help='Directory for stripped libraries')
63 parser
.add_option('--packed-libraries-dir',
64 help='Directory for packed libraries')
65 parser
.add_option('--libraries', action
='append',
66 help='List of libraries')
67 parser
.add_option('--stamp', help='Path to touch on success')
69 options
, _
= parser
.parse_args(args
)
70 enable_packing
= (options
.enable_packing
== '1' and
71 options
.configuration_name
== 'Release')
72 exclude_packing_set
= set(shlex
.split(options
.exclude_packing_list
))
75 for libs_arg
in options
.libraries
:
76 libraries
+= build_utils
.ParseGypList(libs_arg
)
79 build_utils
.DeleteDirectory(options
.packed_libraries_dir
)
81 build_utils
.MakeDirectory(options
.packed_libraries_dir
)
83 for library
in libraries
:
84 library_path
= os
.path
.join(options
.stripped_libraries_dir
, library
)
85 output_path
= os
.path
.join(
86 options
.packed_libraries_dir
, os
.path
.basename(library
))
88 if enable_packing
and library
not in exclude_packing_set
:
89 PackLibraryRelocations(options
.android_pack_relocations
,
93 CopyLibraryUnchanged(library_path
, output_path
)
96 build_utils
.WriteDepfile(
98 libraries
+ build_utils
.GetPythonDependencies())
101 build_utils
.Touch(options
.stamp
)
106 if __name__
== '__main__':
107 sys
.exit(main(sys
.argv
[1:]))