diff options
| -rw-r--r-- | android/apex.go | 5 | ||||
| -rw-r--r-- | android/bazel.go | 89 | ||||
| -rw-r--r-- | android/module.go | 2 | ||||
| -rw-r--r-- | apex/apex.go | 22 | ||||
| -rw-r--r-- | apex/apex_test.go | 2 | ||||
| -rw-r--r-- | apex/systemserver_classpath_fragment_test.go | 92 | ||||
| -rw-r--r-- | bp2build/cc_library_conversion_test.go | 63 | ||||
| -rwxr-xr-x | build_test.bash | 4 | ||||
| -rw-r--r-- | cc/bp2build.go | 34 | ||||
| -rw-r--r-- | cc/compiler.go | 27 | ||||
| -rw-r--r-- | cc/libbuildversion/Android.bp | 1 | ||||
| -rw-r--r-- | cc/library.go | 6 | ||||
| -rw-r--r-- | dexpreopt/config.go | 12 | ||||
| -rw-r--r-- | dexpreopt/testing.go | 15 | ||||
| -rw-r--r-- | java/classpath_fragment.go | 7 | ||||
| -rw-r--r-- | java/dexpreopt.go | 22 | ||||
| -rw-r--r-- | java/java.go | 9 | ||||
| -rw-r--r-- | java/systemserver_classpath_fragment.go | 54 | ||||
| -rw-r--r-- | java/systemserver_classpath_fragment_test.go | 2 | ||||
| -rw-r--r-- | python/androidmk.go | 6 | ||||
| -rw-r--r-- | scripts/Android.bp | 9 |
21 files changed, 366 insertions, 117 deletions
diff --git a/android/apex.go b/android/apex.go index 6b4054d44..461faf760 100644 --- a/android/apex.go +++ b/android/apex.go @@ -878,12 +878,8 @@ var minSdkVersionAllowlist = func(apiMap map[string]int) map[string]ApiLevel { "kotlinx-coroutines-android-nodeps": 30, "kotlinx-coroutines-core": 28, "kotlinx-coroutines-core-nodeps": 30, - "libasyncio": 30, "libbrotli": 30, - "libbuildversion": 30, "libcrypto_static": 30, - "libcrypto_utils": 30, - "libdiagnose_usb": 30, "libeigen": 30, "liblz4": 30, "libmdnssd": 30, @@ -893,7 +889,6 @@ var minSdkVersionAllowlist = func(apiMap map[string]int) map[string]ApiLevel { "libprocpartition": 30, "libprotobuf-java-lite": 30, "libprotoutil": 30, - "libsync": 30, "libtextclassifier_hash_headers": 30, "libtextclassifier_hash_static": 30, "libtflite_kernel_utils": 30, diff --git a/android/bazel.go b/android/bazel.go index 72aad6025..40c971f17 100644 --- a/android/bazel.go +++ b/android/bazel.go @@ -226,34 +226,42 @@ var ( // Configure modules in these directories to enable bp2build_available: true or false by default. bp2buildDefaultConfig = Bp2BuildConfig{ - "bionic": Bp2BuildDefaultTrueRecursively, + "art/libdexfile": Bp2BuildDefaultTrueRecursively, + "bionic": Bp2BuildDefaultTrueRecursively, "build/bazel/examples/soong_config_variables": Bp2BuildDefaultTrueRecursively, "build/bazel/examples/apex/minimal": Bp2BuildDefaultTrueRecursively, + "build/soong": Bp2BuildDefaultTrue, "build/soong/cc/libbuildversion": Bp2BuildDefaultTrue, // Skip tests subdir + "cts/common/device-side/nativetesthelper/jni": Bp2BuildDefaultTrueRecursively, "development/sdk": Bp2BuildDefaultTrueRecursively, "external/arm-optimized-routines": Bp2BuildDefaultTrueRecursively, "external/boringssl": Bp2BuildDefaultTrueRecursively, "external/brotli": Bp2BuildDefaultTrue, "external/fmtlib": Bp2BuildDefaultTrueRecursively, "external/google-benchmark": Bp2BuildDefaultTrueRecursively, - "external/googletest/googletest": Bp2BuildDefaultTrueRecursively, + "external/googletest": Bp2BuildDefaultTrueRecursively, "external/gwp_asan": Bp2BuildDefaultTrueRecursively, "external/jemalloc_new": Bp2BuildDefaultTrueRecursively, "external/jsoncpp": Bp2BuildDefaultTrueRecursively, "external/libcap": Bp2BuildDefaultTrueRecursively, "external/libcxx": Bp2BuildDefaultTrueRecursively, "external/libcxxabi": Bp2BuildDefaultTrueRecursively, + "external/libevent": Bp2BuildDefaultTrueRecursively, "external/lz4/lib": Bp2BuildDefaultTrue, + "external/lzma/C": Bp2BuildDefaultTrueRecursively, "external/mdnsresponder": Bp2BuildDefaultTrueRecursively, "external/minijail": Bp2BuildDefaultTrueRecursively, "external/pcre": Bp2BuildDefaultTrueRecursively, "external/protobuf": Bp2BuildDefaultTrueRecursively, "external/python/six": Bp2BuildDefaultTrueRecursively, + "external/selinux/libsepol": Bp2BuildDefaultTrueRecursively, "external/scudo": Bp2BuildDefaultTrueRecursively, "external/selinux/libselinux": Bp2BuildDefaultTrueRecursively, "external/zlib": Bp2BuildDefaultTrueRecursively, "external/zstd": Bp2BuildDefaultTrueRecursively, "frameworks/native/libs/adbd_auth": Bp2BuildDefaultTrueRecursively, + "frameworks/proto_logging/stats/stats_log_api_gen": Bp2BuildDefaultTrueRecursively, + "libnativehelper": Bp2BuildDefaultTrueRecursively, "packages/modules/adb": Bp2BuildDefaultTrue, "packages/modules/adb/crypto": Bp2BuildDefaultTrueRecursively, "packages/modules/adb/libs": Bp2BuildDefaultTrueRecursively, @@ -263,6 +271,7 @@ var ( "packages/modules/adb/tls": Bp2BuildDefaultTrueRecursively, "prebuilts/clang/host/linux-x86": Bp2BuildDefaultTrueRecursively, "system/apex": Bp2BuildDefaultFalse, // TODO(b/207466993): flaky failures + "system/core/debuggerd": Bp2BuildDefaultTrue, "system/core/diagnose_usb": Bp2BuildDefaultTrueRecursively, "system/core/libasyncio": Bp2BuildDefaultTrue, "system/core/libcrypto_utils": Bp2BuildDefaultTrueRecursively, @@ -271,29 +280,80 @@ var ( "system/core/libprocessgroup": Bp2BuildDefaultTrue, "system/core/libprocessgroup/cgrouprc": Bp2BuildDefaultTrue, "system/core/libprocessgroup/cgrouprc_format": Bp2BuildDefaultTrue, + "system/core/libsystem": Bp2BuildDefaultTrueRecursively, + "system/core/libutils": Bp2BuildDefaultTrueRecursively, + "system/core/libvndksupport": Bp2BuildDefaultTrueRecursively, "system/core/property_service/libpropertyinfoparser": Bp2BuildDefaultTrueRecursively, "system/libbase": Bp2BuildDefaultTrueRecursively, + "system/libprocinfo": Bp2BuildDefaultTrue, "system/libziparchive": Bp2BuildDefaultTrueRecursively, "system/logging/liblog": Bp2BuildDefaultTrueRecursively, "system/sepolicy/apex": Bp2BuildDefaultTrueRecursively, "system/timezone/apex": Bp2BuildDefaultTrueRecursively, "system/timezone/output_data": Bp2BuildDefaultTrueRecursively, + "system/unwinding/libbacktrace": Bp2BuildDefaultTrueRecursively, + "system/unwinding/libunwindstack": Bp2BuildDefaultTrueRecursively, } // Per-module denylist to always opt modules out of both bp2build and mixed builds. bp2buildModuleDoNotConvertList = []string{ + "libnativehelper_compat_libc++", // Broken compile: implicit declaration of function 'strerror_r' is invalid in C99 + "art_libdexfile_dex_instruction_list_header", // breaks libart_mterp.armng, header not found + + "libandroid_runtime_lazy", // depends on unconverted modules: libbinder_headers + "libcmd", // depends on unconverted modules: libbinder + + "chkcon", "sefcontext_compile", // depends on unconverted modules: libsepol + + "libsepol", // TODO(b/207408632): Unsupported case of .l sources in cc library rules + + "get_clang_version_test", // depends on unconverted module: get_clang_version + + "libbinder", // TODO(b/188503688): Disabled for some archs, + "libactivitymanager_aidl", // TODO(b/207426160): Depends on activity_manager_procstate_aidl, which is an aidl filegroup. + + "libnativehelper_lazy_mts_jni", // depends on unconverted modules: libgmock_ndk + "libnativehelper_mts_jni", // depends on unconverted modules: libgmock_ndk + "libnativetesthelper_jni", // depends on unconverted modules: libgtest_ndk_c++ + + "statslog-framework-java-gen", "statslog.cpp", "statslog.h", "statslog.rs", "statslog_header.rs", // depends on unconverted modules: stats-log-api-gen + + "stats-log-api-gen", // depends on unconverted modules: libstats_proto_host, libprotobuf-cpp-full + + "libstatslog", // depends on unconverted modules: statslog.cpp, statslog.h, ... + + "libgmock_main_ndk", "libgmock_ndk", // depends on unconverted module: libgtest_ndk_c++ + + "cmd", // depends on unconverted module packagemanager_aidl-cpp, of unsupported type aidl_interface + "servicedispatcher", // depends on unconverted module android.debug_aidl, of unsupported type aidl_interface + "libutilscallstack", // depends on unconverted module libbacktrace + "libbacktrace", // depends on unconverted module libunwindstack + "libdebuggerd_handler", // depends on unconverted module libdebuggerd_handler_core + "libdebuggerd_handler_core", "libdebuggerd_handler_fallback", // depends on unconverted module libdebuggerd + "unwind_for_offline", // depends on unconverted module libunwindstack_utils + "libdebuggerd", // depends on unconverted modules libdexfile_support, libunwindstack, gwp_asan_crash_handler, libtombstone_proto, libprotobuf-cpp-lite + "libdexfile_static", // depends on libartpalette, libartbase, libdexfile, which are of unsupported type: art_cc_library. + "host_bionic_linker_asm", // depends on extract_linker, a go binary. + "host_bionic_linker_script", // depends on extract_linker, a go binary. + + "pbtombstone", // depends on libprotobuf-cpp-lite, libtombstone_proto + "crash_dump", // depends on unconverted module libprotobuf-cpp-lite "libprotobuf-cpp-full", "libprotobuf-cpp-lite", // Unsupported product&vendor suffix. b/204811222 and b/204810610. - "libc_malloc_debug", // depends on libunwindstack, which depends on unsupported module art_cc_library_statics + "libunwindstack_local", "libunwindstack_utils", // depends on unconverted module libunwindstack + "libunwindstack", // depends on libdexfile_support, of unsupported module type art_cc_library_static + "libc_malloc_debug", // depends on unconverted module libunwindstack "libbase_ndk", // http://b/186826477, fails to link libctscamera2_jni for device (required for CtsCameraTestCases) + "lib_linker_config_proto_lite", // contains .proto sources + "libprotobuf-python", // contains .proto sources "libprotobuf-internal-protos", // we don't handle path property for fileegroups "libprotobuf-internal-python-srcs", // we don't handle path property for fileegroups "libseccomp_policy", // b/201094425: depends on func_to_syscall_nrs, which depends on py_binary, which is unsupported in mixed builds. - "libfdtrack", // depends on libunwindstack, which depends on unsupported module art_cc_library_statics + "libfdtrack", // depends on unconverted module libunwindstack "gwp_asan_crash_handler", // cc_library, ld.lld: error: undefined symbol: memset @@ -304,10 +364,6 @@ var ( "platform_tools_properties", "build_tools_source_properties", - "libminijail", // b/202491296: Uses unsupported c_std property. - "minijail0", // depends on unconverted modules: libminijail - "drop_privs", // depends on unconverted modules: libminijail - // Tests. Handle later. "libbionic_tests_headers_posix", // http://b/186024507, cc_library_static, sched.h, time.h not found "libjemalloc5_integrationtest", @@ -334,14 +390,12 @@ var ( "libgtest_ndk_c++", // b/201816222: Requires sdk_version support. "libgtest_main_ndk_c++", // b/201816222: Requires sdk_version support. - "abb", // depends on unconverted modules: libadbd_core, libadbd_services, libcmd, libbinder, libutils, libselinux - "adb", // depends on unconverted modules: bin2c_fastdeployagent, libadb_crypto, libadb_host, libadb_pairing_connection, libadb_protos, libandroidfw, libapp_processes_protos_full, libfastdeploy_host, libmdnssd, libopenscreen-discovery, libopenscreen-platform-impl, libusb, libutils, libziparchive, libzstd, AdbWinApi - "adbd", // depends on unconverted modules: libadb_crypto, libadb_pairing_connection, libadb_protos, libadbd, libadbd_core, libapp_processes_protos_lite, libmdnssd, libzstd, libadbd_services, libcap, libminijail, libselinux - "bionic_tests_zipalign", // depends on unconverted modules: libziparchive, libutils - "linker", // depends on unconverted modules: liblinker_debuggerd_stub, libdebuggerd_handler_fallback, libziparchive, liblinker_main, liblinker_malloc + "abb", // depends on unconverted modules: libadbd_core, libadbd_services, + "adb", // depends on unconverted modules: bin2c_fastdeployagent, libadb_crypto, libadb_host, libadb_pairing_connection, libadb_protos, libandroidfw, libapp_processes_protos_full, libfastdeploy_host, libopenscreen-discovery, libopenscreen-platform-impl, libusb, libzstd, AdbWinApi + "adbd", // depends on unconverted modules: libadb_crypto, libadb_pairing_connection, libadb_protos, libadbd, libadbd_core, libapp_processes_protos_lite, libzstd, libadbd_services, libcap, libminijail + "linker", // depends on unconverted modules: libdebuggerd_handler_fallback "linker_reloc_bench_main", // depends on unconverted modules: liblinker_reloc_bench_* - "sefcontext_compile", // depends on unconverted modules: libsepol - "versioner", // depends on unconverted modules: libclang_cxx_host, libLLVM_host + "versioner", // depends on unconverted modules: libclang_cxx_host, libLLVM_host, of unsupported type llvm_host_prebuilt_library_shared "linkerconfig", // http://b/202876379 has arch-variant static_executable "mdnsd", // http://b/202876379 has arch-variant static_executable @@ -361,8 +415,9 @@ var ( "libbrotli", // http://b/198585397, ld.lld: error: bionic/libc/arch-arm64/generic/bionic/memmove.S:95:(.text+0x10): relocation R_AARCH64_CONDBR19 out of range: -1404176 is not in [-1048576, 1048575]; references __memcpy "minijail_constants_json", // http://b/200899432, bazel-built cc_genrule does not work in mixed build when it is a dependency of another soong module. - "cap_names.h", // TODO(b/204913827) runfiles need to be handled in mixed builds - "libcap", // TODO(b/204913827) runfiles need to be handled in mixed builds + "cap_names.h", // TODO(b/204913827) runfiles need to be handled in mixed builds + "libcap", // TODO(b/204913827) runfiles need to be handled in mixed builds + "libprotobuf-cpp-full", "libprotobuf-cpp-lite", // Unsupported product&vendor suffix. b/204811222 and b/204810610. } // Used for quicker lookups diff --git a/android/module.go b/android/module.go index 4a388b562..767f9f47f 100644 --- a/android/module.go +++ b/android/module.go @@ -1702,7 +1702,7 @@ func (m *ModuleBase) InstallInRoot() bool { } func (m *ModuleBase) InstallBypassMake() bool { - return false + return true } func (m *ModuleBase) InstallForceOS() (*OsType, *ArchType) { diff --git a/apex/apex.go b/apex/apex.go index c1a4b40bb..885d21c90 100644 --- a/apex/apex.go +++ b/apex/apex.go @@ -111,6 +111,9 @@ type apexBundleProperties struct { // List of java libraries that are embedded inside this APEX bundle. Java_libs []string + // List of sh binaries that are embedded inside this APEX bundle. + Sh_binaries []string + // List of platform_compat_config files that are embedded inside this APEX bundle. Compat_configs []string @@ -618,6 +621,7 @@ var ( sharedLibTag = dependencyTag{name: "sharedLib", payload: true} testForTag = dependencyTag{name: "test for"} testTag = dependencyTag{name: "test", payload: true} + shBinaryTag = dependencyTag{name: "shBinary", payload: true} ) // TODO(jiyong): shorten this function signature @@ -762,6 +766,10 @@ func (a *apexBundle) DepsMutator(ctx android.BottomUpMutatorContext) { for _, d := range depsList { addDependenciesForNativeModules(ctx, d, target, imageVariation) } + ctx.AddFarVariationDependencies([]blueprint.Variation{ + {Mutator: "os", Variation: target.OsVariation()}, + {Mutator: "arch", Variation: target.ArchVariation()}, + }, shBinaryTag, a.properties.Sh_binaries...) } // Common-arch dependencies come next @@ -1482,6 +1490,9 @@ func apexFileForGoBinary(ctx android.BaseModuleContext, depName string, gb boots func apexFileForShBinary(ctx android.BaseModuleContext, sh *sh.ShBinary) apexFile { dirInApex := filepath.Join("bin", sh.SubDir()) + if sh.Target().NativeBridge == android.NativeBridgeEnabled { + dirInApex = filepath.Join(dirInApex, sh.Target().NativeBridgeRelativePath) + } fileToCopy := sh.OutputFile() af := newApexFile(ctx, fileToCopy, sh.BaseModuleName(), dirInApex, shBinary, sh) af.symlinks = sh.Symlinks() @@ -1710,6 +1721,7 @@ func (a *apexBundle) GenerateAndroidBuildActions(ctx android.ModuleContext) { return true // track transitive dependencies } else if r, ok := child.(*rust.Module); ok { fi := apexFileForRustLibrary(ctx, r) + fi.isJniLib = isJniLib filesInfo = append(filesInfo, fi) } else { propertyName := "native_shared_libs" @@ -1722,8 +1734,6 @@ func (a *apexBundle) GenerateAndroidBuildActions(ctx android.ModuleContext) { if cc, ok := child.(*cc.Module); ok { filesInfo = append(filesInfo, apexFileForExecutable(ctx, cc)) return true // track transitive dependencies - } else if sh, ok := child.(*sh.ShBinary); ok { - filesInfo = append(filesInfo, apexFileForShBinary(ctx, sh)) } else if py, ok := child.(*python.Module); ok && py.HostToolPath().Valid() { filesInfo = append(filesInfo, apexFileForPyBinary(ctx, py)) } else if gb, ok := child.(bootstrap.GoBinaryTool); ok && a.Host() { @@ -1732,7 +1742,13 @@ func (a *apexBundle) GenerateAndroidBuildActions(ctx android.ModuleContext) { filesInfo = append(filesInfo, apexFileForRustExecutable(ctx, rust)) return true // track transitive dependencies } else { - ctx.PropertyErrorf("binaries", "%q is neither cc_binary, rust_binary, (embedded) py_binary, (host) blueprint_go_binary, (host) bootstrap_go_binary, nor sh_binary", depName) + ctx.PropertyErrorf("binaries", "%q is neither cc_binary, rust_binary, (embedded) py_binary, (host) blueprint_go_binary, nor (host) bootstrap_go_binary", depName) + } + case shBinaryTag: + if sh, ok := child.(*sh.ShBinary); ok { + filesInfo = append(filesInfo, apexFileForShBinary(ctx, sh)) + } else { + ctx.PropertyErrorf("sh_binaries", "%q is not a sh_binary module", depName) } case bcpfTag: { diff --git a/apex/apex_test.go b/apex/apex_test.go index 130581ca4..e2ca23409 100644 --- a/apex/apex_test.go +++ b/apex/apex_test.go @@ -4250,7 +4250,7 @@ func TestApexWithShBinary(t *testing.T) { apex { name: "myapex", key: "myapex.key", - binaries: ["myscript"], + sh_binaries: ["myscript"], updatable: false, } diff --git a/apex/systemserver_classpath_fragment_test.go b/apex/systemserver_classpath_fragment_test.go index 412fa0e37..d03766448 100644 --- a/apex/systemserver_classpath_fragment_test.go +++ b/apex/systemserver_classpath_fragment_test.go @@ -231,3 +231,95 @@ func TestPrebuiltSystemserverclasspathFragmentContents(t *testing.T) { `prebuilt_foo`, }) } + +func TestSystemserverclasspathFragmentStandaloneContents(t *testing.T) { + result := android.GroupFixturePreparers( + prepareForTestWithSystemserverclasspathFragment, + prepareForTestWithMyapex, + dexpreopt.FixtureSetApexStandaloneSystemServerJars("myapex:foo"), + ).RunTestWithBp(t, ` + apex { + name: "myapex", + key: "myapex.key", + systemserverclasspath_fragments: [ + "mysystemserverclasspathfragment", + ], + updatable: false, + } + + apex_key { + name: "myapex.key", + public_key: "testkey.avbpubkey", + private_key: "testkey.pem", + } + + java_library { + name: "foo", + srcs: ["b.java"], + installable: true, + apex_available: [ + "myapex", + ], + } + + systemserverclasspath_fragment { + name: "mysystemserverclasspathfragment", + standalone_contents: [ + "foo", + ], + apex_available: [ + "myapex", + ], + } + `) + + ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex_image", []string{ + "etc/classpaths/systemserverclasspath.pb", + "javalib/foo.jar", + }) +} + +func TestPrebuiltStandaloneSystemserverclasspathFragmentContents(t *testing.T) { + result := android.GroupFixturePreparers( + prepareForTestWithSystemserverclasspathFragment, + prepareForTestWithMyapex, + dexpreopt.FixtureSetApexStandaloneSystemServerJars("myapex:foo"), + ).RunTestWithBp(t, ` + prebuilt_apex { + name: "myapex", + arch: { + arm64: { + src: "myapex-arm64.apex", + }, + arm: { + src: "myapex-arm.apex", + }, + }, + exported_systemserverclasspath_fragments: ["mysystemserverclasspathfragment"], + } + + java_import { + name: "foo", + jars: ["foo.jar"], + apex_available: [ + "myapex", + ], + } + + prebuilt_systemserverclasspath_fragment { + name: "mysystemserverclasspathfragment", + prefer: true, + standalone_contents: [ + "foo", + ], + apex_available: [ + "myapex", + ], + } + `) + + java.CheckModuleDependencies(t, result.TestContext, "mysystemserverclasspathfragment", "android_common_myapex", []string{ + `myapex.deapexer`, + `prebuilt_foo`, + }) +} diff --git a/bp2build/cc_library_conversion_test.go b/bp2build/cc_library_conversion_test.go index a3d902a9d..d23ea01ed 100644 --- a/bp2build/cc_library_conversion_test.go +++ b/bp2build/cc_library_conversion_test.go @@ -1691,8 +1691,10 @@ cc_library { func TestCcLibraryCppStdWithGnuExtensions_ConvertsToFeatureAttr(t *testing.T) { type testCase struct { cpp_std string + c_std string gnu_extensions string bazel_cpp_std string + bazel_c_std string } testCases := []testCase{ @@ -1702,45 +1704,58 @@ func TestCcLibraryCppStdWithGnuExtensions_ConvertsToFeatureAttr(t *testing.T) { // not set, only emit if gnu_extensions is disabled. the default (gnu+17 // is set in the toolchain.) {cpp_std: "", gnu_extensions: "", bazel_cpp_std: ""}, - {cpp_std: "", gnu_extensions: "false", bazel_cpp_std: "c++17"}, + {cpp_std: "", gnu_extensions: "false", bazel_cpp_std: "c++17", bazel_c_std: "c99"}, {cpp_std: "", gnu_extensions: "true", bazel_cpp_std: ""}, // experimental defaults to gnu++2a {cpp_std: "experimental", gnu_extensions: "", bazel_cpp_std: "gnu++2a"}, - {cpp_std: "experimental", gnu_extensions: "false", bazel_cpp_std: "c++2a"}, + {cpp_std: "experimental", gnu_extensions: "false", bazel_cpp_std: "c++2a", bazel_c_std: "c99"}, {cpp_std: "experimental", gnu_extensions: "true", bazel_cpp_std: "gnu++2a"}, // Explicitly setting a c++ std does not use replace gnu++ std even if // gnu_extensions is true. // "c++11", {cpp_std: "c++11", gnu_extensions: "", bazel_cpp_std: "c++11"}, - {cpp_std: "c++11", gnu_extensions: "false", bazel_cpp_std: "c++11"}, + {cpp_std: "c++11", gnu_extensions: "false", bazel_cpp_std: "c++11", bazel_c_std: "c99"}, {cpp_std: "c++11", gnu_extensions: "true", bazel_cpp_std: "c++11"}, // "c++17", {cpp_std: "c++17", gnu_extensions: "", bazel_cpp_std: "c++17"}, - {cpp_std: "c++17", gnu_extensions: "false", bazel_cpp_std: "c++17"}, + {cpp_std: "c++17", gnu_extensions: "false", bazel_cpp_std: "c++17", bazel_c_std: "c99"}, {cpp_std: "c++17", gnu_extensions: "true", bazel_cpp_std: "c++17"}, // "c++2a", {cpp_std: "c++2a", gnu_extensions: "", bazel_cpp_std: "c++2a"}, - {cpp_std: "c++2a", gnu_extensions: "false", bazel_cpp_std: "c++2a"}, + {cpp_std: "c++2a", gnu_extensions: "false", bazel_cpp_std: "c++2a", bazel_c_std: "c99"}, {cpp_std: "c++2a", gnu_extensions: "true", bazel_cpp_std: "c++2a"}, // "c++98", {cpp_std: "c++98", gnu_extensions: "", bazel_cpp_std: "c++98"}, - {cpp_std: "c++98", gnu_extensions: "false", bazel_cpp_std: "c++98"}, + {cpp_std: "c++98", gnu_extensions: "false", bazel_cpp_std: "c++98", bazel_c_std: "c99"}, {cpp_std: "c++98", gnu_extensions: "true", bazel_cpp_std: "c++98"}, // gnu++ is replaced with c++ if gnu_extensions is explicitly false. // "gnu++11", {cpp_std: "gnu++11", gnu_extensions: "", bazel_cpp_std: "gnu++11"}, - {cpp_std: "gnu++11", gnu_extensions: "false", bazel_cpp_std: "c++11"}, + {cpp_std: "gnu++11", gnu_extensions: "false", bazel_cpp_std: "c++11", bazel_c_std: "c99"}, {cpp_std: "gnu++11", gnu_extensions: "true", bazel_cpp_std: "gnu++11"}, // "gnu++17", {cpp_std: "gnu++17", gnu_extensions: "", bazel_cpp_std: "gnu++17"}, - {cpp_std: "gnu++17", gnu_extensions: "false", bazel_cpp_std: "c++17"}, + {cpp_std: "gnu++17", gnu_extensions: "false", bazel_cpp_std: "c++17", bazel_c_std: "c99"}, {cpp_std: "gnu++17", gnu_extensions: "true", bazel_cpp_std: "gnu++17"}, + + // some c_std test cases + {c_std: "experimental", gnu_extensions: "", bazel_c_std: "gnu11"}, + {c_std: "experimental", gnu_extensions: "false", bazel_cpp_std: "c++17", bazel_c_std: "c11"}, + {c_std: "experimental", gnu_extensions: "true", bazel_c_std: "gnu11"}, + {c_std: "gnu11", cpp_std: "gnu++17", gnu_extensions: "", bazel_cpp_std: "gnu++17", bazel_c_std: "gnu11"}, + {c_std: "gnu11", cpp_std: "gnu++17", gnu_extensions: "false", bazel_cpp_std: "c++17", bazel_c_std: "c11"}, + {c_std: "gnu11", cpp_std: "gnu++17", gnu_extensions: "true", bazel_cpp_std: "gnu++17", bazel_c_std: "gnu11"}, } - for _, tc := range testCases { + for i, tc := range testCases { + name_prefix := fmt.Sprintf("a_%v", i) cppStdProp := "" if tc.cpp_std != "" { cppStdProp = fmt.Sprintf(" cpp_std: \"%s\",", tc.cpp_std) } + cStdProp := "" + if tc.c_std != "" { + cStdProp = fmt.Sprintf(" c_std: \"%s\",", tc.c_std) + } gnuExtensionsProp := "" if tc.gnu_extensions != "" { gnuExtensionsProp = fmt.Sprintf(" gnu_extensions: %s,", tc.gnu_extensions) @@ -1749,61 +1764,67 @@ func TestCcLibraryCppStdWithGnuExtensions_ConvertsToFeatureAttr(t *testing.T) { if tc.bazel_cpp_std != "" { attrs["cpp_std"] = fmt.Sprintf(`"%s"`, tc.bazel_cpp_std) } + if tc.bazel_c_std != "" { + attrs["c_std"] = fmt.Sprintf(`"%s"`, tc.bazel_c_std) + } runCcLibraryTestCase(t, bp2buildTestCase{ description: fmt.Sprintf( - "cc_library with cpp_std: %s and gnu_extensions: %s", tc.cpp_std, tc.gnu_extensions), + "cc_library with c_std: %s, cpp_std: %s and gnu_extensions: %s", tc.c_std, tc.cpp_std, tc.gnu_extensions), moduleTypeUnderTest: "cc_library", moduleTypeUnderTestFactory: cc.LibraryFactory, moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build, blueprint: soongCcLibraryPreamble + fmt.Sprintf(` cc_library { - name: "a", + name: "%s_full", %s // cpp_std: *string +%s // c_std: *string %s // gnu_extensions: *bool include_build_directory: false, } -`, cppStdProp, gnuExtensionsProp), +`, name_prefix, cppStdProp, cStdProp, gnuExtensionsProp), expectedBazelTargets: []string{ - makeBazelTarget("cc_library", "a", attrs), + makeBazelTarget("cc_library", name_prefix+"_full", attrs), }, }) runCcLibraryStaticTestCase(t, bp2buildTestCase{ description: fmt.Sprintf( - "cc_library_static with cpp_std: %s and gnu_extensions: %s", tc.cpp_std, tc.gnu_extensions), + "cc_library_static with c_std: %s, cpp_std: %s and gnu_extensions: %s", tc.c_std, tc.cpp_std, tc.gnu_extensions), moduleTypeUnderTest: "cc_library_static", moduleTypeUnderTestFactory: cc.LibraryStaticFactory, moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryStaticBp2Build, blueprint: soongCcLibraryPreamble + fmt.Sprintf(` cc_library_static { - name: "a", + name: "%s_static", %s // cpp_std: *string +%s // c_std: *string %s // gnu_extensions: *bool include_build_directory: false, } -`, cppStdProp, gnuExtensionsProp), +`, name_prefix, cppStdProp, cStdProp, gnuExtensionsProp), expectedBazelTargets: []string{ - makeBazelTarget("cc_library_static", "a", attrs), + makeBazelTarget("cc_library_static", name_prefix+"_static", attrs), }, }) runCcLibrarySharedTestCase(t, bp2buildTestCase{ description: fmt.Sprintf( - "cc_library_shared with cpp_std: %s and gnu_extensions: %s", tc.cpp_std, tc.gnu_extensions), + "cc_library_shared with c_std: %s, cpp_std: %s and gnu_extensions: %s", tc.c_std, tc.cpp_std, tc.gnu_extensions), moduleTypeUnderTest: "cc_library_shared", moduleTypeUnderTestFactory: cc.LibrarySharedFactory, moduleTypeUnderTestBp2BuildMutator: cc.CcLibrarySharedBp2Build, blueprint: soongCcLibraryPreamble + fmt.Sprintf(` cc_library_shared { - name: "a", + name: "%s_shared", %s // cpp_std: *string +%s // c_std: *string %s // gnu_extensions: *bool include_build_directory: false, } -`, cppStdProp, gnuExtensionsProp), +`, name_prefix, cppStdProp, cStdProp, gnuExtensionsProp), expectedBazelTargets: []string{ - makeBazelTarget("cc_library_shared", "a", attrs), + makeBazelTarget("cc_library_shared", name_prefix+"_shared", attrs), }, }) } diff --git a/build_test.bash b/build_test.bash index b039285ca..b6d00e23f 100755 --- a/build_test.bash +++ b/build_test.bash @@ -50,7 +50,9 @@ esac echo echo "Free disk space:" -df -h +# Ignore df errors because it errors out on gvfsd file systems +# but still displays most of the useful info we need +df -h || true echo echo "Running Bazel smoke test..." diff --git a/cc/bp2build.go b/cc/bp2build.go index d9494362f..eabd814c6 100644 --- a/cc/bp2build.go +++ b/cc/bp2build.go @@ -252,6 +252,7 @@ type compilerAttributes struct { // Not affected by arch variants stl *string + cStd *string cppStd *string localIncludes bazel.StringListAttribute @@ -278,8 +279,7 @@ func (ca *compilerAttributes) bp2buildForAxisAndConfig(ctx android.BazelConversi localIncludeDirs := props.Local_include_dirs if axis == bazel.NoConfigAxis { - ca.cppStd = bp2buildResolveCppStdValue(props.Cpp_std, props.Gnu_extensions) - + ca.cStd, ca.cppStd = bp2buildResolveCppStdValue(props.C_std, props.Cpp_std, props.Gnu_extensions) if includeBuildDirectory(props.Include_build_directory) { localIncludeDirs = append(localIncludeDirs, ".") } @@ -371,24 +371,24 @@ func parseSrcs(ctx android.BazelConversionPathContext, props *BaseCompilerProper return bazel.AppendBazelLabelLists(allSrcsLabelList, generatedSrcsLabelList), anySrcs } -func bp2buildResolveCppStdValue(cpp_std *string, gnu_extensions *bool) *string { - var cppStd *string - // If cpp_std is not specified, don't generate it in the - // BUILD file. For readability purposes, cpp_std and gnu_extensions are - // combined into a single -std=<version> copt, except in the - // default case where cpp_std is nil and gnu_extensions is true or unspecified, - // then the toolchain's default "gnu++17" will be used. +func bp2buildResolveCppStdValue(c_std *string, cpp_std *string, gnu_extensions *bool) (*string, *string) { + var cStdVal, cppStdVal string + // If c{,pp}std properties are not specified, don't generate them in the BUILD file. + // Defaults are handled by the toolchain definition. + // However, if gnu_extensions is false, then the default gnu-to-c version must be specified. if cpp_std != nil { - // TODO(b/202491296): Handle C_std. - // These transformations are shared with compiler.go. - cppStdVal := parseCppStd(cpp_std) - _, cppStdVal = maybeReplaceGnuToC(gnu_extensions, "", cppStdVal) - cppStd = &cppStdVal + cppStdVal = parseCppStd(cpp_std) + } else if gnu_extensions != nil && !*gnu_extensions { + cppStdVal = "c++17" + } + if c_std != nil { + cStdVal = parseCStd(c_std) } else if gnu_extensions != nil && !*gnu_extensions { - cppStdVal := "c++17" - cppStd = &cppStdVal + cStdVal = "c99" } - return cppStd + + cStdVal, cppStdVal = maybeReplaceGnuToC(gnu_extensions, cStdVal, cppStdVal) + return &cStdVal, &cppStdVal } // bp2BuildParseCompilerProps returns copts, srcs and hdrs and other attributes. diff --git a/cc/compiler.go b/cc/compiler.go index ffe8b2e36..2e62b0002 100644 --- a/cc/compiler.go +++ b/cc/compiler.go @@ -304,11 +304,24 @@ func parseCppStd(cppStdPtr *string) string { cppStd := String(cppStdPtr) switch cppStd { case "": - cppStd = config.CppStdVersion + return config.CppStdVersion case "experimental": - cppStd = config.ExperimentalCppStdVersion + return config.ExperimentalCppStdVersion + default: + return cppStd + } +} + +func parseCStd(cStdPtr *string) string { + cStd := String(cStdPtr) + switch cStd { + case "": + return config.CStdVersion + case "experimental": + return config.ExperimentalCStdVersion + default: + return cStd } - return cppStd } // Create a Flags struct that collects the compile flags from global values, @@ -479,13 +492,7 @@ func (compiler *baseCompiler) compilerFlags(ctx ModuleContext, flags Flags, deps flags.Global.CommonFlags = append(flags.Global.CommonFlags, tc.ToolchainCflags()) - cStd := config.CStdVersion - if String(compiler.Properties.C_std) == "experimental" { - cStd = config.ExperimentalCStdVersion - } else if String(compiler.Properties.C_std) != "" { - cStd = String(compiler.Properties.C_std) - } - + cStd := parseCStd(compiler.Properties.C_std) cppStd := parseCppStd(compiler.Properties.Cpp_std) cStd, cppStd = maybeReplaceGnuToC(compiler.Properties.Gnu_extensions, cStd, cppStd) diff --git a/cc/libbuildversion/Android.bp b/cc/libbuildversion/Android.bp index 4debb1c45..2cff99435 100644 --- a/cc/libbuildversion/Android.bp +++ b/cc/libbuildversion/Android.bp @@ -14,6 +14,7 @@ cc_library_static { enabled: true, }, }, + min_sdk_version: "26", apex_available: [ "//apex_available:platform", "//apex_available:anyapex", diff --git a/cc/library.go b/cc/library.go index dbf927d61..3dceda0a3 100644 --- a/cc/library.go +++ b/cc/library.go @@ -253,6 +253,7 @@ type bazelCcLibraryAttributes struct { Stl *string Cpp_std *string + C_std *string // This is shared only. Link_crt bazel.BoolAttribute @@ -335,6 +336,7 @@ func CcLibraryBp2Build(ctx android.TopDownMutatorContext) { Rtti: compilerAttrs.rtti, Stl: compilerAttrs.stl, Cpp_std: compilerAttrs.cppStd, + C_std: compilerAttrs.cStd, Additional_linker_inputs: linkerAttrs.additionalLinkerInputs, @@ -2420,6 +2422,7 @@ func ccSharedOrStaticBp2BuildMutatorInternal(ctx android.TopDownMutatorContext, Rtti: compilerAttrs.rtti, Stl: compilerAttrs.stl, Cpp_std: compilerAttrs.cppStd, + C_std: compilerAttrs.cStd, Export_includes: exportedIncludes.Includes, Export_system_includes: exportedIncludes.SystemIncludes, Local_includes: compilerAttrs.localIncludes, @@ -2445,6 +2448,7 @@ func ccSharedOrStaticBp2BuildMutatorInternal(ctx android.TopDownMutatorContext, Rtti: compilerAttrs.rtti, Stl: compilerAttrs.stl, Cpp_std: compilerAttrs.cppStd, + C_std: compilerAttrs.cStd, Export_includes: exportedIncludes.Includes, Export_system_includes: exportedIncludes.SystemIncludes, @@ -2480,6 +2484,7 @@ type bazelCcLibraryStaticAttributes struct { Rtti bazel.BoolAttribute Stl *string Cpp_std *string + C_std *string Export_includes bazel.StringListAttribute Export_system_includes bazel.StringListAttribute @@ -2516,6 +2521,7 @@ type bazelCcLibrarySharedAttributes struct { Rtti bazel.BoolAttribute Stl *string Cpp_std *string + C_std *string Export_includes bazel.StringListAttribute Export_system_includes bazel.StringListAttribute diff --git a/dexpreopt/config.go b/dexpreopt/config.go index de3666a33..6d6b41d4b 100644 --- a/dexpreopt/config.go +++ b/dexpreopt/config.go @@ -49,10 +49,12 @@ type GlobalConfig struct { ArtApexJars android.ConfiguredJarList // modules for jars that are in the ART APEX - SystemServerJars android.ConfiguredJarList // jars that form the system server - SystemServerApps []string // apps that are loaded into system server - ApexSystemServerJars android.ConfiguredJarList // jars within apex that are loaded into system server - SpeedApps []string // apps that should be speed optimized + SystemServerJars android.ConfiguredJarList // system_server classpath jars on the platform + SystemServerApps []string // apps that are loaded into system server + ApexSystemServerJars android.ConfiguredJarList // system_server classpath jars delivered via apex + StandaloneSystemServerJars android.ConfiguredJarList // jars on the platform that system_server loads dynamically using separate classloaders + ApexStandaloneSystemServerJars android.ConfiguredJarList // jars delivered via apex that system_server loads dynamically using separate classloaders + SpeedApps []string // apps that should be speed optimized BrokenSuboptimalOrderOfSystemServerJars bool // if true, sub-optimal order does not cause a build error @@ -619,6 +621,8 @@ func GlobalConfigForTests(ctx android.PathContext) *GlobalConfig { SystemServerJars: android.EmptyConfiguredJarList(), SystemServerApps: nil, ApexSystemServerJars: android.EmptyConfiguredJarList(), + StandaloneSystemServerJars: android.EmptyConfiguredJarList(), + ApexStandaloneSystemServerJars: android.EmptyConfiguredJarList(), SpeedApps: nil, PreoptFlags: nil, DefaultCompilerFilter: "", diff --git a/dexpreopt/testing.go b/dexpreopt/testing.go index 8f5c31521..2fba01aa7 100644 --- a/dexpreopt/testing.go +++ b/dexpreopt/testing.go @@ -125,6 +125,13 @@ func FixtureSetApexBootJars(bootJars ...string) android.FixturePreparer { }) } +// FixtureSetStandaloneSystemServerJars sets the StandaloneSystemServerJars property. +func FixtureSetStandaloneSystemServerJars(jars ...string) android.FixturePreparer { + return FixtureModifyGlobalConfig(func(dexpreoptConfig *GlobalConfig) { + dexpreoptConfig.StandaloneSystemServerJars = android.CreateTestConfiguredJarList(jars) + }) +} + // FixtureSetSystemServerJars sets the SystemServerJars property. func FixtureSetSystemServerJars(jars ...string) android.FixturePreparer { return FixtureModifyGlobalConfig(func(dexpreoptConfig *GlobalConfig) { @@ -139,6 +146,14 @@ func FixtureSetApexSystemServerJars(jars ...string) android.FixturePreparer { }) } +// FixtureSetApexStandaloneSystemServerJars sets the ApexStandaloneSystemServerJars property in the +// global config. +func FixtureSetApexStandaloneSystemServerJars(jars ...string) android.FixturePreparer { + return FixtureModifyGlobalConfig(func(dexpreoptConfig *GlobalConfig) { + dexpreoptConfig.ApexStandaloneSystemServerJars = android.CreateTestConfiguredJarList(jars) + }) +} + // FixtureSetPreoptWithUpdatableBcp sets the PreoptWithUpdatableBcp property in the global config. func FixtureSetPreoptWithUpdatableBcp(value bool) android.FixturePreparer { return FixtureModifyGlobalConfig(func(dexpreoptConfig *GlobalConfig) { diff --git a/java/classpath_fragment.go b/java/classpath_fragment.go index f63d81d6e..d1d9e73da 100644 --- a/java/classpath_fragment.go +++ b/java/classpath_fragment.go @@ -25,7 +25,7 @@ import ( "android/soong/android" ) -// Build rules and utilities to generate individual packages/modules/SdkExtensions/proto/classpaths.proto +// Build rules and utilities to generate individual packages/modules/common/proto/classpaths.proto // config files based on build configuration to embed into /system and /apex on a device. // // See `derive_classpath` service that reads the configs at runtime and defines *CLASSPATH variables @@ -34,14 +34,15 @@ import ( type classpathType int const ( - // Matches definition in packages/modules/SdkExtensions/proto/classpaths.proto + // Matches definition in packages/modules/common/proto/classpaths.proto BOOTCLASSPATH classpathType = iota DEX2OATBOOTCLASSPATH SYSTEMSERVERCLASSPATH + STANDALONE_SYSTEMSERVER_JARS ) func (c classpathType) String() string { - return [...]string{"BOOTCLASSPATH", "DEX2OATBOOTCLASSPATH", "SYSTEMSERVERCLASSPATH"}[c] + return [...]string{"BOOTCLASSPATH", "DEX2OATBOOTCLASSPATH", "SYSTEMSERVERCLASSPATH", "STANDALONE_SYSTEMSERVER_JARS"}[c] } type classpathFragmentProperties struct { diff --git a/java/dexpreopt.go b/java/dexpreopt.go index 7c081b6e5..f3a53eed9 100644 --- a/java/dexpreopt.go +++ b/java/dexpreopt.go @@ -122,29 +122,33 @@ func moduleName(ctx android.BaseModuleContext) string { } func (d *dexpreopter) dexpreoptDisabled(ctx android.BaseModuleContext) bool { - global := dexpreopt.GetGlobalConfig(ctx) + if !ctx.Device() { + return true + } - if global.DisablePreopt { + if d.isTest { return true } - if inList(moduleName(ctx), global.DisablePreoptModules) { + if !BoolDefault(d.dexpreoptProperties.Dex_preopt.Enabled, true) { return true } - if d.isTest { + if !ctx.Module().(DexpreopterInterface).IsInstallable() { return true } - if !BoolDefault(d.dexpreoptProperties.Dex_preopt.Enabled, true) { + if !android.IsModulePreferred(ctx.Module()) { return true } - if !ctx.Module().(DexpreopterInterface).IsInstallable() { + global := dexpreopt.GetGlobalConfig(ctx) + + if global.DisablePreopt { return true } - if ctx.Host() { + if inList(moduleName(ctx), global.DisablePreoptModules) { return true } @@ -161,10 +165,6 @@ func (d *dexpreopter) dexpreoptDisabled(ctx android.BaseModuleContext) bool { } } - if !android.IsModulePreferred(ctx.Module()) { - return true - } - // TODO: contains no java code return false diff --git a/java/java.go b/java/java.go index 2f9e03a80..ee1fd8ad3 100644 --- a/java/java.go +++ b/java/java.go @@ -447,6 +447,7 @@ const ( JAVA_VERSION_7 = 7 JAVA_VERSION_8 = 8 JAVA_VERSION_9 = 9 + JAVA_VERSION_11 = 11 ) func (v javaVersion) String() string { @@ -459,6 +460,8 @@ func (v javaVersion) String() string { return "1.8" case JAVA_VERSION_9: return "1.9" + case JAVA_VERSION_11: + return "11" default: return "unsupported" } @@ -479,8 +482,10 @@ func normalizeJavaVersion(ctx android.BaseModuleContext, javaVersion string) jav return JAVA_VERSION_8 case "1.9", "9": return JAVA_VERSION_9 - case "10", "11": - ctx.PropertyErrorf("java_version", "Java language levels above 9 are not supported") + case "11": + return JAVA_VERSION_11 + case "10": + ctx.PropertyErrorf("java_version", "Java language levels 10 is not supported") return JAVA_VERSION_UNSUPPORTED default: ctx.PropertyErrorf("java_version", "Unrecognized Java language level") diff --git a/java/systemserver_classpath_fragment.go b/java/systemserver_classpath_fragment.go index e263cc44c..2ec33a422 100644 --- a/java/systemserver_classpath_fragment.go +++ b/java/systemserver_classpath_fragment.go @@ -58,6 +58,10 @@ func (p *platformSystemServerClasspathModule) AndroidMkEntries() (entries []andr func (p *platformSystemServerClasspathModule) GenerateAndroidBuildActions(ctx android.ModuleContext) { configuredJars := p.configuredJars(ctx) classpathJars := configuredJarListToClasspathJars(ctx, configuredJars, p.classpathType) + standaloneConfiguredJars := p.standaloneConfiguredJars(ctx) + standaloneClasspathJars := configuredJarListToClasspathJars(ctx, standaloneConfiguredJars, STANDALONE_SYSTEMSERVER_JARS) + configuredJars = configuredJars.AppendList(standaloneConfiguredJars) + classpathJars = append(classpathJars, standaloneClasspathJars...) p.classpathFragmentBase().generateClasspathProtoBuildActions(ctx, configuredJars, classpathJars) } @@ -66,6 +70,10 @@ func (p *platformSystemServerClasspathModule) configuredJars(ctx android.ModuleC return dexpreopt.GetGlobalConfig(ctx).SystemServerJars } +func (p *platformSystemServerClasspathModule) standaloneConfiguredJars(ctx android.ModuleContext) android.ConfiguredJarList { + return dexpreopt.GetGlobalConfig(ctx).StandaloneSystemServerJars +} + type SystemServerClasspathModule struct { android.ModuleBase android.ApexModuleBase @@ -84,10 +92,15 @@ func (s *SystemServerClasspathModule) ShouldSupportSdkVersion(ctx android.BaseMo } type systemServerClasspathFragmentProperties struct { - // The contents of this systemserverclasspath_fragment, could be either java_library, or java_sdk_library. + // List of system_server classpath jars, could be either java_library, or java_sdk_library. // // The order of this list matters as it is the order that is used in the SYSTEMSERVERCLASSPATH. Contents []string + + // List of jars that system_server loads dynamically using separate classloaders. + // + // The order does not matter. + Standalone_contents []string } func systemServerClasspathFactory() android.Module { @@ -101,12 +114,16 @@ func systemServerClasspathFactory() android.Module { } func (s *SystemServerClasspathModule) GenerateAndroidBuildActions(ctx android.ModuleContext) { - if len(s.properties.Contents) == 0 { - ctx.PropertyErrorf("contents", "empty contents are not allowed") + if len(s.properties.Contents) == 0 && len(s.properties.Standalone_contents) == 0 { + ctx.PropertyErrorf("contents", "Either contents or standalone_contents needs to be non-empty") } configuredJars := s.configuredJars(ctx) classpathJars := configuredJarListToClasspathJars(ctx, configuredJars, s.classpathType) + standaloneConfiguredJars := s.standaloneConfiguredJars(ctx) + standaloneClasspathJars := configuredJarListToClasspathJars(ctx, standaloneConfiguredJars, STANDALONE_SYSTEMSERVER_JARS) + configuredJars = configuredJars.AppendList(standaloneConfiguredJars) + classpathJars = append(classpathJars, standaloneClasspathJars...) s.classpathFragmentBase().generateClasspathProtoBuildActions(ctx, configuredJars, classpathJars) // Collect the module directory for IDE info in java/jdeps.go. @@ -145,6 +162,17 @@ func (s *SystemServerClasspathModule) configuredJars(ctx android.ModuleContext) return jars } +func (s *SystemServerClasspathModule) standaloneConfiguredJars(ctx android.ModuleContext) android.ConfiguredJarList { + global := dexpreopt.GetGlobalConfig(ctx) + + possibleUpdatableModules := gatherPossibleApexModuleNamesAndStems(ctx, s.properties.Standalone_contents, systemServerClasspathFragmentContentDepTag) + jars, _ := global.ApexStandaloneSystemServerJars.Filter(possibleUpdatableModules) + + // TODO(jiakaiz): add a check to ensure that the contents are declared in make. + + return jars +} + type systemServerClasspathFragmentContentDependencyTag struct { blueprint.BaseDependencyTag } @@ -192,8 +220,11 @@ func IsSystemServerClasspathFragmentContentDepTag(tag blueprint.DependencyTag) b func (s *SystemServerClasspathModule) ComponentDepsMutator(ctx android.BottomUpMutatorContext) { module := ctx.Module() _, isSourceModule := module.(*SystemServerClasspathModule) + var deps []string + deps = append(deps, s.properties.Contents...) + deps = append(deps, s.properties.Standalone_contents...) - for _, name := range s.properties.Contents { + for _, name := range deps { // A systemserverclasspath_fragment must depend only on other source modules, while the // prebuilt_systemserverclasspath_fragment_fragment must only depend on other prebuilt modules. if !isSourceModule { @@ -206,6 +237,7 @@ func (s *SystemServerClasspathModule) ComponentDepsMutator(ctx android.BottomUpM // Collect information for opening IDE project files in java/jdeps.go. func (s *SystemServerClasspathModule) IDEInfo(dpInfo *android.IdeInfo) { dpInfo.Deps = append(dpInfo.Deps, s.properties.Contents...) + dpInfo.Deps = append(dpInfo.Deps, s.properties.Standalone_contents...) dpInfo.Paths = append(dpInfo.Paths, s.modulePaths...) } @@ -233,14 +265,22 @@ func (s *systemServerClasspathFragmentMemberType) CreateVariantPropertiesStruct( type systemServerClasspathFragmentSdkMemberProperties struct { android.SdkMemberPropertiesBase - // Contents of the systemserverclasspath fragment + // List of system_server classpath jars, could be either java_library, or java_sdk_library. + // + // The order of this list matters as it is the order that is used in the SYSTEMSERVERCLASSPATH. Contents []string + + // List of jars that system_server loads dynamically using separate classloaders. + // + // The order does not matter. + Standalone_contents []string } func (s *systemServerClasspathFragmentSdkMemberProperties) PopulateFromVariant(ctx android.SdkMemberContext, variant android.Module) { module := variant.(*SystemServerClasspathModule) s.Contents = module.properties.Contents + s.Standalone_contents = module.properties.Standalone_contents } func (s *systemServerClasspathFragmentSdkMemberProperties) AddToPropertySet(ctx android.SdkMemberContext, propertySet android.BpPropertySet) { @@ -250,6 +290,10 @@ func (s *systemServerClasspathFragmentSdkMemberProperties) AddToPropertySet(ctx if len(s.Contents) > 0 { propertySet.AddPropertyWithTag("contents", s.Contents, requiredMemberDependency) } + + if len(s.Standalone_contents) > 0 { + propertySet.AddPropertyWithTag("standalone_contents", s.Standalone_contents, requiredMemberDependency) + } } var _ android.SdkMemberType = (*systemServerClasspathFragmentMemberType)(nil) diff --git a/java/systemserver_classpath_fragment_test.go b/java/systemserver_classpath_fragment_test.go index 9ad50dd4a..ba328e7b1 100644 --- a/java/systemserver_classpath_fragment_test.go +++ b/java/systemserver_classpath_fragment_test.go @@ -99,7 +99,7 @@ func TestPlatformSystemServerClasspathModule_AndroidMkEntries(t *testing.T) { func TestSystemServerClasspathFragmentWithoutContents(t *testing.T) { prepareForTestWithSystemServerClasspath. ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern( - `\Qempty contents are not allowed\E`)). + `\QEither contents or standalone_contents needs to be non-empty\E`)). RunTestWithBp(t, ` systemserverclasspath_fragment { name: "systemserverclasspath-fragment", diff --git a/python/androidmk.go b/python/androidmk.go index 13b41723e..ccc85ec6a 100644 --- a/python/androidmk.go +++ b/python/androidmk.go @@ -75,12 +75,6 @@ func (p *testDecorator) AndroidMk(base *Module, entries *android.AndroidMkEntrie } func (installer *pythonInstaller) AndroidMk(base *Module, entries *android.AndroidMkEntries) { - // Soong installation is only supported for host modules. Have Make - // installation trigger Soong installation. - if base.Target().Os.Class == android.Host { - entries.OutputFile = android.OptionalPathForPath(installer.path) - } - entries.Required = append(entries.Required, "libc++") entries.ExtraEntries = append(entries.ExtraEntries, func(ctx android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) { diff --git a/scripts/Android.bp b/scripts/Android.bp index 730d7567e..4c847a121 100644 --- a/scripts/Android.bp +++ b/scripts/Android.bp @@ -47,15 +47,6 @@ python_library_host { srcs: [ "manifest.py", ], - version: { - py2: { - // TODO(b/203436762) Remove when system/apex/apexer/apexer.py is converted - enabled: true, - }, - py3: { - enabled: true, - }, - }, visibility: ["//system/apex/apexer:__pkg__"], } |