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