# # Copyright (c) 2022, Google, Inc. All rights reserved # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files # (the "Software"), to deal in the Software without restriction, # including without limitation the rights to use, copy, modify, merge, # publish, distribute, sublicense, and/or sell copies of the Software, # and to permit persons to whom the Software is furnished to do so, # subject to the following conditions: # # The above copyright notice and this permission notice shall be # included in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # LOCAL_DIR := $(GET_LOCAL_DIR) MODULE := $(LOCAL_DIR) MODULE_DEPS := \ lib/io ifndef WITH_CUSTOM_MALLOC MODULE_DEPS += lib/heap endif # Clang currently generates incorrect code when it simplifies calls to libc # and then inlines them. The simplification pass does not set a calling # convention on the new call, leading to problems when inlining. # Avoid this bug by disabling LTO for libc. See: b/161257552 MODULE_DISABLE_LTO := true MUSL_DIR := external/trusty/musl LK_DIR := $(LKROOT) LIBC_TRUSTY_DIR := trusty/user/base/lib/libc-trusty MODULE_INCLUDES += \ $(MUSL_DIR)/src/internal \ $(MUSL_DIR)/src/include \ MODULE_EXPORT_COMPILEFLAGS += \ -isystem $(MUSL_DIR)/arch/$(STANDARD_ARCH_NAME) \ -isystem $(MUSL_DIR)/arch/generic \ -isystem $(MUSL_DIR)/include \ MODULE_EXPORT_INCLUDES += \ $(LK_DIR)/lib/libc/include_common \ # Musl is scrupulous about exposing prototypes and defines based on what # standard is requested. When compiling C++ code, however, Clang defines # _GNU_SOURCE because libcxx's header files depend on prototypes that are only # available with _GNU_SOURCE specified. To avoid skew where prototypes are # defined for C++ but not C, turn everything on always. MODULE_EXPORT_COMPILEFLAGS += -D_ALL_SOURCE # Musl declares global variables with names like "index" that can conflict with # function names when _ALL_SOURCE is turned on. Compile Musl as it expects to be # compiled. MODULE_COMPILEFLAGS += -U_ALL_SOURCE -D_XOPEN_SOURCE=700 # Musl's source is not warning clean. Suppress warnings we know about. MODULE_COMPILEFLAGS += \ -Wno-parentheses \ -Wno-sign-compare \ -Wno-incompatible-pointer-types-discards-qualifiers \ -Wno-string-plus-int \ -Wno-missing-braces \ -Wno-implicit-fallthrough \ -Wno-unused-but-set-variable \ # Musl is generally not strict about its function prototypes. # This could be fixed, except for "main". The prototype for main is deliberately # ill-defined. MODULE_CFLAGS += -Wno-strict-prototypes # Musl will do something like this: # weak_alias(a, b); weak_alias(b, c); # But it appears the second statement will get eagerly evaluated to: # weak_alias(a, c); # and overriding b will not affect c. This is likely not intended behavior, but # it does not matter for us so ignore it. MODULE_COMPILEFLAGS += \ -Wno-ignored-attributes \ # The are compares that make sense in 64-bit but do not make sense in 32-bit. MODULE_COMPILEFLAGS += \ -Wno-tautological-constant-compare # NOTE eabi_unwind_stubs.c because libgcc pulls in unwinding stuff. MODULE_SRCS := \ $(LOCAL_DIR)/abort.c \ $(LOCAL_DIR)/close.c \ $(LOCAL_DIR)/fflush.c \ $(LOCAL_DIR)/libc_state.c \ $(LOCAL_DIR)/writev.c \ $(LK_DIR)/lib/libc/atoi.c \ $(LK_DIR)/lib/libc/eabi.c \ $(LK_DIR)/lib/libc/eabi_unwind_stubs.c \ $(LK_DIR)/lib/libc/io_handle.c \ $(LK_DIR)/lib/libc/printf.c \ $(LK_DIR)/lib/libc/stdio.c \ $(LK_DIR)/lib/libc/strtol.c \ $(LK_DIR)/lib/libc/strtoll.c \ # These sources are only necessary to support C++ MODULE_SRCS += \ $(LIBC_TRUSTY_DIR)/locale_stubs.c \ $(LK_DIR)/lib/libc/atexit.c \ $(LK_DIR)/lib/libc/pure_virtual.cpp MODULE_DEPS += \ $(LK_DIR)/lib/libc/rand # These stubs are only needed because binder uses libutils which uses pthreads mutex directly MODULE_SRCS += \ $(LIBC_TRUSTY_DIR)/pthreads.c # Musl MODULE_SRCS += \ $(MUSL_DIR)/src/ctype/isalnum.c \ $(MUSL_DIR)/src/ctype/isalpha.c \ $(MUSL_DIR)/src/ctype/isascii.c \ $(MUSL_DIR)/src/ctype/isblank.c \ $(MUSL_DIR)/src/ctype/iscntrl.c \ $(MUSL_DIR)/src/ctype/isdigit.c \ $(MUSL_DIR)/src/ctype/isgraph.c \ $(MUSL_DIR)/src/ctype/islower.c \ $(MUSL_DIR)/src/ctype/isprint.c \ $(MUSL_DIR)/src/ctype/ispunct.c \ $(MUSL_DIR)/src/ctype/isspace.c \ $(MUSL_DIR)/src/ctype/isupper.c \ $(MUSL_DIR)/src/ctype/isxdigit.c \ $(MUSL_DIR)/src/ctype/toascii.c \ $(MUSL_DIR)/src/ctype/tolower.c \ $(MUSL_DIR)/src/ctype/toupper.c \ $(MUSL_DIR)/src/locale/c_locale.c \ $(MUSL_DIR)/src/stdlib/abs.c \ $(MUSL_DIR)/src/stdlib/bsearch.c \ $(MUSL_DIR)/src/stdlib/div.c \ $(MUSL_DIR)/src/stdlib/imaxabs.c \ $(MUSL_DIR)/src/stdlib/imaxdiv.c \ $(MUSL_DIR)/src/stdlib/labs.c \ $(MUSL_DIR)/src/stdlib/ldiv.c \ $(MUSL_DIR)/src/stdlib/llabs.c \ $(MUSL_DIR)/src/stdlib/lldiv.c \ $(MUSL_DIR)/src/stdlib/qsort.c \ $(MUSL_DIR)/src/string/explicit_bzero.c \ $(MUSL_DIR)/src/string/bcmp.c \ $(MUSL_DIR)/src/string/memccpy.c \ $(MUSL_DIR)/src/string/memmem.c \ $(MUSL_DIR)/src/string/mempcpy.c \ $(MUSL_DIR)/src/string/memrchr.c \ $(MUSL_DIR)/src/string/stpcpy.c \ $(MUSL_DIR)/src/string/stpncpy.c \ $(MUSL_DIR)/src/string/strcasecmp.c \ $(MUSL_DIR)/src/string/strcasestr.c \ $(MUSL_DIR)/src/string/strchrnul.c \ $(MUSL_DIR)/src/string/strcspn.c \ $(MUSL_DIR)/src/string/strerror_r.c \ $(MUSL_DIR)/src/string/strncasecmp.c \ $(MUSL_DIR)/src/string/strndup.c \ $(MUSL_DIR)/src/string/strsep.c \ $(MUSL_DIR)/src/string/strtok_r.c \ $(MUSL_DIR)/src/string/strverscmp.c \ $(MUSL_DIR)/src/string/swab.c \ # We use the lk implementation of stdio but export # the musl stdio.h headers, which expose different # definitions of stdin/out/err. The files below contain # the musl definitions of those FILE structures, along # with their dependencies. MODULE_SRCS += \ $(MUSL_DIR)/src/stdio/stderr.c \ $(MUSL_DIR)/src/stdio/stdin.c \ $(MUSL_DIR)/src/stdio/stdout.c \ $(MUSL_DIR)/src/stdio/__stdio_close.c \ $(MUSL_DIR)/src/stdio/__stdio_read.c \ $(MUSL_DIR)/src/stdio/__stdio_write.c \ $(MUSL_DIR)/src/stdio/__stdio_seek.c \ # These sources are only necessary to support C++ MODULE_SRCS += \ $(MUSL_DIR)/src/ctype/__ctype_get_mb_cur_max.c \ $(MUSL_DIR)/src/multibyte/internal.c \ $(MUSL_DIR)/src/multibyte/mbtowc.c \ $(MUSL_DIR)/src/multibyte/wcrtomb.c \ include $(LK_DIR)/lib/libc/string/rules.mk include make/library.mk