github.com/GoogleCloudPlatform/terraformer@v0.8.18/build/multi-build/main.go (about) 1 package main 2 3 import ( 4 "bytes" 5 "fmt" 6 "io/ioutil" 7 "log" 8 "os" 9 "os/exec" 10 "strings" 11 ) 12 13 const filePrefix = "provider_cmd_" 14 const fileSuffix = ".go" 15 const packageCmdPath = "cmd" 16 17 func main() { 18 // provider := os.Args[1] 19 allProviders := []string{} 20 files, err := ioutil.ReadDir(packageCmdPath) 21 if err != nil { 22 log.Println(err) 23 } 24 for _, f := range files { 25 if strings.HasPrefix(f.Name(), filePrefix) { 26 providerName := strings.ReplaceAll(f.Name(), filePrefix, "") 27 providerName = strings.ReplaceAll(providerName, fileSuffix, "") 28 allProviders = append(allProviders, providerName) 29 } 30 } 31 for _, OS := range []string{"linux", "windows", "mac"} { 32 for _, provider := range allProviders { 33 GOOS := "" 34 binaryName := "" 35 switch OS { 36 case "linux": 37 GOOS = "linux" 38 binaryName = "terraformer-" + provider + "-linux-amd64" 39 case "windows": 40 GOOS = "windows" 41 binaryName = "terraformer-" + provider + "-windows-amd64.exe" 42 case "mac": 43 GOOS = "darwin" 44 binaryName = "terraformer-" + provider + "-darwin-amd64" 45 } 46 log.Println("Build terraformer with "+provider+" provider...", "GOOS=", GOOS) 47 deletedProvider := []string{} 48 for _, f := range files { 49 if strings.HasPrefix(f.Name(), filePrefix) { 50 if !strings.HasPrefix(f.Name(), filePrefix+provider+fileSuffix) { 51 providerName := strings.ReplaceAll(f.Name(), filePrefix, "") 52 providerName = strings.ReplaceAll(providerName, fileSuffix, "") 53 deletedProvider = append(deletedProvider, providerName) 54 } 55 } 56 } 57 // move files for deleted providers 58 err := os.MkdirAll(packageCmdPath+"/tmp", os.ModePerm) 59 if err != nil { 60 log.Fatal("err:", err) 61 } 62 for _, provider := range deletedProvider { 63 err := os.Rename(packageCmdPath+"/"+filePrefix+provider+fileSuffix, packageCmdPath+"/tmp/"+filePrefix+provider+fileSuffix) 64 if err != nil { 65 log.Println(err) 66 } 67 } 68 69 // comment deleted providers in code 70 rootCode, err := ioutil.ReadFile(packageCmdPath + "/root.go") 71 if err != nil { 72 log.Fatal("err:", err) 73 } 74 lines := strings.Split(string(rootCode), "\n") 75 newRootCodeLines := make([]string, len(lines)) 76 for i, line := range lines { 77 for _, provider := range deletedProvider { 78 if strings.Contains(strings.ToLower(line), "newcmd"+provider+"importer") { 79 line = "// " + line 80 } 81 if strings.Contains(strings.ToLower(line), "new"+provider+"provider") { 82 line = "// " + line 83 } 84 } 85 newRootCodeLines[i] = line 86 } 87 newRootCode := strings.Join(newRootCodeLines, "\n") 88 err = ioutil.WriteFile(packageCmdPath+"/root.go", []byte(newRootCode), os.ModePerm) 89 if err != nil { 90 log.Fatal("err:", err) 91 } 92 93 // build.... 94 cmd := exec.Command("go", "build", "-v", "-o", binaryName) 95 cmd.Env = os.Environ() 96 cmd.Env = append(cmd.Env, "GOOS="+GOOS) 97 var outb, errb bytes.Buffer 98 cmd.Stdout = &outb 99 cmd.Stderr = &errb 100 err = cmd.Run() 101 if err != nil { 102 log.Fatal("err:", errb.String()) 103 } 104 fmt.Println(outb.String()) 105 106 // revert code and files 107 err = ioutil.WriteFile(packageCmdPath+"/root.go", rootCode, os.ModePerm) 108 if err != nil { 109 log.Fatal("err:", err) 110 } 111 for _, provider := range deletedProvider { 112 err := os.Rename(packageCmdPath+"/tmp/"+filePrefix+provider+fileSuffix, "cmd/"+filePrefix+provider+fileSuffix) 113 if err != nil { 114 log.Println(err) 115 } 116 } 117 } 118 } 119 }