blob: 3338510fa8c5f76122f90882ed1b4c26919a20f3 [file] [log] [blame]
// 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",
],
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,
},
},
}
//
// The main musl libc library
//
cc_library {
name: "libc_musl",
visibility: ["//visibility:public"],
defaults: [
"libc_musl_defaults",
"libc_musl_sources",
],
whole_static_libs: [
"libc_musl_opt",
"libc_musl_opt_nossp",
"libc_musl_nossp",
],
shared: {
whole_static_libs: ["libc_musl_ldso"],
},
multilib: {
lib32: {
whole_static_libs: ["libc_musl_compat32"],
},
},
ldflags: [
"-Wl,-e,_dlstart",
"-nostdlib",
],
dynamic_list: "dynamic.list",
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"],
}
// 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,
},
},
}
// 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,
},
},
}
//
// The musl CRT objects
//
cc_object {
name: "libc_musl_crt1",
defaults: [
"libc_musl_defaults",
"libc_musl_crt1_sources",
],
}
cc_object {
name: "libc_musl_crti",
defaults: [
"libc_musl_defaults",
"libc_musl_crti_sources",
],
}
cc_object {
name: "libc_musl_crtn",
defaults: [
"libc_musl_defaults",
"libc_musl_crtn_sources",
],
}
cc_object {
name: "libc_musl_rcrt1",
defaults: [
"libc_musl_defaults",
"libc_musl_rcrt1_sources",
],
}
cc_object {
name: "libc_musl_Scrt1",
defaults: [
"libc_musl_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)",
}
build=["sources.bp"]