in newt/builder/build.go [638:728]
func (b *Builder) Build() error {
b.CleanArtifacts()
// Build the packages alphabetically to ensure a consistent order.
bpkgs := b.sortedBuildPackages()
// Calculate the list of jobs. Each record represents a single file that
// needs to be compiled.
entries := []toolchain.CompilerJob{}
bpkgCompilerMap := map[*BuildPackage]*toolchain.Compiler{}
for _, bpkg := range bpkgs {
subEntries, err := b.collectCompileEntriesBpkg(bpkg)
if err != nil {
return err
}
entries = append(entries, subEntries...)
if len(subEntries) > 0 {
bpkgCompilerMap[bpkg] = subEntries[0].Compiler
}
}
// Build each file in parallel.
jobs := make(chan toolchain.CompilerJob, len(entries))
defer close(jobs)
stop := make(chan struct{}, newtutil.NewtNumJobs)
defer close(stop)
errors := make(chan error, newtutil.NewtNumJobs)
defer close(errors)
for _, entry := range entries {
jobs <- entry
}
for i := 0; i < newtutil.NewtNumJobs; i++ {
go buildWorker(i, jobs, stop, errors)
}
var err error
for i := 0; i < newtutil.NewtNumJobs; i++ {
subErr := <-errors
if err == nil && subErr != nil {
err = subErr
}
}
if err != nil {
return err
}
for _, bpkg := range bpkgs {
c := bpkgCompilerMap[bpkg]
if c != nil {
if err := b.createArchive(c, bpkg); err != nil {
return err
}
}
}
var compileCommands []toolchain.CompileCommand
for _, bpkg := range bpkgs {
c := bpkgCompilerMap[bpkg]
if c != nil {
compileCommands = append(compileCommands,
c.GetCompileCommands()...)
}
}
projectPath := interfaces.GetProject().Path() + "/"
for i := range compileCommands {
compileCommands[i].Directory = projectPath
}
cmdBytes, err := json.MarshalIndent(compileCommands, "", " ")
if err != nil {
log.Error("Unable to encode compilation commands as JSON")
return nil
}
cmdPath := b.CompileCmdsPath()
errWrite := ioutil.WriteFile(cmdPath, cmdBytes, 0644)
if errWrite != nil {
return util.FmtNewtError(
"Unable to write compile_commands.json file; reason: %s",
errWrite.Error())
}
return nil
}