// Copyright 2014 Google Inc. All rights reserved.
//
// 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 bootstrap

var (
	// These variables are the only configuration needed by the boostrap
	// modules.  They are always set to the variable name enclosed in "@@" so
	// that their values can be easily replaced in the generated Ninja file.
	srcDir            = pctx.StaticVariable("srcDir", "@@SrcDir@@")
	buildDir          = pctx.StaticVariable("buildDir", "@@BuildDir@@")
	goRoot            = pctx.StaticVariable("goRoot", "@@GoRoot@@")
	compileCmd        = pctx.StaticVariable("compileCmd", "@@GoCompile@@")
	linkCmd           = pctx.StaticVariable("linkCmd", "@@GoLink@@")
	bootstrapCmd      = pctx.StaticVariable("bootstrapCmd", "@@Bootstrap@@")
	bootstrapManifest = pctx.StaticVariable("bootstrapManifest",
		"@@BootstrapManifest@@")
)

type ConfigInterface interface {
	// GeneratingBootstrapper should return true if this build invocation is
	// creating a build.ninja.in file to be used in a build bootstrapping
	// sequence.
	GeneratingBootstrapper() bool
	// GeneratingPrimaryBuilder should return true if this build invocation is
	// creating a build.ninja.in file to be used to build the primary builder
	GeneratingPrimaryBuilder() bool
}

type ConfigRemoveAbandonedFiles interface {
	// RemoveAbandonedFiles should return true if files listed in the
	// .ninja_log but not the output build.ninja file should be deleted.
	RemoveAbandonedFiles() bool
}

type Stage int

const (
	StageBootstrap Stage = iota
	StagePrimary
	StageMain
)

type Config struct {
	stage Stage

	topLevelBlueprintsFile string

	runGoTests bool
}