| #!/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) |