github.com/hwaf/hwaf@v0.0.0-20140814122253-5465f73b20f1/cmd_pkg_create.go (about)

     1  package main
     2  
     3  import (
     4  	"fmt"
     5  	"os"
     6  	"os/user"
     7  	"path/filepath"
     8  	"strings"
     9  	"text/template"
    10  
    11  	"github.com/gonuts/commander"
    12  	"github.com/gonuts/flag"
    13  )
    14  
    15  func hwaf_make_cmd_pkg_create() *commander.Command {
    16  	cmd := &commander.Command{
    17  		Run:       hwaf_run_cmd_pkg_create,
    18  		UsageLine: "create [options] <pkg-full-path>",
    19  		Short:     "create a new package in the current workarea",
    20  		Long: `
    21  create creates a new package in the current workarea.
    22  
    23  ex:
    24   $ hwaf pkg create MyPath/MyPackage
    25   $ hwaf pkg create -script=yml MyPath/MyPackage
    26   $ hwaf pkg create -script=py  MyPath/MyPackage
    27  `,
    28  		Flag: *flag.NewFlagSet("hwaf-pkg-create", flag.ExitOnError),
    29  	}
    30  	cmd.Flag.Bool("v", false, "enable verbose output")
    31  	cmd.Flag.String("script", "yml", "type of the hwaf script to use (yml|py)")
    32  	cmd.Flag.String("authors", "", "comma-separated list of authors for the new package")
    33  	return cmd
    34  }
    35  
    36  func hwaf_run_cmd_pkg_create(cmd *commander.Command, args []string) error {
    37  	var err error
    38  	n := "hwaf-pkg-" + cmd.Name()
    39  	pkgpath := ""
    40  	switch len(args) {
    41  	case 1:
    42  		pkgpath = args[0]
    43  	default:
    44  		return fmt.Errorf("%s: you need to give a package (full) path", n)
    45  	}
    46  
    47  	script := cmd.Flag.Lookup("script").Value.Get().(string)
    48  	switch script {
    49  	case "yml", "py":
    50  		// ok
    51  	default:
    52  		return fmt.Errorf("%s: script type is either 'yml' or 'py' (got: %q)", n, script)
    53  	}
    54  
    55  	verbose := cmd.Flag.Lookup("v").Value.Get().(bool)
    56  	authors := func() []string {
    57  		authors := cmd.Flag.Lookup("authors").Value.Get().(string)
    58  		out := make([]string, 0, 1)
    59  		for _, s := range strings.Split(authors, ",") {
    60  			s = strings.Trim(s, " ")
    61  			if s == "" {
    62  				continue
    63  			}
    64  			out = append(out, s)
    65  		}
    66  		return out
    67  	}()
    68  
    69  	if len(authors) == 0 {
    70  		usr, err := user.Current()
    71  		if err != nil {
    72  			return err
    73  		}
    74  		//fmt.Printf(">>>>> %v\n", usr)
    75  		usrname := usr.Name
    76  		if usrname == "" {
    77  			usrname = usr.Username
    78  		}
    79  		authors = []string{usrname}
    80  	}
    81  
    82  	if verbose {
    83  		fmt.Printf("%s: create package [%s]...\n", n, pkgpath)
    84  	}
    85  
    86  	cfg, err := g_ctx.LocalCfg()
    87  	if err != nil {
    88  		return err
    89  	}
    90  
    91  	pkgdir := "src"
    92  	if cfg.HasOption("hwaf-cfg", "pkgdir") {
    93  		pkgdir, err = cfg.String("hwaf-cfg", "pkgdir")
    94  		if err != nil {
    95  			return err
    96  		}
    97  	}
    98  
    99  	dir := filepath.Join(pkgdir, pkgpath)
   100  	if path_exists(dir) {
   101  		err = fmt.Errorf("%s: directory [%s] already exists on filesystem", n, dir)
   102  		if err != nil {
   103  			return err
   104  		}
   105  	}
   106  
   107  	err = os.MkdirAll(dir, 0755)
   108  	if err != nil {
   109  		return err
   110  	}
   111  
   112  	if g_ctx.PkgDb.HasPkg(dir) {
   113  		return fmt.Errorf("%s: a package with name [%s] already exists", n, dir)
   114  	}
   115  
   116  	pkgname := filepath.Base(pkgpath)
   117  
   118  	const w_txt = `# -*- python -*-
   119  # automatically generated wscript
   120  
   121  import waflib.Logs as msg
   122  
   123  PACKAGE = {
   124      'name': '{{.FullName}}',
   125      'author': [{{.Authors | printlst }}], 
   126  }
   127  
   128  def pkg_deps(ctx):
   129      # put your package dependencies here.
   130      # e.g.:
   131      # ctx.use_pkg('AtlasPolicy')
   132      return
   133  
   134  def configure(ctx):
   135      msg.debug('[configure] package name: '+PACKAGE['name'])
   136      return
   137  
   138  def build(ctx):
   139      # build artifacts
   140      # e.g.:
   141      # ctx(
   142      #    features = 'atlas_component',
   143      #    name = '{{.Name}}',
   144      #    source = 'src/*.cxx src/components/*.cxx',
   145      #    use = ['lib1', 'lib2', 'ROOT', 'boost', ...],
   146      # )
   147      # ctx(
   148      #    features = 'atlas_install_headers',
   149      #    name = '{{.Name}}-install-headers',
   150      # )
   151      # ctx(
   152      #    features = 'atlas_install_python_modules',
   153      #    name = '{{.Name}}-install-py-modules',
   154      # )
   155      # ctx(
   156      #    features = 'atlas_install_joboptions',
   157      #    name = '{{.Name}}-install-jobos',
   158      # )
   159      return
   160  `
   161  
   162  	const h_txt = `# -*- yaml -*-
   163  # automatically generated hscript
   164  
   165  package: {
   166    name: "{{.FullName}}",
   167    authors: [{{.Authors | printlst}}],
   168  
   169    ## dependencies of this package
   170    deps: {
   171      public: [
   172      ],
   173  
   174      private: [
   175      ],
   176  
   177      # specify runtime dependencies
   178      # e.g: python modules for scripts installed by this package
   179      #      binaries used by scripts installed by this package
   180      runtime: [
   181      ],
   182    },
   183  }
   184  
   185  options: {}
   186  configure: {}
   187  
   188  build: {
   189    # build artifacts
   190    # e.g.:
   191    # {{.Name}}: {
   192    #    features: "atlas_component",
   193    #    source:   "src/*.cxx src/components/*.cxx",
   194    #    use:      ["lib1", "lib2", "ROOT", "boost", ...],
   195    # }
   196  }
   197  
   198  ## EOF ##
   199  `
   200  	txt := h_txt
   201  	fname := "hscript.yml"
   202  
   203  	switch script {
   204  	case "yml":
   205  		txt = h_txt
   206  		fname = "hscript.yml"
   207  	case "py":
   208  		txt = w_txt
   209  		fname = "hscript.py"
   210  	}
   211  
   212  	// create generic structure...
   213  	for _, d := range []string{
   214  		//"cmt",
   215  		pkgname,
   216  		"src",
   217  	} {
   218  		err = os.MkdirAll(filepath.Join(dir, d), 0755)
   219  		if err != nil {
   220  			return err
   221  		}
   222  	}
   223  
   224  	wscript, err := os.Create(filepath.Join(dir, fname))
   225  	if err != nil {
   226  		return err
   227  	}
   228  	defer func(err *error) {
   229  		*err = wscript.Sync()
   230  		if *err != nil {
   231  			return
   232  		}
   233  		*err = wscript.Close()
   234  	}(&err)
   235  
   236  	/* fill the template */
   237  	pkg := struct {
   238  		FullName string
   239  		Name     string
   240  		Authors  []string
   241  	}{
   242  		FullName: pkgpath,
   243  		Name:     pkgname,
   244  		Authors:  authors,
   245  	}
   246  	tmpl := template.New(script).Funcs(template.FuncMap{
   247  		"printlst": func(lst []string) string {
   248  			out := []string{}
   249  			for idx, s := range lst {
   250  				s = strings.Trim(s, " ")
   251  				if s == "" {
   252  					continue
   253  				}
   254  				comma := ","
   255  				if idx+1 == len(lst) {
   256  					comma = ""
   257  				}
   258  				out = append(out, fmt.Sprintf("%q%s", s, comma))
   259  			}
   260  			return strings.Join(out, " ")
   261  		},
   262  	})
   263  	tmpl, err = tmpl.Parse(txt)
   264  	if err != nil {
   265  		return err
   266  	}
   267  	err = tmpl.Execute(wscript, &pkg)
   268  	if err != nil {
   269  		return err
   270  	}
   271  
   272  	err = g_ctx.PkgDb.Add("local", "", pkgdir, dir)
   273  	if err != nil {
   274  		return err
   275  	}
   276  
   277  	if verbose {
   278  		fmt.Printf("%s: create package [%s]... [ok]\n", n, pkgpath)
   279  	}
   280  
   281  	return err
   282  }
   283  
   284  // EOF