//===- main.go - Clang compiler wrapper for building libgo ----------------===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // // 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...)) }