/* Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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 main

import "flag"
import "fmt"
import "io"
import "io/ioutil"
import "log"
import "os"
import "os/exec"
import "path"
import "runtime"

import "git-wip-us.apache.org/repos/asf/lucy-clownfish.git/compiler/go/cfc"

var packageName string = "git-wip-us.apache.org/repos/asf/lucy.git/go/lucy"
var cfPackageName string = "git-wip-us.apache.org/repos/asf/lucy-clownfish.git/runtime/go/clownfish"
var charmonizerC string = "../common/charmonizer.c"
var charmonizerEXE string = "charmonizer"
var charmonyH string = "charmony.h"
var buildDir string
var hostSrcDir string
var buildGO string
var configGO string
var cfbindGO string
var installedLibPath string

func init() {
	_, buildGO, _, _ = runtime.Caller(1)
	buildDir = path.Dir(buildGO)
	hostSrcDir = path.Join(buildDir, "../c/src")
	configGO = path.Join(buildDir, "lucy", "config.go")
	cfbindGO = path.Join(buildDir, "lucy", "cfbind.go")
	var err error
	installedLibPath, err = cfc.InstalledLibPath(packageName)
	if err != nil {
		log.Fatal(err)
	}
}

func main() {
	os.Chdir(buildDir)
	flag.Parse()
	action := "build"
	args := flag.Args()
	if len(args) > 0 {
		action = args[0]
	}
	switch action {
	case "build":
		build()
	case "clean":
		clean()
	case "test":
		test()
	case "install":
		install()
	default:
		log.Fatalf("Unrecognized action specified: %s", action)
	}
}

func current(orig, dest string) bool {

	destInfo, err := os.Stat(dest)
	if err != nil {
		if os.IsNotExist(err) {
			// If dest doesn't exist, we're not current.
			return false
		} else {
			log.Fatalf("Unexpected stat err: %s", err)
		}
	}

	// If source is newer than dest, we're not current.
	origInfo, err := os.Stat(orig)
	if err != nil {
		log.Fatalf("Unexpected: %s", err)
	}
	return origInfo.ModTime().Before(destInfo.ModTime())
}

func runCommand(name string, args ...string) {
	command := exec.Command(name, args...)
	command.Stdout = os.Stdout
	command.Stderr = os.Stderr
	err := command.Run()
	if err != nil {
		log.Fatal(err)
	}
}

func configure() {
	if !current(charmonizerC, charmonizerEXE) {
		runCommand("cc", "-o", charmonizerEXE, charmonizerC)
	}
	if !current(charmonizerEXE, charmonyH) {
		runCommand("./charmonizer", "--cc=cc", "--enable-c", "--enable-go",
			"--enable-makefile", "--host=go", "--", "-std=gnu99", "-O2")
	}
}

func runCFC() {
	hierarchy := cfc.NewHierarchy("autogen")
	hierarchy.AddSourceDir("../core")
	hierarchy.AddSourceDir("../test")
	hierarchy.Build()
	autogenHeader := "Auto-generated by build.go.\n"
	coreBinding := cfc.NewBindCore(hierarchy, autogenHeader, "")
	modified := coreBinding.WriteAllModified(false)
	if modified {
		cfc.RegisterParcelPackage("Clownfish", cfPackageName)
		goBinding := cfc.NewBindGo(hierarchy)
		goBinding.SetHeader(autogenHeader)
		goBinding.SetSuppressInit(true)
		parcel := cfc.FetchParcel("Lucy")
		specClasses(parcel)
		packageDir := path.Join(buildDir, "lucy")
		goBinding.WriteBindings(parcel, packageDir)
		hierarchy.WriteLog()
	}
}

func specClasses(parcel *cfc.Parcel) {
	simpleBinding := cfc.NewGoClass(parcel, "Lucy::Simple")
	simpleBinding.SpecMethod("Add_Doc", "AddDoc(doc interface{}) error")
	simpleBinding.SpecMethod("Search", "Search(string, int, int) (int, error)")
	simpleBinding.SpecMethod("Next", "Next(hit interface{}) bool")
	simpleBinding.SpecMethod("", "Error() error")
	simpleBinding.SetSuppressCtor(true)
	simpleBinding.SetSuppressStruct(true)
	simpleBinding.Register()

	tokenBinding := cfc.NewGoClass(parcel, "Lucy::Analysis::Token")
	tokenBinding.SpecMethod("", "SetText(string)")
	tokenBinding.SpecMethod("", "GetText() string")
	tokenBinding.Register()

	analyzerBinding := cfc.NewGoClass(parcel, "Lucy::Analysis::Analyzer")
	analyzerBinding.SpecMethod("Split", "Split(string) []string")
	analyzerBinding.Register()

	polyAnalyzerBinding := cfc.NewGoClass(parcel, "Lucy::Analysis::PolyAnalyzer")
	polyAnalyzerBinding.SpecMethod("Get_Analyzers", "GetAnalyzers() []Analyzer")
	polyAnalyzerBinding.SetSuppressCtor(true)
	polyAnalyzerBinding.Register()

	docBinding := cfc.NewGoClass(parcel, "Lucy::Document::Doc")
	docBinding.SpecMethod("", "GetFields() map[string]interface{}")
	docBinding.SpecMethod("", "SetFields(map[string]interface{})")
	docBinding.SpecMethod("Field_Names", "FieldNames() []string")
	docBinding.Register()

	heatMapBinding := cfc.NewGoClass(parcel, "Lucy::Highlight::HeatMap")
	heatMapBinding.SetSuppressCtor(true)
	heatMapBinding.SpecMethod("Flatten_Spans", "flattenSpans([]Span) []Span")
	heatMapBinding.SpecMethod("Generate_Proximity_Boosts",
		"generateProximityBoosts([]Span) []Span")
	heatMapBinding.SpecMethod("Get_Spans", "getSpans() []Span")
	heatMapBinding.Register()

	indexerBinding := cfc.NewGoClass(parcel, "Lucy::Index::Indexer")
	indexerBinding.SpecMethod("", "Close() error")
	indexerBinding.SpecMethod("Add_Doc", "AddDoc(doc interface{}) error")
	indexerBinding.SpecMethod("Add_Index", "AddIndex(interface{}) error")
	indexerBinding.SpecMethod("Delete_By_Term", "DeleteByTerm(string, interface{}) error")
	indexerBinding.SpecMethod("Delete_By_Query", "DeleteByQuery(Query) error")
	indexerBinding.SpecMethod("Delete_By_Doc_ID", "DeleteByDocID(int32) error")
	indexerBinding.SpecMethod("Prepare_Commit", "PrepareCommit() error")
	indexerBinding.SpecMethod("Commit", "Commit() error")
	indexerBinding.SetSuppressStruct(true)
	indexerBinding.Register()

	dataReaderBinding := cfc.NewGoClass(parcel, "Lucy::Index::DataReader")
	dataReaderBinding.SpecMethod("Aggregator", "Aggregator([]DataReader, []int32) (DataReader, error)")
	dataReaderBinding.SpecMethod("Get_Segments", "GetSegments() []Segment")
	dataReaderBinding.SpecMethod("Close", "Close() error")
	dataReaderBinding.Register()

	ixReaderBinding := cfc.NewGoClass(parcel, "Lucy::Index::IndexReader")
	ixReaderBinding.SpecMethod("Seg_Readers", "SegReaders() []SegReader")
	ixReaderBinding.SpecMethod("Offsets", "Offsets() []int32")
	ixReaderBinding.SpecMethod("Obtain", "Obtain(string) (DataReader, error)")
	ixReaderBinding.Register()

	polyReaderBinding := cfc.NewGoClass(parcel, "Lucy::Index::PolyReader")
	polyReaderBinding.SetSuppressCtor(true)
	polyReaderBinding.Register()

	segReaderBinding := cfc.NewGoClass(parcel, "Lucy::Index::SegReader")
	segReaderBinding.SetSuppressCtor(true)
	segReaderBinding.Register()

	docReaderBinding := cfc.NewGoClass(parcel, "Lucy::Index::DocReader")
	docReaderBinding.SpecMethod("", "ReadDoc(int32, interface{}) error")
	docReaderBinding.SpecMethod("Fetch_Doc", "FetchDoc(int32) (HitDoc, error)")
	docReaderBinding.Register()

	hlReaderBinding := cfc.NewGoClass(parcel, "Lucy::Index::HighlightReader")
	hlReaderBinding.SpecMethod("Fetch_Doc_Vec", "FetchDocVec(int32) (DocVector, error)")
	hlReaderBinding.Register()

	sortReaderBinding := cfc.NewGoClass(parcel, "Lucy::Index::SortReader")
	sortReaderBinding.SpecMethod("Fetch_Sort_Cache", "fetchSortCache(string) (SortCache, error)")
	sortReaderBinding.Register()

	lexReaderBinding := cfc.NewGoClass(parcel, "Lucy::Index::LexiconReader")
	lexReaderBinding.SpecMethod("Lexicon", "Lexicon(string, interface{}) (Lexicon, error)")
	lexReaderBinding.SpecMethod("Doc_Freq", "DocFreq(string, interface{}) (uint32, error)")
	lexReaderBinding.SpecMethod("Fetch_Term_Info", "fetchTermInfo(string, interface{}) (TermInfo, error)")
	lexReaderBinding.Register()

	pListReaderBinding := cfc.NewGoClass(parcel, "Lucy::Index::PostingListReader")
	pListReaderBinding.SpecMethod("Posting_List", "PostingList(string, interface{}) (PostingList, error)")
	pListReaderBinding.Register()

	dwBinding := cfc.NewGoClass(parcel, "Lucy::Index::DataWriter")
	dwBinding.SpecMethod("Add_Inverted_Doc", "addInvertedDoc(Inverter, int32) error")
	dwBinding.SpecMethod("Add_Segment", "AddSegment(SegReader, []int32) error")
	dwBinding.SpecMethod("Delete_Segment", "DeleteSegment(SegReader) error")
	dwBinding.SpecMethod("Merge_Segment", "MergeSegment(SegReader, []int32) error")
	dwBinding.SpecMethod("Finish", "Finish() error")
	dwBinding.Register()

	segWriterBinding := cfc.NewGoClass(parcel, "Lucy::Index::SegWriter")
	segWriterBinding.SpecMethod("Prep_Seg_Dir", "PrepSegDir() error")
	segWriterBinding.SpecMethod("Add_Doc", "AddDoc(Doc, float32) error")
	segWriterBinding.Register()

	delWriterBinding := cfc.NewGoClass(parcel, "Lucy::Index::DeletionsWriter")
	delWriterBinding.SpecMethod("Delete_By_Term", "DeleteByTerm(string, interface{}) error")
	delWriterBinding.SpecMethod("Delete_By_Query", "DeleteByQuery(Query) error")
	delWriterBinding.SpecMethod("Delete_By_Doc_ID", "deleteByDocID(int32) error")
	delWriterBinding.SpecMethod("Generate_Doc_Map", "generateDocMap(Matcher, int32, int32) ([]int32, error)")
	delWriterBinding.SpecMethod("Seg_Deletions", "segDeletions(SegReader) (Matcher, error)")
	delWriterBinding.Register()

	bgMergerBinding := cfc.NewGoClass(parcel, "Lucy::Index::BackgroundMerger")
	bgMergerBinding.SpecMethod("Prepare_Commit", "PrepareCommit() error")
	bgMergerBinding.SpecMethod("Commit", "Commit() error")
	bgMergerBinding.Register()

	managerBinding := cfc.NewGoClass(parcel, "Lucy::Index::IndexManager")
	managerBinding.SpecMethod("Write_Merge_Data", "WriteMergeData(int64) error")
	managerBinding.SpecMethod("Read_Merge_Data", "ReadMergeData() (map[string]interface{}, error)")
	managerBinding.SpecMethod("Remove_Merge_Data", "RemoveMergeData() error")
	managerBinding.SpecMethod("Make_Snapshot_Filename", "MakeSnapshotFilename() (string, error)")
	managerBinding.SpecMethod("Recycle", "Recycle(PolyReader, DeletionsWriter, int64, bool) ([]SegReader, error)")
	managerBinding.Register()

	tvBinding := cfc.NewGoClass(parcel, "Lucy::Index::TermVector")
	tvBinding.SpecMethod("Get_Positions", "GetPositions() []int32")
	tvBinding.SpecMethod("Get_Start_Offsets", "GetStartOffsets() []int32")
	tvBinding.SpecMethod("Get_End_Offsets", "GetEndOffsets() []int32")
	tvBinding.SetSuppressCtor(true)
	tvBinding.Register()

	snapshotBinding := cfc.NewGoClass(parcel, "Lucy::Index::Snapshot")
	snapshotBinding.SpecMethod("List", "List() []string")
	snapshotBinding.SpecMethod("Read_File", "ReadFile(Folder, string) (Snapshot, error)")
	snapshotBinding.SpecMethod("Write_File", "WriteFile(Folder, string) error")
	snapshotBinding.Register()

	segBinding := cfc.NewGoClass(parcel, "Lucy::Index::Segment")
	segBinding.SpecMethod("Read_File", "ReadFile(Folder) error")
	segBinding.SpecMethod("Write_File", "WriteFile(Folder) error")
	segBinding.Register()

	sortCacheBinding := cfc.NewGoClass(parcel, "Lucy::Index::SortCache")
	sortCacheBinding.SpecMethod("Value", "Value(int32) (interface{}, error)")
	sortCacheBinding.SpecMethod("Ordinal", "Ordinal(int32) (int32, error)")
	sortCacheBinding.SpecMethod("Find", "Find(interface{}) (int32, error)")
	sortCacheBinding.Register()

	schemaBinding := cfc.NewGoClass(parcel, "Lucy::Plan::Schema")
	schemaBinding.SpecMethod("All_Fields", "AllFields() []string")
	schemaBinding.Register()

	searcherBinding := cfc.NewGoClass(parcel, "Lucy::Search::Searcher")
	searcherBinding.SpecMethod("Hits",
		"Hits(query interface{}, offset uint32, numWanted uint32, sortSpec SortSpec) (Hits, error)")
	searcherBinding.SpecMethod("Top_Docs", "topDocs(Query, uint32, SortSpec) (TopDocs, error)")
	searcherBinding.SpecMethod("Close", "Close() error")
	searcherBinding.SpecMethod("Fetch_Doc", "FetchDoc(int32) (HitDoc, error)")
	searcherBinding.SpecMethod("Fetch_Doc_Vec", "fetchDocVec(int32) (DocVector, error)")
	searcherBinding.SpecMethod("", "ReadDoc(int32, interface{}) error")
	searcherBinding.Register()

	qParserBinding := cfc.NewGoClass(parcel, "Lucy::Search::QueryParser")
	qParserBinding.SetSuppressCtor(true)
	qParserBinding.SpecMethod("Make_Phrase_Query", "MakePhraseQuery(string, []interface{}) PhraseQuery")
	qParserBinding.SpecMethod("Make_AND_Query", "MakeANDQuery([]Query) ANDQuery")
	qParserBinding.SpecMethod("Make_OR_Query", "MakeORQuery([]Query) ORQuery")
	qParserBinding.SpecMethod("Get_Fields", "getFields() []string")
	qParserBinding.Register()

	hitsBinding := cfc.NewGoClass(parcel, "Lucy::Search::Hits")
	hitsBinding.SpecMethod("Next", "Next(hit interface{}) bool")
	hitsBinding.SpecMethod("", "Error() error")
	hitsBinding.SetSuppressStruct(true)
	hitsBinding.Register()

	queryBinding := cfc.NewGoClass(parcel, "Lucy::Search::Query")
	queryBinding.SpecMethod("Make_Compiler", "MakeCompiler(Searcher, float32, bool) (Compiler, error)")
	queryBinding.Register()

	compilerBinding := cfc.NewGoClass(parcel, "Lucy::Search::Compiler")
	compilerBinding.SpecMethod("Make_Matcher", "MakeMatcher(SegReader, bool) (Matcher, error)")
	compilerBinding.Register()

	andQueryBinding := cfc.NewGoClass(parcel, "Lucy::Search::ANDQuery")
	andQueryBinding.SetSuppressCtor(true)
	andQueryBinding.Register()

	orQueryBinding := cfc.NewGoClass(parcel, "Lucy::Search::ORQuery")
	orQueryBinding.SetSuppressCtor(true)
	orQueryBinding.Register()

	matcherBinding := cfc.NewGoClass(parcel, "Lucy::Search::Matcher")
	matcherBinding.SpecMethod("Next", "Next() int32")
	matcherBinding.SpecMethod("", "Error() error")
	matcherBinding.SetSuppressStruct(true)
	matcherBinding.Register()

	andMatcherBinding := cfc.NewGoClass(parcel, "Lucy::Search::ANDMatcher")
	andMatcherBinding.SetSuppressCtor(true)
	andMatcherBinding.Register()

	orMatcherBinding := cfc.NewGoClass(parcel, "Lucy::Search::ORMatcher")
	orMatcherBinding.SetSuppressCtor(true)
	orMatcherBinding.Register()

	orScorerBinding := cfc.NewGoClass(parcel, "Lucy::Search::ORScorer")
	orScorerBinding.SetSuppressCtor(true)
	orScorerBinding.Register()

	seriesMatcherBinding := cfc.NewGoClass(parcel, "Lucy::Search::SeriesMatcher")
	seriesMatcherBinding.SetSuppressCtor(true)
	seriesMatcherBinding.Register()

	bitVecBinding := cfc.NewGoClass(parcel, "Lucy::Object::BitVector")
	bitVecBinding.SpecMethod("To_Array", "ToArray() []bool")
	bitVecBinding.Register()

	mockMatcherBinding := cfc.NewGoClass(parcel, "LucyX::Search::MockMatcher")
	mockMatcherBinding.SetSuppressCtor(true)
	mockMatcherBinding.Register()

	topDocsBinding := cfc.NewGoClass(parcel, "Lucy::Search::TopDocs")
	topDocsBinding.SetSuppressCtor(true)
	topDocsBinding.SpecMethod("Set_Match_Docs", "SetMatchDocs([]MatchDoc)")
	topDocsBinding.SpecMethod("Get_Match_Docs", "GetMatchDocs() []MatchDoc")
	topDocsBinding.Register()

	sortSpecBinding := cfc.NewGoClass(parcel, "Lucy::Search::SortSpec")
	sortSpecBinding.SetSuppressCtor(true)
	sortSpecBinding.SpecMethod("Get_Rules", "GetRules() []SortRule")
	sortSpecBinding.Register()

	sortCollBinding := cfc.NewGoClass(parcel, "Lucy::Search::Collector::SortCollector")
	sortCollBinding.SpecMethod("Pop_Match_Docs", "PopMatchDocs() []MatchDoc")
	sortCollBinding.Register()

	inStreamBinding := cfc.NewGoClass(parcel, "Lucy::Store::InStream")
	inStreamBinding.SpecMethod("Reopen", "Reopen(string, int64, int64) (InStream, error)")
	inStreamBinding.SpecMethod("Close", "Close() error")
	inStreamBinding.SpecMethod("Seek", "Seek(int64) error")
	inStreamBinding.SpecMethod("", "ReadBytes([]byte, int) error")
	inStreamBinding.SpecMethod("", "ReadString() (string, error)")
	inStreamBinding.SpecMethod("Read_I8", "ReadI8() (int8, error)")
	inStreamBinding.SpecMethod("Read_I32", "ReadI32() (int32, error)")
	inStreamBinding.SpecMethod("Read_I64", "ReadI64() (int64, error)")
	inStreamBinding.SpecMethod("Read_U8", "ReadU8() (uint8, error)")
	inStreamBinding.SpecMethod("Read_U32", "ReadU32() (uint32, error)")
	inStreamBinding.SpecMethod("Read_U64", "ReadU64() (uint64, error)")
	inStreamBinding.SpecMethod("Read_CI32", "ReadCI32() (int32, error)")
	inStreamBinding.SpecMethod("Read_CU32", "ReadCU32() (uint32, error)")
	inStreamBinding.SpecMethod("Read_CI64", "ReadCI64() (int64, error)")
	inStreamBinding.SpecMethod("Read_CU64", "ReadCU64() (uint64, error)")
	inStreamBinding.SpecMethod("Read_F32", "ReadF32() (float32, error)")
	inStreamBinding.SpecMethod("Read_F64", "ReadF64() (float64, error)")
	inStreamBinding.Register()

	outStreamBinding := cfc.NewGoClass(parcel, "Lucy::Store::OutStream")
	outStreamBinding.SpecMethod("Close", "Close() error")
	outStreamBinding.SpecMethod("Grow", "Grow(int64) error")
	outStreamBinding.SpecMethod("Align", "Align(int64) error")
	outStreamBinding.SpecMethod("", "WriteBytes([]byte, int) error")
	outStreamBinding.SpecMethod("", "WriteString(string) error")
	outStreamBinding.SpecMethod("Write_I8", "WriteI8(int8) error")
	outStreamBinding.SpecMethod("Write_I32", "WriteI32(int32) error")
	outStreamBinding.SpecMethod("Write_I64", "WriteI64(int64) error")
	outStreamBinding.SpecMethod("Write_U8", "WriteU8(uint8) error")
	outStreamBinding.SpecMethod("Write_U32", "WriteU32(uint32) error")
	outStreamBinding.SpecMethod("Write_U64", "WriteU64(uint64) error")
	outStreamBinding.SpecMethod("Write_CI32", "WriteCI32(int32) error")
	outStreamBinding.SpecMethod("Write_CU32", "WriteCU32(uint32) error")
	outStreamBinding.SpecMethod("Write_CI64", "WriteCI64(int64) error")
	outStreamBinding.SpecMethod("Write_CU64", "WriteCU64(uint64) error")
	outStreamBinding.SpecMethod("Write_F32", "WriteF32(float32) error")
	outStreamBinding.SpecMethod("Write_F64", "WriteF64(float64) error")
	outStreamBinding.SpecMethod("Absorb", "Absorb(InStream) error")
	outStreamBinding.Register()

	folderBinding := cfc.NewGoClass(parcel, "Lucy::Store::Folder")
	folderBinding.SpecMethod("Initialize", "Initialize() error")
	folderBinding.SpecMethod("Open_Out", "OpenOut(string) (OutStream, error)")
	folderBinding.SpecMethod("Open_In", "OpenIn(string) (InStream, error)")
	folderBinding.SpecMethod("Open_FileHandle", "OpenFileHandle(string, uint32) (FileHandle, error)")
	folderBinding.SpecMethod("Open_Dir", "OpenDir(string) (DirHandle, error)")
	folderBinding.SpecMethod("MkDir", "MkDir(string) error")
	folderBinding.SpecMethod("List", "List(string) ([]string, error)")
	folderBinding.SpecMethod("List_R", "ListR(string) ([]string, error)")
	folderBinding.SpecMethod("Rename", "Rename(string, string) error")
	folderBinding.SpecMethod("Hard_Link", "HardLink(string, string) error")
	folderBinding.SpecMethod("Slurp_File", "SlurpFile(string) ([]byte, error)")
	folderBinding.SpecMethod("Consolidate", "Consolidate(string) error")
	folderBinding.SpecMethod("Local_Open_In", "LocalOpenIn(string) (InStream, error)")
	folderBinding.SpecMethod("Local_Open_FileHandle", "LocalOpenFileHandle(string, uint32) (FileHandle, error)")
	folderBinding.SpecMethod("Local_Open_Dir", "LocalOpenDir() (DirHandle, error)")
	folderBinding.SpecMethod("Local_MkDir", "LocalMkDir(string) error")
	folderBinding.Register()

	fhBinding := cfc.NewGoClass(parcel, "Lucy::Store::FileHandle")
	fhBinding.SpecMethod("", "Write([]byte, int) error")
	fhBinding.SpecMethod("", "Read([]byte, int64, int) error")
	fhBinding.SpecMethod("Window", "Window(FileWindow, int64, int64) error")
	fhBinding.SpecMethod("Release_Window", "ReleaseWindow(FileWindow) error")
	fhBinding.SpecMethod("Grow", "Grow(int64) error")
	fhBinding.SpecMethod("Close", "Close() error")
	fhBinding.Register()

	dhBinding := cfc.NewGoClass(parcel, "Lucy::Store::DirHandle")
	dhBinding.SpecMethod("Close", "Close() error")
	dhBinding.SpecMethod("Next", "next() bool")
	dhBinding.SpecMethod("", "Error() error")
	dhBinding.SetSuppressStruct(true)
	dhBinding.Register()

	lockBinding := cfc.NewGoClass(parcel, "Lucy::Store::Lock")
	lockBinding.SpecMethod("Request", "Request() error")
	lockBinding.SpecMethod("Obtain", "Obtain() error")
	lockBinding.SpecMethod("Release", "Release() error")
	lockBinding.SpecMethod("Clear_Stale", "ClearStale() error")
	lockBinding.Register()

	cfWriterBinding := cfc.NewGoClass(parcel, "Lucy::Store::CompoundFileWriter")
	cfWriterBinding.SpecMethod("Consolidate", "Consolidate() error")
	cfWriterBinding.Register()

	stepperBinding := cfc.NewGoClass(parcel, "Lucy::Util::Stepper")
	stepperBinding.SpecMethod("Write_Key_Frame", "WriteKeyFrame(OutStream, interface{}) error")
	stepperBinding.SpecMethod("Write_Delta", "WriteDelta(OutStream, interface{}) error")
	stepperBinding.SpecMethod("Read_Key_Frame", "ReadKeyFrame(InStream) error")
	stepperBinding.SpecMethod("Read_Delta", "ReadDelta(InStream) error")
	stepperBinding.SpecMethod("Read_Record", "readRecord(InStream) error")
	stepperBinding.Register()
}

func build() {
	configure()
	runCFC()
	runCommand("make", "-j", "static")
	writeConfigGO()
	runCommand("go", "build", packageName)
}

func test() {
	build()
	runCommand("go", "test", packageName)
}

func copyFile(source, dest string) {
	sourceFH, err := os.Open(source)
	if err != nil {
		log.Fatal(err)
	}
	defer sourceFH.Close()
	destFH, err := os.Create(dest)
	if err != nil {
		log.Fatal(err)
	}
	defer destFH.Close()
	_, err = io.Copy(destFH, sourceFH)
	if err != nil {
		log.Fatalf("io.Copy from %s to %s failed: %s", source, dest, err)
	}
}

func installStaticLib() {
	tempLibPath := path.Join(buildDir, "liblucy.a")
	destDir := path.Dir(installedLibPath)
	if _, err := os.Stat(destDir); os.IsNotExist(err) {
		err = os.MkdirAll(destDir, 0755)
		if err != nil {
			log.Fatalf("Can't create dir '%s': %s", destDir, err)
		}
	}
	os.Remove(installedLibPath)
	copyFile(tempLibPath, installedLibPath)
}

func install() {
	build()
	runCommand("go", "install", packageName)
	installStaticLib()
}

func writeConfigGO() {
	if current(buildGO, configGO) {
		return
	}
	installedLibDir := path.Dir(installedLibPath)
	cfLibPath, err := cfc.InstalledLibPath(cfPackageName)
	if err != nil {
		log.Fatal(err)
	}
	cfLibDir := path.Dir(cfLibPath)
	content := fmt.Sprintf(
		"// Auto-generated by build.go, specifying absolute path to static lib.\n"+
			"package lucy\n"+
			"// #cgo CFLAGS: -I%s/../core\n"+
			"// #cgo CFLAGS: -I%s\n"+
			"// #cgo CFLAGS: -I%s/autogen/include\n"+
			"// #cgo LDFLAGS: -L%s\n"+
			"// #cgo LDFLAGS: -L%s\n"+
			"// #cgo LDFLAGS: -L%s\n"+
			"// #cgo LDFLAGS: -llucy\n"+
			"// #cgo LDFLAGS: -lclownfish\n"+
			"// #cgo LDFLAGS: -lm\n"+
			"import \"C\"\n",
		buildDir, buildDir, buildDir, buildDir, installedLibDir, cfLibDir)
	ioutil.WriteFile(configGO, []byte(content), 0666)
}

func clean() {
	fmt.Println("Cleaning")
	if _, err := os.Stat("Makefile"); !os.IsNotExist(err) {
		runCommand("make", "clean")
	}
	files := []string{charmonizerEXE, "charmony.h", "Makefile", configGO, cfbindGO}
	for _, file := range files {
		err := os.Remove(file)
		if err == nil {
			fmt.Println("Removing", file)
		} else if !os.IsNotExist(err) {
			log.Fatal(err)
		}
	}
}
