// // Copyright (C) 2017 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. // package { default_applicable_licenses: ["system_core_init_license"], } // Added automatically by a large-scale-change // See: http://go/android-license-faq license { name: "system_core_init_license", visibility: [":__subpackages__"], license_kinds: [ "SPDX-license-identifier-Apache-2.0", ], license_text: [ "NOTICE", ], } init_common_sources = [ "action.cpp", "action_manager.cpp", "action_parser.cpp", "capabilities.cpp", "epoll.cpp", "import_parser.cpp", "interface_utils.cpp", "keychords.cpp", "parser.cpp", "property_type.cpp", "rlimit_parser.cpp", "service.cpp", "service_list.cpp", "service_parser.cpp", "service_utils.cpp", "subcontext.cpp", "subcontext.proto", "tokenizer.cpp", "util.cpp", ] init_device_sources = [ "block_dev_initializer.cpp", "bootchart.cpp", "builtins.cpp", "devices.cpp", "firmware_handler.cpp", "first_stage_console.cpp", "first_stage_init.cpp", "first_stage_mount.cpp", "fscrypt_init_extensions.cpp", "init.cpp", "lmkd_service.cpp", "modalias_handler.cpp", "mount_handler.cpp", "mount_namespace.cpp", "persistent_properties.cpp", "persistent_properties.proto", "property_service.cpp", "property_service.proto", "reboot.cpp", "reboot_utils.cpp", "security.cpp", "selabel.cpp", "selinux.cpp", "sigchld_handler.cpp", "snapuserd_transition.cpp", "switch_root.cpp", "uevent_listener.cpp", "ueventd.cpp", "ueventd_parser.cpp", ] init_host_sources = [ "check_builtins.cpp", "host_import_parser.cpp", "host_init_verifier.cpp", ] soong_config_module_type { name: "libinit_cc_defaults", module_type: "cc_defaults", config_namespace: "ANDROID", bool_variables: [ "PRODUCT_INSTALL_DEBUG_POLICY_TO_SYSTEM_EXT", ], properties: [ "cflags", ], } libinit_cc_defaults { name: "init_defaults", sanitize: { misc_undefined: ["signed-integer-overflow"], }, cflags: [ "-DLOG_UEVENTS=0", "-Wall", "-Wextra", "-Wno-unused-parameter", "-Werror", "-Wthread-safety", "-DALLOW_FIRST_STAGE_CONSOLE=0", "-DALLOW_LOCAL_PROP_OVERRIDE=0", "-DALLOW_PERMISSIVE_SELINUX=0", "-DREBOOT_BOOTLOADER_ON_PANIC=0", "-DWORLD_WRITABLE_KMSG=0", "-DDUMP_ON_UMOUNT_FAILURE=0", "-DSHUTDOWN_ZERO_TIMEOUT=0", "-DINIT_FULL_SOURCES", "-DINSTALL_DEBUG_POLICY_TO_SYSTEM_EXT=0", ], product_variables: { debuggable: { cppflags: [ "-UALLOW_FIRST_STAGE_CONSOLE", "-DALLOW_FIRST_STAGE_CONSOLE=1", "-UALLOW_LOCAL_PROP_OVERRIDE", "-DALLOW_LOCAL_PROP_OVERRIDE=1", "-UALLOW_PERMISSIVE_SELINUX", "-DALLOW_PERMISSIVE_SELINUX=1", "-UREBOOT_BOOTLOADER_ON_PANIC", "-DREBOOT_BOOTLOADER_ON_PANIC=1", "-UWORLD_WRITABLE_KMSG", "-DWORLD_WRITABLE_KMSG=1", "-UDUMP_ON_UMOUNT_FAILURE", "-DDUMP_ON_UMOUNT_FAILURE=1", ], }, eng: { cppflags: [ "-USHUTDOWN_ZERO_TIMEOUT", "-DSHUTDOWN_ZERO_TIMEOUT=1", ], }, uml: { cppflags: ["-DUSER_MODE_LINUX"], }, }, soong_config_variables: { PRODUCT_INSTALL_DEBUG_POLICY_TO_SYSTEM_EXT: { cflags: [ "-UINSTALL_DEBUG_POLICY_TO_SYSTEM_EXT", "-DINSTALL_DEBUG_POLICY_TO_SYSTEM_EXT=1", ], }, }, static_libs: [ "libavb", "libc++fs", "libcgrouprc_format", "libfsverity_init", "liblmkd_utils", "libmini_keyctl_static", "libmodprobe", "libprocinfo", "libprotobuf-cpp-lite", "libpropertyinfoserializer", "libpropertyinfoparser", "libsigningutils", "libsnapshot_cow", "libsnapshot_init", "libxml2", "lib_apex_manifest_proto_lite", "update_metadata-protos", ], shared_libs: [ "libbacktrace", "libbase", "libbootloader_message", "libcrypto", "libcutils", "libdl", "libext4_utils", "libfs_mgr", "libgsi", "libhidl-gen-utils", "libkeyutils", "liblog", "liblogwrap", "liblp", "libprocessgroup", "libprocessgroup_setup", "libselinux", "libutils", "libziparchive", ], bootstrap: true, visibility: [":__subpackages__"], } cc_library_static { name: "libinit", recovery_available: true, defaults: [ "init_defaults", "selinux_policy_version", ], srcs: init_common_sources + init_device_sources, generated_sources: [ "apex-info-list", ], whole_static_libs: [ "libcap", "com.android.sysprop.apex", "com.android.sysprop.init", ], header_libs: ["bootimg_headers"], proto: { type: "lite", export_proto_headers: true, }, target: { recovery: { cflags: ["-DRECOVERY"], exclude_static_libs: [ "libxml2", ], exclude_generated_sources: [ "apex-info-list", ], exclude_shared_libs: [ "libbinder", "libutils", ], }, }, } phony { name: "init", required: [ "init_second_stage", ], } cc_binary { name: "init_second_stage", recovery_available: true, stem: "init", defaults: ["init_defaults"], static_libs: ["libinit"], srcs: ["main.cpp"], symlinks: ["ueventd"], target: { platform: { required: [ "init.rc", "ueventd.rc", "e2fsdroid", "extra_free_kbytes.sh", "make_f2fs", "mke2fs", "sload_f2fs", ], }, recovery: { cflags: ["-DRECOVERY"], exclude_static_libs: [ "libxml2", ], exclude_shared_libs: [ "libbinder", "libutils", ], required: [ "init_recovery.rc", "ueventd.rc.recovery", "e2fsdroid.recovery", "make_f2fs.recovery", "mke2fs.recovery", "sload_f2fs.recovery", ], }, }, visibility: ["//packages/modules/Virtualization/microdroid"], } soong_config_module_type { name: "init_first_stage_cc_defaults", module_type: "cc_defaults", config_namespace: "ANDROID", bool_variables: ["BOARD_BUILD_SYSTEM_ROOT_IMAGE", "BOARD_USES_RECOVERY_AS_BOOT"], properties: ["installable"], } // Do not install init_first_stage even with mma if we're system-as-root. // Otherwise, it will overwrite the symlink. init_first_stage_cc_defaults { name: "init_first_stage_defaults", soong_config_variables: { BOARD_BUILD_SYSTEM_ROOT_IMAGE: { installable: false, }, BOARD_USES_RECOVERY_AS_BOOT: { installable: false, }, }, } cc_binary { name: "init_first_stage", stem: "init", defaults: ["init_first_stage_defaults"], srcs: [ "block_dev_initializer.cpp", "devices.cpp", "first_stage_console.cpp", "first_stage_init.cpp", "first_stage_main.cpp", "first_stage_mount.cpp", "reboot_utils.cpp", "selabel.cpp", "service_utils.cpp", "snapuserd_transition.cpp", "switch_root.cpp", "uevent_listener.cpp", "util.cpp", ], static_libs: [ "libc++fs", "libfs_avb", "libfs_mgr", "libfec", "libfec_rs", "libsquashfs_utils", "libcrypto_utils", "libavb", "liblp", "libcutils", "libbase", "liblog", "libcrypto_static", "libselinux", "libcap", "libgsi", "liblzma", "libunwindstack_no_dex", "libbacktrace_no_dex", "libmodprobe", "libext2_uuid", "libprotobuf-cpp-lite", "libsnapshot_cow", "libsnapshot_init", "update_metadata-protos", "libprocinfo", ], static_executable: true, system_shared_libs: [], cflags: [ "-Wall", "-Wextra", "-Wno-unused-parameter", "-Werror", "-DALLOW_FIRST_STAGE_CONSOLE=0", "-DALLOW_LOCAL_PROP_OVERRIDE=0", "-DALLOW_PERMISSIVE_SELINUX=0", "-DREBOOT_BOOTLOADER_ON_PANIC=0", "-DWORLD_WRITABLE_KMSG=0", "-DDUMP_ON_UMOUNT_FAILURE=0", "-DSHUTDOWN_ZERO_TIMEOUT=0", "-DLOG_UEVENTS=0", "-DSEPOLICY_VERSION=30", // TODO(jiyong): externalize the version number ], product_variables: { debuggable: { cflags: [ "-UALLOW_FIRST_STAGE_CONSOLE", "-DALLOW_FIRST_STAGE_CONSOLE=1", "-UALLOW_LOCAL_PROP_OVERRIDE", "-DALLOW_LOCAL_PROP_OVERRIDE=1", "-UALLOW_PERMISSIVE_SELINUX", "-DALLOW_PERMISSIVE_SELINUX=1", "-UREBOOT_BOOTLOADER_ON_PANIC", "-DREBOOT_BOOTLOADER_ON_PANIC=1", "-UWORLD_WRITABLE_KMSG", "-DWORLD_WRITABLE_KMSG=1", "-UDUMP_ON_UMOUNT_FAILURE", "-DDUMP_ON_UMOUNT_FAILURE=1", ], }, eng: { cflags: [ "-USHUTDOWN_ZERO_TIMEOUT", "-DSHUTDOWN_ZERO_TIMEOUT=1", ], }, }, sanitize: { misc_undefined: ["signed-integer-overflow"], // First stage init is weird: it may start without stdout/stderr, and no /proc. hwaddress: false, }, // Install adb_debug.prop into debug ramdisk. // This allows adb root on a user build, when debug ramdisk is used. required: ["adb_debug.prop"], ramdisk: true, install_in_root: true, } phony { name: "init_system", required: ["init_second_stage"], } // Tests // ------------------------------------------------------------------------------ cc_test { name: "CtsInitTestCases", defaults: ["init_defaults"], require_root: true, compile_multilib: "both", multilib: { lib32: { suffix: "32", }, lib64: { suffix: "64", }, }, srcs: [ "devices_test.cpp", "epoll_test.cpp", "firmware_handler_test.cpp", "init_test.cpp", "keychords_test.cpp", "oneshot_on_test.cpp", "persistent_properties_test.cpp", "property_service_test.cpp", "property_type_test.cpp", "reboot_test.cpp", "rlimit_parser_test.cpp", "service_test.cpp", "subcontext_test.cpp", "tokenizer_test.cpp", "ueventd_parser_test.cpp", "ueventd_test.cpp", "util_test.cpp", ], static_libs: ["libinit"], test_suites: [ "cts", "device-tests", ], } cc_benchmark { name: "init_benchmarks", defaults: ["init_defaults"], srcs: [ "subcontext_benchmark.cpp", ], static_libs: ["libinit"], } cc_defaults { name: "libinit_test_utils_libraries_defaults", shared_libs: [ "libbase", "libcutils", "libselinux", "libhidl-gen-utils", "liblog", "libprocessgroup", "libprotobuf-cpp-lite", ], } cc_library_static { name: "libinit_test_utils", defaults: ["libinit_test_utils_libraries_defaults"], cflags: [ "-Wall", "-Wextra", "-Wno-unused-parameter", "-Werror", ], srcs: init_common_sources + [ "test_utils/service_utils.cpp", ], whole_static_libs: [ "libcap", ], export_include_dirs: ["test_utils/include"], // for tests } // Host Verifier // ------------------------------------------------------------------------------ genrule { name: "generated_stub_builtin_function_map", tool_files: ["host_builtin_map.py"], out: ["generated_stub_builtin_function_map.h"], srcs: [ "builtins.cpp", "check_builtins.cpp", ], cmd: "$(location host_builtin_map.py) --builtins $(location builtins.cpp) --check_builtins $(location check_builtins.cpp) > $(out)", } cc_defaults { name: "init_host_defaults", host_supported: true, cflags: [ "-Wall", "-Wextra", "-Wno-unused-parameter", "-Werror", ], static_libs: [ "libbase", "libselinux", "libpropertyinfoserializer", "libpropertyinfoparser", ], whole_static_libs: ["libcap"], shared_libs: [ "libcutils", "libhidl-gen-utils", "libhidlmetadata", "liblog", "libprocessgroup", "libprotobuf-cpp-lite", ], proto: { type: "lite", }, generated_headers: [ "generated_stub_builtin_function_map", "generated_android_ids", ], target: { android: { enabled: false, }, darwin: { enabled: false, }, }, } cc_binary { name: "host_init_verifier", defaults: ["init_host_defaults"], srcs: init_common_sources + init_host_sources, } cc_library_host_static { name: "libinit_host", defaults: ["init_host_defaults"], srcs: init_common_sources, export_include_dirs: ["."], proto: { export_proto_headers: true, }, visibility: [ // host_apex_verifier performs a subset of init.rc validation "//system/apex/tools", ], } sh_binary { name: "extra_free_kbytes.sh", src: "extra_free_kbytes.sh", }