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

     1  package main
     2  
     3  import (
     4  	"fmt"
     5  	"os"
     6  	// "os/exec"
     7  	"path/filepath"
     8  	"time"
     9  
    10  	"github.com/gonuts/commander"
    11  	"github.com/gonuts/flag"
    12  )
    13  
    14  func hwaf_make_cmd_waf_bdist() *commander.Command {
    15  	cmd := &commander.Command{
    16  		Run:       hwaf_run_cmd_waf_bdist,
    17  		UsageLine: "bdist [options]",
    18  		Short:     "create a binary distribution from the project or packages",
    19  		Long: `
    20  bdist creates a binary distribution from the project or packages.
    21  
    22  ex:
    23   $ hwaf bdist
    24   $ hwaf bdist -name=mana
    25   $ hwaf bdist -name=mana -version=20121218
    26   $ hwaf bdist -name=mana -version -variant=x86_64-linux-gcc-opt
    27  `,
    28  		Flag: *flag.NewFlagSet("hwaf-bdist", flag.ExitOnError),
    29  		//CustomFlags: true,
    30  	}
    31  	cmd.Flag.Bool("v", false, "enable verbose output")
    32  	cmd.Flag.String("name", "", "name of the binary distribution (default: project name)")
    33  	cmd.Flag.String("version", "", "version of the binary distribution (default: project version)")
    34  	cmd.Flag.String("variant", "", "HWAF_VARIANT quadruplet for the binary distribution (default: project VARIANT)")
    35  	return cmd
    36  }
    37  
    38  func hwaf_run_cmd_waf_bdist(cmd *commander.Command, args []string) error {
    39  	var err error
    40  	n := "hwaf-" + cmd.Name()
    41  
    42  	switch len(args) {
    43  	case 0:
    44  	default:
    45  		return fmt.Errorf("%s: too many arguments (%d)", n, len(args))
    46  	}
    47  
    48  	bdist_name := cmd.Flag.Lookup("name").Value.Get().(string)
    49  	bdist_vers := cmd.Flag.Lookup("version").Value.Get().(string)
    50  	bdist_variant := cmd.Flag.Lookup("variant").Value.Get().(string)
    51  
    52  	workdir, err := g_ctx.Workarea()
    53  	if err != nil {
    54  		// not a git repo... assume we are at the root, then...
    55  		workdir, err = os.Getwd()
    56  	}
    57  	if err != nil {
    58  		return err
    59  	}
    60  
    61  	pinfos, err := g_ctx.ProjectInfos()
    62  	if err != nil {
    63  		return err
    64  	}
    65  
    66  	if bdist_name == "" {
    67  		bdist_name = workdir
    68  		bdist_name = filepath.Base(bdist_name)
    69  	}
    70  	if bdist_vers == "" {
    71  		bdist_vers = time.Now().Format("20060102")
    72  	}
    73  	if bdist_variant == "" {
    74  		bdist_variant, err = pinfos.Get("HWAF_VARIANT")
    75  		if err != nil {
    76  			return err
    77  		}
    78  	}
    79  	fname := bdist_name + "-" + bdist_vers + "-" + bdist_variant + ".tar.gz"
    80  
    81  	//fmt.Printf(">> fname=[%s]\n", fname)
    82  	fname = filepath.Join(workdir, fname)
    83  
    84  	// first try destdir
    85  	install_area, err := pinfos.Get("DESTDIR")
    86  	if err != nil {
    87  		install_area, err = pinfos.Get("PREFIX")
    88  	}
    89  	if err != nil {
    90  		return err
    91  	}
    92  	if !path_exists(install_area) {
    93  		err = fmt.Errorf(
    94  			"no such directory [%s]. did you run \"hwaf install\" ?",
    95  			install_area,
    96  		)
    97  		if err != nil {
    98  			return err
    99  		}
   100  	}
   101  	// the prefix to prepend inside the tar-ball
   102  	prefix := bdist_name + "-" + bdist_vers //+ "-" + bdist_variant
   103  	// create a temporary install-area with the correct structure:
   104  	//  install-area/<pkgname>-<pkgvers>/...
   105  	bdist_dir := filepath.Join(workdir, ".hwaf-bdist-install-area-"+bdist_variant)
   106  	_ = os.RemoveAll(bdist_dir)
   107  	err = os.MkdirAll(bdist_dir, 0700)
   108  	if err != nil {
   109  		return err
   110  	}
   111  
   112  	// move the install-area...
   113  	err = os.Rename(install_area, filepath.Join(bdist_dir, prefix))
   114  	if err != nil {
   115  		return err
   116  	}
   117  	defer func() error {
   118  		err = os.Rename(filepath.Join(bdist_dir, prefix), install_area)
   119  		if err != nil {
   120  			return err
   121  		}
   122  		return os.RemoveAll(bdist_dir)
   123  	}()
   124  
   125  	err = _tar_gz(fname, bdist_dir)
   126  	if err != nil {
   127  		return err
   128  	}
   129  	return err
   130  }
   131  
   132  // EOF