OSDN Git Service

Add rules to build musl-libc executables
[android-x86/external-musl-libc.git] / Android.mk
1 #
2 # Copyright (C) 2019 The Android-x86 Open Source Project
3 #
4 # Licensed under the standard MIT license.
5 # See the COPYRIGHT in the same directory.
6 #
7
8 LOCAL_PATH := $(call my-dir)
9
10 include $(CLEAR_VARS)
11
12 LOCAL_MODULE := libc-musl
13 LOCAL_CC := $(TARGET_CC)
14
15 include $(LOCAL_PATH)/common.mk
16
17 MUSL_ARCH := $(TARGET_ARCH)
18 MUSL_SRC_DIRS := $(addprefix $(LOCAL_PATH)/,src/* crt ldso)
19 MUSL_BASE_SRCS := $(sort $(wildcard $(addsuffix /*.c,$(MUSL_SRC_DIRS))))
20 MUSL_ARCH_SRCS := $(sort $(wildcard $(addsuffix /$(MUSL_ARCH)/*.[csS],$(MUSL_SRC_DIRS))))
21 MUSL_REPLACED_SRCS := $(addsuffix .c,$(subst $(MUSL_ARCH)/,,$(basename $(MUSL_ARCH_SRCS))))
22 MUSL_LDSO_PATHNAME := $(TARGET_OUT_VENDOR_SHARED_LIBRARIES)/$(LOCAL_MODULE).so
23 MUSL_EMPTY_LIB_NAMES := m rt pthread crypt util xnet resolv dl
24
25 MUSL_SRC_FILES := $(subst $(LOCAL_PATH)/,,$(filter-out $(MUSL_REPLACED_SRCS),$(MUSL_BASE_SRCS)) $(MUSL_ARCH_SRCS))
26 MUSL_CRT_SRCS := $(filter crt/%,$(MUSL_SRC_FILES))
27 LOCAL_SRC_FILES := $(filter-out $(MUSL_CRT_SRCS),$(MUSL_SRC_FILES))
28
29 LOCAL_C_INCLUDES := $(addprefix $(LOCAL_PATH)/, \
30         arch/$(MUSL_ARCH) \
31         arch/generic \
32         src/include \
33         src/internal \
34         include)
35
36 LOCAL_CFLAGS := -std=c99 -nostdinc \
37         -ffreestanding -fexcess-precision=standard -frounding-math \
38         -Wa,--noexecstack -D_XOPEN_SOURCE=700 -fomit-frame-pointer \
39         -fno-unwind-tables -fno-asynchronous-unwind-tables \
40         -ffunction-sections -fdata-sections \
41         -Werror=implicit-function-declaration -Werror=implicit-int \
42         -Werror=pointer-sign -Werror=pointer-arith -fno-stack-protector \
43         -Os -pipe
44
45 intermediates := $(call local-intermediates-dir)
46 MUSL_LIBC_SYS := $(intermediates)
47
48 LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_C_INCLUDES)
49
50 LOCAL_GENERATED_SOURCES := \
51         $(intermediates)/bits/alltypes.h \
52         $(intermediates)/bits/syscall.h \
53         $(intermediates)/version.h
54
55 $(intermediates)/bits/alltypes.h: $(LOCAL_PATH)/tools/mkalltypes.sed $(LOCAL_PATH)/arch/$(MUSL_ARCH)/bits/alltypes.h.in $(LOCAL_PATH)/include/alltypes.h.in
56         sed -f $^ > $@
57
58 $(intermediates)/bits/syscall.h: $(LOCAL_PATH)/arch/$(MUSL_ARCH)/bits/syscall.h.in | $(ACP)
59         $(ACP) $< $@
60         sed -n -e s/__NR_/SYS_/p < $< >> $@
61
62 $(intermediates)/version.h: $(wildcard $(LOCAL_PATH)/VERSION $(LOCAL_PATH)/.git)
63         echo "#define VERSION \"$$(cd $(<D); sh tools/version.sh)\"" > $@
64
65 MUSL_CRT_OBJS := $(addsuffix .o,$(basename $(MUSL_CRT_SRCS:%=$(intermediates)/%)))
66 $(MUSL_CRT_OBJS): PRIVATE_CFLAGS := $(LOCAL_CFLAGS) $(addprefix -I,$(intermediates) $(LOCAL_C_INCLUDES)) -DCRT
67 $(filter $(intermediates)/crt/$(MUSL_ARCH)/%.o,$(MUSL_CRT_OBJS)): $(intermediates)/%.o: $(LOCAL_PATH)/%.s
68         $(TARGET_CC) $(PRIVATE_CFLAGS) -o $@ -c $< && ln -sf crt/$(MUSL_ARCH)/$(@F) $(@D)/../..
69 $(filter-out $(intermediates)/crt/$(MUSL_ARCH)/%.o,$(MUSL_CRT_OBJS)): $(intermediates)/%.o: $(LOCAL_PATH)/%.c
70         $(TARGET_CC) $(PRIVATE_CFLAGS) $(if $(filter %/crt1.c,$<),,-fPIC) -o $@ -c $< && ln -sf crt/$(@F) $(@D)/..
71
72 LOCAL_ADDITIONAL_DEPENDENCIES := $(MUSL_CRT_OBJS)
73
74 LOCAL_LDFLAGS := \
75         -Wl,--sort-common \
76         -Wl,--gc-sections \
77         -Wl,--hash-style=both \
78         -Wl,--no-undefined \
79         -Wl,--exclude-libs=ALL \
80         -Wl,--dynamic-list=$(LOCAL_PATH)/dynamic.list \
81         -Wl,-e,_dlstart
82
83 LOCAL_POST_INSTALL_CMD := ln -sf $(LOCAL_MODULE).so $(MUSL_LIBC_SYS)/libc.so
84
85 include $(BUILD_SHARED_LIBRARY)
86
87 include $(CLEAR_VARS)
88
89 LOCAL_MODULE := musl-gcc
90 LOCAL_MODULE_CLASS := EXECUTABLES
91 LOCAL_IS_HOST_MODULE := true
92
93 intermediates := $(call local-generated-sources-dir)
94 MUSL_GCC_SPECS := $(intermediates)/$(LOCAL_MODULE).specs
95 LOCAL_PREBUILT_MODULE_FILE := $(basename $(MUSL_GCC_SPECS))
96 LOCAL_GENERATED_SOURCES := $(LOCAL_PREBUILT_MODULE_FILE)
97
98 $(MUSL_GCC_SPECS): $(LOCAL_PATH)/tools/musl-gcc.specs.sh
99         sh $< "$(MUSL_LIBC_SYS)" "$(MUSL_LIBC_SYS)" "$(subst $(PRODUCT_OUT),,$(MUSL_LDSO_PATHNAME))" > $@
100
101 $(LOCAL_PREBUILT_MODULE_FILE): $(MUSL_GCC_SPECS)
102         echo -e "#!/bin/sh\ncd \$$(dirname \$$0)/../../../..\nexec $(TARGET_CC) \$$(cat $(MUSL_LIBC_SYS)/export_includes) -specs $(MUSL_GCC_SPECS) \"\$$@\"\n" > $@
103
104 MUSL_EMPTY_LIBS := $(MUSL_EMPTY_LIB_NAMES:%=$(MUSL_LIBC_SYS)/lib%.a)
105 $(MUSL_EMPTY_LIBS):
106         $(hide) rm -f $@; $(LLVM_PREBUILTS_PATH)/llvm-ar rc $@
107
108 LOCAL_ADDITIONAL_DEPENDENCIES := $(MUSL_EMPTY_LIBS)
109
110 include $(BUILD_PREBUILT)
111
112 MUSL_GCC := $(LOCAL_INSTALLED_MODULE)
113
114 include $(call all-makefiles-under,$(LOCAL_PATH))