in newt/toolchain/deps.go [194:285]
func (tracker *DepTracker) CompileRequired(srcFile string,
compilerType int) (bool, error) {
objPath := tracker.compiler.dstFilePath(srcFile) + ".o"
depPath := tracker.compiler.dstFilePath(srcFile) + ".d"
// If the object was previously built with a different set of options, a
// rebuild is necessary.
cmd, err := tracker.compiler.CompileFileCmd(srcFile, compilerType)
if err != nil {
return false, err
}
if commandHasChanged(objPath, cmd) {
logRebuildReqdCmdChanged(srcFile)
err := tracker.compiler.GenDepsForFile(srcFile, compilerType)
if err != nil {
return false, err
}
return true, nil
}
if util.NodeNotExist(depPath) {
err := tracker.compiler.GenDepsForFile(srcFile, compilerType)
if err != nil {
return false, err
}
}
srcModTime, err := util.FileModificationTime(srcFile)
if err != nil {
return false, err
}
objModTime, err := util.FileModificationTime(objPath)
if err != nil {
return false, err
}
// If the object doesn't exist or is older than the source file, a build is
// required; no need to check dependencies.
if srcModTime.After(objModTime) {
logRebuildReqdModTime(objPath, srcFile)
return true, nil
}
// Determine if the dependency (.d) file needs to be generated. If it
// doesn't exist or is older than the source file, it is out of date and
// needs to be created.
depModTime, err := util.FileModificationTime(depPath)
if err != nil {
return false, err
}
if srcModTime.After(depModTime) {
err := tracker.compiler.GenDepsForFile(srcFile, compilerType)
if err != nil {
return false, err
}
}
// Extract the dependency filenames from the dependency file.
deps, err := ParseDepsFile(depPath)
if err != nil {
return false, err
}
// Check if any dependencies are newer than the destination object file.
for _, dep := range deps {
if util.NodeNotExist(dep) {
// The dependency has been deleted; a rebuild is required. Also,
// the dependency file is out of date, so it needs to be deleted.
// We cannot regenerate it now because the source file might be
// including a nonexistent header.
logRebuildReqdNoDep(srcFile, dep)
os.Remove(depPath)
return true, nil
} else {
depModTime, err = util.FileModificationTime(dep)
if err != nil {
return false, err
}
}
if depModTime.After(objModTime) {
logRebuildReqdNewDep(srcFile, dep)
return true, nil
}
}
return false, nil
}