releasetools: Set the search path based on the current executable.

We used to mimic the behavior of build system, to find the default
search path based on OUT_DIR_COMMON_BASE or OUT_DIR. These variables
should be internal to build system.

Since we've switched releasetools script to hermetic Python executables
(e.g. `m -j ota_from_target_files`, then run the binary at
`out/host/linux-x86/bin/ota_from_target_files`), we can set the search
path in relative to the path of the current executable.

Bug: 133126366
Test: TreeHugger
Test: 1. Build aosp_x86, by "lunch aosp_x86; m -j"
      2. Inject errors to the executables under out/host/linux-x86/bin,
         e.g.  to `lpmake`.
      3. Set up OUT_DIR (e.g., to /tmp/out) and build the same product
         again by "export OUT_DIR=/tmp/out; lunch aosp_x86; m -j". Check
         that the second run finishes successfully (with the binaries at
         /tmp/out as opposed to out/; otherwise it would fail the build
         due to the invalid binaries from step 2).
Test: lunch a target;
      `atest --host releasetools_test releasetools_py3_test`
Change-Id: I366099c3dfd5fa4282745ef258a8cf35338e1e42
This commit is contained in:
Tao Bao
2019-10-10 22:44:22 -07:00
parent 51a7d20229
commit afd92a8689

View File

@@ -47,22 +47,23 @@ logger = logging.getLogger(__name__)
class Options(object):
def __init__(self):
base_out_path = os.getenv('OUT_DIR_COMMON_BASE')
if base_out_path is None:
base_search_path = "out"
else:
base_search_path = os.path.join(base_out_path,
os.path.basename(os.getcwd()))
# Set up search path, in order to find framework/ and lib64/. At the time of
# running this function, user-supplied search path (`--path`) hasn't been
# available. So the value set here is the default, which might be overridden
# by commandline flag later.
exec_path = sys.argv[0]
if exec_path.endswith('.py'):
script_name = os.path.basename(exec_path)
# logger hasn't been initialized yet at this point. Use print to output
# warnings.
print(
'Warning: releasetools script should be invoked as hermetic Python '
'executable -- build and run `{}` directly.'.format(script_name[:-3]),
file=sys.stderr)
self.search_path = os.path.realpath(os.path.join(exec_path, '..'))
# Python >= 3.3 returns 'linux', whereas Python 2.7 gives 'linux2'.
platform_search_path = {
"linux": os.path.join(base_search_path, "host/linux-x86"),
"linux2": os.path.join(base_search_path, "host/linux-x86"),
"darwin": os.path.join(base_search_path, "host/darwin-x86"),
}
self.search_path = platform_search_path.get(sys.platform)
self.signapk_path = "framework/signapk.jar" # Relative to search_path
self.signapk_shared_library_path = "lib64" # Relative to search_path
self.extra_signapk_args = []