github.com/hwaf/hwaf@v0.0.0-20140814122253-5465f73b20f1/cmd_init.go (about) 1 package main 2 3 import ( 4 "fmt" 5 "io" 6 "io/ioutil" 7 "os" 8 "path/filepath" 9 "runtime" 10 "strings" 11 12 "github.com/gonuts/commander" 13 "github.com/gonuts/flag" 14 "github.com/hwaf/gas" 15 ) 16 17 func hwaf_make_cmd_init() *commander.Command { 18 cmd := &commander.Command{ 19 Run: hwaf_run_cmd_init, 20 UsageLine: "init [options] <workarea>", 21 Short: "initialize a new workarea", 22 Long: ` 23 init initializes a new workarea. 24 25 ex: 26 $ hwaf init 27 $ hwaf init . 28 $ hwaf init my-work-area 29 `, 30 Flag: *flag.NewFlagSet("hwaf-init", flag.ExitOnError), 31 } 32 cmd.Flag.Bool("v", false, "enable verbose output") 33 return cmd 34 } 35 36 func hwaf_run_cmd_init(cmd *commander.Command, args []string) error { 37 var err error 38 n := "hwaf-" + cmd.Name() 39 dirname := "" 40 41 switch len(args) { 42 case 0: 43 dirname = "." 44 case 1: 45 dirname = args[0] 46 default: 47 return fmt.Errorf("%s: you need to give a directory name", n) 48 } 49 50 dirname = os.ExpandEnv(dirname) 51 dirname = filepath.Clean(dirname) 52 53 verbose := cmd.Flag.Lookup("v").Value.Get().(bool) 54 proj_name := dirname 55 if proj_name == "." { 56 pwd, err := os.Getwd() 57 if err != nil { 58 return err 59 } 60 proj_name = filepath.Base(pwd) 61 } else { 62 proj_name = filepath.Base(dirname) 63 } 64 65 if verbose { 66 fmt.Printf("%s: creating workarea [%s]...\n", n, dirname) 67 } 68 69 if !path_exists(dirname) { 70 err = os.MkdirAll(dirname, 0700) 71 if err != nil { 72 return err 73 } 74 } 75 76 pwd, err := os.Getwd() 77 if err != nil { 78 return err 79 } 80 defer os.Chdir(pwd) 81 82 err = os.Chdir(dirname) 83 if err != nil { 84 return err 85 } 86 87 // setup hep-waf-tools 88 if verbose { 89 fmt.Printf("%s: add .hwaf/tools...\n", n) 90 } 91 hwaf_tools_dir := "" 92 switch g_ctx.Root { 93 default: 94 hwaf_tools_dir = filepath.Join(g_ctx.Root, "share", "hwaf", "tools") 95 case "": 96 hwaf_tools_dir, err = gas.Abs("github.com/hwaf/hwaf/py-hwaftools") 97 if err != nil { 98 return err 99 } 100 } 101 102 hwaf_tools_dir = os.ExpandEnv(hwaf_tools_dir) 103 if verbose { 104 fmt.Printf("%s: using hwaf/tools from [%s]...\n", n, hwaf_tools_dir) 105 } 106 if !path_exists(hwaf_tools_dir) { 107 return fmt.Errorf("no such directory [%s]", hwaf_tools_dir) 108 } 109 if !path_exists(".hwaf") { 110 err = os.MkdirAll(".hwaf", 0700) 111 if err != nil { 112 return err 113 } 114 } 115 116 // add waf-bin 117 { 118 if verbose { 119 fmt.Printf("%s: add .hwaf/bin...\n", n) 120 } 121 hwaf_bin_dir := "" 122 switch g_ctx.Root { 123 default: 124 hwaf_bin_dir = filepath.Join(g_ctx.Root, "bin") 125 case "": 126 hwaf_bin_dir, err = gas.Abs("github.com/hwaf/hwaf") 127 if err != nil { 128 return err 129 } 130 } 131 hwaf_bin_dir = os.ExpandEnv(hwaf_bin_dir) 132 if verbose { 133 fmt.Printf("%s: using hwaf-bin from [%s]...\n", n, hwaf_bin_dir) 134 } 135 if !path_exists(hwaf_bin_dir) { 136 err = fmt.Errorf("no such hwaf-bin dir [%s]", hwaf_bin_dir) 137 if err != nil { 138 return err 139 } 140 } 141 src_waf, err := os.Open(filepath.Join(hwaf_bin_dir, "waf")) 142 if err != nil { 143 return err 144 } 145 defer src_waf.Close() 146 147 if !path_exists(".hwaf/bin") { 148 err = os.MkdirAll(".hwaf/bin", 0700) 149 if err != nil { 150 return err 151 } 152 } 153 154 waf_bin, err := os.Create(filepath.Join(".hwaf", "bin", "waf")) 155 if err != nil { 156 return err 157 } 158 defer waf_bin.Close() 159 160 if runtime.GOOS != "windows" { 161 err = waf_bin.Chmod(0755) 162 if err != nil { 163 return err 164 } 165 } 166 167 _, err = io.Copy(waf_bin, src_waf) 168 if err != nil { 169 return err 170 } 171 172 err = waf_bin.Sync() 173 if err != nil { 174 return err 175 } 176 } 177 178 // add pkgdb 179 err = ioutil.WriteFile( 180 filepath.Join(".hwaf", "pkgdb.json"), 181 []byte("{}\n"), 182 0755, 183 ) 184 if err != nil { 185 return err 186 } 187 188 // add template wscript 189 if verbose { 190 fmt.Printf("%s: add top-level wscript...\n", n) 191 } 192 193 if !path_exists("wscript") { 194 wscript_tmpl, err := os.Open(filepath.Join(hwaf_tools_dir, "hwaf-wscript")) 195 if err != nil { 196 return err 197 } 198 defer wscript_tmpl.Close() 199 200 wscript_b, err := ioutil.ReadAll(wscript_tmpl) 201 if err != nil { 202 return err 203 } 204 205 // replace 'hwaf-workarea' with workarea name 206 wscript_s := strings.Replace( 207 string(wscript_b), 208 "APPNAME = 'hwaf-workarea'", 209 fmt.Sprintf("APPNAME = '%s'", proj_name), 210 -1) 211 212 wscript, err := os.Create("wscript") 213 if err != nil { 214 return err 215 } 216 defer wscript.Close() 217 218 _, err = io.WriteString(wscript, wscript_s) 219 if err != nil { 220 return err 221 } 222 err = wscript.Sync() 223 if err != nil { 224 return err 225 } 226 err = wscript.Close() 227 if err != nil { 228 return err 229 } 230 } 231 232 // create 'src' directory 233 if !path_exists("src") { 234 err = os.MkdirAll("src", 0700) 235 if err != nil { 236 return err 237 } 238 } 239 240 if verbose { 241 fmt.Printf("%s: creating workarea [%s]... [ok]\n", n, dirname) 242 } 243 244 return err 245 } 246 247 // EOF