From 422c2ce76ddb8003d12864aae0a70aa095acd8cb Mon Sep 17 00:00:00 2001 From: Chih-Wei Huang Date: Fri, 1 Nov 2019 17:28:31 +0800 Subject: [PATCH] Add rules to build musl-libc executables --- Android.mk | 76 +++++++++++++++++++++++++++++++++++++++++++-------------- binary.mk | 32 ++++++++++++++++++++++++ common.mk | 14 +++++++++++ executable.mk | 14 +++++++++++ test/Android.mk | 10 ++++++++ test/hello.cpp | 12 +++++++++ test/main.c | 7 ++++++ 7 files changed, 147 insertions(+), 18 deletions(-) create mode 100644 binary.mk create mode 100644 common.mk create mode 100644 executable.mk create mode 100644 test/Android.mk create mode 100644 test/hello.cpp create mode 100644 test/main.c diff --git a/Android.mk b/Android.mk index 2a8d9e90..759640cc 100644 --- a/Android.mk +++ b/Android.mk @@ -10,24 +10,28 @@ LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := libc-musl -LOCAL_MULTILIB := first -LOCAL_VENDOR_MODULE := true -LOCAL_MODULE_CLASS := SHARED_LIBRARIES +LOCAL_CC := $(TARGET_CC) + +include $(LOCAL_PATH)/common.mk MUSL_ARCH := $(TARGET_ARCH) -MUSL_SRC_DIRS := $(addprefix $(LOCAL_PATH)/,src/* ldso) +MUSL_SRC_DIRS := $(addprefix $(LOCAL_PATH)/,src/* crt ldso) MUSL_BASE_SRCS := $(sort $(wildcard $(addsuffix /*.c,$(MUSL_SRC_DIRS)))) MUSL_ARCH_SRCS := $(sort $(wildcard $(addsuffix /$(MUSL_ARCH)/*.[csS],$(MUSL_SRC_DIRS)))) -MUSL_REPLACED_SRCS = $(addsuffix .c,$(subst $(MUSL_ARCH)/,,$(basename $(MUSL_ARCH_SRCS)))) +MUSL_REPLACED_SRCS := $(addsuffix .c,$(subst $(MUSL_ARCH)/,,$(basename $(MUSL_ARCH_SRCS)))) +MUSL_LDSO_PATHNAME := $(TARGET_OUT_VENDOR_SHARED_LIBRARIES)/$(LOCAL_MODULE).so +MUSL_EMPTY_LIB_NAMES := m rt pthread crypt util xnet resolv dl -LOCAL_SRC_FILES := $(subst $(LOCAL_PATH)/,,$(filter-out $(MUSL_REPLACED_SRCS),$(MUSL_BASE_SRCS)) $(MUSL_ARCH_SRCS)) +MUSL_SRC_FILES := $(subst $(LOCAL_PATH)/,,$(filter-out $(MUSL_REPLACED_SRCS),$(MUSL_BASE_SRCS)) $(MUSL_ARCH_SRCS)) +MUSL_CRT_SRCS := $(filter crt/%,$(MUSL_SRC_FILES)) +LOCAL_SRC_FILES := $(filter-out $(MUSL_CRT_SRCS),$(MUSL_SRC_FILES)) LOCAL_C_INCLUDES := $(addprefix $(LOCAL_PATH)/, \ arch/$(MUSL_ARCH) \ arch/generic \ src/include \ src/internal \ - include) \ + include) LOCAL_CFLAGS := -std=c99 -nostdinc \ -ffreestanding -fexcess-precision=standard -frounding-math \ @@ -35,10 +39,13 @@ LOCAL_CFLAGS := -std=c99 -nostdinc \ -fno-unwind-tables -fno-asynchronous-unwind-tables \ -ffunction-sections -fdata-sections \ -Werror=implicit-function-declaration -Werror=implicit-int \ - -Werror=pointer-sign -Werror=pointer-arith \ - -Os -pipe \ + -Werror=pointer-sign -Werror=pointer-arith -fno-stack-protector \ + -Os -pipe -intermediates := $(call local-generated-sources-dir) +intermediates := $(call local-intermediates-dir) +MUSL_LIBC_SYS := $(intermediates) + +LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_C_INCLUDES) LOCAL_GENERATED_SOURCES := \ $(intermediates)/bits/alltypes.h \ @@ -55,13 +62,15 @@ $(intermediates)/bits/syscall.h: $(LOCAL_PATH)/arch/$(MUSL_ARCH)/bits/syscall.h. $(intermediates)/version.h: $(wildcard $(LOCAL_PATH)/VERSION $(LOCAL_PATH)/.git) echo "#define VERSION \"$$(cd $( $@ -LOCAL_CXX_STL := none -LOCAL_SANITIZE := never -LOCAL_SYSTEM_SHARED_LIBRARIES := -LOCAL_NO_CRT := true -LOCAL_NO_DEFAULT_COMPILER_FLAGS := true -LOCAL_NO_LIBCOMPILER_RT := true -LOCAL_NO_STANDARD_LIBRARIES := true +MUSL_CRT_OBJS := $(addsuffix .o,$(basename $(MUSL_CRT_SRCS:%=$(intermediates)/%))) +$(MUSL_CRT_OBJS): PRIVATE_CFLAGS := $(LOCAL_CFLAGS) $(addprefix -I,$(intermediates) $(LOCAL_C_INCLUDES)) -DCRT +$(filter $(intermediates)/crt/$(MUSL_ARCH)/%.o,$(MUSL_CRT_OBJS)): $(intermediates)/%.o: $(LOCAL_PATH)/%.s + $(TARGET_CC) $(PRIVATE_CFLAGS) -o $@ -c $< && ln -sf crt/$(MUSL_ARCH)/$(@F) $(@D)/../.. +$(filter-out $(intermediates)/crt/$(MUSL_ARCH)/%.o,$(MUSL_CRT_OBJS)): $(intermediates)/%.o: $(LOCAL_PATH)/%.c + $(TARGET_CC) $(PRIVATE_CFLAGS) $(if $(filter %/crt1.c,$<),,-fPIC) -o $@ -c $< && ln -sf crt/$(@F) $(@D)/.. + +LOCAL_ADDITIONAL_DEPENDENCIES := $(MUSL_CRT_OBJS) + LOCAL_LDFLAGS := \ -Wl,--sort-common \ -Wl,--gc-sections \ @@ -69,6 +78,37 @@ LOCAL_LDFLAGS := \ -Wl,--no-undefined \ -Wl,--exclude-libs=ALL \ -Wl,--dynamic-list=$(LOCAL_PATH)/dynamic.list \ - -Wl,-e,_dlstart -v + -Wl,-e,_dlstart + +LOCAL_POST_INSTALL_CMD := ln -sf $(LOCAL_MODULE).so $(MUSL_LIBC_SYS)/libc.so include $(BUILD_SHARED_LIBRARY) + +include $(CLEAR_VARS) + +LOCAL_MODULE := musl-gcc +LOCAL_MODULE_CLASS := EXECUTABLES +LOCAL_IS_HOST_MODULE := true + +intermediates := $(call local-generated-sources-dir) +MUSL_GCC_SPECS := $(intermediates)/$(LOCAL_MODULE).specs +LOCAL_PREBUILT_MODULE_FILE := $(basename $(MUSL_GCC_SPECS)) +LOCAL_GENERATED_SOURCES := $(LOCAL_PREBUILT_MODULE_FILE) + +$(MUSL_GCC_SPECS): $(LOCAL_PATH)/tools/musl-gcc.specs.sh + sh $< "$(MUSL_LIBC_SYS)" "$(MUSL_LIBC_SYS)" "$(subst $(PRODUCT_OUT),,$(MUSL_LDSO_PATHNAME))" > $@ + +$(LOCAL_PREBUILT_MODULE_FILE): $(MUSL_GCC_SPECS) + echo -e "#!/bin/sh\ncd \$$(dirname \$$0)/../../../..\nexec $(TARGET_CC) \$$(cat $(MUSL_LIBC_SYS)/export_includes) -specs $(MUSL_GCC_SPECS) \"\$$@\"\n" > $@ + +MUSL_EMPTY_LIBS := $(MUSL_EMPTY_LIB_NAMES:%=$(MUSL_LIBC_SYS)/lib%.a) +$(MUSL_EMPTY_LIBS): + $(hide) rm -f $@; $(LLVM_PREBUILTS_PATH)/llvm-ar rc $@ + +LOCAL_ADDITIONAL_DEPENDENCIES := $(MUSL_EMPTY_LIBS) + +include $(BUILD_PREBUILT) + +MUSL_GCC := $(LOCAL_INSTALLED_MODULE) + +include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/binary.mk b/binary.mk new file mode 100644 index 00000000..58b5fd21 --- /dev/null +++ b/binary.mk @@ -0,0 +1,32 @@ +# +# Copyright (C) 2019 The Android-x86 Open Source Project +# +# Licensed under the standard MIT license. +# See the COPYRIGHT in the same directory. +# + +LOCAL_CC := $(MUSL_GCC) +LOCAL_SHARED_LIBRARIES += libc-musl +LOCAL_VENDOR_MODULE := true + +intermediates := $(call local-intermediates-dir) + +LOCAL_PREBUILT_MODULE_FILE := $(intermediates)/$(LOCAL_MODULE)-musl +LOCAL_GENERATED_SOURCES := $(LOCAL_PREBUILT_MODULE_FILE) + +c_normal_sources := $(filter-out ../%,$(filter %.c,$(LOCAL_SRC_FILES))) +c_normal_objects := $(addprefix $(intermediates)/,$(c_normal_sources:.c=.o)) +$(c_normal_objects): PRIVATE_CC := $(MUSL_GCC) +$(c_normal_objects): PRIVATE_CFLAGS := $(LOCAL_CFLAGS) +$(c_normal_objects): $(intermediates)/%.o: $(LOCAL_PATH)/%.c | $(MUSL_GCC) + $(transform-c-to-o) + +LOCAL_CPP_EXTENSION := $(if $(LOCAL_CPP_EXTENSION),$(LOCAL_CPP_EXTENSION),.cpp) +cpp_normal_sources := $(filter-out ../%,$(filter %$(LOCAL_CPP_EXTENSION),$(LOCAL_SRC_FILES))) +cpp_normal_objects := $(addprefix $(intermediates)/,$(cpp_normal_sources:$(LOCAL_CPP_EXTENSION)=.o)) +$(cpp_normal_objects): PRIVATE_CXX := $(MUSL_GCC) +$(cpp_normal_objects): PRIVATE_CPPFLAGS := $(LOCAL_CPPFLAGS) +$(cpp_normal_objects): $(intermediates)/%.o: $(LOCAL_PATH)/%$(LOCAL_CPP_EXTENSION) | $(MUSL_GCC) + $(transform-cpp-to-o) + +all_objects := $(c_normal_objects) $(cpp_normal_objects) diff --git a/common.mk b/common.mk new file mode 100644 index 00000000..b93ac854 --- /dev/null +++ b/common.mk @@ -0,0 +1,14 @@ +LOCAL_CXX ?= $(HOST_OUT_EXECUTABLES)/musl-g++ +LOCAL_CLANG := none +LOCAL_MULTILIB := first +LOCAL_VENDOR_MODULE := true +LOCAL_CXX_STL := none +LOCAL_SANITIZE := never +LOCAL_SYSTEM_SHARED_LIBRARIES := +LOCAL_NO_CRT := true +LOCAL_NO_DEFAULT_COMPILER_FLAGS := true +LOCAL_NO_LIBCOMPILER_RT := true +LOCAL_NO_STANDARD_LIBRARIES := true +LOCAL_LDFLAGS += -v + +$(if $(LOCAL_MODULE_CLASS),,$(eval LOCAL_MODULE_CLASS := SHARED_LIBRARIES)) diff --git a/executable.mk b/executable.mk new file mode 100644 index 00000000..3c83b6ed --- /dev/null +++ b/executable.mk @@ -0,0 +1,14 @@ +# +# Copyright (C) 2019 The Android-x86 Open Source Project +# +# Licensed under the standard MIT license. +# See the COPYRIGHT in the same directory. +# + +LOCAL_MODULE_CLASS := EXECUTABLES +include $(call my-dir)/binary.mk + +$(LOCAL_PREBUILT_MODULE_FILE): $(all_objects) + $(hide) $(MUSL_GCC) $^ -o $@ -Wl,-rpath=$(subst $(PRODUCT_OUT),,$(TARGET_OUT_VENDOR_SHARED_LIBRARIES)) + +include $(BUILD_PREBUILT) diff --git a/test/Android.mk b/test/Android.mk new file mode 100644 index 00000000..8fb235a3 --- /dev/null +++ b/test/Android.mk @@ -0,0 +1,10 @@ +LOCAL_PATH := $(call my-dir) + +include $(CLEAR_VARS) + +LOCAL_MODULE := hello + +LOCAL_SRC_FILES := hello.cpp main.c + +#include $(BUILD_MUSL_EXECUTABLE) +include $(LOCAL_PATH)/../executable.mk diff --git a/test/hello.cpp b/test/hello.cpp new file mode 100644 index 00000000..26d675d7 --- /dev/null +++ b/test/hello.cpp @@ -0,0 +1,12 @@ +#include + +class Hello { +public: + Hello(const char *s) { printf(s); } +}; + +extern "C" void hello() +{ + Hello("Hello C world!\n"); + Hello("Hello C++ world!!\n"); +} diff --git a/test/main.c b/test/main.c new file mode 100644 index 00000000..db638edb --- /dev/null +++ b/test/main.c @@ -0,0 +1,7 @@ +void hello(); + +main() +{ + hello(); + return 0; +} -- 2.11.0