diff options
author | Treehugger Robot <treehugger-gerrit@google.com> | 2018-03-03 03:16:48 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2018-03-03 03:16:48 +0000 |
commit | 83a495830b23f7391b39512d43c0f2a68675644e (patch) | |
tree | 451faf47b36ec4861fb985365c60d9554ba1a0ad /cc | |
parent | ea0a2e1928fd2a3ae14e38ee2a92adc4bd58d446 (diff) | |
parent | 86803cfe6e814d3699e842cfc41244cd9a6e0c30 (diff) | |
download | build_soong-83a495830b23f7391b39512d43c0f2a68675644e.tar.gz build_soong-83a495830b23f7391b39512d43c0f2a68675644e.tar.bz2 build_soong-83a495830b23f7391b39512d43c0f2a68675644e.zip |
Merge changes I6f7d40b7,I25654032
* changes:
add a library to report build numbers without causing rebuilds
Rewrite symbol_inject to be testable
Diffstat (limited to 'cc')
-rw-r--r-- | cc/binary.go | 6 | ||||
-rw-r--r-- | cc/libbuildversion/Android.bp | 12 | ||||
-rw-r--r-- | cc/libbuildversion/include/build/version.h | 30 | ||||
-rw-r--r-- | cc/libbuildversion/libbuildversion.cpp | 55 | ||||
-rw-r--r-- | cc/libbuildversion/tests/Android.bp | 35 | ||||
-rw-r--r-- | cc/libbuildversion/tests/build_version_test.cpp | 36 | ||||
-rw-r--r-- | cc/libbuildversion/tests/build_version_test_lib.cpp | 23 | ||||
-rw-r--r-- | cc/libbuildversion/tests/build_version_test_lib.h | 24 | ||||
-rw-r--r-- | cc/library.go | 16 | ||||
-rw-r--r-- | cc/linker.go | 36 |
10 files changed, 271 insertions, 2 deletions
diff --git a/cc/binary.go b/cc/binary.go index 630a68df..7794eab6 100644 --- a/cc/binary.go +++ b/cc/binary.go @@ -323,6 +323,12 @@ func (binary *binaryDecorator) link(ctx ModuleContext, flagsToBuilderFlags(flags), afterPrefixSymbols) } + if Bool(binary.baseLinker.Properties.Use_version_lib) && ctx.Host() { + versionedOutputFile := outputFile + outputFile = android.PathForModuleOut(ctx, "unversioned", fileName) + binary.injectVersionSymbol(ctx, outputFile, versionedOutputFile) + } + linkerDeps = append(linkerDeps, deps.SharedLibsDeps...) linkerDeps = append(linkerDeps, deps.LateSharedLibsDeps...) linkerDeps = append(linkerDeps, objs.tidyFiles...) diff --git a/cc/libbuildversion/Android.bp b/cc/libbuildversion/Android.bp new file mode 100644 index 00000000..fd563e6d --- /dev/null +++ b/cc/libbuildversion/Android.bp @@ -0,0 +1,12 @@ +cc_library_static { + name: "libbuildversion", + host_supported: true, + srcs: ["libbuildversion.cpp"], + export_include_dirs: ["include"], + cflags: ["-fvisibility=hidden"], + target: { + windows: { + enabled: true, + }, + }, +} diff --git a/cc/libbuildversion/include/build/version.h b/cc/libbuildversion/include/build/version.h new file mode 100644 index 00000000..0cc60820 --- /dev/null +++ b/cc/libbuildversion/include/build/version.h @@ -0,0 +1,30 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef BUILD_VERSION_H +#define BUILD_VERSION_H + +#include <string> + +namespace android { +namespace build { + +std::string GetBuildNumber(); + +} // namespace build +} // namespace android + +#endif // BUILD_VERSION_H diff --git a/cc/libbuildversion/libbuildversion.cpp b/cc/libbuildversion/libbuildversion.cpp new file mode 100644 index 00000000..d80d587c --- /dev/null +++ b/cc/libbuildversion/libbuildversion.cpp @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <build/version.h> + +#ifdef __ANDROID__ +#include <sys/system_properties.h> +#endif + +namespace android { +namespace build { + +#ifdef __ANDROID__ + +std::string GetBuildNumber() { + const prop_info* pi = __system_property_find("ro.build.version.incremental"); + if (pi == nullptr) return ""; + + std::string property_value; + __system_property_read_callback(pi, + [](void* cookie, const char*, const char* value, unsigned) { + auto property_value = reinterpret_cast<std::string*>(cookie); + *property_value = value; + }, + &property_value); + + return property_value; +} + +#else + +extern "C" { + char soong_build_number[128] = "SOONG BUILD NUMBER PLACEHOLDER"; +} + +std::string GetBuildNumber() { + return soong_build_number; +} + +#endif +} // namespace build +} // namespace android diff --git a/cc/libbuildversion/tests/Android.bp b/cc/libbuildversion/tests/Android.bp new file mode 100644 index 00000000..a18bc6cc --- /dev/null +++ b/cc/libbuildversion/tests/Android.bp @@ -0,0 +1,35 @@ +cc_defaults { + name: "build_version_test_defaults", + use_version_lib: true, + host_supported: true, + target: { + windows: { + enabled: true, + }, + }, +} + +cc_test { + name: "build_version_test", + defaults: ["build_version_test_defaults"], + srcs: ["build_version_test.cpp"], + target: { + android: { + shared_libs: ["libbuild_version_test"], + }, + not_windows: { + shared_libs: ["libbuild_version_test"], + }, + }, +} + +cc_library_shared { + name: "libbuild_version_test", + defaults: ["build_version_test_defaults"], + srcs: ["build_version_test_lib.cpp"], + target: { + windows: { + enabled: false, + }, + }, +} diff --git a/cc/libbuildversion/tests/build_version_test.cpp b/cc/libbuildversion/tests/build_version_test.cpp new file mode 100644 index 00000000..9a920654 --- /dev/null +++ b/cc/libbuildversion/tests/build_version_test.cpp @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <stdio.h> + +#include <gtest/gtest.h> + +#include <build/version.h> + +#include "build_version_test_lib.h" + +TEST(BuildNumber, binary) { + printf("binary version: %s\n", android::build::GetBuildNumber().c_str()); + EXPECT_NE(android::build::GetBuildNumber(), "SOONG BUILD NUMBER PLACEHOLDER"); +} + + // symbol_inject doesn't support dlls +#ifndef __WIN32__ +TEST(BuildNumber, library) { + printf("shared library version: %s\n", LibGetBuildNumber().c_str()); + EXPECT_NE(LibGetBuildNumber(), "SOONG BUILD NUMBER PLACEHOLDER"); +} +#endif diff --git a/cc/libbuildversion/tests/build_version_test_lib.cpp b/cc/libbuildversion/tests/build_version_test_lib.cpp new file mode 100644 index 00000000..2876a63c --- /dev/null +++ b/cc/libbuildversion/tests/build_version_test_lib.cpp @@ -0,0 +1,23 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <build/version.h> + +#include "build_version_test_lib.h" + +std::string LibGetBuildNumber() { + return android::build::GetBuildNumber(); +} diff --git a/cc/libbuildversion/tests/build_version_test_lib.h b/cc/libbuildversion/tests/build_version_test_lib.h new file mode 100644 index 00000000..ca975afe --- /dev/null +++ b/cc/libbuildversion/tests/build_version_test_lib.h @@ -0,0 +1,24 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef BUILD_VERSION_TEST_LIB_H_ +#define BUILD_VERSION_TEST_LIB_H_ + +#include <string> + +std::string __attribute__((visibility("default"))) LibGetBuildNumber(); + +#endif // BUILD_VERSION_TEST_LIB_H_ diff --git a/cc/library.go b/cc/library.go index d3717dd9..6fe9ca4e 100644 --- a/cc/library.go +++ b/cc/library.go @@ -492,10 +492,16 @@ func (library *libraryDecorator) linkStatic(ctx ModuleContext, library.objects = deps.WholeStaticLibObjs.Copy() library.objects = library.objects.Append(objs) - outputFile := android.PathForModuleOut(ctx, - ctx.ModuleName()+library.MutatedProperties.VariantName+staticLibraryExtension) + fileName := ctx.ModuleName() + library.MutatedProperties.VariantName + staticLibraryExtension + outputFile := android.PathForModuleOut(ctx, fileName) builderFlags := flagsToBuilderFlags(flags) + if Bool(library.baseLinker.Properties.Use_version_lib) && ctx.Host() { + versionedOutputFile := outputFile + outputFile = android.PathForModuleOut(ctx, "unversioned", fileName) + library.injectVersionSymbol(ctx, outputFile, versionedOutputFile) + } + TransformObjToStaticLib(ctx, library.objects.objFiles, builderFlags, outputFile, objs.tidyFiles) library.coverageOutputFile = TransformCoverageFilesToLib(ctx, library.objects, builderFlags, @@ -585,6 +591,12 @@ func (library *libraryDecorator) linkShared(ctx ModuleContext, library.stripper.strip(ctx, outputFile, strippedOutputFile, builderFlags) } + if Bool(library.baseLinker.Properties.Use_version_lib) && ctx.Host() { + versionedOutputFile := outputFile + outputFile = android.PathForModuleOut(ctx, "unversioned", fileName) + library.injectVersionSymbol(ctx, outputFile, versionedOutputFile) + } + sharedLibs := deps.SharedLibs sharedLibs = append(sharedLibs, deps.LateSharedLibs...) diff --git a/cc/linker.go b/cc/linker.go index fae55425..bcedc8da 100644 --- a/cc/linker.go +++ b/cc/linker.go @@ -18,6 +18,7 @@ import ( "android/soong/android" "fmt" + "github.com/google/blueprint" "github.com/google/blueprint/proptools" ) @@ -95,6 +96,9 @@ type BaseLinkerProperties struct { Exclude_static_libs []string } } + + // make android::build:GetBuildNumber() available containing the build ID. + Use_version_lib *bool `android:"arch_variant"` } func NewBaseLinker() *baseLinker { @@ -136,6 +140,10 @@ func (linker *baseLinker) linkerDeps(ctx BaseModuleContext, deps Deps) Deps { deps.ReexportSharedLibHeaders = append(deps.ReexportSharedLibHeaders, linker.Properties.Export_shared_lib_headers...) deps.ReexportGeneratedHeaders = append(deps.ReexportGeneratedHeaders, linker.Properties.Export_generated_headers...) + if Bool(linker.Properties.Use_version_lib) { + deps.WholeStaticLibs = append(deps.WholeStaticLibs, "libbuildversion") + } + if ctx.useVndk() { deps.SharedLibs = removeListFromList(deps.SharedLibs, linker.Properties.Target.Vendor.Exclude_shared_libs) deps.ReexportSharedLibHeaders = removeListFromList(deps.ReexportSharedLibHeaders, linker.Properties.Target.Vendor.Exclude_shared_libs) @@ -278,3 +286,31 @@ func (linker *baseLinker) link(ctx ModuleContext, flags Flags, deps PathDeps, objs Objects) android.Path { panic(fmt.Errorf("baseLinker doesn't know how to link")) } + +// Injecting version symbols +// Some host modules want a version number, but we don't want to rebuild it every time. Optionally add a step +// after linking that injects a constant placeholder with the current version number. + +func init() { + pctx.HostBinToolVariable("symbolInjectCmd", "symbol_inject") +} + +var injectVersionSymbol = pctx.AndroidStaticRule("injectVersionSymbol", + blueprint.RuleParams{ + Command: "$symbolInjectCmd -i $in -o $out -s soong_build_number " + + "-from 'SOONG BUILD NUMBER PLACEHOLDER' -v $buildNumberFromFile", + CommandDeps: []string{"$symbolInjectCmd"}, + }, + "buildNumberFromFile") + +func (linker *baseLinker) injectVersionSymbol(ctx ModuleContext, in android.Path, out android.WritablePath) { + ctx.Build(pctx, android.BuildParams{ + Rule: injectVersionSymbol, + Description: "inject version symbol", + Input: in, + Output: out, + Args: map[string]string{ + "buildNumberFromFile": ctx.Config().BuildNumberFromFile(), + }, + }) +} |