// Build musl libc from source to eventually use as the libc for host modules in the platform build. // The list of sources to compile for each library is loaded from sources.bp, which is generated // by generate_bp.py. package { default_visibility: ["//visibility:private"], default_applicable_licenses: ["musl_license"], } license { name: "musl_license", visibility: [":__subpackages__"], license_kinds: [ "SPDX-license-identifier-MIT", "SPDX-license-identifier-BSD", ], license_text: ["COPYRIGHT"], } cc_library_headers { name: "libc_musl_arch_headers", host_supported: true, device_supported: false, system_shared_libs: [], generated_headers: [ "libc_musl_alltypes.h", "libc_musl_syscall.h", ], export_generated_headers: [ "libc_musl_alltypes.h", "libc_musl_syscall.h", ], export_include_dirs: [ "arch/generic", ], arch: { arm: { export_include_dirs: ["arch/arm"], }, arm64: { export_include_dirs: ["arch/aarch64"], }, x86: { export_include_dirs: ["arch/i386"], }, x86_64: { export_include_dirs: ["arch/x86_64"], }, }, } cc_library_headers { name: "libc_musl_private_headers", host_supported: true, device_supported: false, system_shared_libs: [], generated_headers: [ "libc_musl_version.h", ], export_generated_headers: [ "libc_musl_version.h", ], export_include_dirs: [ "src/include", "src/internal", ], } cc_library_headers { name: "libc_musl_public_headers", host_supported: true, device_supported: false, system_shared_libs: [], export_system_include_dirs: [ "android/include", "include", ], } cc_defaults { name: "libc_musl_defaults", host_supported: true, device_supported: false, system_shared_libs: [], cflags: [ // CFLAGS_C99FSE "-nostdinc", "-ffreestanding", "-frounding-math", "-Wa,--noexecstack", // CFLAGS_AUTO //"-Os", "-O0", "-pipe", "-fomit-frame-pointer", "-fno-unwind-tables", "-fno-asynchronous-unwind-tables", "-ffunction-sections", "-fdata-sections", //"-w", "-Wno-pointer-to-int-cast", "-Werror=implicit-function-declaration", "-Werror=implicit-int", "-Werror=pointer-sign", "-Werror=pointer-arith", "-Werror=int-conversion", "-Werror=incompatible-pointer-types", "-Qunused-arguments", "-Waddress", "-Warray-bounds", "-Wchar-subscripts", "-Wduplicate-decl-specifier", "-Winit-self", "-Wreturn-type", "-Wsequence-point", "-Wstrict-aliasing", "-Wunused-function", "-Wunused-label", "-Wunused-variable", // CFLAGS_ALL "-D_XOPEN_SOURCE=700", // undefine NDEBUG from global flags, musl defines it locally "-UNDEBUG", // disable warnings: "-Wno-bitwise-op-parentheses", "-Wno-dangling-else", "-Wno-ignored-attributes", "-Wno-logical-op-parentheses", "-Wno-missing-braces", "-Wno-missing-field-initializers", "-Wno-parentheses", "-Wno-shift-op-parentheses", "-Wno-string-plus-int", "-Wno-unused-parameter", ], ldflags: [ "-Wl,--sort-section,alignment", "-Wl,--sort-common", "-Wl,--gc-sections", "-Wl,--hash-style=both", "-Wl,--no-undefined", // Can't use --exclude-libs=ALL, that excludes the static libraries // used for building subparts of libc_musl. //"-Wl,--exclude-libs=ALL", "-Wl,--exclude-libs=libgcc.a", "-Wl,--exclude-libs=libgcc_stripped.a", "-Wl,--exclude-libs=libclang_rt.builtins-arm-android.a", "-Wl,--exclude-libs=libclang_rt.builtins-aarch64-android.a", "-Wl,--exclude-libs=libclang_rt.builtins-i686-android.a", "-Wl,--exclude-libs=libclang_rt.builtins-x86_64-android.a", ], asflags: ["-Wno-unused-command-line-argument"], header_libs: [ // The order here is very important, private headers like src/include/features.h override // public headers like include/features.h, and arch headers like arch/x86_64/ksigaction.h // override private headers like src/internal/ksigaction.h. "libc_musl_arch_headers", "libc_musl_private_headers", "libc_musl_public_headers", ], stl: "none", c_std: "c99", sanitize: { never: true, }, target: { darwin: { enabled: false, }, bionic: { enabled: false, }, glibc: { enabled: false, }, }, } cc_library_headers { name: "libc_musl_headers", visibility: ["//bionic/libc"], host_supported: true, device_supported: false, system_shared_libs: [], export_header_lib_headers: [ "libc_musl_arch_headers", "libc_musl_public_headers", "libc_llndk_headers", ], header_libs: [ "libc_musl_arch_headers", "libc_musl_public_headers", "libc_llndk_headers", ], } // // The main musl libc library // cc_library { name: "libc_musl", visibility: ["//visibility:public"], defaults: ["libc_musl_defaults"], whole_static_libs: ["libc_musl_static"], shared: { whole_static_libs: ["libc_musl_ldso"], }, ldflags: [ "-Wl,-e,_dlstart", "-nostdlib", ], dynamic_list: "dynamic.list", } // All the static parts of the main musl libc. Don't use this directly, use // the version exported through libc_musl instead. cc_library_static { name: "libc_musl_static", defaults: [ "libc_musl_defaults", "libc_musl_sources", ], whole_static_libs: [ "libc_musl_opt", "libc_musl_opt_nossp", "libc_musl_nossp", "libexecinfo", "libb64", "libunwind", ], multilib: { lib32: { whole_static_libs: ["libc_musl_compat32"], }, }, export_header_lib_headers: [ "libc_musl_arch_headers", "libc_musl_public_headers", "libc_llndk_headers", ], header_libs: [ "libc_llndk_headers", ], } // Musl sources that are compiled with -O3 cc_library_static { name: "libc_musl_opt", defaults: [ "libc_musl_defaults", "libc_musl_opt_sources", ], cflags: ["-O3"], } // Musl sources that are compiled with -O3 and -fno-stack-protector cc_library_static { name: "libc_musl_opt_nossp", defaults: [ "libc_musl_defaults", "libc_musl_opt_nossp_sources", ], cflags: [ "-O3", "-fno-stack-protector", ], } // Musl sources that are compiled with -fno-stack-protector cc_library_static { name: "libc_musl_nossp", defaults: [ "libc_musl_defaults", "libc_musl_nossp_sources", ], cflags: ["-fno-stack-protector"], } // Musl sources for 32-bit architectures cc_library_static { name: "libc_musl_compat32", defaults: [ "libc_musl_defaults", "libc_musl_compat32_sources", ], } // Musl sources for the dynamic linker. cc_library_static { name: "libc_musl_ldso", defaults: [ "libc_musl_defaults", "libc_musl_ldso_sources", ], cflags: [ "-fno-stack-protector", "-DLIBC_SONAME=libc_musl.so", ], } // Musl sources for the dynamic linker when used in the sysroot. cc_library_static { name: "libc_musl_ldso_sysroot", defaults: [ "libc_musl_defaults", "libc_musl_ldso_sources", ], cflags: [ "-fno-stack-protector", "-DLIBC_SONAME=libc.so", ], } // An attempt to compile the dynamic linker as a standalone library separate from libc_musl.so. // Not used yet. cc_library_shared { name: "musl_linker", defaults: [ "libc_musl_defaults", ], nocrt: true, static_libs: [ "libc_musl_ldso", "libc_musl", ], ldflags: [ "-Wl,-e,_dlstart", "-nostdlib", "-Wl,--exclude-libs=libc_musl.a", ], } // Convert the linker (which is actually libc_musl.so) into a .s file for embedding in crtbegin. cc_genrule { name: "musl_linker_asm", host_supported: true, device_supported: false, tools: ["extract_linker"], cmd: "$(location) -s $(out) $(in)", srcs: [":libc_musl"], out: ["linker.s"], target: { darwin: { enabled: false, }, bionic: { enabled: false, }, glibc: { enabled: false, }, }, } // Convert the linker (which is actually libc_musl.so) into a linker script for embedding in // crtbegin. cc_genrule { name: "musl_linker_script", visibility: ["//visibility:public"], host_supported: true, device_supported: false, tools: ["extract_linker"], cmd: "$(location) -T $(out) $(in)", srcs: [":libc_musl"], out: ["linker.script"], target: { darwin: { enabled: false, }, bionic: { enabled: false, }, glibc: { enabled: false, }, }, } // // The musl CRT objects // cc_defaults { name: "libc_musl_crt_defaults", defaults: ["libc_musl_defaults"], cflags: [ // These are required to make sure the C code in crt/*.c // doesn't have any dependencies on libc. "-fno-stack-protector", "-ftrivial-auto-var-init=uninitialized", ], } cc_object { name: "libc_musl_crt1", defaults: [ "libc_musl_crt_defaults", "libc_musl_crt1_sources", ], } cc_object { name: "libc_musl_crti", defaults: [ "libc_musl_crt_defaults", "libc_musl_crti_sources", ], } cc_object { name: "libc_musl_crtn", defaults: [ "libc_musl_crt_defaults", "libc_musl_crtn_sources", ], } cc_object { name: "libc_musl_rcrt1", defaults: [ "libc_musl_crt_defaults", "libc_musl_rcrt1_sources", ], } cc_object { name: "libc_musl_Scrt1", defaults: [ "libc_musl_crt_defaults", "libc_musl_Scrt1_sources", ], } // // The custom CRT objects for use in the platform build. // Embeds the linker into crtbegin_dynamic. // cc_object { name: "libc_musl_crtbegin_dynamic", defaults: ["libc_musl_defaults"], visibility: ["//visibility:public"], objs: [ "libc_musl_crt1", "libc_musl_crti", "clang_rt.crtbegin", ], srcs: [ ":musl_linker_asm", "android/ldso_trampoline.cpp", ], cflags: [ // These are required to make sure the C code in ldso_trampoline.c // doesn't have any dependencies on libc. "-fno-stack-protector", "-ftrivial-auto-var-init=uninitialized", ], } cc_object { name: "libc_musl_crtbegin_static", defaults: ["libc_musl_defaults"], visibility: ["//visibility:public"], objs: [ "libc_musl_Scrt1", "libc_musl_crti", "clang_rt.crtbegin", ], } cc_object { name: "libc_musl_crtend", defaults: ["libc_musl_defaults"], visibility: ["//visibility:public"], objs: [ "clang_rt.crtend", "libc_musl_crtn", ], } cc_object { name: "libc_musl_crtbegin_so", defaults: ["libc_musl_defaults"], visibility: ["//visibility:public"], objs: [ "libc_musl_crti", "clang_rt.crtbegin", ], } cc_object { name: "libc_musl_crtend_so", defaults: ["libc_musl_defaults"], visibility: ["//visibility:public"], objs: [ "clang_rt.crtend", "libc_musl_crtn", ], } // // Tests for the embedded linker trampoline // cc_test_host { name: "libc_musl_ldso_trampoline_test", srcs: ["android/ldso_trampoline_test.cpp"], stl: "libc++", target: { darwin: { enabled: false, }, }, } // // Generated headers // genrule { name: "libc_musl_version.h", srcs: ["VERSION"], out: ["version.h"], cmd: "printf '#define VERSION \"%s\"\n' \"$$(cat $(location VERSION))\" > $(out)", } // libc_musl_arch_alltypes.h is split out of libc_musl_alltypes.h to ensure the arch-specific // alltypes.h.in ends up before the generic alltypes.h.in in the output. cc_genrule { name: "libc_musl_arch_alltypes.h", host_supported: true, device_supported: false, arch: { arm: { srcs: ["arch/arm/bits/alltypes.h.in"], }, arm64: { srcs: ["arch/aarch64/bits/alltypes.h.in"], }, x86: { srcs: ["arch/i386/bits/alltypes.h.in"], }, x86_64: { srcs: ["arch/x86_64/bits/alltypes.h.in"], }, }, tool_files: ["tools/mkalltypes.sed"], out: ["bits/alltypes.h"], cmd: "sed -f $(location tools/mkalltypes.sed) $(in) > $(out)", } cc_genrule { name: "libc_musl_alltypes.h", host_supported: true, device_supported: false, srcs: [ "include/alltypes.h.in", ":libc_musl_arch_alltypes.h", ], tool_files: ["tools/mkalltypes.sed"], out: ["bits/alltypes.h"], cmd: "( " + "cat $(location :libc_musl_arch_alltypes.h) && " + "sed -f $(location tools/mkalltypes.sed) $(location include/alltypes.h.in) " + ") > $(out)", } cc_genrule { name: "libc_musl_syscall.h", host_supported: true, device_supported: false, arch: { arm: { srcs: ["arch/arm/bits/syscall.h.in"], }, arm64: { srcs: ["arch/aarch64/bits/syscall.h.in"], }, x86: { srcs: ["arch/i386/bits/syscall.h.in"], }, x86_64: { srcs: ["arch/x86_64/bits/syscall.h.in"], }, }, out: ["bits/syscall.h"], cmd: "cp $(in) $(out) && sed -n -e s/__NR_/SYS_/p < $(in) >> $(out)", } // // Rules to generate a sysroot. This isn't used during the build, but can be convenient to run // configure scripts from external projects to generate necessary files to build against musl. // // A copy of libc_musl that uses libc.so as its soname for putting in the sysroot. cc_library_shared { name: "libc_musl_for_sysroot", defaults: ["libc_musl_defaults"], whole_static_libs: ["libc_musl_static"], shared: { whole_static_libs: ["libc_musl_ldso_sysroot"], }, ldflags: [ "-Wl,-e,_dlstart", "-nostdlib", "-Wl,--soname,libc.so", ], dynamic_list: "dynamic.list", } // An empty static library that will be copied to libdl.a, etc. in the sysroot. // Shouldn't be used by anything else besides the sysroot cc_genrule. cc_library_static { name: "libc_musl_sysroot_static_empty", defaults: [ "libc_musl_defaults", ], } // The linker and trampoline compiled as a .o file to use as part of the sysroot // crt. cc_object { name: "libc_musl_linker_object", defaults: ["libc_musl_defaults"], srcs: [ ":musl_linker_asm", "android/ldso_trampoline.cpp", ], cflags: [ // These are required to make sure the C code in ldso_trampoline.c // doesn't have any dependencies on libc. "-fno-stack-protector", "-ftrivial-auto-var-init=uninitialized", ], } // The architecture-specific bits have to be handled separately because the label varies based // on architecture, which prevents using $(locations) to find them and requires using $(in) // instead, which would mix in all the other files if this were part of the main libc_musl_sysroot // genrule. cc_genrule { name: "libc_musl_sysroot_bits", host_supported: true, device_supported: false, arch: { arm: { srcs: ["arch/arm/bits/*.h"], }, arm64: { srcs: ["arch/aarch64/bits/*.h"], }, x86: { srcs: ["arch/i386/bits/*.h"], }, x86_64: { srcs: ["arch/x86_64/bits/*.h"], }, }, out: ["libc_musl_sysroot_bits.zip"], tools: ["soong_zip"], cmd: "includes=($(in)) && $(location soong_zip) -o $(out) -P include/bits -j -D $$(dirname $${includes[0]})", } genrule { name: "libc_musl_clang_wrapper", srcs: ["tools/musl-clang.in"], out: ["musl-clang"], cmd: "sed -e 's`@CC@`clang`' -e 's`@PREFIX@`$$(dirname \"$$0\")/..`' -e 's`@INCDIR@`$${libc}/include`' -e 's`@LIBDIR@`$${libc}/lib`' $(in) > $(out) && " + "chmod a+x $(out)", } genrule { name: "libc_musl_ld_wrapper", srcs: ["tools/ld.musl-clang.in"], out: ["ld.musl-clang"], cmd: "sed -e 's`@CC@`clang`' -e 's`@LIBDIR@`$$(dirname \"$$0\")/../lib`' -e 's`@LDSO@`$$(dirname \"$$0\")/../lib/ld-musl.so.1`' $(in) > $(out) && " + "chmod a+x $(out)", } cc_genrule { name: "libc_musl_sysroot", host_supported: true, device_supported: false, enabled: false, target: { musl: { enabled: true, }, }, srcs: [ "LICENSE", "COPYRIGHT", // Headers "include/**/*.h", "arch/generic/bits/*.h", "android/include/bits/*.h", "android/include/sys/cdefs.h", ":libc_musl_syscall.h", ":libc_musl_alltypes.h", ":libc_musl_sysroot_bits", // Bionic kernel uapi headers ":libc_musl_sysroot_bionic_headers", // libc++ headers ":libc_musl_sysroot_libc++_headers", ":libc_musl_sysroot_libc++abi_headers", // Libraries ":libc_musl", ":libc_musl_for_sysroot", ":libc_musl_static", ":libc++abi", ":libc++", ":libc++_static", // Objects ":libc_musl_crti", ":libc_musl_crtn", ":libc_musl_crt1", ":libc_musl_rcrt1", ":libc_musl_Scrt1", ":clang_rt.crtbegin", ":clang_rt.crtend", // Embedded linker objects and linker scripts ":libc_musl_linker_object", ":musl_linker_script", // Wrapper scripts ":libc_musl_clang_wrapper", ":libc_musl_ld_wrapper", // Empty static libraries ":libc_musl_sysroot_static_empty", ], out: ["libc_musl_sysroot.zip"], tools: [ "soong_zip", "merge_zips", "zip2zip", ], cmd: "includes=($(locations include/**/*.h)) && " + "bits=($(locations arch/generic/bits/*.h)) && " + "android_bits=($(locations android/include/bits/*.h)) && " + "ln -s libc_musl.so $(genDir)/ld-musl.so.1 && " + "echo -e 'GROUP ( Scrt1-real.o libc_musl_linker_object.o )\nINCLUDE linker.script' > $(genDir)/Scrt1.ld && " + "echo -e 'GROUP ( libc_musl.so )' > $(genDir)/libc.so && " + "$(location soong_zip) -o $(genDir)/sysroot.zip " + " -j " + " -f $(location LICENSE) " + " -f $(location COPYRIGHT) " + // headers " -P include " + " -C $$(dirname $${includes[0]}) " + " -D $$(dirname $${includes[0]}) " + " -P include/bits -j " + " -f $(location :libc_musl_syscall.h) " + " -f $(location :libc_musl_alltypes.h) " + " -D $$(dirname $${bits[0]}) " + " -D $$(dirname $${android_bits[0]}) " + " -P include/sys -j " + " -f $(location android/include/sys/cdefs.h) " + // crt objects " -P lib -j " + " -f $(location :libc_musl_crti) " + " -f $(location :libc_musl_crtn) " + " -f $(location :libc_musl_crt1) " + " -f $(location :libc_musl_rcrt1) " + // embedded linker crt objects " -f $(location :musl_linker_script) " + " -f $(location :libc_musl_linker_object) " + // libs " -f $(location :libc_musl) " + " -f $(location :libc++abi) " + " -f $(location :libc++) " + " -f $(genDir)/ld-musl.so.1 " + " -f $(genDir)/libc.so " + // clang wrappers " -P bin -j " + " -f $(location :libc_musl_clang_wrapper) " + " -f $(location :libc_musl_ld_wrapper) " + " && " + // libs in a separate zip so they can be renamed "$(location soong_zip) -o $(genDir)/libs.zip " + " -P lib -j " + " -f $(location :libc_musl_static) " + " -f $(location :libc_musl_sysroot_static_empty) " + " -f $(genDir)/Scrt1.ld " + " -f $(location :libc_musl_Scrt1) " + " -f $(location :libc++_static) " + " -f $(location :clang_rt.crtbegin) " + " -f $(location :clang_rt.crtend) " + " && " + "$(location zip2zip) -i $(genDir)/libs.zip -o $(genDir)/libs_renamed.zip " + // rename libs from module names to desired names in sysroot " lib/libc_musl_static.a:lib/libc.a " + " lib/libc++_static.a:lib/libc++.a " + // Swap in linker script for Scrt1.o " lib/Scrt1.o:lib/Scrt1-real.o " + " lib/Scrt1.ld:lib/Scrt1.o " + // copy empty static libs " lib/libc_musl_sysroot_static_empty.a:lib/libcrypt.a " + " lib/libc_musl_sysroot_static_empty.a:lib/libdl.a " + " lib/libc_musl_sysroot_static_empty.a:lib/libm.a " + " lib/libc_musl_sysroot_static_empty.a:lib/libpthread.a " + " lib/libc_musl_sysroot_static_empty.a:lib/libresolv.a " + " lib/libc_musl_sysroot_static_empty.a:lib/librt.a " + " lib/libc_musl_sysroot_static_empty.a:lib/libutil.a " + " lib/libc_musl_sysroot_static_empty.a:lib/libxnet.a " + // rename clang crt objects to gcc names " lib/clang_rt.crtbegin.o:lib/crtbegin.o " + " lib/clang_rt.crtbegin.o:lib/crtbeginS.o " + " lib/clang_rt.crtbegin.o:lib/crtbeginT.o " + " lib/clang_rt.crtend.o:lib/crtend.o " + " lib/clang_rt.crtend.o:lib/crtendS.o " + " && " + "$(location merge_zips) -ignore-duplicates $(out) " + " $(location :libc_musl_sysroot_bionic_headers) " + " $(location :libc_musl_sysroot_libc++_headers) " + " $(location :libc_musl_sysroot_libc++abi_headers) " + " $(location :libc_musl_sysroot_bits) " + " $(genDir)/sysroot.zip " + " $(genDir)/libs_renamed.zip", } build=["sources.bp"]