1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
| |
OUTPUT = $(CURDIR)/output
LLVM_SRCDIR = LLVM_SRCDIR_not_set
MUSL_SRCDIR = MUSL_SRCDIR_not_set
TARGETS = \
aarch64-linux-musleabi \
armv7-linux-musleabi \
armv7-linux-musleabihf \
armv7m-linux-musleabi \
armv7m-linux-musleabihf \
x86_64-linux-musl \
# end
DEFAULT_TARGET = x86_64-linux-musl
TOOLS = \
llvm-ar \
llvm-nm \
llvm-objcopy \
llvm-objdump \
llvm-ranlib \
llvm-size \
llvm-strip \
# end
-include config.mak
# TODO: determine LLVM_TARGETS_TO_BUILD from TARGETS?
FULL_LLVM_CONFIG = $(LLVM_CONFIG) \
-DCLANG_DEFAULT_CXX_STDLIB=libc++ \
-DCLANG_DEFAULT_LINKER=lld \
-DCLANG_DEFAULT_OBJCOPY=llvm-objcopy \
-DCLANG_DEFAULT_RTLIB=compiler-rt \
-DCMAKE_BUILD_TYPE=MinSizeRel \
-DCMAKE_INSTALL_PREFIX=/clang \
-DDEFAULT_SYSROOT=../../TARGET \
-DLLVM_BUILTIN_TARGETS='$(subst $(subst ,, ),;,$(TARGETS))' \
-DLLVM_DEFAULT_TARGET_TRIPLE=$(DEFAULT_TARGET) \
-DLLVM_DISTRIBUTION_COMPONENTS='clang;lld;LTO;$(subst $(subst ,, ),;,$(TOOLS))' \
-DLLVM_ENABLE_PROJECTS='clang;lld' \
-DLLVM_ENABLE_RUNTIMES='compiler-rt;libcxx;libcxxabi;libunwind' \
-DLLVM_INSTALL_TOOLCHAIN_ONLY=ON \
-DLLVM_RUNTIME_TARGETS='$(subst $(subst ,, ),;,$(TARGETS))' \
-DLLVM_TARGETS_TO_BUILD='AArch64;ARM;Mips;PowerPC;X86' \
$(foreach t,$(TARGETS),-DBUILTINS_$(t)_CMAKE_SYSROOT=$(CURDIR)/obj_sysroot/$(t)) \
$(foreach t,$(TARGETS),-DRUNTIMES_$(t)_CMAKE_CXX_FLAGS='-L$(CURDIR)/obj_musl/$(t)/lib -B$(CURDIR)/obj_musl/$(t)/lib -Qunused-arguments') \
$(foreach t,$(TARGETS),-DRUNTIMES_$(t)_CMAKE_C_FLAGS='-L$(CURDIR)/obj_musl/$(t)/lib -B$(CURDIR)/obj_musl/$(t)/lib -Qunused-arguments') \
$(foreach t,$(TARGETS),-DRUNTIMES_$(t)_CMAKE_SYSROOT=$(CURDIR)/obj_sysroot/$(t)) \
$(foreach t,$(TARGETS),-DRUNTIMES_$(t)_COMPILER_RT_BUILD_LIBFUZZER=OFF) \
$(foreach t,$(TARGETS),-DRUNTIMES_$(t)_COMPILER_RT_BUILD_SANITIZERS=OFF) \
$(foreach t,$(TARGETS),-DRUNTIMES_$(t)_COMPILER_RT_BUILD_XRAY=OFF) \
$(foreach t,$(TARGETS),-DRUNTIMES_$(t)_LIBCXXABI_USE_COMPILER_RT=ON) \
$(foreach t,$(TARGETS),-DRUNTIMES_$(t)_LIBCXXABI_USE_LLVM_UNWINDER=ON) \
$(foreach t,$(TARGETS),-DRUNTIMES_$(t)_LIBCXX_HAS_MUSL_LIBC=ON) \
$(foreach t,$(TARGETS),-DRUNTIMES_$(t)_LIBCXX_USE_COMPILER_RT=ON) \
$(foreach t,$(TARGETS),-DRUNTIMES_$(t)_LIBUNWIND_USE_COMPILER_RT=ON) \
# end
all: llvm musl
install: install-llvm install-musl install-kernel-headers install-configs install-symlinks
llvm: | obj_llvm/.lc_built_3
musl: | $(foreach t,$(TARGETS),obj_musl/$(t)/.lc_built)
install-musl: $(foreach t,$(TARGETS),install-musl_$(t))
install-kernel-headers: $(foreach t,$(TARGETS),install-kernel-headers_$(t))
install-configs: $(foreach t,$(TARGETS),install-configs_$(t))
install-symlinks: $(foreach t,$(TARGETS),install-symlinks_$(t))
.PHONY: all llvm musl install-llvm install-musl install-kernel-headers install-configs install-symlinks clean
src_llvm: | $(LLVM_SRCDIR)
ln -sf $(LLVM_SRCDIR) $@
src_musl: | $(MUSL_SRCDIR)
ln -sf $(MUSL_SRCDIR) $@
src_kernel_headers: | $(LINUX_SRCDIR)
ln -sf "$(LINUX_SRCDIR)" $@
%/:
mkdir -p $@
obj_llvm/.lc_configured: | obj_llvm/ src_llvm
cd obj_llvm && cmake -G "Unix Makefiles" $(FULL_LLVM_CONFIG) ../src_llvm/llvm
touch $@
obj_llvm/.lc_built_1: | obj_llvm/.lc_configured
cd obj_llvm && $(MAKE) distribution
touch $@
obj_musl/%/.lc_configured: | obj_musl/%/ src_musl obj_llvm/.lc_built_1
cd obj_musl/$* && ../../src_musl/configure \
--prefix= \
--target=$* \
--disable-wrapper \
LIBCC=../../obj_llvm/lib/clang/$(LLVM_VER)/lib/$*/libclang_rt.builtins.a \
CC="../../obj_llvm/bin/clang --target=$*" \
$(MUSL_CONFIG)
touch $@
obj_sysroot/%/.lc_headers: | obj_sysroot/ obj_musl/%/.lc_configured
cd obj_musl/$* && $(MAKE) DESTDIR=$(CURDIR)/obj_sysroot/$* install-headers
touch $@
obj_llvm/.lc_built_2: | $(foreach t,$(TARGETS),obj_sysroot/$(t)/.lc_headers)
cd obj_llvm && $(MAKE) builtins
touch $@
obj_musl/%/.lc_built: | obj_musl/%/.lc_configured obj_llvm/.lc_built_2
cd obj_musl/$* && $(MAKE) AR=../../obj_llvm/bin/llvm-ar \
RANLIB=../../obj_llvm/bin/llvm-ranlib
touch $@
obj_sysroot/%/.lc_crt_workaround:
# Some configure tests for llvm runtimes fail without crtbegin and
# crtend files in the sysroot. The runtimes build generates these files
# leading to a chicken-egg problem.
mkdir -p obj_sysroot/$*/lib
cd obj_sysroot/$*/lib && touch crtbeginT.o crtbeginS.o crtbegin.o crtend.o crtendS.o
touch $@
obj_kernel_headers/%/.lc_built: | src_kernel_headers
mkdir -p $(CURDIR)/obj_kernel_headers/$*/staged
cd src_kernel_headers && $(MAKE) ARCH=$(call fn_linux_arch,$*) O=$(CURDIR)/obj_kernel_headers/$* INSTALL_HDR_PATH=$(CURDIR)/obj_kernel_headers/$*/staged headers_install
find obj_kernel_headers/$*/staged/include '(' -name .install -o -name ..install.cmd ')' -exec rm {} +
touch $@
obj_sysroot/%/.lc_linux_headers: | obj_kernel_headers/%/.lc_built
mkdir -p obj_sysroot/$*/include
cp -R obj_kernel_headers/$*/staged/include/* obj_sysroot/$*/include
obj_llvm/.lc_built_3: | $(foreach t,$(TARGETS),obj_musl/$(t)/.lc_built \
obj_sysroot/$(t)/.lc_crt_workaround \
obj_sysroot/$(t)/.lc_linux_headers)
cd obj_llvm && $(MAKE) runtimes
touch $@
install-llvm: | obj_llvm/.lc_built_3
# -j1 because there's a broken dependency in the llvm build somewhere
# which often results in missing c++ libraries for some targets
cd obj_llvm && $(MAKE) -j1 DESTDIR=$(DESTDIR)$(OUTPUT) install-distribution install-builtins install-runtimes
install-musl_%: | obj_musl/%/.lc_built
cd obj_musl/$* && $(MAKE) $(MUSL_VARS) DESTDIR=$(DESTDIR)$(OUTPUT)/$* install
install-kernel-headers_%: | obj_kernel_headers/%/.lc_built
mkdir -p $(DESTDIR)$(OUTPUT)/$*/include
cp -R obj_kernel_headers/$*/staged/include/* $(DESTDIR)$(OUTPUT)/$*/include
install-configs_%: | $(DESDIR)$(OUTPUT)/clang/bin/
echo "--target=$*" > $(DESTDIR)$(OUTPUT)/clang/bin/$*-clang.cfg
echo "--target=$* -lc++abi -lunwind" > $(DESTDIR)$(OUTPUT)/clang/bin/$*-clang++.cfg
install-symlinks_%: | $(DESTDIR)$(OUTPUT)/bin/
cd $(DESTDIR)$(OUTPUT)/bin && ln -sf ../clang/bin/clang $*-clang
cd $(DESTDIR)$(OUTPUT)/bin && ln -sf ../clang/bin/clang++ $*-clang++
cd $(DESTDIR)$(OUTPUT)/bin && ln -sf ../clang/bin/clang-cpp $*-clang-cpp
cd $(DESTDIR)$(OUTPUT)/bin && ln -sf ../clang/bin/ld.lld $*-ld
$(foreach t,$(TOOLS),cd $(DESTDIR)$(OUTPUT)/bin && ln -sf ../clang/bin/$(t) $*-$(subst llvm-,,$(t);))
clean:
rm -rf src_* obj_*
# $(call fn_linux_arch,target-triple)
# Determine linux architecture from target triple
ifeq ($(LINUX_SRCDIR),)
$(error LINUX_SRCDIR is required for llvm libc++ build)
endif
LINUX_ARCH_LIST := $(sort $(notdir $(wildcard $(LINUX_SRCDIR)/arch/*)))
fn_target_arch = $(firstword $(subst -, ,$(1)))
fn_target_arch_mangled = $(patsubst i%86,x86,$(patsubst aarch64%,arm64%,$(call fn_target_arch,$(1))))
fn_linux_arch = $(lastword $(foreach a,$(LINUX_ARCH_LIST),$(if $(filter $(a)%,$(call fn_target_arch_mangled,$(1))),$(a))))
.SECONDARY:
|