You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by cc...@apache.org on 2015/11/21 01:42:48 UTC

[23/42] incubator-mynewt-newt git commit: Move newt source into a "newt" subdirectory.

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/blob/e95057f4/cli/compiler.go
----------------------------------------------------------------------
diff --git a/cli/compiler.go b/cli/compiler.go
deleted file mode 100644
index 94cea3a..0000000
--- a/cli/compiler.go
+++ /dev/null
@@ -1,619 +0,0 @@
-/*
- Copyright 2015 Runtime Inc.
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-*/
-
-package cli
-
-import (
-	"io/ioutil"
-	"log"
-	"os"
-	"path"
-	"path/filepath"
-	"sort"
-	"strings"
-	"time"
-)
-
-const (
-	COMPILER_TYPE_C   = 0
-	COMPILER_TYPE_ASM = 1
-)
-
-type Compiler struct {
-	ConfigPath   string
-	TargetName   string
-	BaseIncludes map[string]bool
-	ObjPathList  map[string]bool
-	LinkerScript string
-
-	Cflags string
-	Aflags string
-	Lflags string
-
-	depTracker            DepTracker
-	ccPath                string
-	asPath                string
-	arPath                string
-	odPath                string
-	osPath                string
-	ocPath                string
-	ldFlags               string
-	ldResolveCircularDeps bool
-	ldMapFile             bool
-}
-
-func NewCompiler(ccPath string, cDef string, tName string, includes []string) (
-	*Compiler, error) {
-
-	c := &Compiler{
-		ConfigPath:   ccPath,
-		TargetName:   tName,
-		BaseIncludes: map[string]bool{},
-		ObjPathList:  map[string]bool{},
-	}
-
-	c.depTracker = NewDepTracker(c)
-	for _, incl := range includes {
-		c.BaseIncludes[incl] = true
-	}
-
-	StatusMessage(VERBOSITY_VERBOSE,
-		"Loading compiler %s, target %s, def %s\n", ccPath, tName, cDef)
-
-	err := c.ReadSettings(cDef)
-	if err != nil {
-		return nil, err
-	}
-
-	return c, nil
-}
-
-func (c *Compiler) ReadSettings(cDef string) error {
-	v, err := ReadConfig(c.ConfigPath, "compiler")
-	if err != nil {
-		return err
-	}
-
-	c.ccPath = v.GetString("compiler.path.cc")
-	c.asPath = v.GetString("compiler.path.as")
-	c.arPath = v.GetString("compiler.path.archive")
-	c.odPath = v.GetString("compiler.path.objdump")
-	c.osPath = v.GetString("compiler.path.objsize")
-	c.ocPath = v.GetString("compiler.path.objcopy")
-
-	cflags := v.GetStringSlice("compiler.flags." + cDef)
-	for _, flag := range cflags {
-		if strings.HasPrefix(flag, "compiler.flags") {
-			c.Cflags += " " + strings.Trim(v.GetString(flag), "\n")
-		} else {
-			c.Cflags += " " + strings.Trim(flag, "\n")
-		}
-	}
-
-	c.ldFlags = v.GetString("compiler.ld.flags")
-	c.ldResolveCircularDeps = v.GetBool("compiler.ld.resolve_circular_deps")
-	c.ldMapFile = v.GetBool("compiler.ld.mapfile")
-
-	log.Printf("[INFO] ccPath = %s, arPath = %s, flags = %s", c.ccPath,
-		c.arPath, c.Cflags)
-
-	return nil
-}
-
-// Skips compilation of the specified C or assembly file, but adds the name of
-// the object file that would have been generated to the compiler's list of
-// object files.  This function is used when the object file is already up to
-// date, so no compilation is necessary.  The name of the object file should
-// still be remembered so that it gets linked in to the final library or
-// executable.
-func (c *Compiler) SkipSourceFile(srcFile string) error {
-	wd, _ := os.Getwd()
-	objDir := wd + "/obj/" + c.TargetName + "/"
-	objFile := objDir + strings.TrimSuffix(srcFile, filepath.Ext(srcFile)) +
-		".o"
-	c.ObjPathList[filepath.ToSlash(objFile)] = true
-
-	// Update the dependency tracker with the object file's modification time.
-	// This is necessary later for determining if the library / executable
-	// needs to be rebuilt.
-	err := c.depTracker.ProcessFileTime(objFile)
-	if err != nil {
-		return err
-	}
-
-	return nil
-}
-
-// Generates a string consisting of all the necessary include path (-I)
-// options.  The result is sorted and contains no duplicate paths.
-func (c *Compiler) IncludesString() string {
-	includes := make([]string, 0, len(c.BaseIncludes))
-	for k, _ := range c.BaseIncludes {
-		includes = append(includes, filepath.ToSlash(k))
-	}
-
-	sort.Strings(includes)
-
-	return "-I" + strings.Join(includes, " -I")
-}
-
-// Calculates the command-line invocation necessary to compile the specified C
-// or assembly file.
-//
-// @param file                  The filename of the source file to compile.
-// @param compilerType          One of the COMPILER_TYPE_[...] constants.
-//
-// @return                      (success) The command string.
-func (c *Compiler) CompileFileCmd(file string,
-	compilerType int) (string, error) {
-
-	wd, _ := os.Getwd()
-	objDir := wd + "/obj/" + c.TargetName + "/"
-	objFile := strings.TrimSuffix(file, filepath.Ext(file)) + ".o"
-	objPath := filepath.ToSlash(objDir + objFile)
-
-	var cmd string
-
-	switch compilerType {
-	case COMPILER_TYPE_C:
-		cmd = c.ccPath
-	case COMPILER_TYPE_ASM:
-		cmd = c.asPath
-	default:
-		return "", NewNewtError("Unknown compiler type")
-	}
-
-	cmd += " -c " + "-o " + objPath + " " + file +
-		" " + c.Cflags + " " + c.IncludesString()
-
-	return cmd, nil
-}
-
-// Generates a dependency Makefile (.d) for the specified source C file.
-//
-// @param file                  The name of the source file.
-func (c *Compiler) GenDepsForFile(file string) error {
-	wd, _ := os.Getwd()
-	objDir := wd + "/obj/" + c.TargetName + "/"
-
-	if NodeNotExist(objDir) {
-		os.MkdirAll(objDir, 0755)
-	}
-
-	depFile := objDir + strings.TrimSuffix(file, filepath.Ext(file)) + ".d"
-	depFile = filepath.ToSlash(depFile)
-	cFlags := c.Cflags + " " + c.IncludesString()
-
-	var cmd string
-	var err error
-
-	cmd = c.ccPath + " " + cFlags + " -MM -MG " + file + " > " + depFile
-	_, err = ShellCommand(cmd)
-	if err != nil {
-		return err
-	}
-
-	return nil
-}
-
-// Compile the specified C or assembly file.
-//
-// @param file                  The filename of the source file to compile.
-// @param compilerType          One of the COMPILER_TYPE_[...] constants.
-func (c *Compiler) CompileFile(file string, compilerType int) error {
-	wd, _ := os.Getwd()
-	objDir := wd + "/obj/" + c.TargetName + "/"
-
-	if NodeNotExist(objDir) {
-		os.MkdirAll(objDir, 0755)
-	}
-
-	objFile := strings.TrimSuffix(file, filepath.Ext(file)) + ".o"
-
-	objPath := objDir + objFile
-	c.ObjPathList[filepath.ToSlash(objPath)] = true
-
-	cmd, err := c.CompileFileCmd(file, compilerType)
-	if err != nil {
-		return err
-	}
-
-	switch compilerType {
-	case COMPILER_TYPE_C:
-		StatusMessage(VERBOSITY_DEFAULT, "Compiling %s\n", file)
-	case COMPILER_TYPE_ASM:
-		StatusMessage(VERBOSITY_DEFAULT, "Assembling %s\n", file)
-	default:
-		return NewNewtError("Unknown compiler type")
-	}
-
-	rsp, err := ShellCommand(cmd)
-	if err != nil {
-		StatusMessage(VERBOSITY_QUIET, string(rsp))
-		return err
-	}
-
-	err = WriteCommandFile(objPath, cmd)
-	if err != nil {
-		return err
-	}
-
-	// Tell the dependency tracker that an object file was just rebuilt.
-	c.depTracker.MostRecent = time.Now()
-
-	return nil
-}
-
-// Compiles all C files matching the specified file glob.
-//
-// @param match                 The file glob specifying which C files to
-//                                  compile.
-func (c *Compiler) Compile(match string) error {
-	files, _ := filepath.Glob(match)
-
-	wd, err := os.Getwd()
-	if err != nil {
-		return err
-	}
-
-	log.Printf("[INFO] Compiling C if outdated (%s/%s) %s", wd, match,
-		strings.Join(files, " "))
-	for _, file := range files {
-		file = filepath.ToSlash(file)
-		compileRequired, err := c.depTracker.CompileRequired(file, 0)
-		if err != nil {
-			return err
-		}
-		if compileRequired {
-			err = c.CompileFile(file, COMPILER_TYPE_C)
-		} else {
-			err = c.SkipSourceFile(file)
-		}
-		if err != nil {
-			return err
-		}
-	}
-
-	return nil
-}
-
-// Compiles all assembly files matching the specified file glob.
-//
-// @param match                 The file glob specifying which assembly files
-//                                  to compile.
-func (c *Compiler) CompileAs(match string) error {
-	files, _ := filepath.Glob(match)
-
-	wd, err := os.Getwd()
-	if err != nil {
-		return err
-	}
-
-	log.Printf("[INFO] Compiling assembly if outdated (%s/%s) %s", wd, match,
-		strings.Join(files, " "))
-	for _, file := range files {
-		compileRequired, err := c.depTracker.CompileRequired(file, 1)
-		if err != nil {
-			return err
-		}
-		if compileRequired {
-			err = c.CompileFile(file, COMPILER_TYPE_ASM)
-		} else {
-			err = c.SkipSourceFile(file)
-		}
-		if err != nil {
-			return err
-		}
-	}
-
-	return nil
-}
-
-func (c *Compiler) RecursiveClean(path string, tName string) error {
-	// Find all the subdirectories of path that contain an "obj/" directory,
-	// and remove that directory either altogether, or just the arch specific
-	// directory.
-	dirList, err := ioutil.ReadDir(path)
-	if err != nil {
-		return NewNewtError(err.Error())
-	}
-
-	for _, node := range dirList {
-		if node.IsDir() {
-			if node.Name() == "obj" || node.Name() == "bin" {
-				if tName == "" {
-					os.RemoveAll(path + "/" + node.Name() + "/")
-				} else {
-					os.RemoveAll(path + "/" + node.Name() + "/" + tName + "/")
-				}
-			} else {
-				// recurse into the directory.
-				err = c.RecursiveClean(path+"/"+node.Name(), tName)
-				if err != nil {
-					return err
-				}
-			}
-		}
-	}
-
-	return nil
-}
-
-func (c *Compiler) processEntry(wd string, node os.FileInfo, match string, cType int,
-	ignDirs []string) error {
-	// check to see if we ignore this element
-	for _, entry := range ignDirs {
-		if entry == node.Name() {
-			return nil
-		}
-	}
-
-	// if not, recurse into the directory
-	os.Chdir(wd + "/" + node.Name())
-	return c.RecursiveCompile(match, cType, ignDirs)
-}
-
-func (c *Compiler) RecursiveCompile(match string, cType int, ignDirs []string) error {
-	// Get a list of files in the current directory, and if they are a directory,
-	// and that directory is not in the ignDirs variable, then recurse into that
-	// directory and compile the files in there
-	wd, err := os.Getwd()
-	if err != nil {
-		return NewNewtError(err.Error())
-	}
-	wd = filepath.ToSlash(wd)
-
-	dirList, err := ioutil.ReadDir(wd)
-	if err != nil {
-		return NewNewtError(err.Error())
-	}
-
-	for _, node := range dirList {
-		if node.IsDir() {
-			err = c.processEntry(wd, node, match, cType, ignDirs)
-			if err != nil {
-				return err
-			}
-		}
-	}
-
-	os.Chdir(wd)
-
-	switch cType {
-	case 0:
-		return c.Compile(match)
-	case 1:
-		return c.CompileAs(match)
-	default:
-		return NewNewtError("Wrong compiler type specified to RecursiveCompile")
-	}
-}
-
-func (c *Compiler) getObjFiles(baseObjFiles []string) string {
-	for objName, _ := range c.ObjPathList {
-		baseObjFiles = append(baseObjFiles, objName)
-	}
-
-	sort.Strings(baseObjFiles)
-	objList := strings.Join(baseObjFiles, " ")
-	return objList
-}
-
-// Calculates the command-line invocation necessary to link the specified elf
-// file.
-//
-// @param dstFile               The filename of the destination elf file to
-//                                  link.
-// @param options               Some build options specifying how the elf file
-//                                  gets generated.
-// @param objFiles              An array of the source .o and .a filenames.
-//
-// @return                      (success) The command string.
-func (c *Compiler) CompileBinaryCmd(dstFile string, options map[string]bool,
-	objFiles []string) string {
-
-	objList := c.getObjFiles(UniqueStrings(objFiles))
-
-	cmd := c.ccPath + " -o " + dstFile + " " + c.ldFlags + " " + c.Cflags
-	if c.ldResolveCircularDeps {
-		cmd += " -Wl,--start-group " + objList + " -Wl,--end-group "
-	} else {
-		cmd += " " + objList
-	}
-
-	if c.LinkerScript != "" {
-		cmd += " -T " + c.LinkerScript
-	}
-	if checkBoolMap(options, "mapFile") {
-		cmd += " -Wl,-Map=" + dstFile + ".map"
-	}
-
-	return cmd
-}
-
-// Links the specified elf file.
-//
-// @param dstFile               The filename of the destination elf file to
-//                                  link.
-// @param options               Some build options specifying how the elf file
-//                                  gets generated.
-// @param objFiles              An array of the source .o and .a filenames.
-func (c *Compiler) CompileBinary(dstFile string, options map[string]bool,
-	objFiles []string) error {
-
-	objList := c.getObjFiles(UniqueStrings(objFiles))
-
-	StatusMessage(VERBOSITY_DEFAULT, "Linking %s\n", path.Base(dstFile))
-	StatusMessage(VERBOSITY_VERBOSE, "Linking %s with input files %s\n",
-		dstFile, objList)
-
-	cmd := c.CompileBinaryCmd(dstFile, options, objFiles)
-	rsp, err := ShellCommand(cmd)
-	if err != nil {
-		StatusMessage(VERBOSITY_QUIET, string(rsp))
-		return err
-	}
-
-	err = WriteCommandFile(dstFile, cmd)
-	if err != nil {
-		return err
-	}
-
-	return nil
-}
-
-// Generates the following build artifacts:
-//    * lst file
-//    * map file
-//    * bin file
-//
-// @param elfFilename           The filename of the elf file corresponding to
-//                                  the artifacts to be generated.
-// @param options               Some build options specifying which artifacts
-//                                  get generated.
-func (c *Compiler) generateExtras(elfFilename string,
-	options map[string]bool) error {
-
-	var cmd string
-
-	if checkBoolMap(options, "listFile") {
-		listFile := elfFilename + ".lst"
-		// if list file exists, remove it
-		if NodeExist(listFile) {
-			if err := os.RemoveAll(listFile); err != nil {
-				return err
-			}
-		}
-
-		cmd = c.odPath + " -wxdS " + elfFilename + " >> " + listFile
-		_, err := ShellCommand(cmd)
-		if err != nil {
-			// XXX: gobjdump appears to always crash.  Until we get that sorted
-			// out, don't fail the link process if lst generation fails.
-			return nil
-		}
-
-		sects := []string{".text", ".rodata", ".data"}
-		for _, sect := range sects {
-			cmd = c.odPath + " -s -j " + sect + " " + elfFilename + " >> " +
-				listFile
-			ShellCommand(cmd)
-		}
-
-		cmd = c.osPath + " " + elfFilename + " >> " + listFile
-		_, err = ShellCommand(cmd)
-		if err != nil {
-			return err
-		}
-	}
-
-	if checkBoolMap(options, "binFile") {
-		binFile := elfFilename + ".bin"
-		cmd = c.ocPath + " -R .bss -R .bss.core -R .bss.core.nz -O binary " +
-			elfFilename + " " + binFile
-		_, err := ShellCommand(cmd)
-		if err != nil {
-			return err
-		}
-	}
-
-	return nil
-}
-
-// Links the specified elf file and generates some associated artifacts (lst,
-// bin, and map files).
-//
-// @param binFile               The filename of the destination elf file to
-//                                  link.
-// @param options               Some build options specifying how the elf file
-//                                  gets generated.
-// @param objFiles              An array of the source .o and .a filenames.
-func (c *Compiler) CompileElf(binFile string, options map[string]bool,
-	objFiles []string) error {
-
-	binFile += ".elf"
-
-	linkRequired, err := c.depTracker.LinkRequired(binFile, options, objFiles)
-	if err != nil {
-		return err
-	}
-	if linkRequired {
-		err := c.CompileBinary(binFile, options, objFiles)
-		if err != nil {
-			return err
-		}
-	}
-
-	err = c.generateExtras(binFile, options)
-	if err != nil {
-		return err
-	}
-
-	return nil
-}
-
-// Calculates the command-line invocation necessary to archive the specified
-// static library.
-//
-// @param archiveFile           The filename of the library to archive.
-// @param objFiles              An array of the source .o filenames.
-//
-// @return                      The command string.
-func (c *Compiler) CompileArchiveCmd(archiveFile string,
-	objFiles []string) string {
-
-	objList := c.getObjFiles(objFiles)
-	return c.arPath + " rcs " + archiveFile + " " + objList
-}
-
-// Archives the specified static library.
-//
-// @param archiveFile           The filename of the library to archive.
-// @param objFiles              An array of the source .o filenames.
-func (c *Compiler) CompileArchive(archiveFile string, objFiles []string) error {
-	arRequired, err := c.depTracker.ArchiveRequired(archiveFile, objFiles)
-	if err != nil {
-		return err
-	}
-	if !arRequired {
-		return nil
-	}
-
-	objList := c.getObjFiles(objFiles)
-
-	StatusMessage(VERBOSITY_DEFAULT, "Archiving %s\n", path.Base(archiveFile))
-	StatusMessage(VERBOSITY_VERBOSE, "Archiving %s with object files %s",
-		archiveFile, objList)
-
-	// Delete the old archive, if it exists.
-	err = os.Remove(archiveFile)
-	if err != nil && !os.IsNotExist(err) {
-		return NewNewtError(err.Error())
-	}
-
-	cmd := c.CompileArchiveCmd(archiveFile, objFiles)
-	rsp, err := ShellCommand(cmd)
-	if err != nil {
-		StatusMessage(VERBOSITY_QUIET, string(rsp))
-		return err
-	}
-
-	err = WriteCommandFile(archiveFile, cmd)
-	if err != nil {
-		return err
-	}
-
-	return nil
-}

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/blob/e95057f4/cli/deps.go
----------------------------------------------------------------------
diff --git a/cli/deps.go b/cli/deps.go
deleted file mode 100644
index 23dd4b9..0000000
--- a/cli/deps.go
+++ /dev/null
@@ -1,239 +0,0 @@
-package cli
-
-import (
-	"os"
-	"path/filepath"
-	"strings"
-	"time"
-)
-
-type DepTracker struct {
-	// Most recent .o modification time.
-	MostRecent time.Time
-
-	compiler *Compiler
-}
-
-func NewDepTracker(c *Compiler) DepTracker {
-	tracker := DepTracker{
-		MostRecent: time.Unix(0, 0),
-		compiler:   c,
-	}
-
-	return tracker
-}
-
-// Parses a dependency (.d) file generated by gcc.  On success, the returned
-// string array is populated with the dependency filenames.  This function
-// expects the first line of a dependency file to have the following format:
-//
-// <file>.d: <file>.c a.h b.h c.h \
-//  d.h e.h f.h
-//
-// This function ignores all lines except for the first.
-func ParseDepsFile(filename string) ([]string, error) {
-	lines, err := ReadLines(filename)
-	if err != nil {
-		return nil, err
-	}
-
-	if len(lines) == 0 {
-		return []string{}, nil
-	}
-
-	// Assume only the first line is important.
-	tokens := strings.Fields(lines[0])
-	if len(tokens) == 0 {
-		return nil, NewNewtError("Invalid Makefile dependency file; first " +
-			"line is blank")
-	}
-
-	dFileTok := tokens[0]
-	if dFileTok[len(dFileTok)-1:] != ":" {
-		return nil, NewNewtError("Invalid Makefile dependency file; first " +
-			"line missing ':'")
-	}
-
-	return tokens[1:], nil
-}
-
-// Updates the dependency tracker's most recent timestamp according to the
-// modification time of the specified file.  If the specified file is older
-// than the tracker's currently most-recent time, this function has no effect.
-func (tracker *DepTracker) ProcessFileTime(file string) error {
-	modTime, err := FileModificationTime(file)
-	if err != nil {
-		return err
-	}
-
-	if modTime.After(tracker.MostRecent) {
-		tracker.MostRecent = modTime
-	}
-
-	return nil
-}
-
-// Determines if the specified C or assembly file needs to be built.  A compile
-// is required if any of the following is true:
-//     * The destination object file does not exist.
-//     * The existing object file was built with a different compiler
-//       invocation.
-//     * The source file has a newer modification time than the object file.
-//     * One or more included header files has a newer modification time than
-//       the object file.
-func (tracker *DepTracker) CompileRequired(srcFile string,
-	compilerType int) (bool, error) {
-	wd, _ := os.Getwd()
-	objDir := wd + "/obj/" + tracker.compiler.TargetName + "/"
-
-	objFile := objDir + strings.TrimSuffix(srcFile, filepath.Ext(srcFile)) +
-		".o"
-	depFile := objDir + strings.TrimSuffix(srcFile, filepath.Ext(srcFile)) +
-		".d"
-
-	// If the object was previously built with a different set of options, a
-	// rebuild is necessary.
-	cmd, err := tracker.compiler.CompileFileCmd(srcFile, compilerType)
-	if err != nil {
-		return false, err
-	}
-	if CommandHasChanged(objFile, cmd) {
-		return true, nil
-	}
-
-	srcModTime, err := FileModificationTime(srcFile)
-	if err != nil {
-		return false, err
-	}
-
-	objModTime, err := FileModificationTime(objFile)
-	if err != nil {
-		return false, err
-	}
-
-	// If the object doesn't exist or is older than the source file, a build is
-	// required; no need to check dependencies.
-	if srcModTime.After(objModTime) {
-		return true, nil
-	}
-
-	// Determine if the dependency (.d) file needs to be generated.  If it
-	// doesn't exist or is older than the source file, it is out of date and
-	// needs to be created.
-	depModTime, err := FileModificationTime(depFile)
-	if err != nil {
-		return false, err
-	}
-
-	if srcModTime.After(depModTime) {
-		err := tracker.compiler.GenDepsForFile(srcFile)
-		if err != nil {
-			return false, err
-		}
-	}
-
-	// Extract the dependency filenames from the dependency file.
-	deps, err := ParseDepsFile(depFile)
-	if err != nil {
-		return false, err
-	}
-
-	// Check if any dependencies are newer than the destination object file.
-	for _, dep := range deps {
-		if NodeNotExist(dep) {
-			depModTime = time.Now()
-		} else {
-			depModTime, err = FileModificationTime(dep)
-			if err != nil {
-				return false, err
-			}
-		}
-
-		if depModTime.After(objModTime) {
-			return true, nil
-		}
-	}
-
-	return false, nil
-}
-
-// Determines if the specified static library needs to be rearchived.  The
-// library needs to be archived if any of the following is true:
-//     * The destination library file does not exist.
-//     * The existing library file was built with a different compiler
-//       invocation.
-//     * One or more source object files has a newer modification time than the
-//       library file.
-func (tracker *DepTracker) ArchiveRequired(archiveFile string,
-	objFiles []string) (bool, error) {
-
-	// If the archive was previously built with a different set of options, a
-	// rebuild is required.
-	cmd := tracker.compiler.CompileArchiveCmd(archiveFile, objFiles)
-	if CommandHasChanged(archiveFile, cmd) {
-		return true, nil
-	}
-
-	// If the archive doesn't exist or is older than any object file, a rebuild
-	// is required.
-	aModTime, err := FileModificationTime(archiveFile)
-	if err != nil {
-		return false, err
-	}
-	if tracker.MostRecent.After(aModTime) {
-		return true, nil
-	}
-
-	// The library is up to date.
-	return false, nil
-}
-
-// Determines if the specified elf file needs to be linked.  Linking is
-// necessary if the elf file does not exist or has an older modification time
-// than any source object or library file.
-// Determines if the specified static library needs to be rearchived.  The
-// library needs to be archived if any of the following is true:
-//     * The destination library file does not exist.
-//     * The existing library file was built with a different compiler
-//       invocation.
-//     * One or more source object files has a newer modification time than the
-//       library file.
-func (tracker *DepTracker) LinkRequired(dstFile string,
-	options map[string]bool, objFiles []string) (bool, error) {
-
-	// If the elf file was previously built with a different set of options, a
-	// rebuild is required.
-	cmd := tracker.compiler.CompileBinaryCmd(dstFile, options, objFiles)
-	if CommandHasChanged(dstFile, cmd) {
-		return true, nil
-	}
-
-	// If the elf file doesn't exist or is older than any input file, a rebuild
-	// is required.
-	dstModTime, err := FileModificationTime(dstFile)
-	if err != nil {
-		return false, err
-	}
-
-	// Check timestamp of each .o file in the project.
-	if tracker.MostRecent.After(dstModTime) {
-		return true, nil
-	}
-
-	// Check timestamp of the linker script and all input libraries.
-	if tracker.compiler.LinkerScript != "" {
-		objFiles = append(objFiles, tracker.compiler.LinkerScript)
-	}
-	for _, obj := range objFiles {
-		objModTime, err := FileModificationTime(obj)
-		if err != nil {
-			return false, err
-		}
-
-		if objModTime.After(dstModTime) {
-			return true, nil
-		}
-	}
-
-	return false, nil
-}

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/blob/e95057f4/cli/downloader.go
----------------------------------------------------------------------
diff --git a/cli/downloader.go b/cli/downloader.go
deleted file mode 100644
index b743fea..0000000
--- a/cli/downloader.go
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- Copyright 2015 Runtime Inc.
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-*/
-
-package cli
-
-import (
-	"fmt"
-	"io/ioutil"
-	"os"
-)
-
-type Downloader struct {
-	Repos map[string]string
-}
-
-func NewDownloader() (*Downloader, error) {
-	dl := &Downloader{}
-
-	dl.Repos = map[string]string{}
-
-	return dl, nil
-}
-
-func (dl *Downloader) gitClone(url string, branch string, dest string) error {
-	StatusMessage(VERBOSITY_VERBOSE,
-		"Git cloning URL %s branch %s into dest %s\n", branch, url, dest)
-
-	_, err := ShellCommand(fmt.Sprintf("git clone --depth 1 -b %s %s %s", branch, url, dest))
-	if err != nil {
-		return NewNewtError(fmt.Sprintf("Command git clone %s branch %s failed",
-			url, branch))
-	}
-
-	StatusMessage(VERBOSITY_VERBOSE,
-		"Git clone successful, removing .git directory\n")
-
-	if err := os.RemoveAll(dest + "/.git/"); err != nil {
-		return err
-	}
-
-	return nil
-}
-
-func (dl *Downloader) GetRepo(repoUrl string, branch string) (string, error) {
-	// If repo already exists, return the temporary directory where it exists
-	dir, ok := dl.Repos[repoUrl+branch]
-	if ok {
-		return dir, nil
-	}
-
-	dir, err := ioutil.TempDir("", "newtrepo")
-	if err != nil {
-		return "", err
-	}
-
-	// Otherwise, get a temporary directory and place the repo there.
-	if err := dl.gitClone(repoUrl, branch, dir); err != nil {
-		return "", err
-	}
-
-	dl.Repos[repoUrl+branch] = dir
-
-	return dir, nil
-}
-
-func (dl *Downloader) DownloadFile(repoUrl string, branch string,
-	filePath string, destPath string) error {
-	repoDir, err := dl.GetRepo(repoUrl, branch)
-	if err != nil {
-		return err
-	}
-
-	if err := CopyFile(repoDir+"/"+filePath, destPath); err != nil {
-		return err
-	}
-
-	return nil
-}

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/blob/e95057f4/cli/egg.go
----------------------------------------------------------------------
diff --git a/cli/egg.go b/cli/egg.go
deleted file mode 100644
index 0758a51..0000000
--- a/cli/egg.go
+++ /dev/null
@@ -1,775 +0,0 @@
-/*
- Copyright 2015 Runtime Inc.
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-*/
-
-package cli
-
-import (
-	"crypto/sha1"
-	"fmt"
-	"io/ioutil"
-	"log"
-	"os"
-	"path/filepath"
-	"regexp"
-	"strconv"
-	"strings"
-)
-
-type VersMatch struct {
-	CompareType string
-	Vers        *Version
-}
-
-type Version struct {
-	Major    int64
-	Minor    int64
-	Revision int64
-}
-
-type DependencyRequirement struct {
-	Name        string
-	Stability   string
-	VersMatches []*VersMatch
-}
-
-type Egg struct {
-	// Base directory of the egg
-	BasePath string
-	// Name of the egg
-	Name string
-	// Full Name of the egg include prefix dir
-	FullName string
-	// Nest this egg belongs to
-	Nest *Nest
-	// Egg version
-	Version *Version
-	// Type of egg
-	LinkerScript string
-
-	// For BSP egg, how to download
-	DownloadScript string
-	// For BSP egg, how to start debugger and attach it to target board
-	DebugScript string
-
-	// Has the dependencies been loaded for this egg
-	DepLoaded bool
-
-	// Has the configuration been loaded for this egg
-	CfgLoaded bool
-
-	// Egg sources
-	Sources []string
-	// Egg include directories
-	Includes []string
-
-	// Egg compiler flags
-	Cflags string
-
-	// Egg linker flags
-	Lflags string
-
-	// Egg assembler flags
-	Aflags string
-
-	// Whether or not this egg is a BSP
-	IsBsp bool
-
-	// Capabilities that this egg exports
-	Capabilities []*DependencyRequirement
-
-	// Capabilities that this egg requires
-	ReqCapabilities []*DependencyRequirement
-
-	// Whether or not we've already compiled this egg
-	Built bool
-
-	// Whether or not we've already cleaned this egg
-	Clean bool
-
-	// Eggs that this egg depends on
-	Deps []*DependencyRequirement
-}
-
-type EggShell struct {
-	FullName string
-	Version  *Version
-	/* Clutch this eggshell belongs to */
-	Clutch  *Clutch
-	Hash    string
-	Deps    []*DependencyRequirement
-	Caps    []*DependencyRequirement
-	ReqCaps []*DependencyRequirement
-}
-
-func NewEggShell(clutch *Clutch) (*EggShell, error) {
-	eShell := &EggShell{
-		Clutch: clutch,
-	}
-
-	return eShell, nil
-}
-
-func (es *EggShell) serializeDepReq(name string,
-	drList []*DependencyRequirement, indent string) string {
-	drStr := ""
-	if len(drList) > 0 {
-		drStr += fmt.Sprintf("%s%s:\n", indent, name)
-		for _, dr := range drList {
-			drStr += fmt.Sprintf("%s    - %s\n", indent, dr)
-		}
-	}
-
-	return drStr
-}
-
-func (es *EggShell) Serialize(indent string) string {
-	esStr := fmt.Sprintf("%s%s:\n", indent, es.FullName)
-	indent += "    "
-	if es.Version == nil {
-		es.Version = &Version{0, 0, 0}
-	}
-	esStr += fmt.Sprintf("%svers: %s\n", indent, es.Version)
-	esStr += fmt.Sprintf("%shash: %s\n", indent, es.Hash)
-	esStr += es.serializeDepReq("deps", es.Deps, indent)
-	esStr += es.serializeDepReq("caps", es.Caps, indent)
-	esStr += es.serializeDepReq("req_caps", es.ReqCaps, indent)
-
-	return esStr
-}
-
-func (v *Version) compareVersions(vers1 *Version, vers2 *Version) int64 {
-	log.Printf("[DEBUG] Comparing %s to %s (%d %d %d)", vers1, vers2,
-		vers1.Major-vers2.Major, vers1.Minor-vers2.Minor,
-		vers1.Revision-vers2.Revision)
-
-	if r := vers1.Major - vers2.Major; r != 0 {
-		return r
-	}
-
-	if r := vers1.Minor - vers2.Minor; r != 0 {
-		return r
-	}
-
-	if r := vers1.Revision - vers2.Revision; r != 0 {
-		return r
-	}
-
-	return 0
-}
-
-func (v *Version) SatisfiesVersion(versMatches []*VersMatch) bool {
-	if versMatches == nil {
-		return true
-	}
-
-	for _, match := range versMatches {
-		r := v.compareVersions(match.Vers, v)
-		switch match.CompareType {
-		case "<":
-			if r <= 0 {
-				return false
-			}
-		case "<=":
-			if r < 0 {
-				return false
-			}
-		case ">":
-			if r >= 0 {
-				return false
-			}
-		case ">=":
-			if r > 0 {
-				return false
-			}
-		case "==":
-			if r != 0 {
-				return false
-			}
-		}
-	}
-
-	return true
-}
-
-func (vers *Version) String() string {
-	return fmt.Sprintf("%d.%d.%d", vers.Major, vers.Minor, vers.Revision)
-}
-
-func NewVersParseString(versStr string) (*Version, error) {
-	var err error
-
-	parts := strings.Split(versStr, ".")
-	if len(parts) > 3 {
-		return nil, NewNewtError(fmt.Sprintf("Invalid version string: %s", versStr))
-	}
-
-	if strings.Trim(parts[0], " ") == "" || strings.Trim(parts[0], " ") == "none" {
-		return nil, nil
-	}
-
-	v := &Version{}
-
-	// convert first string to an int
-	if v.Major, err = strconv.ParseInt(parts[0], 0, 64); err != nil {
-		return nil, NewNewtError(err.Error())
-	}
-	if len(parts) >= 2 {
-		if v.Minor, err = strconv.ParseInt(parts[1], 0, 64); err != nil {
-			return nil, NewNewtError(err.Error())
-		}
-	}
-	if len(parts) == 3 {
-		if v.Revision, err = strconv.ParseInt(parts[2], 0, 64); err != nil {
-			return nil, NewNewtError(err.Error())
-		}
-	}
-
-	return v, nil
-}
-
-//
-// Set the version comparison constraints on a dependency requirement.
-// The version string contains a list of version constraints in the following format:
-//    - <comparison><version>
-// Where <comparison> can be any one of the following comparison
-//   operators: <=, <, >, >=, ==
-// And <version> is specified in the form: X.Y.Z where X, Y and Z are all
-// int64 types in decimal form
-func (dr *DependencyRequirement) SetVersStr(versStr string) error {
-	var err error
-
-	re, err := regexp.Compile(`(<=|>=|==|>|<)([\d\.]+)`)
-	if err != nil {
-		return err
-	}
-
-	matches := re.FindAllStringSubmatch(versStr, -1)
-	if matches != nil {
-		dr.VersMatches = make([]*VersMatch, 0, len(matches))
-		for _, match := range matches {
-			vm := &VersMatch{}
-			vm.CompareType = match[1]
-			if vm.Vers, err = NewVersParseString(match[2]); err != nil {
-				return err
-			}
-
-			if vm.Vers != nil {
-				dr.VersMatches = append(dr.VersMatches, vm)
-			}
-		}
-	} else {
-		dr.VersMatches = make([]*VersMatch, 0)
-		vm := &VersMatch{}
-		vm.CompareType = "=="
-		if vm.Vers, err = NewVersParseString(versStr); err != nil {
-			return err
-		}
-		if vm.Vers != nil {
-			dr.VersMatches = append(dr.VersMatches, vm)
-		}
-	}
-
-	if len(dr.VersMatches) == 0 {
-		dr.VersMatches = nil
-	}
-
-	return nil
-}
-
-// Convert the array of version matches into a string for display
-func (dr *DependencyRequirement) VersMatchesString() string {
-	if dr.VersMatches != nil {
-		str := ""
-		for _, match := range dr.VersMatches {
-			str += fmt.Sprintf("%s%s", match.CompareType, match.Vers)
-		}
-		return str
-	} else {
-		return "none"
-	}
-}
-
-// Convert the dependency requirement to a string for display
-func (dr *DependencyRequirement) String() string {
-	return fmt.Sprintf("%s@%s#%s", dr.Name, dr.VersMatchesString(), dr.Stability)
-}
-
-func (dr *DependencyRequirement) SatisfiesCapability(
-	capability *DependencyRequirement) error {
-	if dr.Name != capability.Name {
-		return NewNewtError(fmt.Sprintf("Required capability name %s doesn't match "+
-			"specified capability name %s", dr.Name, capability.Name))
-	}
-
-	for _, versMatch := range dr.VersMatches {
-		if !versMatch.Vers.SatisfiesVersion(capability.VersMatches) {
-			return NewNewtError(fmt.Sprintf("Capability %s doesn't satisfy version "+
-				"requirement %s", capability, versMatch.Vers))
-		}
-	}
-
-	return nil
-}
-
-// Check whether the passed in egg satisfies the current dependency requirement
-func (dr *DependencyRequirement) SatisfiesDependency(egg *Egg) bool {
-	if egg.FullName != dr.Name {
-		return false
-	}
-
-	if egg.Version.SatisfiesVersion(dr.VersMatches) {
-		return true
-	}
-
-	return false
-}
-
-// Convert the dependency requirement to branch name to look for
-func (dr *DependencyRequirement) BranchName() string {
-	if dr.Stability != "stable" {
-		// XXX should compare to latest
-		return dr.Stability
-	}
-	for _, versMatch := range dr.VersMatches {
-		if versMatch.CompareType == "==" || versMatch.CompareType == "<=" {
-			if versMatch.Vers.Minor == 0 && versMatch.Vers.Revision == 0 {
-				return fmt.Sprintf("%d", versMatch.Vers.Major)
-			} else if versMatch.Vers.Revision == 0 {
-				return fmt.Sprintf("%d.%d", versMatch.Vers.Major,
-					versMatch.Vers.Minor)
-			} else {
-				return fmt.Sprintf("%d.%d.%d", versMatch.Vers.Major,
-					versMatch.Vers.Minor, versMatch.Vers.Revision)
-			}
-		}
-		// XXX What to do with other version comparisons?
-	}
-	return "master"
-}
-
-// Create a New DependencyRequirement structure from the contents of the depReq
-// string that has been passed in as an argument.
-func NewDependencyRequirementParseString(depReq string) (*DependencyRequirement,
-	error) {
-	// Allocate dependency requirement
-	dr := &DependencyRequirement{}
-	// Split string into multiple parts, @#
-	// first, get dependency name
-	parts := strings.Split(depReq, "@")
-	if len(parts) == 1 {
-		parts = strings.Split(depReq, "#")
-		dr.Name = parts[0]
-		if len(parts) > 1 {
-			dr.Stability = parts[1]
-		} else {
-			dr.Stability = "stable"
-		}
-	} else if len(parts) == 2 {
-		dr.Name = parts[0]
-		verParts := strings.Split(parts[1], "#")
-
-		if err := dr.SetVersStr(verParts[0]); err != nil {
-			return nil, err
-		}
-		if len(verParts) == 2 {
-			dr.Stability = verParts[1]
-		} else {
-			dr.Stability = "stable"
-		}
-	}
-
-	return dr, nil
-}
-
-// Get a map of egg capabilities.  The returned map contains the name of the
-// capability, and its version as the key, and a pointer to the
-// Capability structure associated with that name.
-func (egg *Egg) GetCapabilities() ([]*DependencyRequirement, error) {
-	return egg.Capabilities, nil
-}
-
-// Return the egg dependencies for this egg.
-func (egg *Egg) GetDependencies() ([]*DependencyRequirement, error) {
-	return egg.Deps, nil
-}
-
-func (egg *Egg) GetReqCapabilities() ([]*DependencyRequirement, error) {
-	return egg.ReqCapabilities, nil
-}
-
-func (eggShell *EggShell) GetCapabilities() ([]*DependencyRequirement, error) {
-	return eggShell.Caps, nil
-}
-
-// Return the egg dependencies for this eggShell.
-func (eggShell *EggShell) GetDependencies() ([]*DependencyRequirement, error) {
-	return eggShell.Deps, nil
-}
-
-func (eggShell *EggShell) GetReqCapabilities() ([]*DependencyRequirement, error) {
-	return eggShell.ReqCaps, nil
-}
-
-// Load a egg's configuration information from the egg config
-// file.
-func (egg *Egg) GetIncludes(t *Target) ([]string, error) {
-	// Return the include directories for just this egg
-	incls := []string{
-		egg.BasePath + "/include/",
-		egg.BasePath + "/include/" + egg.Name + "/arch/" + t.Arch + "/",
-	}
-
-	return incls, nil
-}
-
-// Load capabilities from a string containing a list of capabilities.
-// The capability format is expected to be one of:
-//   name@version
-//   name
-// @param capList An array of capability strings
-// @return On success error is nil, and a list of capabilities is returned,
-// on failure error is non-nil
-func (egg *Egg) loadCaps(capList []string) ([]*DependencyRequirement, error) {
-	if len(capList) == 0 {
-		return nil, nil
-	}
-
-	// Allocate an array of capabilities
-	caps := make([]*DependencyRequirement, 0)
-
-	StatusMessage(VERBOSITY_VERBOSE, "Loading capabilities %s\n",
-		strings.Join(capList, " "))
-	for _, capItem := range capList {
-		dr, err := NewDependencyRequirementParseString(capItem)
-		if err != nil {
-			return nil, err
-		}
-
-		caps = append(caps, dr)
-		log.Printf("[DEBUG] Appending new capability egg: %s, cap:%s",
-			egg.Name, dr)
-	}
-
-	return caps, nil
-}
-
-// Create a dependency requirement out of an egg
-//
-func (egg *Egg) MakeDependency() (*DependencyRequirement, error) {
-	return NewDependencyRequirementParseString(egg.FullName)
-}
-
-// Generate a hash of the contents of an egg.  This function recursively
-// processes the contents of a directory, ignoring hidden files and the
-// bin and obj directories.  It returns a hash of all the files, their
-// contents.
-func (egg *Egg) GetHash() (string, error) {
-	hash := sha1.New()
-
-	err := filepath.Walk(egg.BasePath,
-		func(path string, info os.FileInfo, err error) error {
-			name := info.Name()
-			if name == "bin" || name == "obj" || name[0] == '.' {
-				return filepath.SkipDir
-			}
-
-			if info.IsDir() {
-				// SHA the directory name into the hash
-				hash.Write([]byte(name))
-			} else {
-				// SHA the file name & contents into the hash
-				contents, err := ioutil.ReadFile(path)
-				if err != nil {
-					return err
-				}
-				hash.Write(contents)
-			}
-			return nil
-		})
-	if err != nil && err != filepath.SkipDir {
-		return "", NewNewtError(err.Error())
-	}
-
-	hashStr := fmt.Sprintf("%x", hash.Sum(nil))
-
-	return hashStr, nil
-}
-
-// Load egg's configuration, and collect required capabilities, dependencies, and
-// identities it provides, so we'll have this available when target is being built.
-func (egg *Egg) LoadDependencies(identities map[string]string,
-	capabilities map[string]string) error {
-
-	if egg.DepLoaded {
-		return nil
-	}
-
-	log.Printf("[DEBUG] Loading dependencies for egg %s", egg.BasePath)
-
-	v, err := ReadConfig(egg.BasePath, "egg")
-	if err != nil {
-		return err
-	}
-
-	// Append all identities that this egg exposes.
-	idents := GetStringSliceIdentities(v, identities, "egg.identities")
-
-	// Add these to project identities
-	for _, item := range idents {
-		StatusMessage(VERBOSITY_VERBOSE, "    Adding identity %s - %s\n", item,
-			egg.FullName)
-		identities[item] = egg.FullName
-	}
-
-	// Load the list of capabilities that this egg exposes
-	egg.Capabilities, err = egg.loadCaps(GetStringSliceIdentities(v, identities,
-		"egg.caps"))
-	if err != nil {
-		return err
-	}
-
-	// Add these to project capabilities
-	for _, cap := range egg.Capabilities {
-		if capabilities[cap.String()] != "" &&
-			capabilities[cap.String()] != egg.FullName {
-
-			return NewNewtError(fmt.Sprintf("Multiple eggs with "+
-				"capability %s (%s and %s)",
-				cap.String(), capabilities[cap.String()], egg.FullName))
-		}
-		capabilities[cap.String()] = egg.FullName
-		StatusMessage(VERBOSITY_VERBOSE, "    Adding capability %s - %s\n",
-			cap.String(), egg.FullName)
-	}
-
-	// Load the list of capabilities that this egg requires
-	egg.ReqCapabilities, err = egg.loadCaps(GetStringSliceIdentities(v, identities,
-		"egg.req_caps"))
-	if err != nil {
-		return err
-	}
-
-	// Load egg dependencies
-	depList := GetStringSliceIdentities(v, identities, "egg.deps")
-	if len(depList) > 0 {
-		egg.Deps = make([]*DependencyRequirement, 0, len(depList))
-		for _, depStr := range depList {
-			log.Printf("[DEBUG] Loading dependency %s from egg %s", depStr,
-				egg.FullName)
-			dr, err := NewDependencyRequirementParseString(depStr)
-			if err != nil {
-				return err
-			}
-
-			egg.Deps = append(egg.Deps, dr)
-		}
-	}
-	for _, cap := range egg.ReqCapabilities {
-		eggName := capabilities[cap.String()]
-		if eggName == "" {
-			continue
-		}
-		dr, err := NewDependencyRequirementParseString(eggName)
-		if err != nil {
-			return err
-		}
-		egg.Deps = append(egg.Deps, dr)
-	}
-
-	// Check these as well
-	egg.LinkerScript = GetStringIdentities(v, identities, "egg.linkerscript")
-	egg.DownloadScript = GetStringIdentities(v, identities, "egg.downloadscript")
-	egg.DebugScript = GetStringIdentities(v, identities, "egg.debugscript")
-
-	egg.Cflags = GetStringIdentities(v, identities, "egg.cflags")
-	egg.Lflags = GetStringIdentities(v, identities, "egg.lflags")
-	egg.Aflags = GetStringIdentities(v, identities, "egg.aflags")
-
-	egg.DepLoaded = true
-
-	return nil
-}
-
-// Collect identities and capabilities that egg and it's dependencies provide
-func (egg *Egg) collectDependencies(clutch *Clutch,
-	identities map[string]string,
-	capabilities map[string]string) error {
-
-	if egg.DepLoaded {
-		return nil
-	}
-
-	StatusMessage(VERBOSITY_VERBOSE, "  Collecting egg %s dependencies\n", egg.Name)
-
-	err := egg.LoadDependencies(identities, capabilities)
-	if err != nil {
-		return err
-	}
-
-	for _, dep := range egg.Deps {
-		egg, err := clutch.ResolveEggName(dep.Name)
-		if err != nil {
-			return err
-		}
-		err = egg.collectDependencies(clutch, identities, capabilities)
-		if err != nil {
-			return err
-		}
-	}
-	return nil
-}
-
-// Clear the var which says that dependencies have been checked for this egg and
-// it's dependencies
-func (egg *Egg) clearDependencyMarker(clutch *Clutch) {
-
-	if egg.DepLoaded == false {
-		return
-	}
-	egg.DepLoaded = false
-
-	for _, dep := range egg.Deps {
-		egg, err := clutch.ResolveEggName(dep.Name)
-		if err == nil {
-			egg.clearDependencyMarker(clutch)
-		}
-	}
-}
-
-// Load a egg's configuration.  This allocates & initializes a fair number of
-// the main data structures within the egg.
-func (egg *Egg) LoadConfig(t *Target, force bool) error {
-	if egg.CfgLoaded && !force {
-		return nil
-	}
-
-	log.Printf("[DEBUG] Loading configuration for egg %s", egg.BasePath)
-
-	v, err := ReadConfig(egg.BasePath, "egg")
-	if err != nil {
-		return err
-	}
-
-	egg.FullName = v.GetString("egg.name")
-	egg.Name = filepath.Base(egg.FullName)
-
-	egg.Version, err = NewVersParseString(v.GetString("egg.vers"))
-	if err != nil {
-		return err
-	}
-
-	// Append all the identities that this egg exposes to sub-eggs.  This must
-	// be done before the remainder of the settings, as some settings depend on
-	// identity.
-	identities := map[string]string{}
-	if t != nil {
-		identities = t.Identities;
-		idents := GetStringSliceIdentities(v, identities, "egg.identities")
-		for _, item := range idents {
-		    identities[item] = egg.FullName;
-		}
-	}
-
-	egg.LinkerScript = GetStringIdentities(v, identities, "egg.linkerscript")
-	egg.DownloadScript = GetStringIdentities(v, identities, "egg.downloadscript")
-	egg.DebugScript = GetStringIdentities(v, identities, "egg.debugscript")
-
-	egg.Cflags += GetStringIdentities(v, identities, "egg.cflags")
-	egg.Lflags += GetStringIdentities(v, identities, "egg.lflags")
-	egg.Aflags += GetStringIdentities(v, identities, "egg.aflags")
-
-	// Load egg dependencies
-	depList := GetStringSliceIdentities(v, identities, "egg.deps")
-	if len(depList) > 0 {
-		egg.Deps = make([]*DependencyRequirement, 0, len(depList))
-		for _, depStr := range depList {
-			log.Printf("[DEBUG] Loading dependency %s from egg %s", depStr,
-				egg.FullName)
-			dr, err := NewDependencyRequirementParseString(depStr)
-			if err != nil {
-				return err
-			}
-
-			egg.Deps = append(egg.Deps, dr)
-		}
-	}
-
-	// Load the list of capabilities that this egg exposes
-	egg.Capabilities, err = egg.loadCaps(GetStringSliceIdentities(v, identities,
-		"egg.caps"))
-	if err != nil {
-		return err
-	}
-
-	// Load the list of capabilities that this egg requires
-	egg.ReqCapabilities, err = egg.loadCaps(GetStringSliceIdentities(v, identities,
-		"egg.req_caps"))
-	if err != nil {
-		return err
-	}
-	if len(egg.ReqCapabilities) > 0 {
-		for _, reqStr := range egg.ReqCapabilities {
-			log.Printf("[DEBUG] Loading reqCap %s from egg %s", reqStr,
-				egg.FullName)
-		}
-	}
-	egg.CfgLoaded = true
-
-	return nil
-}
-
-// Initialize a egg: loads the egg configuration, and sets up egg data
-// structures.  Should only be called from NewEgg
-func (egg *Egg) Init() error {
-	return nil
-}
-
-// Allocate and initialize a new egg, and return a fully initialized Egg
-//     structure.
-// @param nest The Nest this egg is located in
-// @param basePath The path to this egg, within the specified nest
-// @return On success, error is nil, and a Egg is returned.  on failure,
-//         error is not nil.
-func NewEgg(nest *Nest, basePath string) (*Egg, error) {
-	egg := &Egg{
-		BasePath: basePath,
-		Nest:     nest,
-	}
-
-	if err := egg.Init(); err != nil {
-		return nil, err
-	}
-
-	return egg, nil
-}
-
-func (egg *Egg) TestBinName() string {
-	return "test_" + egg.Name
-}
-
-/*
- * Download egg from a clutch and stick it to nest.
- */
-func (eggShell *EggShell) Install(eggMgr *Clutch, branch string) error {
-	downloaded, err := eggMgr.InstallEgg(eggShell.FullName, branch, nil)
-	for _, remoteNest := range downloaded {
-		remoteNest.Remove()
-	}
-	return err
-}
-
-func (egg *Egg) Remove() error {
-	return os.RemoveAll(egg.BasePath)
-}

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/blob/e95057f4/cli/nest.go
----------------------------------------------------------------------
diff --git a/cli/nest.go b/cli/nest.go
deleted file mode 100644
index abc2bce..0000000
--- a/cli/nest.go
+++ /dev/null
@@ -1,467 +0,0 @@
-/*
- Copyright 2015 Runtime Inc.
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-*/
-
-package cli
-
-import (
-	"database/sql"
-	"fmt"
-	_ "github.com/mattn/go-sqlite3"
-	"io/ioutil"
-	"log"
-	"os"
-	"path"
-	"path/filepath"
-)
-
-type Nest struct {
-	// Name of the Nest
-	Name string
-
-	// Path to the Nest Store
-	StorePath string
-
-	// Path to the Nest Clutches
-	ClutchPath string
-
-	// Nest File
-	NestFile string
-
-	// Base path of the nest
-	BasePath string
-
-	// Store of Clutches
-	Clutches map[string]*Clutch
-
-	// Configuration
-	Config map[string]map[string]string
-
-	// The database handle for the nest configuration database
-	db *sql.DB
-}
-
-// Create a new Nest object and initialize it
-func NewNest() (*Nest, error) {
-	n := &Nest{}
-
-	err := n.Init()
-	if err != nil {
-		return nil, err
-	}
-
-	return n, nil
-}
-
-// Create a Nest object constructed out of repo in given path
-func NewNestWithDir(srcDir string) (*Nest, error) {
-	n := &Nest{}
-
-	err := n.InitPath(srcDir)
-	if err != nil {
-		return nil, err
-	}
-
-	return n, nil
-}
-
-func CreateNest(nestName string, destDir string, tadpoleUrl string) error {
-	if tadpoleUrl == "" {
-		tadpoleUrl = "https://git-wip-us.apache.org/repos/asf/incubator-mynewt-tadpole.git"
-	}
-
-	if NodeExist(destDir) {
-		return NewNewtError(fmt.Sprintf("Directory %s already exists, "+
-			" cannot create new newt nest", destDir))
-	}
-
-	dl, err := NewDownloader()
-	if err != nil {
-		return err
-	}
-
-	StatusMessage(VERBOSITY_DEFAULT, "Downloading nest skeleton from %s...",
-		tadpoleUrl)
-	if err := dl.DownloadFile(tadpoleUrl, "master", "/",
-		destDir); err != nil {
-		return err
-	}
-	StatusMessage(VERBOSITY_DEFAULT, OK_STRING)
-
-	// Overwrite nest.yml
-	contents := []byte(fmt.Sprintf("nest.name: %s\n", nestName))
-	if err := ioutil.WriteFile(destDir+"/nest.yml",
-		contents, 0644); err != nil {
-		return NewNewtError(err.Error())
-	}
-
-	// DONE!
-
-	return nil
-}
-
-// Get a temporary directory to stick stuff in
-func (nest *Nest) GetTmpDir(dirName string, prefix string) (string, error) {
-	tmpDir := dirName
-	if NodeNotExist(tmpDir) {
-		if err := os.MkdirAll(tmpDir, 0700); err != nil {
-			return "", err
-		}
-	}
-
-	name, err := ioutil.TempDir(tmpDir, prefix)
-	if err != nil {
-		return "", err
-	}
-
-	return name, nil
-}
-
-// Find the repo file.  Searches the current directory, and then recurses
-// parent directories until it finds a file named .repo.yml
-// if no repo file found in the directory heirarchy, an error is returned
-func (nest *Nest) getNestFile() (string, error) {
-	rFile := ""
-
-	curDir, err := os.Getwd()
-	if err != nil {
-		return rFile, NewNewtError(err.Error())
-	}
-
-	for {
-		rFile = curDir + "/nest.yml"
-		log.Printf("[DEBUG] Searching for nest file at %s", rFile)
-		if _, err := os.Stat(rFile); err == nil {
-			log.Printf("[DEBUG] Found nest file at %s!", rFile)
-			break
-		}
-
-		curDir = path.Clean(curDir + "../../")
-		if curDir == "/" {
-			rFile = ""
-			err = NewNewtError("No repo file found!")
-			break
-		}
-	}
-
-	return rFile, err
-}
-
-// Create the contents of the configuration database
-func (nest *Nest) createDb(db *sql.DB) error {
-	query := `
-	CREATE TABLE IF NOT EXISTS newt_cfg (
-		cfg_name VARCHAR(255) NOT NULL,
-		key VARCHAR(255) NOT NULL,
-		value TEXT
-	)
-	`
-	_, err := db.Exec(query)
-	if err != nil {
-		return NewNewtError(err.Error())
-	} else {
-		return nil
-	}
-}
-
-// Initialize the configuration database specified by dbName.  If the database
-// doesn't exist, create it.
-func (nest *Nest) initDb(dbName string) error {
-	db, err := sql.Open("sqlite3", dbName)
-	if err != nil {
-		return err
-	}
-	nest.db = db
-
-	err = nest.createDb(db)
-	if err != nil {
-		return err
-	}
-
-	// Populate repo configuration
-	log.Printf("[DEBUG] Populating Nest configuration from %s", dbName)
-
-	rows, err := db.Query("SELECT * FROM newt_cfg")
-	if err != nil {
-		return NewNewtError(err.Error())
-	}
-	defer rows.Close()
-
-	for rows.Next() {
-		var cfgName sql.NullString
-		var cfgKey sql.NullString
-		var cfgVal sql.NullString
-
-		err := rows.Scan(&cfgName, &cfgKey, &cfgVal)
-		if err != nil {
-			return NewNewtError(err.Error())
-		}
-
-		log.Printf("[DEBUG] Setting sect %s, key %s to val %s", cfgName.String,
-			cfgKey.String, cfgVal.String)
-
-		_, ok := nest.Config[cfgName.String]
-		if !ok {
-			nest.Config[cfgName.String] = make(map[string]string)
-		}
-
-		nest.Config[cfgName.String][cfgKey.String] = cfgVal.String
-	}
-
-	return nil
-}
-
-// Get a configuration variable in section sect, with key
-// error is populated if variable doesn't exist
-func (nest *Nest) GetConfig(sect string, key string) (string, error) {
-	sectMap, ok := nest.Config[sect]
-	if !ok {
-		return "", NewNewtError("No configuration section exists")
-	}
-
-	val, ok := sectMap[key]
-	if !ok {
-		return "", NewNewtError("No configuration variable exists")
-	}
-
-	return val, nil
-}
-
-func (nest *Nest) GetConfigSect(sect string) (map[string]string, error) {
-	sm, ok := nest.Config[sect]
-	if !ok {
-		return nil, NewNewtError("No configuration section exists")
-	}
-
-	return sm, nil
-}
-
-// Delete a configuration variable in section sect with key and val
-// Returns an error if configuration variable cannot be deleted
-// (most likely due to database error or key not existing)
-func (nest *Nest) DelConfig(sect string, key string) error {
-	db := nest.db
-
-	log.Printf("[DEBUG] Deleting sect %s, key %s", sect, key)
-
-	tx, err := db.Begin()
-	if err != nil {
-		return NewNewtError(err.Error())
-	}
-
-	stmt, err := tx.Prepare("DELETE FROM newt_cfg WHERE cfg_name=? AND key=?")
-	if err != nil {
-		return err
-	}
-	defer stmt.Close()
-
-	res, err := stmt.Exec(sect, key)
-	if err != nil {
-		return err
-	}
-
-	tx.Commit()
-
-	if affected, err := res.RowsAffected(); affected > 0 && err == nil {
-		log.Printf("[DEBUG] sect %s, key %s successfully deleted from database",
-			sect, key)
-	} else {
-		log.Printf("[DEBUG] sect %s, key %s not found, considering \"delete\" successful",
-			sect, key)
-	}
-
-	return nil
-}
-
-// Set a configuration variable in section sect with key, and val
-// Returns an error if configuration variable cannot be set
-// (most likely not able to set it in database.)
-func (nest *Nest) SetConfig(sect string, key string, val string) error {
-	_, ok := nest.Config[sect]
-	if !ok {
-		nest.Config[sect] = make(map[string]string)
-	}
-	nest.Config[sect][key] = val
-
-	// Store config
-	log.Printf("[DEBUG] Storing value %s into key %s for section %s",
-		val, sect, key)
-	db := nest.db
-
-	tx, err := db.Begin()
-	if err != nil {
-		return NewNewtError(err.Error())
-	}
-
-	stmt, err := tx.Prepare(
-		"UPDATE newt_cfg SET value=? WHERE cfg_name=? AND key=?")
-	if err != nil {
-		return NewNewtError(err.Error())
-	}
-	defer stmt.Close()
-
-	res, err := stmt.Exec(val, sect, key)
-	if err != nil {
-		return NewNewtError(err.Error())
-	}
-
-	// Value already existed, and we updated it.  Mission accomplished!
-	// Exit
-	if affected, err := res.RowsAffected(); affected > 0 && err == nil {
-		tx.Commit()
-		log.Printf("[DEBUG] Key %s, sect %s successfully updated to %s", key, sect, val)
-		return nil
-	}
-
-	// Otherwise, insert a new row
-	stmt1, err := tx.Prepare("INSERT INTO newt_cfg VALUES (?, ?, ?)")
-	if err != nil {
-		return NewNewtError(err.Error())
-	}
-	defer stmt1.Close()
-
-	_, err = stmt1.Exec(sect, key, val)
-	if err != nil {
-		return NewNewtError(err.Error())
-	}
-
-	tx.Commit()
-
-	log.Printf("[DEBUG] Key %s, sect %s successfully create, value set to %s",
-		key, sect, val)
-
-	return nil
-}
-
-// Load the repo configuration file
-func (nest *Nest) loadConfig() error {
-	v, err := ReadConfig(nest.BasePath, "nest")
-	if err != nil {
-		return NewNewtError(err.Error())
-	}
-
-	nest.Name = v.GetString("nest.name")
-	if nest.Name == "" {
-		return NewNewtError("Nest file must specify nest name")
-	}
-
-	return nil
-}
-
-func (nest *Nest) LoadClutches() error {
-	files, err := ioutil.ReadDir(nest.ClutchPath)
-	if err != nil {
-		return err
-	}
-	for _, fileInfo := range files {
-		file := fileInfo.Name()
-		if filepath.Ext(file) == ".yml" {
-			name := file[:len(filepath.Base(file))-len(".yml")]
-			log.Printf("[DEBUG] Loading Clutch %s", name)
-			clutch, err := NewClutch(nest)
-			if err != nil {
-				return err
-			}
-			if err := clutch.Load(name); err != nil {
-				return err
-			}
-		}
-	}
-	return nil
-}
-
-func (nest *Nest) InitPath(nestPath string) error {
-	cwd, err := os.Getwd()
-	if err != nil {
-		return NewNewtError(err.Error())
-	}
-
-	if err = os.Chdir(nestPath); err != nil {
-		return NewNewtError(err.Error())
-	}
-
-	log.Printf("[DEBUG] Searching for repository, starting in directory %s", cwd)
-
-	if nest.NestFile, err = nest.getNestFile(); err != nil {
-		return err
-	}
-
-	log.Printf("[DEBUG] Nest file found, directory %s, loading configuration...",
-		nest.NestFile)
-
-	nest.BasePath = filepath.ToSlash(path.Dir(nest.NestFile))
-
-	if err = nest.loadConfig(); err != nil {
-		return err
-	}
-
-	if err = os.Chdir(cwd); err != nil {
-		return NewNewtError(err.Error())
-	}
-	return nil
-}
-
-// Initialze the repository
-// returns a NewtError on failure, and nil on success
-func (nest *Nest) Init() error {
-	var err error
-
-	cwd, err := os.Getwd()
-	if err != nil {
-		return NewNewtError(err.Error())
-	}
-	if err := nest.InitPath(cwd); err != nil {
-		return err
-	}
-
-	log.Printf("[DEBUG] Configuration loaded!  Initializing .nest database")
-
-	// Create Nest store directory
-	nest.StorePath = nest.BasePath + "/.nest/"
-	if NodeNotExist(nest.StorePath) {
-		if err := os.MkdirAll(nest.StorePath, 0755); err != nil {
-			return NewNewtError(err.Error())
-		}
-	}
-
-	// Create Nest configuration database
-	nest.Config = make(map[string]map[string]string)
-
-	dbName := nest.StorePath + "/nest.db"
-	if err := nest.initDb(dbName); err != nil {
-		return err
-	}
-
-	log.Printf("[DEBUG] Database initialized.")
-
-	// Load Clutches for the current Nest
-	nest.ClutchPath = nest.StorePath + "/clutches/"
-	if NodeNotExist(nest.ClutchPath) {
-		if err := os.MkdirAll(nest.ClutchPath, 0755); err != nil {
-			return NewNewtError(err.Error())
-		}
-	}
-
-	nest.Clutches = map[string]*Clutch{}
-
-	if err := nest.LoadClutches(); err != nil {
-		return err
-	}
-
-	return nil
-}
-
-func (nest *Nest) GetClutches() (map[string]*Clutch, error) {
-	return nest.Clutches, nil
-}

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/blob/e95057f4/cli/project.go
----------------------------------------------------------------------
diff --git a/cli/project.go b/cli/project.go
deleted file mode 100644
index e7aa0da..0000000
--- a/cli/project.go
+++ /dev/null
@@ -1,484 +0,0 @@
-/*
- Copyright 2015 Runtime Inc.
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-*/
-
-package cli
-
-import (
-	"log"
-	"os"
-)
-
-// Structure representing a project
-type Project struct {
-	// Project name
-	Name string
-
-	// Base path of project
-	BasePath string
-
-	// Eggs
-	Eggs []string
-
-	// Capabilities
-	Capabilities []string
-
-	// Assembler compiler flags
-	Aflags string
-
-	// Compiler flags
-	Cflags string
-
-	// Linker flags
-	Lflags string
-
-	// The repository the project is located in
-	Nest *Nest
-
-	// The target associated with this project
-	Target *Target
-}
-
-// Load and initialize a project specified by name
-// nest & t are the nest and target to associate the project with
-func LoadProject(nest *Nest, t *Target, name string) (*Project, error) {
-	p := &Project{
-		Name:   name,
-		Nest:   nest,
-		Target: t,
-	}
-
-	StatusMessage(VERBOSITY_VERBOSE,
-		"Loading project %s for repo %s, target %s\n",
-		name, nest.BasePath, t.Name)
-
-	if err := p.Init(); err != nil {
-		return nil, err
-	} else {
-		return p, nil
-	}
-}
-
-// Get the packages associated with the project
-func (p *Project) GetEggs() []string {
-	return p.Eggs
-}
-
-// Load project configuration
-func (p *Project) loadConfig() error {
-	log.Printf("[DEBUG] Reading Project configuration for %s in %s",
-		p.Name, p.BasePath)
-
-	v, err := ReadConfig(p.BasePath, p.Name)
-	if err != nil {
-		return err
-	}
-
-	t := p.Target
-
-	p.Eggs = GetStringSliceIdentities(v, t.Identities, "project.eggs")
-
-	idents := GetStringSliceIdentities(v, t.Identities, "project.identities")
-	for _, ident := range idents {
-		t.Identities[ident] = p.Name
-	}
-	p.Capabilities = GetStringSliceIdentities(v, t.Identities, "project.caps")
-
-	p.Cflags = GetStringIdentities(v, t.Identities, "project.cflags")
-	p.Lflags = GetStringIdentities(v, t.Identities, "project.lflags")
-	p.Aflags = GetStringIdentities(v, t.Identities, "project.aflags")
-
-	return nil
-}
-
-// Clean the project build, and all packages that were built with the
-// project, if cleanAll is true, then clean everything, not just the current
-// architecture
-func (p *Project) BuildClean(cleanAll bool) error {
-	clutch, err := NewClutch(p.Nest)
-	if err != nil {
-		return err
-	}
-
-	// first, clean packages
-	StatusMessage(VERBOSITY_VERBOSE,
-		"Cleaning all the packages associated with project %s", p.Name)
-	for _, eggName := range p.GetEggs() {
-		err = clutch.BuildClean(p.Target, eggName, cleanAll)
-		if err != nil {
-			return err
-		}
-	}
-
-	// clean the BSP, if it exists
-	if p.Target.Bsp != "" {
-		if err := clutch.BuildClean(p.Target, p.Target.Bsp, cleanAll); err != nil {
-			return err
-		}
-	}
-
-	c, err := NewCompiler(p.Target.GetCompiler(), p.Target.Cdef, p.Target.Name, []string{})
-	if err != nil {
-		return err
-	}
-
-	tName := p.Target.Name
-	if cleanAll {
-		tName = ""
-	}
-
-	if err := c.RecursiveClean(p.BasePath, tName); err != nil {
-		return err
-	}
-
-	return nil
-}
-
-// Collect all identities and capabilities that project has
-func (p *Project) collectAllDeps(clutch *Clutch, identities map[string]string,
-	capabilities map[string]string) error {
-
-	eggList := p.GetEggs()
-	if eggList == nil {
-		return nil
-	}
-
-	StatusMessage(VERBOSITY_VERBOSE, " Collecting all project dependencies\n")
-
-	t := p.Target
-
-	eggList = append(eggList, t.Dependencies...)
-	if t.Bsp != "" {
-		eggList = append(eggList, t.Bsp)
-	}
-
-	for _, eggName := range eggList {
-		if eggName == "" {
-			continue
-		}
-
-		egg, err := clutch.ResolveEggName(eggName)
-		if err != nil {
-			return err
-		}
-
-		err = egg.collectDependencies(clutch, identities, capabilities)
-		if err != nil {
-			return err
-		}
-	}
-	return nil
-}
-
-func (p *Project) clearAllDeps(clutch *Clutch) {
-	eggList := p.GetEggs()
-	if eggList == nil {
-		return
-	}
-
-	t := p.Target
-
-	eggList = append(eggList, t.Dependencies...)
-	if t.Bsp != "" {
-		eggList = append(eggList, t.Bsp)
-	}
-
-	for _, eggName := range eggList {
-		if eggName == "" {
-			continue
-		}
-		egg, err := clutch.ResolveEggName(eggName)
-		if err != nil {
-			return
-		}
-		egg.clearDependencyMarker(clutch)
-	}
-}
-
-// Collect project identities and capabilities, and make target ready for
-// building.
-func (p *Project) collectDeps(clutch *Clutch) error {
-
-	identCount := 0
-	capCount := 0
-
-	t := p.Target
-
-	StatusMessage(VERBOSITY_VERBOSE,
-		"Collecting egg dependencies for project %s\n", p.Name)
-
-	// Need to do this multiple times, until there are no new identities,
-	// capabilities which show up.
-	identities := t.Identities
-	capabilities := map[string]string{}
-	for {
-		err := p.collectAllDeps(clutch, identities, capabilities)
-		if err != nil {
-			return err
-		}
-		newIdentCount := len(identities)
-		newCapCount := len(capabilities)
-		StatusMessage(VERBOSITY_VERBOSE, "Collected idents %d caps %d\n",
-			newIdentCount, newCapCount)
-		if identCount == newIdentCount && capCount == newCapCount {
-			break
-		}
-		p.clearAllDeps(clutch)
-		identCount = newIdentCount
-		capCount = newCapCount
-	}
-
-	return nil
-}
-
-// Build the packages that this project depends on
-// clutch is an initialized package manager, incls is an array of includes to
-// append to (package includes get append as they are built)
-// libs is an array of archive files to append to (package libraries get
-// appended as they are built)
-func (p *Project) buildDeps(clutch *Clutch, incls *[]string,
-	libs *[]string) (map[string]string, error) {
-	eggList := p.GetEggs()
-	if eggList == nil {
-		return nil, nil
-	}
-
-	StatusMessage(VERBOSITY_VERBOSE,
-		"Building egg dependencies for project %s\n", p.Name)
-
-	t := p.Target
-
-	// Append project variables to target variables, so that all package builds
-	// inherit from them
-	eggList = append(eggList, t.Dependencies...)
-	t.Capabilities = append(t.Capabilities, p.Capabilities...)
-	t.Cflags += " " + p.Cflags
-	t.Lflags += " " + p.Lflags
-	t.Aflags += " " + p.Aflags
-
-	deps := map[string]*DependencyRequirement{}
-	reqcaps := map[string]*DependencyRequirement{}
-	caps := map[string]*DependencyRequirement{}
-	capEggs := map[string]string{}
-
-	// inherit project capabilities, mark these capabilities as supported.
-	for _, cName := range t.Capabilities {
-		dr, err := NewDependencyRequirementParseString(cName)
-		if err != nil {
-			return nil, err
-		}
-
-		caps[dr.String()] = dr
-	}
-
-	for _, eggName := range eggList {
-		if eggName == "" {
-			continue
-		}
-
-		egg, err := clutch.ResolveEggName(eggName)
-		if err != nil {
-			return nil, err
-		}
-
-		if err := clutch.CheckEggDeps(egg, deps, reqcaps, caps, capEggs); err != nil {
-			return nil, err
-		}
-	}
-
-	StatusMessage(VERBOSITY_VERBOSE,
-		"Reporting required capabilities for project %s\n", p.Name)
-	for dname, dep := range reqcaps {
-		StatusMessage(VERBOSITY_VERBOSE,
-			"	%s - %s\n", dname, dep.Name)
-	}
-	StatusMessage(VERBOSITY_VERBOSE,
-		"Reporting actual capabilities for project %s\n", p.Name)
-	for dname, dep := range caps {
-		StatusMessage(VERBOSITY_VERBOSE,
-			"	%s - %s ", dname, dep.Name)
-		if capEggs[dname] != "" {
-			StatusMessage(VERBOSITY_VERBOSE,
-				"- %s\n", capEggs[dname])
-		} else {
-			StatusMessage(VERBOSITY_VERBOSE, "\n")
-		}
-	}
-
-	// After processing all the dependencies, verify that the package's
-	// capability requirements are satisfied as well
-	if err := clutch.VerifyCaps(reqcaps, caps); err != nil {
-		return nil, err
-	}
-
-	// now go through and build everything
-	for _, eggName := range eggList {
-		if eggName == "" {
-			continue
-		}
-
-		egg, err := clutch.ResolveEggName(eggName)
-		if err != nil {
-			return nil, err
-		}
-
-		if err = clutch.Build(p.Target, eggName, *incls, libs); err != nil {
-			return nil, err
-		}
-
-		// Don't fail if package did not produce a library file; some packages
-		// are header-only.
-		if lib := clutch.GetEggLib(p.Target, egg); NodeExist(lib) {
-			*libs = append(*libs, lib)
-		}
-
-		*incls = append(*incls, egg.Includes...)
-	}
-
-	return capEggs, nil
-}
-
-// Build the BSP for this project.
-// The BSP is specified by the Target attached to the project.
-// clutch is an initialized egg mgr, containing all the packages
-// incls and libs are pointers to an array of includes and libraries, when buildBsp()
-// builds the BSP, it appends the include directories for the BSP, and the archive file
-// to these variables.
-func (p *Project) buildBsp(clutch *Clutch, incls *[]string,
-	libs *[]string, capEggs map[string]string) (string, error) {
-
-	StatusMessage(VERBOSITY_VERBOSE, "Building BSP %s for project %s\n",
-		p.Target.Bsp, p.Name)
-
-	if p.Target.Bsp == "" {
-		return "", NewNewtError("Must specify a BSP to build project")
-	}
-
-	return buildBsp(p.Target, clutch, incls, libs, capEggs)
-}
-
-// Build the project
-func (p *Project) Build() error {
-	clutch, err := NewClutch(p.Nest)
-	if err != nil {
-		return err
-	}
-
-	// Load the configuration for this target
-	if err := clutch.LoadConfigs(nil, false); err != nil {
-		return err
-	}
-
-	incls := []string{}
-	libs := []string{}
-	linkerScript := ""
-
-	// Collect target identities, libraries to include
-	err = p.collectDeps(clutch)
-	if err != nil {
-		return err
-	}
-
-	// If there is a BSP:
-	//     1. Calculate the include paths that it and its dependencies export.
-	//        This set of include paths is accessible during all subsequent
-	//        builds.
-	//     2. Build the BSP package.
-	if p.Target.Bsp != "" {
-		incls, err = BspIncludePaths(clutch, p.Target)
-		if err != nil {
-			return err
-		}
-	}
-
-	// Build the project dependencies.
-	capEggs, err := p.buildDeps(clutch, &incls, &libs)
-	if err != nil {
-		return err
-	}
-
-	if p.Target.Bsp != "" {
-		linkerScript, err = p.buildBsp(clutch, &incls, &libs, capEggs)
-		if err != nil {
-			return err
-		}
-	}
-
-	// Append project includes
-	projIncls := []string{
-		p.BasePath + "/include/",
-		p.BasePath + "/arch/" + p.Target.Arch + "/include/",
-	}
-
-	incls = append(incls, projIncls...)
-
-	c, err := NewCompiler(p.Target.GetCompiler(), p.Target.Cdef, p.Target.Name,
-		incls)
-	if err != nil {
-		return err
-	}
-
-	c.LinkerScript = linkerScript
-
-	// Add target C flags
-	c.Cflags = CreateCflags(clutch, c, p.Target, p.Cflags)
-
-	os.Chdir(p.BasePath + "/src/")
-	if err = c.Compile("*.c"); err != nil {
-		return err
-	}
-
-	if !NodeNotExist(p.BasePath + "/src/arch/" + p.Target.Arch + "/") {
-		os.Chdir(p.BasePath + "/src/arch/" + p.Target.Arch + "/")
-		if err = c.Compile("*.c"); err != nil {
-			return err
-		}
-	}
-
-	StatusMessage(VERBOSITY_DEFAULT, "Building project %s\n", p.Name)
-
-	// Create binaries in the project bin/ directory, under:
-	// bin/<arch>/
-	binDir := p.BinPath()
-	if NodeNotExist(binDir) {
-		os.MkdirAll(binDir, 0755)
-	}
-
-	options := map[string]bool{"mapFile": c.ldMapFile,
-		"listFile": true, "binFile": true}
-	err = c.CompileElf(binDir+p.Name, options, libs)
-	if err != nil {
-		return err
-	}
-
-	return nil
-}
-
-// Initialize the project, and project definition
-func (p *Project) Init() error {
-	p.BasePath = p.Nest.BasePath + "/project/" + p.Name + "/"
-	if NodeNotExist(p.BasePath) {
-		return NewNewtError("Project directory does not exist")
-	}
-
-	if err := p.loadConfig(); err != nil {
-		return err
-	}
-	return nil
-}
-
-// Return path to target binary
-func (p *Project) BinPath() string {
-	return p.BasePath + "/bin/" + p.Target.Name + "/"
-}

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/blob/e95057f4/cli/remotenest.go
----------------------------------------------------------------------
diff --git a/cli/remotenest.go b/cli/remotenest.go
deleted file mode 100644
index 7bd51d7..0000000
--- a/cli/remotenest.go
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- Copyright 2015 Runtime Inc.
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-*/
-
-package cli
-
-import (
-	"fmt"
-	"os"
-	"path/filepath"
-)
-
-type RemoteNest struct {
-	// Nestsitory associated with the Eggs
-	Nest *Nest
-
-	Clutch *Clutch
-
-	Name string
-
-	RemoteLoc string
-
-	LocalLoc string
-}
-
-// Allocate a new  structure, and initialize it.
-func NewRemoteNest(clutch *Clutch, branch string) (*RemoteNest, error) {
-	remoteNest := &RemoteNest{
-		Name : clutch.Name,
-		RemoteLoc: clutch.RemoteUrl,
-		LocalLoc: "",
-	}
-
-	err := remoteNest.Download(branch)
-	if err != nil {
-		return nil, err
-	}
-	return remoteNest, nil
-}
-
-// Download it
-func (remoteNest *RemoteNest) Download(branch string) error {
-	dl, err := NewDownloader()
-	if err != nil {
-		return err
-	}
-
-	StatusMessage(VERBOSITY_DEFAULT, "Downloading %s from %s/"+
-		"%s...", remoteNest.Name, remoteNest.RemoteLoc, branch)
-
-	dir, err := dl.GetRepo(remoteNest.RemoteLoc, branch)
-	if err != nil {
-		return err
-	}
-
-	StatusMessage(VERBOSITY_DEFAULT, OK_STRING)
-
-	remoteNest.LocalLoc = dir
-
-	nest, err := NewNestWithDir(dir)
-	if err != nil {
-		return err
-	}
-	remoteNest.Nest = nest
-
-	clutch, err := NewClutch(nest)
-	if err != nil {
-		return err
-	}
-
-	err = clutch.LoadConfigs(nil, false)
-	if err != nil {
-		return err
-	}
-	remoteNest.Clutch = clutch
-
-	return nil
-}
-
-func (remoteNest *RemoteNest) ResolveEggName(eggName string) (*Egg, error) {
-	if remoteNest.Clutch == nil {
-		return nil, NewNewtError(fmt.Sprintf("RemoteNest %s not downloaded yet!",
-					remoteNest.Name))
-	}
-	return remoteNest.Clutch.ResolveEggName(eggName)
-}
-
-func (remoteNest *RemoteNest) fetchEgg(eggName string, tgtBase string) error {
-	egg, err := remoteNest.ResolveEggName(eggName)
-	if err != nil {
-		return err
-	}
-
-	StatusMessage(VERBOSITY_DEFAULT, "Installing %s\n", egg.FullName)
-
-	srcDir := filepath.Join(remoteNest.LocalLoc, egg.FullName)
-	tgtDir := filepath.Join(tgtBase, egg.FullName)
-
-	err = CopyDir(srcDir, tgtDir)
-	return err
-}
-
-// Remove local copy
-func (remoteNest *RemoteNest) Remove() error {
-	if remoteNest.LocalLoc != "" {
-		err := os.RemoveAll(remoteNest.LocalLoc)
-		return err
-	}
-	return nil
-}