github.com/hwaf/hwaf@v0.0.0-20140814122253-5465f73b20f1/cmd_setup.go (about) 1 package main 2 3 import ( 4 "fmt" 5 "os" 6 "path/filepath" 7 "strings" 8 9 "github.com/gonuts/commander" 10 gocfg "github.com/gonuts/config" 11 "github.com/gonuts/flag" 12 "github.com/hwaf/hwaf/hwaflib" 13 ) 14 15 func hwaf_make_cmd_setup() *commander.Command { 16 cmd := &commander.Command{ 17 Run: hwaf_run_cmd_setup, 18 UsageLine: "setup [options] <workarea>", 19 Short: "setup an existing workarea", 20 Long: ` 21 setup sets up an existing workarea. 22 23 ex: 24 $ hwaf setup 25 $ hwaf setup . 26 $ hwaf setup my-work-area 27 $ hwaf setup -p=/opt/sw/mana/mana-core/20121207 my-work-area 28 $ hwaf setup -p=/path1:/path2 my-work-area 29 $ hwaf setup -cfg=${HWAF_CFG}/usr.cfg my-work-area 30 $ hwaf setup -tags=ATLAS,NEED_PYCOOL my-work-area 31 $ hwaf setup -variant=x86_64-slc6-gcc47-opt my-work-area 32 `, 33 Flag: *flag.NewFlagSet("hwaf-setup", flag.ExitOnError), 34 } 35 cmd.Flag.String("p", "", "List of paths to projects to setup against") 36 cmd.Flag.String("cfg", "", "Path to a configuration file") 37 cmd.Flag.String("pkgdir", "src", "Directory under which to checkout packages") 38 cmd.Flag.String("variant", "", "quadruplet (e.g. x86_64-slc6-gcc47-opt) identifying the target to build for") 39 cmd.Flag.String("tags", "", "comma-separated list of tags to enable for this build") 40 cmd.Flag.Bool("v", false, "enable verbose output") 41 42 return cmd 43 } 44 45 func hwaf_run_cmd_setup(cmd *commander.Command, args []string) error { 46 var err error 47 n := "hwaf-" + cmd.Name() 48 dirname := "." 49 switch len(args) { 50 case 0: 51 dirname = "." 52 case 1: 53 dirname = args[0] 54 default: 55 return fmt.Errorf("%s: you need to give a directory name", n) 56 } 57 58 dirname = os.ExpandEnv(dirname) 59 dirname = filepath.Clean(dirname) 60 61 verbose := cmd.Flag.Lookup("v").Value.Get().(bool) 62 cfg_fname := cmd.Flag.Lookup("cfg").Value.Get().(string) 63 pkgdir := cmd.Flag.Lookup("pkgdir").Value.Get().(string) 64 variant := cmd.Flag.Lookup("variant").Value.Get().(string) 65 tags := cmd.Flag.Lookup("tags").Value.Get().(string) 66 67 projdirs := []string{} 68 const pathsep = string(os.PathListSeparator) 69 for _, v := range strings.Split(cmd.Flag.Lookup("p").Value.Get().(string), pathsep) { 70 if v != "" { 71 v = os.ExpandEnv(v) 72 v = filepath.Clean(v) 73 projdirs = append(projdirs, v) 74 } 75 } 76 77 if verbose { 78 fmt.Printf("%s: setup workarea [%s]...\n", n, dirname) 79 fmt.Printf("%s: projects=%v\n", n, projdirs) 80 if cfg_fname != "" { 81 fmt.Printf("%s: cfg-file=%s\n", n, cfg_fname) 82 } 83 } 84 85 if cfg_fname != "" && !path_exists(cfg_fname) { 86 err = fmt.Errorf("configuration file [%s] does not exist (or is not readable)", cfg_fname) 87 if err != nil { 88 return err 89 } 90 } 91 92 for _, projdir := range projdirs { 93 if !path_exists(projdir) { 94 err = fmt.Errorf("no such directory: [%s]", projdir) 95 if err != nil { 96 return err 97 } 98 } 99 100 pinfo := filepath.Join(projdir, "project.info") 101 if !path_exists(pinfo) { 102 err = fmt.Errorf("no such file: [%s]", pinfo) 103 if err != nil { 104 return err 105 } 106 } 107 } 108 109 pwd, err := os.Getwd() 110 if err != nil { 111 return err 112 } 113 defer os.Chdir(pwd) 114 115 err = os.Chdir(dirname) 116 if err != nil { 117 return err 118 } 119 120 if verbose { 121 fmt.Printf("%s: create local config...\n", n) 122 } 123 124 var lcfg *gocfg.Config 125 lcfg_fname := "local.conf" 126 127 // if the user provided a configuration file use that as a default 128 if cfg_fname != "" && path_exists(cfg_fname) { 129 lcfg, err = gocfg.ReadDefault(cfg_fname) 130 if err != nil { 131 return err 132 } 133 } else { 134 if path_exists(lcfg_fname) { 135 lcfg, err = gocfg.ReadDefault(lcfg_fname) 136 if err != nil { 137 return err 138 } 139 } else { 140 lcfg = gocfg.NewDefault() 141 } 142 } 143 144 section := "hwaf-cfg" 145 if !lcfg.HasSection(section) && !lcfg.AddSection(section) { 146 return fmt.Errorf("%s: could not create section [%s] in file [%s]", 147 n, section, lcfg_fname) 148 } 149 150 // fetch a few informations from the first project.info 151 proj_variant := g_ctx.Variant() 152 //projvers := time.Now().Format("20060102") 153 if len(projdirs) > 0 { 154 pinfo, err := hwaflib.NewProjectInfos(filepath.Join(projdirs[0], "project.info")) 155 if err != nil { 156 return err 157 } 158 proj_variant, err = pinfo.Get("HWAF_VARIANT") 159 if err != nil { 160 return err 161 } 162 } 163 164 if variant != "" { 165 proj_variant = variant 166 } 167 168 if tags != "" { 169 tags_slice := strings.Split(tags, ",") 170 tags = strings.Join(tags_slice, " ") 171 } 172 173 for k, v := range map[string]string{ 174 "projects": strings.Join(projdirs, pathsep), 175 "pkgdir": pkgdir, 176 "variant": proj_variant, 177 "tags": tags, 178 } { 179 if lcfg.HasOption(section, k) { 180 lcfg.RemoveOption(section, k) 181 } 182 if !lcfg.AddOption(section, k, v) { 183 return fmt.Errorf("%s: could not add option [%s] to section [%s]", 184 n, k, section, 185 ) 186 } 187 } 188 189 err = lcfg.WriteFile(lcfg_fname, 0600, "") 190 if err != nil { 191 return err 192 } 193 194 if verbose { 195 fmt.Printf("%s: setup workarea [%s]... [ok]\n", n, dirname) 196 } 197 198 return err 199 } 200 201 // EOF