#!/usr/bin/env python3 # # Copyright (c) 2023, the Dart project authors. Please see the AUTHORS file # for details. All rights reserved. Use of this source code is governed by a # BSD-style license that can be found in the LICENSE file. # # Sign given binaries with using the specified signing identity and # using entitlements from runtime/tools/entitlement/${binary_name}.plist # if any. # import optparse import os import subprocess SCRIPT_DIR = os.path.dirname(os.path.realpath(__file__)) def SignBinary(identity, binary): codesign_args = [ "--deep", "--force", "--verify", "--verbose", "--timestamp", "--options", "runtime", "--sign", identity ] name = os.path.basename(binary) # Check if we have a matching entitlements file and apply it. # It would be simpler if we could specify it from outside but # GN does not give us tools for doing that: executable target can't # push arbitrary configuration down to the link tool where # we would like to perform code signing. entitlements_file = os.path.join(SCRIPT_DIR, "entitlements", name + ".plist") if os.path.exists(entitlements_file): codesign_args += ["--entitlements", entitlements_file] cmd = ["codesign"] + codesign_args + [binary] result = subprocess.run(cmd, capture_output=True, encoding="utf8") if result.returncode != 0: print("failed to run: " + " ".join(cmd)) print(f"exit code: {result.returncode}") print("stdout:") print(result.stdout) print("stdout:") print(result.stderr) raise Exception("failed to codesign") parser = optparse.OptionParser() parser.add_option("--identity", type="string", help="Code signing identity") parser.add_option("--binary", type="string", action="append", help="Binary to sign") options = parser.parse_args()[0] if not options.identity: raise Exception("Missing code signing identity (--identity)") if not options.binary: raise Exception("Missing binaries to sign (--binary)") for binary in options.binary: SignBinary(options.identity, binary)