Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 569edc5f authored by Dan Willemsen's avatar Dan Willemsen
Browse files

Add dist support to Soong

When dist'ing a library or binary that has use_version_lib set, always
distribute the stamped version, even for the device.

Test: m test_build_version_test dist
Change-Id: I2995ec516b1d182ce18f099aeaa4d186ffbcf01f
parent bba551c1
Loading
Loading
Loading
Loading
+40 −0
Original line number Diff line number Diff line
@@ -40,6 +40,7 @@ type AndroidMkDataProvider interface {
type AndroidMkData struct {
	Class      string
	SubName    string
	DistFile   OptionalPath
	OutputFile OptionalPath
	Disabled   bool
	Include    string
@@ -220,6 +221,45 @@ func translateAndroidModule(ctx SingletonContext, w io.Writer, mod blueprint.Mod
		}
	}

	if len(amod.commonProperties.Dist.Targets) > 0 {
		distFile := data.DistFile
		if !distFile.Valid() {
			distFile = data.OutputFile
		}
		if distFile.Valid() {
			dest := filepath.Base(distFile.String())

			if amod.commonProperties.Dist.Dest != nil {
				var err error
				dest, err = validateSafePath(*amod.commonProperties.Dist.Dest)
				if err != nil {
					// This was checked in ModuleBase.GenerateBuildActions
					panic(err)
				}
			}

			if amod.commonProperties.Dist.Suffix != nil {
				ext := filepath.Ext(dest)
				suffix := *amod.commonProperties.Dist.Suffix
				dest = strings.TrimSuffix(dest, ext) + suffix + ext
			}

			if amod.commonProperties.Dist.Dir != nil {
				var err error
				dest, err = validateSafePath(*amod.commonProperties.Dist.Dir, dest)
				if err != nil {
					// This was checked in ModuleBase.GenerateBuildActions
					panic(err)
				}
			}

			goals := strings.Join(amod.commonProperties.Dist.Targets, " ")
			fmt.Fprintln(&data.preamble, ".PHONY:", goals)
			fmt.Fprintf(&data.preamble, "$(call dist-for-goals,%s,%s:%s)\n",
				goals, distFile.String(), dest)
		}
	}

	fmt.Fprintln(&data.preamble, "\ninclude $(CLEAR_VARS)")
	fmt.Fprintln(&data.preamble, "LOCAL_PATH :=", filepath.Dir(ctx.BlueprintFile(mod)))
	fmt.Fprintln(&data.preamble, "LOCAL_MODULE :=", name+data.SubName)
+37 −0
Original line number Diff line number Diff line
@@ -265,6 +265,24 @@ type commonProperties struct {
	// relative path to a file to include in the list of notices for the device
	Notice *string

	Dist struct {
		// copy the output of this module to the $DIST_DIR when `dist` is specified on the
		// command line and  any of these targets are also on the command line, or otherwise
		// built
		Targets []string `android:"arch_variant"`

		// The name of the output artifact. This defaults to the basename of the output of
		// the module.
		Dest *string `android:"arch_variant"`

		// The directory within the dist directory to store the artifact. Defaults to the
		// top level directory ("").
		Dir *string `android:"arch_variant"`

		// A suffix to add to the artifact file name (before any extension).
		Suffix *string `android:"arch_variant"`
	} `android:"arch_variant"`

	// Set by TargetMutator
	CompileTarget       Target   `blueprint:"mutated"`
	CompileMultiTargets []Target `blueprint:"mutated"`
@@ -781,6 +799,25 @@ func (a *ModuleBase) GenerateBuildActions(blueprintCtx blueprint.ModuleContext)
	}
	ctx.Variable(pctx, "moduleDescSuffix", s)

	// Some common property checks for properties that will be used later in androidmk.go
	if a.commonProperties.Dist.Dest != nil {
		_, err := validateSafePath(*a.commonProperties.Dist.Dest)
		if err != nil {
			ctx.PropertyErrorf("dist.dest", "%s", err.Error())
		}
	}
	if a.commonProperties.Dist.Dir != nil {
		_, err := validateSafePath(*a.commonProperties.Dist.Dir)
		if err != nil {
			ctx.PropertyErrorf("dist.dir", "%s", err.Error())
		}
	}
	if a.commonProperties.Dist.Suffix != nil {
		if strings.Contains(*a.commonProperties.Dist.Suffix, "/") {
			ctx.PropertyErrorf("dist.suffix", "Suffix may not contain a '/' character.")
		}
	}

	if a.Enabled() {
		a.module.GenerateAndroidBuildActions(ctx)
		if ctx.Failed() {
+2 −0
Original line number Diff line number Diff line
@@ -151,6 +151,7 @@ func (library *libraryDecorator) AndroidMk(ctx AndroidMkContext, ret *android.An
		ret.Class = "HEADER_LIBRARIES"
	}

	ret.DistFile = library.distFile
	ret.Extra = append(ret.Extra, func(w io.Writer, outputFile android.Path) {
		library.androidMkWriteExportedFlags(w)
		fmt.Fprintln(w, "LOCAL_ADDITIONAL_DEPENDENCIES := ")
@@ -194,6 +195,7 @@ func (binary *binaryDecorator) AndroidMk(ctx AndroidMkContext, ret *android.Andr
	ctx.subAndroidMk(ret, binary.baseInstaller)

	ret.Class = "EXECUTABLES"
	ret.DistFile = binary.distFile
	ret.Extra = append(ret.Extra, func(w io.Writer, outputFile android.Path) {
		fmt.Fprintln(w, "LOCAL_SOONG_UNSTRIPPED_BINARY :=", binary.unstrippedOutputFile.String())
		if len(binary.symlinks) > 0 {
+20 −4
Original line number Diff line number Diff line
@@ -88,6 +88,9 @@ type binaryDecorator struct {

	// Output archive of gcno coverage information
	coverageOutputFile android.OptionalPath

	// Location of the file that should be copied to dist dir when requested
	distFile android.OptionalPath
}

var _ linker = (*binaryDecorator)(nil)
@@ -330,10 +333,23 @@ func (binary *binaryDecorator) link(ctx ModuleContext,
			flagsToBuilderFlags(flags), afterPrefixSymbols)
	}

	if Bool(binary.baseLinker.Properties.Use_version_lib) && ctx.Host() {
	if Bool(binary.baseLinker.Properties.Use_version_lib) {
		if ctx.Host() {
			versionedOutputFile := outputFile
			outputFile = android.PathForModuleOut(ctx, "unversioned", fileName)
			binary.injectVersionSymbol(ctx, outputFile, versionedOutputFile)
		} else {
			versionedOutputFile := android.PathForModuleOut(ctx, "versioned", fileName)
			binary.distFile = android.OptionalPathForPath(versionedOutputFile)

			if binary.stripper.needsStrip(ctx) {
				out := android.PathForModuleOut(ctx, "versioned-stripped", fileName)
				binary.distFile = android.OptionalPathForPath(out)
				binary.stripper.strip(ctx, versionedOutputFile, out, builderFlags)
			}

			binary.injectVersionSymbol(ctx, outputFile, versionedOutputFile)
		}
	}

	if ctx.Os() == android.LinuxBionic && !binary.static() {
+10 −4
Original line number Diff line number Diff line
@@ -23,9 +23,19 @@
namespace android {
namespace build {

#define PLACEHOLDER "SOONG BUILD NUMBER PLACEHOLDER"

extern "C" {
  char soong_build_number[128] = PLACEHOLDER;
}

#ifdef __ANDROID__

std::string GetBuildNumber() {
  if (strcmp(PLACEHOLDER, soong_build_number) != 0) {
    return soong_build_number;
  }

  const prop_info* pi = __system_property_find("ro.build.version.incremental");
  if (pi == nullptr) return "";

@@ -42,10 +52,6 @@ std::string GetBuildNumber() {

#else

extern "C" {
  char soong_build_number[128] = "SOONG BUILD NUMBER PLACEHOLDER";
}

std::string GetBuildNumber() {
  return soong_build_number;
}
Loading