// This file is copied from the SkCMS repository. Original file: // https://skia.googlesource.com/skcms/+/ba39d81f9797aa973bdf01aa6b0363b280352fba/toolchain/android_trampolines/gen_trampolines/gen_trampolines.go // // Helper program to generate trampoline scripts for NDK tools. // // This program is meant to be run by hand when making changes to the hermetic Android NDK // toolchain, e.g. when upgrading to a new Android NDK version. // // Trampoline scripts are necessary because the `cc_common.create_cc_toolchain_config_info`[1] // built-in Bazel function expects tool paths to point to files under the directory in which it is // invoked, thus we cannot directly reference tools under `external/ndk_linux_amd64`. The solution is // to use trampoline scripts that pass through any command-line arguments to the NDK binaries under // `external/android_sdk`. // // [1] https://bazel.build/rules/lib/cc_common#create_cc_toolchain_config_info package main import ( "errors" "flag" "fmt" "os" "path/filepath" ) const bazelNdkPath = "external/ndk_linux_amd64" // Paths relative to the Android NDK root directory. These paths can be determined by inspecting // the Android NDK ZIP file downloaded by the `download_toolchains` macro defined in // //toolchains/download_toolchains.bzl. var tools = []string{ "toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-ar", "toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-dwp", "toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-ld", "toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-nm", "toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-objcopy", "toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-objdump", "toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-strip", "toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-ar", "toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-dwp", "toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-ld", "toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-nm", "toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-objcopy", "toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-objdump", "toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-strip", "toolchains/llvm/prebuilt/linux-x86_64/bin/clang", } const trampolineScriptTemplate = `#!/bin/sh # Copyright 2023 Google LLC # # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. %s $@ ` func main() { ndkDirFlag := flag.String("ndk-dir", "", "Path to a local copy of the NDK. Used only to verify that the tool paths assumed by this program are valid. Required.") outDirFlag := flag.String("out-dir", "", "Directory where to save the trampoline scripts. Required.") flag.Parse() if *ndkDirFlag == "" || *outDirFlag == "" { flag.Usage() os.Exit(1) } for _, tool := range tools { // Verify that the tool exists in the NDK. ndkPath := filepath.Join(*ndkDirFlag, tool) if _, err := os.Stat(ndkPath); errors.Is(err, os.ErrNotExist) { fmt.Fprintf(os.Stderr, "File %s not found.", ndkPath) os.Exit(1) } // Generate trampoline script. trampolineScript := fmt.Sprintf(trampolineScriptTemplate, filepath.Join(bazelNdkPath, tool)) trampolineScriptPath := filepath.Join(*outDirFlag, filepath.Base(tool)+".sh") if err := os.WriteFile(trampolineScriptPath, []byte(trampolineScript), 0750); err != nil { fmt.Fprintf(os.Stderr, "Error writing file %s: %s", trampolineScriptPath, err) } } }