| //===- main.go - Clang compiler wrapper for building libgo ----------------===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // This is a wrapper for Clang that passes invocations with -fdump-go-spec to |
| // GCC, and rewrites -fplan9-extensions to -fms-extensions. It is intended to |
| // go away once libgo's build no longer uses these flags. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| package main |
| |
| import ( |
| "fmt" |
| "os" |
| "os/exec" |
| "strings" |
| ) |
| |
| func runproc(name string, argv []string) { |
| path, err := exec.LookPath(name) |
| if err != nil { |
| fmt.Fprintf(os.Stderr, "cc-wrapper: could not find %s: %v\n", name, err) |
| os.Exit(1) |
| } |
| |
| proc, err := os.StartProcess(path, append([]string{name}, argv...), &os.ProcAttr{ |
| Files: []*os.File{os.Stdin, os.Stdout, os.Stderr}, |
| }) |
| if err != nil { |
| fmt.Fprintf(os.Stderr, "cc-wrapper: could not start %s: %v\n", name, err) |
| os.Exit(1) |
| } |
| |
| state, err := proc.Wait() |
| if err != nil { |
| fmt.Fprintf(os.Stderr, "cc-wrapper: could not wait for %s: %v\n", name, err) |
| os.Exit(1) |
| } |
| |
| if state.Success() { |
| os.Exit(0) |
| } else { |
| os.Exit(1) |
| } |
| } |
| |
| func main() { |
| newargs := make([]string, len(os.Args)-1) |
| for i, arg := range os.Args[1:] { |
| switch { |
| case strings.HasPrefix(arg, "-fdump-go-spec"): |
| runproc("gcc", os.Args[1:]) |
| |
| case arg == "-fplan9-extensions": |
| newargs[i] = "-fms-extensions" |
| newargs = append(newargs, "-Wno-microsoft") |
| |
| default: |
| newargs[i] = arg |
| } |
| } |
| |
| ccargs := strings.Split(os.Getenv("REAL_CC"), "@SPACE@") |
| runproc(ccargs[0], append(ccargs[1:], newargs...)) |
| } |