16
18
// domake builds the package in dir.
17
19
// domake generates a standard Makefile and passes it
18
20
// to make on standard input.
19
func domake(dir, pkg string, root *pkgroot, isCmd bool) (err os.Error) {
20
makefile, err := makeMakefile(dir, pkg, root, isCmd)
21
func domake(dir, pkg string, tree *build.Tree, isCmd bool) (err os.Error) {
22
makefile, err := makeMakefile(dir, pkg, tree, isCmd)
24
26
cmd := []string{"bash", "gomake", "-f-"}
28
cmd = append(cmd, "nuke")
26
30
cmd = append(cmd, "clean")
28
32
cmd = append(cmd, "install")
32
36
// makeMakefile computes the standard Makefile for the directory dir
33
37
// installing as package pkg. It includes all *.go files in the directory
34
38
// except those in package main and those ending in _test.go.
35
func makeMakefile(dir, pkg string, root *pkgroot, isCmd bool) ([]byte, os.Error) {
39
func makeMakefile(dir, pkg string, tree *build.Tree, isCmd bool) ([]byte, os.Error) {
36
40
if !safeName(pkg) {
37
return nil, os.ErrorString("unsafe name: " + pkg)
41
return nil, os.NewError("unsafe name: " + pkg)
40
targDir := root.pkgDir()
44
targDir := tree.PkgDir()
42
46
// use the last part of the package name for targ
43
47
_, targ = filepath.Split(pkg)
44
targDir = root.binDir()
48
targDir = tree.BinDir()
46
dirInfo, err := scanDir(dir, isCmd)
50
dirInfo, err := build.ScanDir(dir, isCmd)
51
cgoFiles := dirInfo.cgoFiles
55
cgoFiles := dirInfo.CgoFiles
52
56
isCgo := make(map[string]bool, len(cgoFiles))
53
57
for _, file := range cgoFiles {
54
58
if !safeName(file) {
55
return nil, os.ErrorString("bad name: " + file)
59
return nil, os.NewError("bad name: " + file)
60
goFiles := make([]string, 0, len(dirInfo.goFiles))
61
for _, file := range dirInfo.goFiles {
64
goFiles := make([]string, 0, len(dirInfo.GoFiles))
65
for _, file := range dirInfo.GoFiles {
62
66
if !safeName(file) {
63
return nil, os.ErrorString("unsafe name: " + file)
67
return nil, os.NewError("unsafe name: " + file)
66
70
goFiles = append(goFiles, file)
70
oFiles := make([]string, 0, len(dirInfo.cFiles)+len(dirInfo.sFiles))
71
cgoOFiles := make([]string, 0, len(dirInfo.cFiles))
72
for _, file := range dirInfo.cFiles {
74
oFiles := make([]string, 0, len(dirInfo.CFiles)+len(dirInfo.SFiles))
75
cgoOFiles := make([]string, 0, len(dirInfo.CFiles))
76
for _, file := range dirInfo.CFiles {
73
77
if !safeName(file) {
74
return nil, os.ErrorString("unsafe name: " + file)
78
return nil, os.NewError("unsafe name: " + file)
76
80
// When cgo is in use, C files are compiled with gcc,
77
81
// otherwise they're compiled with gc.
85
for _, file := range dirInfo.sFiles {
89
for _, file := range dirInfo.SFiles {
86
90
if !safeName(file) {
87
return nil, os.ErrorString("unsafe name: " + file)
91
return nil, os.NewError("unsafe name: " + file)
89
93
oFiles = append(oFiles, file[:len(file)-2]+".$O")
97
for _, t := range build.Path {
98
imports = append(imports, t.PkgDir())
92
101
var buf bytes.Buffer
93
102
md := makedata{targ, targDir, "pkg", goFiles, oFiles, cgoFiles, cgoOFiles, imports}