unexport Makefile, Parser and EvalResult
diff --git a/bootstrap.go b/bootstrap.go
index de13b2b..30ca77d 100644
--- a/bootstrap.go
+++ b/bootstrap.go
@@ -22,7 +22,7 @@
 
 const bootstrapMakefileName = "*bootstrap*"
 
-func BootstrapMakefile(targets []string) Makefile {
+func bootstrapMakefile(targets []string) makefile {
 	bootstrap := `
 CC:=cc
 CXX:=g++
@@ -48,7 +48,7 @@
 		panic(err)
 	}
 	bootstrap += fmt.Sprintf("CURDIR:=%s\n", cwd)
-	mk, err := ParseMakefileString(bootstrap, bootstrapMakefileName, 0)
+	mk, err := parseMakefileString(bootstrap, bootstrapMakefileName, 0)
 	if err != nil {
 		panic(err)
 	}
diff --git a/dep.go b/dep.go
index ebbad3e..a728b87 100644
--- a/dep.go
+++ b/dep.go
@@ -440,7 +440,7 @@
 	}
 }
 
-func (db *depBuilder) populateRules(er *EvalResult) {
+func (db *depBuilder) populateRules(er *evalResult) {
 	for _, r := range er.rules {
 		for i, input := range r.inputs {
 			r.inputs[i] = trimLeadingCurdir(input)
@@ -500,7 +500,7 @@
 	}
 }
 
-func newDepBuilder(er *EvalResult, vars Vars) *depBuilder {
+func newDepBuilder(er *evalResult, vars Vars) *depBuilder {
 	db := &depBuilder{
 		rules:       make(map[string]*rule),
 		ruleVars:    er.ruleVars,
diff --git a/depgraph.go b/depgraph.go
index da0ff1b..2f0b427 100644
--- a/depgraph.go
+++ b/depgraph.go
@@ -53,13 +53,13 @@
 		}
 	}
 
-	bmk := BootstrapMakefile(opt.Targets)
+	bmk := bootstrapMakefile(opt.Targets)
 
 	content, err := ioutil.ReadFile(makefile)
 	if err != nil {
 		return nil, err
 	}
-	mk, err := ParseMakefile(content, makefile)
+	mk, err := parseMakefile(content, makefile)
 	if err != nil {
 		return nil, err
 	}
@@ -79,7 +79,7 @@
 	if err != nil {
 		return nil, err
 	}
-	er, err := Eval(mk, vars, opt.UseCache)
+	er, err := eval(mk, vars, opt.UseCache)
 	if err != nil {
 		return nil, err
 	}
diff --git a/eval.go b/eval.go
index 7b48b18..b24d2ed 100644
--- a/eval.go
+++ b/eval.go
@@ -97,7 +97,7 @@
 	return r
 }
 
-type EvalResult struct {
+type evalResult struct {
 	vars        Vars
 	rules       []*rule
 	ruleVars    map[string]Vars
@@ -275,7 +275,7 @@
 		// assign_after_tab.mk.
 		if strings.IndexByte(ast.cmd, '=') >= 0 {
 			line := trimLeftSpace(ast.cmd)
-			mk, err := ParseMakefileString(line, ast.filename, ast.lineno)
+			mk, err := parseMakefileString(line, ast.filename, ast.lineno)
 			if err != nil {
 				panic(err)
 			}
@@ -331,7 +331,7 @@
 	return buf.String()
 }
 
-func (ev *Evaluator) evalIncludeFile(fname string, mk Makefile) error {
+func (ev *Evaluator) evalIncludeFile(fname string, mk makefile) error {
 	te := traceEvent.begin("include", literal(fname), traceEventMain)
 	defer func() {
 		traceEvent.end(te)
@@ -465,7 +465,7 @@
 	stmt.eval(ev)
 }
 
-func Eval(mk Makefile, vars Vars, useCache bool) (er *EvalResult, err error) {
+func eval(mk makefile, vars Vars, useCache bool) (er *evalResult, err error) {
 	ev := NewEvaluator(vars)
 	if useCache {
 		ev.cache = newAccessCache()
@@ -487,7 +487,7 @@
 		ev.eval(stmt)
 	}
 
-	return &EvalResult{
+	return &evalResult{
 		vars:        ev.outVars,
 		rules:       ev.outRules,
 		ruleVars:    ev.outRuleVars,
diff --git a/func.go b/func.go
index 121cfa6..46de333 100644
--- a/func.go
+++ b/func.go
@@ -886,7 +886,7 @@
 	f.args[1].Eval(abuf, ev)
 	s := abuf.Bytes()
 	Logf("eval %q at %s:%d", s, ev.filename, ev.lineno)
-	mk, err := ParseMakefileBytes(s, ev.filename, ev.lineno)
+	mk, err := parseMakefileBytes(s, ev.filename, ev.lineno)
 	if err != nil {
 		panic(err)
 	}
diff --git a/parser.go b/parser.go
index 527d7c4..53f6185 100644
--- a/parser.go
+++ b/parser.go
@@ -26,13 +26,12 @@
 	"fmt"
 	"io"
 	"io/ioutil"
-	"os"
 	"strings"
 	"sync"
 	"time"
 )
 
-type Makefile struct {
+type makefile struct {
 	filename string
 	stmts    []ast
 }
@@ -45,7 +44,7 @@
 
 type parser struct {
 	rd          *bufio.Reader
-	mk          Makefile
+	mk          makefile
 	lineno      int
 	elineno     int // lineno == elineno unless there is trailing '\'.
 	linenoFixed bool
@@ -569,7 +568,7 @@
 	return false
 }
 
-func (p *parser) parse() (mk Makefile, err error) {
+func (p *parser) parse() (mk makefile, err error) {
 	defer func() {
 		if r := recover(); r != nil {
 			err = fmt.Errorf("panic in parse %s: %v", mk.filename, r)
@@ -679,11 +678,6 @@
 	return p.mk, nil
 }
 
-func ParseMakefileFd(filename string, f *os.File) (Makefile, error) {
-	parser := newParser(f, filename)
-	return parser.parse()
-}
-
 func defaultMakefile() string {
 	candidates := []string{"GNUmakefile", "makefile", "Makefile"}
 	for _, filename := range candidates {
@@ -695,7 +689,7 @@
 	panic("") // Cannot be reached.
 }
 
-func parseMakefileReader(rd io.Reader, name string, lineno int) (Makefile, error) {
+func parseMakefileReader(rd io.Reader, name string, lineno int) (makefile, error) {
 	parser := newParser(rd, name)
 	parser.lineno = lineno
 	parser.elineno = lineno
@@ -703,16 +697,16 @@
 	return parser.parse()
 }
 
-func ParseMakefileString(s string, name string, lineno int) (Makefile, error) {
+func parseMakefileString(s string, name string, lineno int) (makefile, error) {
 	return parseMakefileReader(strings.NewReader(s), name, lineno)
 }
 
-func ParseMakefileBytes(s []byte, name string, lineno int) (Makefile, error) {
+func parseMakefileBytes(s []byte, name string, lineno int) (makefile, error) {
 	return parseMakefileReader(bytes.NewReader(s), name, lineno)
 }
 
 type mkCacheEntry struct {
-	mk   Makefile
+	mk   makefile
 	hash [sha1.Size]byte
 	err  error
 	ts   int64
@@ -727,22 +721,22 @@
 	mk: make(map[string]mkCacheEntry),
 }
 
-func (mc *makefileCacheT) lookup(filename string) (Makefile, [sha1.Size]byte, bool, error) {
+func (mc *makefileCacheT) lookup(filename string) (makefile, [sha1.Size]byte, bool, error) {
 	var hash [sha1.Size]byte
 	mc.mu.Lock()
 	c, present := mc.mk[filename]
 	mc.mu.Unlock()
 	if !present {
-		return Makefile{}, hash, false, nil
+		return makefile{}, hash, false, nil
 	}
 	ts := getTimestamp(filename)
 	if ts < 0 || ts >= c.ts {
-		return Makefile{}, hash, false, nil
+		return makefile{}, hash, false, nil
 	}
 	return c.mk, c.hash, true, c.err
 }
 
-func (mc *makefileCacheT) parse(filename string) (Makefile, [sha1.Size]byte, error) {
+func (mc *makefileCacheT) parse(filename string) (makefile, [sha1.Size]byte, error) {
 	Logf("parse Makefile %q", filename)
 	mk, hash, ok, err := makefileCache.lookup(filename)
 	if ok {
@@ -756,12 +750,12 @@
 	}
 	c, err := ioutil.ReadFile(filename)
 	if err != nil {
-		return Makefile{}, hash, err
+		return makefile{}, hash, err
 	}
 	hash = sha1.Sum(c)
-	mk, err = ParseMakefile(c, filename)
+	mk, err = parseMakefile(c, filename)
 	if err != nil {
-		return Makefile{}, hash, err
+		return makefile{}, hash, err
 	}
 	makefileCache.mu.Lock()
 	makefileCache.mk[filename] = mkCacheEntry{
@@ -774,7 +768,7 @@
 	return mk, hash, err
 }
 
-func ParseMakefile(s []byte, filename string) (Makefile, error) {
+func parseMakefile(s []byte, filename string) (makefile, error) {
 	parser := newParser(bytes.NewReader(s), filename)
 	return parser.parse()
 }
diff --git a/testcase/gen_testcase_parse_benchmark.go b/testcase/gen_testcase_parse_benchmark.go
index e034114..a1d58ee 100644
--- a/testcase/gen_testcase_parse_benchmark.go
+++ b/testcase/gen_testcase_parse_benchmark.go
@@ -26,7 +26,7 @@
 	"text/template"
 )
 
-const preamble = `package main
+const preamble = `package kati
 
 import (
 	"io/ioutil"
@@ -45,7 +45,7 @@
 	mk := string(data)
 	b.ResetTimer()
 	for i := 0; i < b.N; i++ {
-		ParseMakefileString(mk, {{.Filename | printf "%q"}}, 0)
+		parseMakefileString(mk, {{.Filename | printf "%q"}}, 0)
 	}
 }
 `))