OSDN Git Service

Add rules to build musl-libc executables master
authorChih-Wei Huang <cwhuang@linux.org.tw>
Fri, 1 Nov 2019 09:28:31 +0000 (17:28 +0800)
committerChih-Wei Huang <cwhuang@linux.org.tw>
Fri, 1 Nov 2019 09:28:31 +0000 (17:28 +0800)
Android.mk
binary.mk [new file with mode: 0644]
common.mk [new file with mode: 0644]
executable.mk [new file with mode: 0644]
test/Android.mk [new file with mode: 0644]
test/hello.cpp [new file with mode: 0644]
test/main.c [new file with mode: 0644]

index 2a8d9e9..759640c 100644 (file)
@@ -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 $(<D); sh tools/version.sh)\"" > $@
 
-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 (file)
index 0000000..58b5fd2
--- /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 (file)
index 0000000..b93ac85
--- /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 (file)
index 0000000..3c83b6e
--- /dev/null
@@ -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 (file)
index 0000000..8fb235a
--- /dev/null
@@ -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 (file)
index 0000000..26d675d
--- /dev/null
@@ -0,0 +1,12 @@
+#include <stdio.h>
+
+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 (file)
index 0000000..db638ed
--- /dev/null
@@ -0,0 +1,7 @@
+void hello();
+
+main()
+{
+       hello();
+       return 0;
+}