| // Copyright 2019 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. |
| |
| // +build !build_with_native_toolchain |
| |
| // The Fuchsia Go Grand Unified Binary is a binary that contains several other |
| // binaries, so done in order to reduce the amount of disk space and shared |
| // memory required to run Fuchsia subsystems written in Go. This combination |
| // saves >=50% of storage and ram cost on a running system at boot/update time. |
| package main |
| |
| import ( |
| "log" |
| "os" |
| "path/filepath" |
| "strings" |
| |
| "go.fuchsia.dev/fuchsia/src/connectivity/network/netstack" |
| "go.fuchsia.dev/fuchsia/src/connectivity/network/netstack/ifconfig" |
| "go.fuchsia.dev/fuchsia/src/sys/pkg/bin/amber/amberctl" |
| "go.fuchsia.dev/fuchsia/src/sys/pkg/bin/pkgfs/pkgsvr" |
| ) |
| |
| func main() { |
| // The new fuchsia build templates do not support renaming a binary and properly |
| // including its dependent libraries in a package. As a workaround, we leave the |
| // binary name untouched and check the second argument if the first argument is |
| // the default binary name. |
| // TODO(fxbug.dev/55842): Remove this workaround. |
| if len(os.Args) != 0 && filepath.Base(os.Args[0]) == "grand_unified_binary" { |
| os.Args[0] = "" |
| os.Args = os.Args[1:] |
| } |
| |
| if len(os.Args) < 1 { |
| log.Println("software delivery grand unified binary: cannot determine binary, no argv 0") |
| os.Exit(1) |
| } |
| name := filepath.Base(os.Args[0]) |
| name = strings.SplitN(name, ".", 2)[0] |
| switch name { |
| case "pkgsvr": |
| pkgsvr.Main() |
| case "amberctl", "amber_ctl": |
| amberctl.Main() |
| case "netstack": |
| netstack.Main() |
| case "ifconfig": |
| ifconfig.Main() |
| default: |
| log.Printf("software delivery grand unified binary: unknown inner binary name: %s (%s)", name, os.Args[0]) |
| os.Exit(1) |
| } |
| } |