benchmarking/utils/build_program.py (98 lines of code) (raw):

#!/usr/bin/env python ############################################################################## # Copyright 2017-present, Facebook, Inc. # All rights reserved. # # This source code is licensed under the license found in the # LICENSE file in the root directory of this source tree. ############################################################################## from __future__ import absolute_import from __future__ import division from __future__ import print_function from __future__ import unicode_literals import os import pkg_resources from .custom_logger import getLogger from .subprocess_with_logger import processRun def buildUsingBuck(dst, platform, buck_target): _setUpTempDirectory(dst) final_command = f"{buck_target} --out {dst}" result, _ = processRun(final_command.split()) getLogger().info("\n".join(result)) if _isBuildSuccessful(dst, platform, final_command): os.chmod(dst, 0o500) return True return False def buildProgramPlatform(dst, repo_dir, framework, frameworks_dir, platform, *args): script = getBuildScript(framework, frameworks_dir, platform, dst) _setUpTempDirectory(dst) if os.name == "nt": result, _ = processRun([script, repo_dir, dst]) else: cmds = ["sh", script, repo_dir, dst] if args: cmds.extend(list(args)) result, _ = processRun(cmds) getLogger().info("\n".join(result)) if _isBuildSuccessful(dst, platform, script): os.chmod(dst, 0o500) return True return False def _setUpTempDirectory(dst): dst_dir = os.path.dirname(dst) if os.path.isfile(dst): os.remove(dst) elif not os.path.isdir(dst_dir): os.makedirs(dst_dir) def _isBuildSuccessful(dst, platform, script): if not os.path.isfile(dst) and ( not (os.path.isdir(dst) and platform.startswith("ios")) ): getLogger().error('Build program using "{}" failed.'.format(script)) return False return True def getBuildScript(framework, frameworks_dir, platform, dst): if not frameworks_dir: try: build_script = _readFromBinary(framework, frameworks_dir, platform, dst) except Exception as e: getLogger().info("We will load from old default path due to {}.".format(e)) frameworks_dir = str( os.path.dirname(os.path.realpath(__file__)) + "/../../specifications/frameworks" ) build_script = _readFromPath(framework, frameworks_dir, platform, dst) else: try: build_script = _readFromPath(framework, frameworks_dir, platform, dst) except Exception as e: getLogger().info("We will load from binary due to {}.".format(e)) build_script = _readFromBinary(framework, frameworks_dir, platform, dst) return build_script def _readFromPath(framework, frameworks_dir, platform, dst): # if user provide frameworks_dir, we want to validate its correctness. assert os.path.isdir(frameworks_dir), "{} must be specified.".format(frameworks_dir) framework_dir = os.path.join(frameworks_dir, framework) assert os.path.isdir(framework_dir), "{} must be specified.".format(framework_dir) platform_dir = os.path.join(framework_dir, platform) build_script = None if os.path.isdir(platform_dir): if os.path.isfile(platform_dir + "/build.sh"): build_script = platform_dir + "/build.sh" if build_script is None: # Ideally, should check the parent directory until the # framework directory. Save this for the future build_script = framework_dir + "/build.sh" getLogger().warning( "Directory {} ".format(platform_dir) + "doesn't exist. Use " + "{} instead".format(framework_dir) ) assert os.path.isfile(build_script), "Cannot find build script in {} for ".format( framework_dir ) + "platform {}".format(platform) return build_script def _readFromBinary(framework, frameworks_dir, platform, dst): script_path = os.path.join( "specifications/frameworks", framework, platform, "build.sh" ) if not pkg_resources.resource_exists("aibench", script_path): raise Exception( "cannot find the build script in the binary under {}.".format(script_path) ) raw_build_script = pkg_resources.resource_string("aibench", script_path) if not os.path.exists(os.path.dirname(dst)): os.makedirs(os.path.dirname(dst)) with open(os.path.join(os.path.dirname(dst), "build.sh"), "w") as f: f.write(raw_build_script.decode("utf-8")) build_script = f.name return build_script