blob: c15709b313c330f9c566a5b086bf01b5629c3e6e [file] [log] [blame]
// Copyright 2010 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// Run "make install" to build package.
package main
import (
"bytes"
"os"
"template"
)
// domake builds the package in dir.
// If local is false, the package was copied from an external system.
// For non-local packages or packages without Makefiles,
// domake generates a standard Makefile and passes it
// to make on standard input.
func domake(dir, pkg string, local bool) os.Error {
if local {
_, err := os.Stat(dir + "/Makefile")
if err == nil {
return run(dir, nil, gobin+"/gomake", "install")
}
}
makefile, err := makeMakefile(dir, pkg)
if err != nil {
return err
}
return run(dir, makefile, gobin+"/gomake", "-f-", "install")
}
// makeMakefile computes the standard Makefile for the directory dir
// installing as package pkg. It includes all *.go files in the directory
// except those in package main and those ending in _test.go.
func makeMakefile(dir, pkg string) ([]byte, os.Error) {
files, _, _, err := goFiles(dir, false)
if err != nil {
return nil, err
}
var buf bytes.Buffer
if err := makefileTemplate.Execute(&makedata{pkg, files}, &buf); err != nil {
return nil, err
}
return buf.Bytes(), nil
}
// makedata is the data type for the makefileTemplate.
type makedata struct {
pkg string // package import path
files []string // list of .go files
}
var makefileTemplate = template.MustParse(`
include $(GOROOT)/src/Make.$(GOARCH)
TARG={pkg}
GOFILES=\
{.repeated section files}
{@}\
{.end}
include $(GOROOT)/src/Make.pkg
`,
nil)