blob: 4cbcd4605c80b26d75274d676a86fa02b93ecec5 [file] [log] [blame]
#!/usr/bin/env python3.8
# Copyright 2022 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import glob
import os
import sys
import shutil
import subprocess
import argparse
import re
# Where all prebuilt debug binaries go.
PREBUILT_BUILD_ID_DIR = "prebuilt/.build-id"
parser = argparse.ArgumentParser(description="Upload Intel media driver to CIPD")
parser.add_argument("--out-dir", required=True)
parser.add_argument("--dry-run", action="store_true")
parser.add_argument("--ignore-branch", action="store_true")
parser.add_argument("--ignore-rebuild", action="store_true")
parser.add_argument("--ignore-buildtype", action="store_true")
parser.add_argument("--debug", action="store_true")
args = parser.parse_args()
dir_path = os.path.dirname(os.path.realpath(__file__))
fuchsia_root = os.path.abspath(os.path.join(dir_path, "../../../../"))
out_dir = os.path.abspath(args.out_dir)
if not os.path.exists(out_dir):
print("Out dir: %s doesn't exist" % out_dir)
sys.exit(1)
debug_suffix = ""
if args.debug:
debug_suffix = "-debug"
class CommonDriver(object):
def CalculateGitRevision(self):
self.git_rev = subprocess.check_output(
["git", "-C", self.git_repo_location, "rev-parse",
"HEAD"]).decode("utf-8").strip()
# Ignore commits on local branch
self.fuchsia_git_rev = subprocess.check_output(
["git", "-C", fuchsia_root, "merge-base", "origin/master",
"HEAD"]).decode("utf-8").strip()
class IntelDriver(CommonDriver):
def __init__(self, repo_name):
self.public = True
self.driver_type = "intel-gen"
self.repo_name = repo_name
self.git_repo_location = "%s/third_party/%s/" % (
fuchsia_root, repo_name)
self.file_name = "codec_runner_intel_gen.far"
self.input_name = "obj/third_party/intel/media-driver/fuchsia/codec_runner_intel_gen.far"
self.platform = "x64"
platform_suffix = "-" + self.platform
# Package dir is in the out directory to avoid dirtying source directories.
self.package_dir = os.path.join(
out_dir, "build-intel-media-driver",
"codec_runner_intel_gen" + debug_suffix)
package_name_base = "third_party/intel/media-driver/codec_runner_intel_gen"
self.package_name = "fuchsia/" + package_name_base + debug_suffix + platform_suffix
self.prebuilt_path = "prebuilt/" + package_name_base + debug_suffix + platform_suffix
self.symbol_package_name = "fuchsia/" + package_name_base + debug_suffix + "-debug-symbols" + platform_suffix
self.symbol_package_dir = self.package_dir + "-symbols"
self.symbol_input_names = [
"build-intel-media-driver/install/strip/iHD_drv_video.so.debug",
"build-intel-media-driver/install/strip/libva-magma.so.2.debug",
"build-intel-media-driver/install/strip/libigdgmm.so.11.debug",
"build-intel-media-driver/install/strip/libva.so.2.debug",
"exe.unstripped/codec_runner_intel_gen",
]
def GnArgs(self):
return [
("is_debug", args.debug),
("intel_media_driver_debug", args.debug),
]
driver_list = [IntelDriver("intel/media-driver")]
dir_path = os.path.join(fuchsia_root, "third_party/intel/media-driver/fuchsia")
os.chdir(dir_path)
for driver in driver_list:
git_branch = subprocess.check_output(
[
"git", "-C", driver.git_repo_location, "rev-parse", "--abbrev-ref",
"HEAD"
]).decode("utf-8").strip()
if git_branch != "main":
print(
"Git repo %s on incorrect branch %s (should be main)" %
(driver.repo_name, git_branch))
if args.ignore_branch:
print("Ignoring")
else:
print("Use --ignore-branch flag to upload anyway")
sys.exit(1)
for driver in driver_list:
target_name = driver.input_name
# Force ninja dry-run. Output can be on stderr on new ninja versions or
# stdout on old versions.
ninja_output = subprocess.check_output(
[
os.path.join(
fuchsia_root, "prebuilt/third_party/ninja/linux-x64/ninja"),
"-C", out_dir, "-v", "-n", target_name
],
stderr=subprocess.STDOUT).decode("utf-8")
if "ninja: no work to do." not in ninja_output:
print("Ninja reported work needed to be done for %s" % target_name)
if args.ignore_rebuild:
print("Ignoring")
else:
print("Use --ignore-rebuild flag to upload anyway")
sys.exit(1)
for driver in driver_list:
gn_args = driver.GnArgs()
gn_arg_mismatch = False
gn_output = subprocess.check_output(
[
os.path.join(fuchsia_root, "prebuilt/third_party/gn/linux-x64/gn"),
"args", out_dir, "--short", "--list"
]).decode("utf-8").strip()
for arg_name, arg_val in gn_args:
expected_output = "%s = %s" % (arg_name, "true" if arg_val else "false")
if expected_output not in gn_output:
print("Missing \"%s\" from GN arguments" % expected_output)
gn_arg_mismatch = True
if gn_arg_mismatch:
if args.ignore_buildtype:
print("Ignoring")
else:
print("Use --ignore-buildtype flag to upload anyway")
sys.exit(1)
for driver in driver_list:
full_name = os.path.join(driver.package_dir, driver.file_name)
source_file_name = os.path.join(out_dir, driver.input_name)
try:
os.remove(full_name)
except:
pass
try:
os.mkdir(driver.package_dir)
except:
pass
shutil.copyfile(source_file_name, full_name)
shutil.copyfile(
"../LICENSE.md", os.path.join(driver.package_dir, "LICENSE"))
buildidtool = os.path.join(
fuchsia_root, "prebuilt/tools/buildidtool/linux-x64/buildidtool")
cipd_path = os.path.join(fuchsia_root, ".jiri_root/bin/cipd")
# See
# https://fuchsia.dev/fuchsia-src/development/prebuilt_packages/publish_prebuilt_packages_to_cipd
# for symbol directory format
for driver in driver_list:
if not driver.symbol_package_name:
continue
try:
shutil.rmtree(driver.symbol_package_dir)
except:
pass
try:
os.mkdir(driver.symbol_package_dir)
except:
pass
for i, symbol_input_name in enumerate(driver.symbol_input_names):
subprocess.check_output(
[
buildidtool, "-entry",
".debug=" + os.path.join(out_dir, symbol_input_name),
"-build-id-dir", driver.symbol_package_dir,
"-stamp=" + os.path.join(
out_dir,
"build-intel-media-driver-stamp-" + debug_suffix + str(i))
])
for driver in driver_list:
driver.CalculateGitRevision()
def cipd_upload(package_dir, package_name, git_rev, fuchsia_git_rev):
cipd_command = (
"%s create -in %s -name %s -ref latest -install-mode copy "
"-tag git_revision:%s -tag fuchsia_git_revision:%s") % (
cipd_path, package_dir, package_name, git_rev, fuchsia_git_rev)
print(cipd_command)
if not args.dry_run:
subprocess.check_call(cipd_command.split(" "))
for driver in driver_list:
cipd_upload(
driver.package_dir, driver.package_name, driver.git_rev,
driver.fuchsia_git_rev)
if driver.symbol_package_name:
cipd_upload(
driver.symbol_package_dir, driver.symbol_package_name,
driver.git_rev, driver.fuchsia_git_rev)
print("Modifying jiri manifests")
public_manifest = "integration/fuchsia/prebuilts"
def print_latest_package_info(
package_name, prebuilt_path, manifest_path, attributes=None):
cipd_command = "%s describe %s -version latest" % (cipd_path, package_name)
cipd_output = subprocess.check_output(cipd_command.split()).decode("utf-8")
cipd_output = [x for x in cipd_output.split("\n") if "Instance ID:" in x]
package_id = re.search(r"Instance ID: +([0-9a-zA-Z_\-]+)",
cipd_output[0]).group(1)
if attributes:
attrib_string = '\n attributes="' + attributes + '"'
else:
attrib_string = ""
print(
(
"""
<package name="%s"
path="%s"
version="%s"%s/>
""" % (package_name, prebuilt_path, package_id, attrib_string))[1:-1])
os.system(
"jiri edit -package='%s=%s' %s" %
(package_name, package_id, os.path.join(fuchsia_root, manifest_path)))
for driver in driver_list:
print_latest_package_info(
driver.package_name, driver.prebuilt_path, public_manifest)
for driver in driver_list:
if driver.symbol_package_name:
print_latest_package_info(
driver.symbol_package_name, PREBUILT_BUILD_ID_DIR, public_manifest,
"debug-symbols,debug-symbols-x64,debug-symbols-" +
driver.driver_type)