func()

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
}