github.com/prattmic/llgo-embedded@v0.0.0-20150820070356-41cfecea0e1e/cmd/cc-wrapper/main.go (about)

     1  //===- main.go - Clang compiler wrapper for building libgo ----------------===//
     2  //
     3  //                     The LLVM Compiler Infrastructure
     4  //
     5  // This file is distributed under the University of Illinois Open Source
     6  // License. See LICENSE.TXT for details.
     7  //
     8  //===----------------------------------------------------------------------===//
     9  //
    10  // This is a wrapper for Clang that passes invocations with -fdump-go-spec to
    11  // GCC, and rewrites -fplan9-extensions to -fms-extensions. It is intended to
    12  // go away once libgo's build no longer uses these flags.
    13  //
    14  //===----------------------------------------------------------------------===//
    15  
    16  package main
    17  
    18  import (
    19  	"fmt"
    20  	"os"
    21  	"os/exec"
    22  	"strings"
    23  )
    24  
    25  func runproc(name string, argv []string) {
    26  	path, err := exec.LookPath(name)
    27  	if err != nil {
    28  		fmt.Fprintf(os.Stderr, "cc-wrapper: could not find %s: %v\n", name, err)
    29  		os.Exit(1)
    30  	}
    31  
    32  	proc, err := os.StartProcess(path, append([]string{name}, argv...), &os.ProcAttr{
    33  		Files: []*os.File{os.Stdin, os.Stdout, os.Stderr},
    34  	})
    35  	if err != nil {
    36  		fmt.Fprintf(os.Stderr, "cc-wrapper: could not start %s: %v\n", name, err)
    37  		os.Exit(1)
    38  	}
    39  
    40  	state, err := proc.Wait()
    41  	if err != nil {
    42  		fmt.Fprintf(os.Stderr, "cc-wrapper: could not wait for %s: %v\n", name, err)
    43  		os.Exit(1)
    44  	}
    45  
    46  	if state.Success() {
    47  		os.Exit(0)
    48  	} else {
    49  		os.Exit(1)
    50  	}
    51  }
    52  
    53  func main() {
    54  	newargs := make([]string, len(os.Args)-1)
    55  	for i, arg := range os.Args[1:] {
    56  		switch {
    57  		case strings.HasPrefix(arg, "-fdump-go-spec"):
    58  			runproc("gcc", os.Args[1:])
    59  
    60  		case arg == "-fplan9-extensions":
    61  			newargs[i] = "-fms-extensions"
    62  			newargs = append(newargs, "-Wno-microsoft")
    63  
    64  		default:
    65  			newargs[i] = arg
    66  		}
    67  	}
    68  
    69  	ccargs := strings.Split(os.Getenv("REAL_CC"), "@SPACE@")
    70  	runproc(ccargs[0], append(ccargs[1:], newargs...))
    71  }