Merge "Don't set LOCAL_SDK_RES_VERSION to current if LOCAL_SDK_VERSION is core_current"
diff --git a/Changes.md b/Changes.md
index 1fadcef..be2a271 100644
--- a/Changes.md
+++ b/Changes.md
@@ -1,5 +1,9 @@
# Build System Changes for Android.mk Writers
+## Deprecation of `BUILD_*` module types
+
+See [build/make/Deprecation.md](Deprecation.md) for the current status.
+
## `PRODUCT_HOST_PACKAGES` split from `PRODUCT_PACKAGES` {#PRODUCT_HOST_PACKAGES}
Previously, adding a module to `PRODUCT_PACKAGES` that supported both the host
diff --git a/Deprecation.md b/Deprecation.md
new file mode 100644
index 0000000..6468f46
--- /dev/null
+++ b/Deprecation.md
@@ -0,0 +1,56 @@
+# Deprecation of Make
+
+We've made significant progress converting AOSP from Make to Soong (Android.mk
+to Android.bp), and we're ready to start turning off pieces of Make. If you
+have any problems converting, please contact us via:
+
+* The [android-building@googlegroups.com] group.
+* Our [public bug tracker](https://issuetracker.google.com/issues/new?component=381517).
+* Or privately through your existing contacts at Google.
+
+## Status
+
+[build/make/core/deprecation.mk] is the source of truth, but for easy browsing:
+
+| Module type | State |
+| -------------------------- | --------- |
+| `BUILD_HOST_TEST_CONFIG` | Warning |
+| `BUILD_TARGET_TEST_CONFIG` | Warning |
+| `BUILD_*` | Available |
+
+## Module Type Deprecation Process
+
+We'll be turning off `BUILD_*` module types as all of the users are removed
+from AOSP (and Google's internal trees). The process will go something like
+this, using `BUILD_PACKAGE` as an example:
+
+* Prerequisite: all common users of `BUILD_PACKAGE` have been removed (some
+ device-specific ones may remain).
+* `BUILD_PACKAGE` will be moved from `AVAILABLE_BUILD_MODULE_TYPES` to
+ `DEFAULT_WARNING_BUILD_MODULE_TYPES` in [build/make/core/deprecation.mk]. This
+ will make referring to `BUILD_PACKAGE` a warning.
+* Any devices that still have warnings will have
+ `BUILD_BROKEN_USES_BUILD_PACKAGE := true` added to their `BoardConfig.mk`.
+* `BUILD_PACKAGE` will be switched from `DEFAULT_WARNING_BUILD_MODULE_TYPES` to
+ `DEFAULT_ERROR_BUILD_MODULE_TYPES`, which will turn referring to
+ `BUILD_PACKAGE` into an error unless the device has overridden it.
+* At some later point, after all devices in AOSP no longer set
+ `BUILD_BROKEN_USES_BUILD_PACKAGE`, `BUILD_PACKAGE` will be moved from
+ `DEFAULT_ERROR_BUILD_MODULE_TYPES` to `OBSOLETE_BUILD_MODULE_TYPES` and the
+ code will be removed. It will no longer be possible to use `BUILD_PACKAGE`.
+
+In most cases, we expect module types to stay in the default warning state for
+about two weeks before becoming an error by default. Then it will spend some
+amount of time in the default error state before moving to obsolete -- we'll
+try and keep that around for a while, but other development may cause those to
+break, and the fix may to be to obsolete them. There is no expectation that the
+`BUILD_BROKEN_USES_BUILD_*` workarounds will work in a future release, it's a
+short-term workaround.
+
+Just to be clear, the above process will happen on the AOSP master branch. So
+if you're following Android releases, none of the deprecation steps will be in
+Android Q, and the 2020 release will have jumped directly to the end for many
+module types.
+
+[android-building@googlegroups.com]: https://groups.google.com/forum/#!forum/android-building
+[build/make/core/deprecation.mk]: /core/deprecation.mk
diff --git a/core/board_config.mk b/core/board_config.mk
index d32e301..e4b88cb 100644
--- a/core/board_config.mk
+++ b/core/board_config.mk
@@ -92,6 +92,12 @@
BUILD_BROKEN_ENG_DEBUG_TAGS \
BUILD_BROKEN_USES_NETWORK \
+_build_broken_var_list += \
+ $(foreach m,$(AVAILABLE_BUILD_MODULE_TYPES) \
+ $(DEFAULT_WARNING_BUILD_MODULE_TYPES) \
+ $(DEFAULT_ERROR_BUILD_MODULE_TYPES), \
+ BUILD_BROKEN_USES_$(m))
+
_board_true_false_vars := $(_build_broken_var_list)
_board_strip_readonly_list += $(_build_broken_var_list)
@@ -511,3 +517,16 @@
$(error System SDK versions '$(_unsupported_systemsdk_versions)' in BOARD_SYSTEMSDK_VERSIONS are not supported.\
Supported versions are $(PLATFORM_SYSTEMSDK_VERSIONS))
endif
+
+###########################################
+# Handle BUILD_BROKEN_USES_BUILD_*
+
+$(foreach m,$(DEFAULT_WARNING_BUILD_MODULE_TYPES),\
+ $(if $(filter false,$(BUILD_BROKEN_USES_$(m))),\
+ $(KATI_obsolete_var $(m),Please convert to Soong),\
+ $(KATI_deprecated_var $(m),Please convert to Soong)))
+
+$(foreach m,$(DEFAULT_ERROR_BUILD_MODULE_TYPES),\
+ $(if $(filter true,$(BUILD_BROKEN_USES_$(m))),\
+ $(KATI_deprecated_var $(m),Please convert to Soong),\
+ $(KATI_obsolete_var $(m),Please convert to Soong)))
diff --git a/core/config.mk b/core/config.mk
index b5fe866..16cd376 100644
--- a/core/config.mk
+++ b/core/config.mk
@@ -135,45 +135,48 @@
# Build system internal files
# ###############################################################
-BUILD_COMBOS:= $(BUILD_SYSTEM)/combo
+BUILD_COMBOS :=$= $(BUILD_SYSTEM)/combo
-CLEAR_VARS:= $(BUILD_SYSTEM)/clear_vars.mk
-BUILD_HOST_STATIC_LIBRARY:= $(BUILD_SYSTEM)/host_static_library.mk
-BUILD_HOST_SHARED_LIBRARY:= $(BUILD_SYSTEM)/host_shared_library.mk
-BUILD_STATIC_LIBRARY:= $(BUILD_SYSTEM)/static_library.mk
-BUILD_HEADER_LIBRARY:= $(BUILD_SYSTEM)/header_library.mk
-BUILD_AUX_STATIC_LIBRARY:= $(BUILD_SYSTEM)/aux_static_library.mk
-BUILD_AUX_EXECUTABLE:= $(BUILD_SYSTEM)/aux_executable.mk
-BUILD_SHARED_LIBRARY:= $(BUILD_SYSTEM)/shared_library.mk
-BUILD_EXECUTABLE:= $(BUILD_SYSTEM)/executable.mk
-BUILD_HOST_EXECUTABLE:= $(BUILD_SYSTEM)/host_executable.mk
-BUILD_PACKAGE:= $(BUILD_SYSTEM)/package.mk
-BUILD_PHONY_PACKAGE:= $(BUILD_SYSTEM)/phony_package.mk
-BUILD_RRO_PACKAGE:= $(BUILD_SYSTEM)/build_rro_package.mk
-BUILD_HOST_PREBUILT:= $(BUILD_SYSTEM)/host_prebuilt.mk
-BUILD_PREBUILT:= $(BUILD_SYSTEM)/prebuilt.mk
-BUILD_MULTI_PREBUILT:= $(BUILD_SYSTEM)/multi_prebuilt.mk
-BUILD_JAVA_LIBRARY:= $(BUILD_SYSTEM)/java_library.mk
-BUILD_STATIC_JAVA_LIBRARY:= $(BUILD_SYSTEM)/static_java_library.mk
-BUILD_HOST_JAVA_LIBRARY:= $(BUILD_SYSTEM)/host_java_library.mk
-BUILD_COPY_HEADERS := $(BUILD_SYSTEM)/copy_headers.mk
-BUILD_NATIVE_TEST := $(BUILD_SYSTEM)/native_test.mk
-BUILD_NATIVE_BENCHMARK := $(BUILD_SYSTEM)/native_benchmark.mk
-BUILD_HOST_NATIVE_TEST := $(BUILD_SYSTEM)/host_native_test.mk
-BUILD_FUZZ_TEST := $(BUILD_SYSTEM)/fuzz_test.mk
-BUILD_HOST_FUZZ_TEST := $(BUILD_SYSTEM)/host_fuzz_test.mk
+CLEAR_VARS :=$= $(BUILD_SYSTEM)/clear_vars.mk
-BUILD_SHARED_TEST_LIBRARY := $(BUILD_SYSTEM)/shared_test_lib.mk
-BUILD_HOST_SHARED_TEST_LIBRARY := $(BUILD_SYSTEM)/host_shared_test_lib.mk
-BUILD_STATIC_TEST_LIBRARY := $(BUILD_SYSTEM)/static_test_lib.mk
-BUILD_HOST_STATIC_TEST_LIBRARY := $(BUILD_SYSTEM)/host_static_test_lib.mk
+BUILD_HOST_STATIC_LIBRARY :=$= $(BUILD_SYSTEM)/host_static_library.mk
+BUILD_HOST_SHARED_LIBRARY :=$= $(BUILD_SYSTEM)/host_shared_library.mk
+BUILD_STATIC_LIBRARY :=$= $(BUILD_SYSTEM)/static_library.mk
+BUILD_HEADER_LIBRARY :=$= $(BUILD_SYSTEM)/header_library.mk
+BUILD_AUX_STATIC_LIBRARY :=$= $(BUILD_SYSTEM)/aux_static_library.mk
+BUILD_AUX_EXECUTABLE :=$= $(BUILD_SYSTEM)/aux_executable.mk
+BUILD_SHARED_LIBRARY :=$= $(BUILD_SYSTEM)/shared_library.mk
+BUILD_EXECUTABLE :=$= $(BUILD_SYSTEM)/executable.mk
+BUILD_HOST_EXECUTABLE :=$= $(BUILD_SYSTEM)/host_executable.mk
+BUILD_PACKAGE :=$= $(BUILD_SYSTEM)/package.mk
+BUILD_PHONY_PACKAGE :=$= $(BUILD_SYSTEM)/phony_package.mk
+BUILD_RRO_PACKAGE :=$= $(BUILD_SYSTEM)/build_rro_package.mk
+BUILD_HOST_PREBUILT :=$= $(BUILD_SYSTEM)/host_prebuilt.mk
+BUILD_PREBUILT :=$= $(BUILD_SYSTEM)/prebuilt.mk
+BUILD_MULTI_PREBUILT :=$= $(BUILD_SYSTEM)/multi_prebuilt.mk
+BUILD_JAVA_LIBRARY :=$= $(BUILD_SYSTEM)/java_library.mk
+BUILD_STATIC_JAVA_LIBRARY :=$= $(BUILD_SYSTEM)/static_java_library.mk
+BUILD_HOST_JAVA_LIBRARY :=$= $(BUILD_SYSTEM)/host_java_library.mk
+BUILD_COPY_HEADERS :=$= $(BUILD_SYSTEM)/copy_headers.mk
+BUILD_NATIVE_TEST :=$= $(BUILD_SYSTEM)/native_test.mk
+BUILD_NATIVE_BENCHMARK :=$= $(BUILD_SYSTEM)/native_benchmark.mk
+BUILD_HOST_NATIVE_TEST :=$= $(BUILD_SYSTEM)/host_native_test.mk
+BUILD_FUZZ_TEST :=$= $(BUILD_SYSTEM)/fuzz_test.mk
+BUILD_HOST_FUZZ_TEST :=$= $(BUILD_SYSTEM)/host_fuzz_test.mk
-BUILD_NOTICE_FILE := $(BUILD_SYSTEM)/notice_files.mk
-BUILD_HOST_DALVIK_JAVA_LIBRARY := $(BUILD_SYSTEM)/host_dalvik_java_library.mk
-BUILD_HOST_DALVIK_STATIC_JAVA_LIBRARY := $(BUILD_SYSTEM)/host_dalvik_static_java_library.mk
+BUILD_SHARED_TEST_LIBRARY :=$= $(BUILD_SYSTEM)/shared_test_lib.mk
+BUILD_HOST_SHARED_TEST_LIBRARY :=$= $(BUILD_SYSTEM)/host_shared_test_lib.mk
+BUILD_STATIC_TEST_LIBRARY :=$= $(BUILD_SYSTEM)/static_test_lib.mk
+BUILD_HOST_STATIC_TEST_LIBRARY :=$= $(BUILD_SYSTEM)/host_static_test_lib.mk
-BUILD_HOST_TEST_CONFIG := $(BUILD_SYSTEM)/host_test_config.mk
-BUILD_TARGET_TEST_CONFIG := $(BUILD_SYSTEM)/target_test_config.mk
+BUILD_NOTICE_FILE :=$= $(BUILD_SYSTEM)/notice_files.mk
+BUILD_HOST_DALVIK_JAVA_LIBRARY :=$= $(BUILD_SYSTEM)/host_dalvik_java_library.mk
+BUILD_HOST_DALVIK_STATIC_JAVA_LIBRARY :=$= $(BUILD_SYSTEM)/host_dalvik_static_java_library.mk
+
+BUILD_HOST_TEST_CONFIG :=$= $(BUILD_SYSTEM)/host_test_config.mk
+BUILD_TARGET_TEST_CONFIG :=$= $(BUILD_SYSTEM)/target_test_config.mk
+
+include $(BUILD_SYSTEM)/deprecation.mk
# ###############################################################
# Parse out any modifier targets.
diff --git a/core/deprecation.mk b/core/deprecation.mk
new file mode 100644
index 0000000..cbc938a
--- /dev/null
+++ b/core/deprecation.mk
@@ -0,0 +1,55 @@
+# These module types can still be used without warnings or errors.
+AVAILABLE_BUILD_MODULE_TYPES :=$= \
+ BUILD_AUX_EXECUTABLE \
+ BUILD_AUX_STATIC_LIBRARY \
+ BUILD_COPY_HEADERS \
+ BUILD_EXECUTABLE \
+ BUILD_FUZZ_TEST \
+ BUILD_HEADER_LIBRARY \
+ BUILD_HOST_DALVIK_JAVA_LIBRARY \
+ BUILD_HOST_DALVIK_STATIC_JAVA_LIBRARY \
+ BUILD_HOST_EXECUTABLE \
+ BUILD_HOST_FUZZ_TEST \
+ BUILD_HOST_JAVA_LIBRARY \
+ BUILD_HOST_NATIVE_TEST \
+ BUILD_HOST_PREBUILT \
+ BUILD_HOST_SHARED_LIBRARY \
+ BUILD_HOST_SHARED_TEST_LIBRARY \
+ BUILD_HOST_STATIC_LIBRARY \
+ BUILD_HOST_STATIC_TEST_LIBRARY \
+ BUILD_JAVA_LIBRARY \
+ BUILD_MULTI_PREBUILT \
+ BUILD_NATIVE_BENCHMARK \
+ BUILD_NATIVE_TEST \
+ BUILD_NOTICE_FILE \
+ BUILD_PACKAGE \
+ BUILD_PHONY_PACKAGE \
+ BUILD_PREBUILT \
+ BUILD_RRO_PACKAGE \
+ BUILD_SHARED_LIBRARY \
+ BUILD_SHARED_TEST_LIBRARY \
+ BUILD_STATIC_JAVA_LIBRARY \
+ BUILD_STATIC_LIBRARY \
+ BUILD_STATIC_TEST_LIBRARY \
+
+# These are BUILD_* variables that will throw a warning when used. This is
+# generally a temporary state until all the devices are marked with the
+# relevant BUILD_BROKEN_USES_BUILD_* variables, then these would move to
+# DEFAULT_ERROR_BUILD_MODULE_TYPES.
+DEFAULT_WARNING_BUILD_MODULE_TYPES :=$= \
+ BUILD_HOST_TEST_CONFIG \
+ BUILD_TARGET_TEST_CONFIG \
+
+# These are BUILD_* variables that are errors to reference, but you can set
+# BUILD_BROKEN_USES_BUILD_* in your BoardConfig.mk in order to turn them back
+# to warnings.
+DEFAULT_ERROR_BUILD_MODULE_TYPES :=$= \
+
+# These are BUILD_* variables that are always errors to reference.
+# Setting the BUILD_BROKEN_USES_BUILD_* variables is also an error.
+OBSOLETE_BUILD_MODULE_TYPES :=$= \
+
+$(foreach m,$(OBSOLETE_BUILD_MODULE_TYPES),\
+ $(KATI_obsolete_var $(m),Please convert to Soong) \
+ $(KATI_obsolete_var BUILD_BROKEN_USES_$(m),Please convert to Soong))
+
diff --git a/core/soong_config.mk b/core/soong_config.mk
index c01fc98..46e026a 100644
--- a/core/soong_config.mk
+++ b/core/soong_config.mk
@@ -165,7 +165,7 @@
$(call add_json_list, ProductHiddenAPIStubsSystem, $(PRODUCT_HIDDENAPI_STUBS_SYSTEM))
$(call add_json_list, ProductHiddenAPIStubsTest, $(PRODUCT_HIDDENAPI_STUBS_TEST))
-$(call add_json_str, TargetFSConfigGen, $(TARGET_FS_CONFIG_GEN))
+$(call add_json_list, TargetFSConfigGen, $(TARGET_FS_CONFIG_GEN))
$(call add_json_map, VendorVars)
$(foreach namespace,$(SOONG_CONFIG_NAMESPACES),\
diff --git a/target/product/mainline_system.mk b/target/product/mainline_system.mk
index d75809c..66207df 100644
--- a/target/product/mainline_system.mk
+++ b/target/product/mainline_system.mk
@@ -18,6 +18,8 @@
$(call inherit-product, $(SRC_TARGET_DIR)/product/handheld_system.mk)
$(call inherit-product, $(SRC_TARGET_DIR)/product/telephony_system.mk)
$(call inherit-product, $(SRC_TARGET_DIR)/product/languages_default.mk)
+# Enable updating of APEXes
+$(call inherit-product, $(SRC_TARGET_DIR)/product/updatable_apex.mk)
# Add adb keys to debuggable AOSP builds (if they exist)
$(call inherit-product-if-exists, vendor/google/security/adb/vendor_key.mk)
diff --git a/target/product/updatable_apex.mk b/target/product/updatable_apex.mk
new file mode 100644
index 0000000..4b31578
--- /dev/null
+++ b/target/product/updatable_apex.mk
@@ -0,0 +1,20 @@
+#
+# Copyright (C) 2019 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.
+#
+
+# Inherit this when the target needs to support updating APEXes
+
+PRODUCT_PROPERTY_OVERRIDES := ro.apex.updatable=true
+PRODUCT_PACKAGES := com.android.apex.cts.shim.v1_prebuilt
diff --git a/tools/fs_config/Android.bp b/tools/fs_config/Android.bp
index d6fae2d..d9a48d7 100644
--- a/tools/fs_config/Android.bp
+++ b/tools/fs_config/Android.bp
@@ -42,7 +42,7 @@
genrule {
name: "oemaids_header_gen",
tool_files: ["fs_config_generator.py"],
- cmd: "$(location fs_config_generator.py) oemaid --aid-header=$(location :android_filesystem_config_header) $(location :target_fs_config_gen) >$(out)",
+ cmd: "$(location fs_config_generator.py) oemaid --aid-header=$(location :android_filesystem_config_header) $(locations :target_fs_config_gen) >$(out)",
srcs: [
":target_fs_config_gen",
":android_filesystem_config_header",
@@ -62,7 +62,7 @@
genrule {
name: "passwd_gen",
tool_files: ["fs_config_generator.py"],
- cmd: "$(location fs_config_generator.py) passwd --required-prefix=vendor_ --aid-header=$(location :android_filesystem_config_header) $(location :target_fs_config_gen) >$(out)",
+ cmd: "$(location fs_config_generator.py) passwd --required-prefix=vendor_ --aid-header=$(location :android_filesystem_config_header) $(locations :target_fs_config_gen) >$(out)",
srcs: [
":target_fs_config_gen",
":android_filesystem_config_header",
@@ -82,7 +82,7 @@
genrule {
name: "group_gen",
tool_files: ["fs_config_generator.py"],
- cmd: "$(location fs_config_generator.py) group --required-prefix=vendor_ --aid-header=$(location :android_filesystem_config_header) $(location :target_fs_config_gen) >$(out)",
+ cmd: "$(location fs_config_generator.py) group --required-prefix=vendor_ --aid-header=$(location :android_filesystem_config_header) $(locations :target_fs_config_gen) >$(out)",
srcs: [
":target_fs_config_gen",
":android_filesystem_config_header",
diff --git a/tools/fs_config/fs_config.go b/tools/fs_config/fs_config.go
index 869cb3d..16bcefa 100644
--- a/tools/fs_config/fs_config.go
+++ b/tools/fs_config/fs_config.go
@@ -24,7 +24,7 @@
android.RegisterModuleType("target_fs_config_gen_filegroup", targetFSConfigGenFactory)
}
-// target_fs_config_gen_filegroup is used to expose the file pointed to by TARGET_FS_CONFIG_GEN to
+// target_fs_config_gen_filegroup is used to expose the files pointed to by TARGET_FS_CONFIG_GEN to
// genrules in Soong. If TARGET_FS_CONFIG_GEN is empty, it will export an empty file instead.
func targetFSConfigGenFactory() android.Module {
module := &targetFSConfigGen{}
@@ -36,17 +36,17 @@
type targetFSConfigGen struct {
android.ModuleBase
- path android.Path
+ paths android.Paths
}
func (targetFSConfigGen) DepsMutator(ctx android.BottomUpMutatorContext) {}
func (t *targetFSConfigGen) GenerateAndroidBuildActions(ctx android.ModuleContext) {
- if ret := ctx.DeviceConfig().TargetFSConfigGen(); ret != nil && *ret != "" {
- t.path = android.PathForSource(ctx, *ret)
+ if ret := ctx.DeviceConfig().TargetFSConfigGen(); len(ret) != 0 {
+ t.paths = android.PathsForSource(ctx, ret)
} else {
path := android.PathForModuleGen(ctx, "empty")
- t.path = path
+ t.paths = android.Paths{path}
rule := android.NewRuleBuilder()
rule.Command().Text("rm -rf").Output(path)
@@ -56,5 +56,5 @@
}
func (t *targetFSConfigGen) Srcs() android.Paths {
- return android.Paths{t.path}
+ return t.paths
}
diff --git a/tools/releasetools/merge_target_files.py b/tools/releasetools/merge_target_files.py
index 77c774a..e306807 100755
--- a/tools/releasetools/merge_target_files.py
+++ b/tools/releasetools/merge_target_files.py
@@ -13,11 +13,11 @@
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations under
# the License.
+"""This script merges two partial target files packages.
-"""
-This script merges two partial target files packages (one of which contains
-system files, and the other contains non-system files) together, producing a
-complete target files package that can be used to generate an OTA package.
+One package contains system files, and the other contains non-system files.
+It produces a complete target files package that can be used to generate an
+OTA package.
Usage: merge_target_files.py [args]
@@ -126,8 +126,8 @@
'META/*',
]
-# default_system_misc_info_keys is a list of keys to obtain from the system instance of
-# META/misc_info.txt. The remaining keys from the other instance.
+# default_system_misc_info_keys is a list of keys to obtain from the system
+# instance of META/misc_info.txt. The remaining keys from the other instance.
default_system_misc_info_keys = [
'avb_system_hashtree_enable',
@@ -185,10 +185,8 @@
Args:
target_files: The target files zip archive from which to extract items.
-
target_files_temp_dir: The temporary directory where the extracted items
- will land.
-
+ will land.
extract_item_list: A list of items to extract.
"""
@@ -198,9 +196,7 @@
# zip file. Otherwise, the extraction step will fail.
with zipfile.ZipFile(
- target_files,
- 'r',
- allowZip64=True) as target_files_zipfile:
+ target_files, 'r', allowZip64=True) as target_files_zipfile:
target_files_namelist = target_files_zipfile.namelist()
filtered_extract_item_list = []
@@ -214,18 +210,17 @@
# Extract from target_files into target_files_temp_dir the
# filtered_extract_item_list.
- common.UnzipToDir(
- target_files,
- target_files_temp_dir,
- filtered_extract_item_list)
+ common.UnzipToDir(target_files, target_files_temp_dir,
+ filtered_extract_item_list)
def copy_items(from_dir, to_dir, patterns):
"""Similar to extract_items() except uses an input dir instead of zip."""
file_paths = []
for dirpath, _, filenames in os.walk(from_dir):
- file_paths.extend(os.path.relpath(path=os.path.join(dirpath, filename),
- start=from_dir) for filename in filenames)
+ file_paths.extend(
+ os.path.relpath(path=os.path.join(dirpath, filename), start=from_dir)
+ for filename in filenames)
filtered_file_paths = set()
for pattern in patterns:
@@ -250,26 +245,25 @@
Args:
config_file_path: The path to the config file to open and read.
+
+ Returns:
+ The list of strings in the config file.
"""
with open(config_file_path) as config_file:
return config_file.read().splitlines()
-def validate_config_lists(
- system_item_list,
- system_misc_info_keys,
- other_item_list):
+def validate_config_lists(system_item_list, system_misc_info_keys,
+ other_item_list):
"""Performs validations on the merge config lists.
Args:
- system_item_list: The list of items to extract from the partial
- system target files package as is.
-
- system_misc_info_keys: A list of keys to obtain from the system instance
- of META/misc_info.txt. The remaining keys from the other instance.
-
- other_item_list: The list of items to extract from the partial
- other target files package as is.
+ system_item_list: The list of items to extract from the partial system
+ target files package as is.
+ system_misc_info_keys: A list of keys to obtain from the system instance of
+ META/misc_info.txt. The remaining keys from the other instance.
+ other_item_list: The list of items to extract from the partial other target
+ files package as is.
Returns:
False if a validation fails, otherwise true.
@@ -284,7 +278,7 @@
# by the default config lists.
difference = default_combined_item_set.difference(combined_item_set)
if difference:
- logger.error('Missing merge config items: %s' % list(difference))
+ logger.error('Missing merge config items: %s', list(difference))
logger.error('Please ensure missing items are in either the '
'system-item-list or other-item-list files provided to '
'this script.')
@@ -299,11 +293,10 @@
return True
-def process_ab_partitions_txt(
- system_target_files_temp_dir,
- other_target_files_temp_dir,
- output_target_files_temp_dir):
- """Perform special processing for META/ab_partitions.txt
+def process_ab_partitions_txt(system_target_files_temp_dir,
+ other_target_files_temp_dir,
+ output_target_files_temp_dir):
+ """Perform special processing for META/ab_partitions.txt.
This function merges the contents of the META/ab_partitions.txt files from
the system directory and the other directory, placing the merged result in
@@ -314,22 +307,20 @@
names.
Args:
- system_target_files_temp_dir: The name of a directory containing the
- special items extracted from the system target files package.
-
- other_target_files_temp_dir: The name of a directory containing the
- special items extracted from the other target files package.
-
- output_target_files_temp_dir: The name of a directory that will be used
- to create the output target files package after all the special cases
- are processed.
+ system_target_files_temp_dir: The name of a directory containing the special
+ items extracted from the system target files package.
+ other_target_files_temp_dir: The name of a directory containing the special
+ items extracted from the other target files package.
+ output_target_files_temp_dir: The name of a directory that will be used to
+ create the output target files package after all the special cases are
+ processed.
"""
- system_ab_partitions_txt = os.path.join(
- system_target_files_temp_dir, 'META', 'ab_partitions.txt')
+ system_ab_partitions_txt = os.path.join(system_target_files_temp_dir, 'META',
+ 'ab_partitions.txt')
- other_ab_partitions_txt = os.path.join(
- other_target_files_temp_dir, 'META', 'ab_partitions.txt')
+ other_ab_partitions_txt = os.path.join(other_target_files_temp_dir, 'META',
+ 'ab_partitions.txt')
with open(system_ab_partitions_txt) as f:
system_ab_partitions = f.read().splitlines()
@@ -339,8 +330,8 @@
output_ab_partitions = set(system_ab_partitions + other_ab_partitions)
- output_ab_partitions_txt = os.path.join(
- output_target_files_temp_dir, 'META', 'ab_partitions.txt')
+ output_ab_partitions_txt = os.path.join(output_target_files_temp_dir, 'META',
+ 'ab_partitions.txt')
with open(output_ab_partitions_txt, 'w') as output:
for partition in sorted(output_ab_partitions):
@@ -348,42 +339,35 @@
def append_recovery_to_filesystem_config(output_target_files_temp_dir):
- """Perform special processing for META/filesystem_config.txt
+ """Perform special processing for META/filesystem_config.txt.
This function appends recovery information to META/filesystem_config.txt
so that recovery patch regeneration will succeed.
Args:
- output_target_files_temp_dir: The name of a directory that will be used
- to create the output target files package after all the special cases
- are processed. We find filesystem_config.txt here.
+ output_target_files_temp_dir: The name of a directory that will be used to
+ create the output target files package after all the special cases are
+ processed. We find filesystem_config.txt here.
"""
- filesystem_config_txt = os.path.join(
- output_target_files_temp_dir,
- 'META',
- 'filesystem_config.txt')
+ filesystem_config_txt = os.path.join(output_target_files_temp_dir, 'META',
+ 'filesystem_config.txt')
with open(filesystem_config_txt, 'a') as f:
# TODO(bpeckham) this data is hard coded. It should be generated
# programmatically.
- f.write(
- 'system/bin/install-recovery.sh 0 0 750 '
- 'selabel=u:object_r:install_recovery_exec:s0 capabilities=0x0\n')
- f.write(
- 'system/recovery-from-boot.p 0 0 644 '
- 'selabel=u:object_r:system_file:s0 capabilities=0x0\n')
- f.write(
- 'system/etc/recovery.img 0 0 440 '
- 'selabel=u:object_r:install_recovery_exec:s0 capabilities=0x0\n')
+ f.write('system/bin/install-recovery.sh 0 0 750 '
+ 'selabel=u:object_r:install_recovery_exec:s0 capabilities=0x0\n')
+ f.write('system/recovery-from-boot.p 0 0 644 '
+ 'selabel=u:object_r:system_file:s0 capabilities=0x0\n')
+ f.write('system/etc/recovery.img 0 0 440 '
+ 'selabel=u:object_r:install_recovery_exec:s0 capabilities=0x0\n')
-def process_misc_info_txt(
- system_target_files_temp_dir,
- other_target_files_temp_dir,
- output_target_files_temp_dir,
- system_misc_info_keys):
- """Perform special processing for META/misc_info.txt
+def process_misc_info_txt(system_target_files_temp_dir,
+ other_target_files_temp_dir,
+ output_target_files_temp_dir, system_misc_info_keys):
+ """Perform special processing for META/misc_info.txt.
This function merges the contents of the META/misc_info.txt files from the
system directory and the other directory, placing the merged result in the
@@ -392,18 +376,15 @@
content.
Args:
- system_target_files_temp_dir: The name of a directory containing the
- special items extracted from the system target files package.
-
- other_target_files_temp_dir: The name of a directory containing the
- special items extracted from the other target files package.
-
- output_target_files_temp_dir: The name of a directory that will be used
- to create the output target files package after all the special cases
- are processed.
-
- system_misc_info_keys: A list of keys to obtain from the system instance
- of META/misc_info.txt. The remaining keys from the other instance.
+ system_target_files_temp_dir: The name of a directory containing the special
+ items extracted from the system target files package.
+ other_target_files_temp_dir: The name of a directory containing the special
+ items extracted from the other target files package.
+ output_target_files_temp_dir: The name of a directory that will be used to
+ create the output target files package after all the special cases are
+ processed.
+ system_misc_info_keys: A list of keys to obtain from the system instance of
+ META/misc_info.txt. The remaining keys from the other instance.
"""
def read_helper(d):
@@ -434,19 +415,18 @@
# Partition groups and group sizes are defined by the other (non-system)
# misc info file because these values may vary for each board that uses
# a shared system image.
- for partition_group in merged_info_dict['super_partition_groups'].split(' '):
+ for partition_group in merged_info_dict['super_partition_groups'].split(
+ ' '):
if ('super_%s_group_size' % partition_group) not in merged_info_dict:
raise ValueError(
'Other META/misc_info.txt does not contain required key '
'super_%s_group_size.' % partition_group)
key = 'super_%s_partition_list' % partition_group
- merged_info_dict[key] = '%s %s' % (
- system_info_dict.get(key, ''),
- merged_info_dict.get(key, ''))
+ merged_info_dict[key] = '%s %s' % (system_info_dict.get(
+ key, ''), merged_info_dict.get(key, ''))
- output_misc_info_txt = os.path.join(
- output_target_files_temp_dir,
- 'META', 'misc_info.txt')
+ output_misc_info_txt = os.path.join(output_target_files_temp_dir, 'META',
+ 'misc_info.txt')
sorted_keys = sorted(merged_info_dict.keys())
@@ -464,12 +444,11 @@
Args:
temp_dir: The name of a scratch directory that this function can use for
- intermediate files generated during processing.
-
+ intermediate files generated during processing.
output_target_files_temp_dir: The name of the working directory that must
- already contain plat_file_contexts and vendor_file_contexts (in the
- appropriate sub directories), and to which META/file_contexts.bin will be
- written.
+ already contain plat_file_contexts and vendor_file_contexts (in the
+ appropriate sub directories), and to which META/file_contexts.bin will be
+ written.
"""
# To create a merged file_contexts.bin file, we use the system and vendor
@@ -490,9 +469,8 @@
for partition in ['SYSTEM', 'VENDOR', 'PRODUCT', 'ODM']:
prefix = 'plat' if partition == 'SYSTEM' else partition.lower()
- file_contexts = os.path.join(
- output_target_files_temp_dir,
- partition, 'etc', 'selinux', prefix + '_file_contexts')
+ file_contexts = os.path.join(output_target_files_temp_dir, partition, 'etc',
+ 'selinux', prefix + '_file_contexts')
mandatory = partition in ['SYSTEM', 'VENDOR']
@@ -518,27 +496,23 @@
# Finally, the compile step creates the final META/file_contexts.bin.
- file_contexts_bin = os.path.join(
- output_target_files_temp_dir,
- 'META', 'file_contexts.bin')
+ file_contexts_bin = os.path.join(output_target_files_temp_dir, 'META',
+ 'file_contexts.bin')
command = [
'sefcontext_compile',
- '-o', file_contexts_bin,
+ '-o',
+ file_contexts_bin,
sorted_file_contexts_txt,
]
common.RunAndWait(command, verbose=True)
-def process_special_cases(
- temp_dir,
- system_target_files_temp_dir,
- other_target_files_temp_dir,
- output_target_files_temp_dir,
- system_misc_info_keys,
- rebuild_recovery
-):
+def process_special_cases(temp_dir, system_target_files_temp_dir,
+ other_target_files_temp_dir,
+ output_target_files_temp_dir, system_misc_info_keys,
+ rebuild_recovery):
"""Perform special-case processing for certain target files items.
Certain files in the output target files package require special-case
@@ -546,23 +520,18 @@
Args:
temp_dir: The name of a scratch directory that this function can use for
- intermediate files generated during processing.
-
- system_target_files_temp_dir: The name of a directory containing the
- special items extracted from the system target files package.
-
- other_target_files_temp_dir: The name of a directory containing the
- special items extracted from the other target files package.
-
- output_target_files_temp_dir: The name of a directory that will be used
- to create the output target files package after all the special cases
- are processed.
-
- system_misc_info_keys: A list of keys to obtain from the system instance
- of META/misc_info.txt. The remaining keys from the other instance.
-
+ intermediate files generated during processing.
+ system_target_files_temp_dir: The name of a directory containing the special
+ items extracted from the system target files package.
+ other_target_files_temp_dir: The name of a directory containing the special
+ items extracted from the other target files package.
+ output_target_files_temp_dir: The name of a directory that will be used to
+ create the output target files package after all the special cases are
+ processed.
+ system_misc_info_keys: A list of keys to obtain from the system instance of
+ META/misc_info.txt. The remaining keys from the other instance.
rebuild_recovery: If true, rebuild the recovery patch used by non-A/B
- devices and write it to the system image.
+ devices and write it to the system image.
"""
if 'ab_update' in system_misc_info_keys:
@@ -586,19 +555,11 @@
output_target_files_temp_dir=output_target_files_temp_dir)
-def merge_target_files(
- temp_dir,
- system_target_files,
- system_item_list,
- system_misc_info_keys,
- other_target_files,
- other_item_list,
- output_target_files,
- output_dir,
- output_item_list,
- output_ota,
- output_super_empty,
- rebuild_recovery):
+def merge_target_files(temp_dir, system_target_files, system_item_list,
+ system_misc_info_keys, other_target_files,
+ other_item_list, output_target_files, output_dir,
+ output_item_list, output_ota, output_super_empty,
+ rebuild_recovery):
"""Merge two target files packages together.
This function takes system and other target files packages as input, performs
@@ -607,45 +568,35 @@
Args:
temp_dir: The name of a directory we use when we extract items from the
- input target files packages, and also a scratch directory that we use for
- temporary files.
-
+ input target files packages, and also a scratch directory that we use for
+ temporary files.
system_target_files: The name of the zip archive containing the system
- partial target files package.
-
+ partial target files package.
system_item_list: The list of items to extract from the partial system
- target files package as is, meaning these items will land in the output
- target files package exactly as they appear in the input partial system
- target files package.
-
+ target files package as is, meaning these items will land in the output
+ target files package exactly as they appear in the input partial system
+ target files package.
system_misc_info_keys: The list of keys to obtain from the system instance
- of META/misc_info.txt. The remaining keys from the other instance.
-
- other_target_files: The name of the zip archive containing the other
- partial target files package.
-
- other_item_list: The list of items to extract from the partial other
- target files package as is, meaning these items will land in the output
- target files package exactly as they appear in the input partial other
- target files package.
-
- output_target_files: The name of the output zip archive target files
- package created by merging system and other.
-
+ of META/misc_info.txt. The remaining keys from the other instance.
+ other_target_files: The name of the zip archive containing the other partial
+ target files package.
+ other_item_list: The list of items to extract from the partial other target
+ files package as is, meaning these items will land in the output target
+ files package exactly as they appear in the input partial other target
+ files package.
+ output_target_files: The name of the output zip archive target files package
+ created by merging system and other.
+ output_dir: The destination directory for saving merged files.
+ output_item_list: The list of items to copy into the output_dir.
output_ota: The name of the output zip archive ota package.
-
output_super_empty: If provided, creates a super_empty.img file from the
- merged target files package and saves it at this path.
-
+ merged target files package and saves it at this path.
rebuild_recovery: If true, rebuild the recovery patch used by non-A/B
- devices and write it to the system image.
+ devices and write it to the system image.
"""
- logger.info(
- 'starting: merge system %s and other %s into output %s',
- system_target_files,
- other_target_files,
- output_target_files)
+ logger.info('starting: merge system %s and other %s into output %s',
+ system_target_files, other_target_files, output_target_files)
# Create directory names that we'll use when we extract files from system,
# and other, and for zipping the final output.
@@ -706,8 +657,9 @@
# Create super_empty.img using the merged misc_info.txt.
if output_super_empty:
- misc_info_txt = os.path.join(output_target_files_temp_dir,
- 'META', 'misc_info.txt')
+ misc_info_txt = os.path.join(output_target_files_temp_dir, 'META',
+ 'misc_info.txt')
+
def read_helper():
with open(misc_info_txt) as f:
return list(f.read().splitlines())
@@ -718,9 +670,9 @@
'Building super_empty.img requires use_dynamic_partitions=true.')
build_super_image_args = [
- '--verbose',
- misc_info_txt,
- output_super_empty,
+ '--verbose',
+ misc_info_txt,
+ output_super_empty,
]
build_super_image.main(build_super_image_args)
@@ -744,8 +696,8 @@
output_zip = os.path.abspath(output_target_files)
output_target_files_list = os.path.join(temp_dir, 'output.list')
- output_target_files_meta_dir = os.path.join(
- output_target_files_temp_dir, 'META')
+ output_target_files_meta_dir = os.path.join(output_target_files_temp_dir,
+ 'META')
command = [
'find',
@@ -754,13 +706,8 @@
# TODO(bpeckham): sort this to be more like build.
meta_content = common.RunAndCheckOutput(command, verbose=False)
command = [
- 'find',
- output_target_files_temp_dir,
- '-path',
- output_target_files_meta_dir,
- '-prune',
- '-o',
- '-print'
+ 'find', output_target_files_temp_dir, '-path',
+ output_target_files_meta_dir, '-prune', '-o', '-print'
]
# TODO(bpeckham): sort this to be more like build.
other_content = common.RunAndCheckOutput(command, verbose=False)
@@ -772,9 +719,12 @@
command = [
'soong_zip',
'-d',
- '-o', output_zip,
- '-C', output_target_files_temp_dir,
- '-l', output_target_files_list,
+ '-o',
+ output_zip,
+ '-C',
+ output_target_files_temp_dir,
+ '-l',
+ output_target_files_list,
]
logger.info('creating %s', output_target_files)
common.RunAndWait(command, verbose=True)
@@ -796,9 +746,8 @@
directory. It also cleans up the temporary directory.
Args:
- func: The function to call. Should accept one parameter, the path to
- the temporary directory.
-
+ func: The function to call. Should accept one parameter, the path to the
+ temporary directory.
keep_tmp: Keep the temporary directory after processing is complete.
"""
@@ -858,7 +807,8 @@
return True
args = common.ParseOptions(
- sys.argv[1:], __doc__,
+ sys.argv[1:],
+ __doc__,
extra_long_opts=[
'system-target-files=',
'system-item-list=',
@@ -875,13 +825,10 @@
],
extra_option_handler=option_handler)
- if (len(args) != 0 or
- OPTIONS.system_target_files is None or
- OPTIONS.other_target_files is None or (
- OPTIONS.output_target_files is None and
- OPTIONS.output_dir is None) or (
- OPTIONS.output_dir is not None and
- OPTIONS.output_item_list is None)):
+ if (args or OPTIONS.system_target_files is None or
+ OPTIONS.other_target_files is None or
+ (OPTIONS.output_target_files is None and OPTIONS.output_dir is None) or
+ (OPTIONS.output_dir is not None and OPTIONS.output_item_list is None)):
common.Usage(__doc__)
sys.exit(1)
@@ -924,8 +871,7 @@
output_item_list=output_item_list,
output_ota=OPTIONS.output_ota,
output_super_empty=OPTIONS.output_super_empty,
- rebuild_recovery=OPTIONS.rebuild_recovery),
- OPTIONS.keep_tmp)
+ rebuild_recovery=OPTIONS.rebuild_recovery), OPTIONS.keep_tmp)
if __name__ == '__main__':