func()

in newt/builder/buildpackage.go [134:237]


func (bpkg *BuildPackage) CompilerInfo(
	b *Builder) (*toolchain.CompilerInfo, error) {

	// If this package's compiler info has already been generated, return the
	// cached copy.
	if bpkg.ci != nil {
		return bpkg.ci, nil
	}

	ci := toolchain.NewCompilerInfo()
	settings := b.cfg.AllSettingsForLpkg(bpkg.rpkg.Lpkg)

	var err error

	// Read each set of flags and expand repo designators ("@<repo-name>") into
	// paths.
	ci.Cflags, err = bpkg.rpkg.Lpkg.PkgY.GetValStringSlice("pkg.cflags", settings)
	util.OneTimeWarningError(err)
	expandFlags(ci.Cflags)

	ci.CXXflags, err = bpkg.rpkg.Lpkg.PkgY.GetValStringSlice("pkg.cxxflags", settings)
	util.OneTimeWarningError(err)
	expandFlags(ci.CXXflags)

	ci.Lflags, err = bpkg.rpkg.Lpkg.PkgY.GetValStringSlice("pkg.lflags", settings)
	util.OneTimeWarningError(err)
	expandFlags(ci.Lflags)

	ci.Aflags, err = bpkg.rpkg.Lpkg.PkgY.GetValStringSlice("pkg.aflags", settings)
	util.OneTimeWarningError(err)
	expandFlags(ci.Aflags)

	// Package-specific injected settings get specified as C flags on the
	// command line.
	for _, k := range bpkg.rpkg.Lpkg.InjectedSettings().Names() {
		ci.Cflags = append(ci.Cflags, syscfg.FeatureToCflag(k))
	}

	ci.IgnoreFiles = []*regexp.Regexp{}

	ignPats, err := bpkg.rpkg.Lpkg.PkgY.GetValStringSlice(
		"pkg.ignore_files", settings)
	util.OneTimeWarningError(err)

	if len(ignPats) == 0 {
		ignPats, err = bpkg.rpkg.Lpkg.PkgY.GetValStringSlice(
			"pkg.ign_files", settings)
		util.OneTimeWarningError(err)
	}

	for _, str := range ignPats {
		re, err := regexp.Compile(str)
		if err != nil {
			return nil, util.NewNewtError(
				"Ignore files, unable to compile re: " + err.Error())
		}
		ci.IgnoreFiles = append(ci.IgnoreFiles, re)
	}

	ci.IgnoreDirs = []*regexp.Regexp{}

	ignPats, err = bpkg.rpkg.Lpkg.PkgY.GetValStringSlice(
		"pkg.ignore_dirs", settings)
	util.OneTimeWarningError(err)

	if len(ignPats) == 0 {
		ignPats, err = bpkg.rpkg.Lpkg.PkgY.GetValStringSlice(
			"pkg.ign_dirs", settings)
		util.OneTimeWarningError(err)
	}

	for _, str := range ignPats {
		re, err := regexp.Compile(str)
		if err != nil {
			return nil, util.NewNewtError(
				"Ignore dirs, unable to compile re: " + err.Error())
		}
		ci.IgnoreDirs = append(ci.IgnoreDirs, re)
	}

	bpkg.SourceDirectories, err = bpkg.rpkg.Lpkg.PkgY.GetValStringSlice(
		"pkg.source_dirs", settings)
	util.OneTimeWarningError(err)

	if len(bpkg.SourceDirectories) == 0 {
		bpkg.SourceDirectories, err = bpkg.rpkg.Lpkg.PkgY.GetValStringSlice(
			"pkg.src_dirs", settings)
		util.OneTimeWarningError(err)
	}

	bpkg.SourceFiles, err = bpkg.rpkg.Lpkg.PkgY.GetValStringSlice(
		"pkg.source_files", settings)
	util.OneTimeWarningError(err)

	includePaths, err := bpkg.recursiveIncludePaths(b)
	if err != nil {
		return nil, err
	}

	ci.Includes = append(bpkg.privateIncludeDirs(b), includePaths...)
	bpkg.ci = ci

	return bpkg.ci, nil
}