From afd92a86891a46418d8b18d5caea78fadd2968eb Mon Sep 17 00:00:00 2001 From: Tao Bao Date: Thu, 10 Oct 2019 22:44:22 -0700 Subject: [PATCH] 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 --- tools/releasetools/common.py | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/tools/releasetools/common.py b/tools/releasetools/common.py index b7a7f37ceb..f846b18ff3 100644 --- a/tools/releasetools/common.py +++ b/tools/releasetools/common.py @@ -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 = []