Makefile (10324B)
1 # Included by the repository-root Makefile. Paths are root-relative. 2 3 RT_CC ?= $(BIN) cc 4 RT_AR ?= $(BIN) ar 5 RT_AS ?= $(BIN) as 6 RT_AS_COMPILE_FLAGS ?= 7 8 RT_BUILD_DIR ?= $(BUILD_DIR)/rt 9 RT_COMMON_CFLAGS = -Werror 10 RT_LIB_INCS = -Irt/lib/include/common -Irt/lib/impl 11 12 RT_VARIANTS = \ 13 x86_64-linux \ 14 x86_64-apple-darwin \ 15 aarch64-linux \ 16 aarch64-apple-darwin \ 17 riscv64-linux \ 18 riscv64-elf \ 19 riscv64-elf-save-restore \ 20 aarch64-windows \ 21 x86_64-pc-windows \ 22 i386-linux \ 23 wasm32 \ 24 riscv32-elf \ 25 riscv32-elf-save-restore \ 26 arm-eabi-thumb2 \ 27 arm-eabi-thumb1 28 29 RT_HOST_MACHINE ?= $(shell uname -m 2>/dev/null || printf unknown) 30 RT_NATIVE_VARIANT = 31 ifeq ($(HOST_UNAME),Darwin) 32 ifneq ($(filter arm64 aarch64,$(RT_HOST_MACHINE)),) 33 RT_NATIVE_VARIANT = aarch64-apple-darwin 34 else ifneq ($(filter x86_64 amd64,$(RT_HOST_MACHINE)),) 35 RT_NATIVE_VARIANT = x86_64-apple-darwin 36 endif 37 else ifeq ($(HOST_UNAME),Linux) 38 ifneq ($(filter x86_64 amd64,$(RT_HOST_MACHINE)),) 39 RT_NATIVE_VARIANT = x86_64-linux 40 else ifneq ($(filter arm64 aarch64,$(RT_HOST_MACHINE)),) 41 RT_NATIVE_VARIANT = aarch64-linux 42 else ifneq ($(filter riscv64,$(RT_HOST_MACHINE)),) 43 RT_NATIVE_VARIANT = riscv64-linux 44 else ifneq ($(filter i386 i486 i586 i686,$(RT_HOST_MACHINE)),) 45 RT_NATIVE_VARIANT = i386-linux 46 endif 47 else ifneq ($(filter MINGW% MSYS% CYGWIN%,$(HOST_UNAME)),) 48 ifneq ($(filter x86_64 amd64,$(RT_HOST_MACHINE)),) 49 RT_NATIVE_VARIANT = x86_64-pc-windows 50 else ifneq ($(filter arm64 aarch64,$(RT_HOST_MACHINE)),) 51 RT_NATIVE_VARIANT = aarch64-windows 52 endif 53 endif 54 55 RT_DEFAULT_VARIANTS ?= $(RT_NATIVE_VARIANT) 56 57 .PHONY: rt rt-all-targets rt-no-native-target $(addprefix rt-,$(RT_VARIANTS)) clean-rt 58 59 rt: $(if $(RT_DEFAULT_VARIANTS),$(addprefix rt-,$(RT_DEFAULT_VARIANTS)),rt-no-native-target) 60 rt-all-targets: $(addprefix rt-,$(RT_VARIANTS)) 61 62 rt-no-native-target: 63 $(error unsupported native runtime target: HOST_UNAME=$(HOST_UNAME) RT_HOST_MACHINE=$(RT_HOST_MACHINE)) 64 65 # ---------- variant feature flags -------------------------------------------- 66 # TARGET - clang target triple 67 # ABI - lp64 | ilp32 | llp64 68 # INT128 - 0 | 1 69 # CORO - x86_64 | x86_64_win | i386 | aarch64 | 70 # arm32 | arm32_thumb1 | riscv32 | riscv64 | empty 71 # LDBL128 - 1 enables binary128 long double support 72 # SAVE_RESTORE - 1 enables RISC-V save-restore routines 73 # AEABI - thumb2 | thumb1 | empty 74 # ARCH_FLAGS - extra target-specific flags 75 76 RT_x86_64-linux_TARGET = x86_64-linux-gnu 77 RT_x86_64-linux_ABI = lp64 78 RT_x86_64-linux_INT128 = 1 79 RT_x86_64-linux_CORO = x86_64 80 81 RT_x86_64-apple-darwin_TARGET = x86_64-apple-darwin 82 RT_x86_64-apple-darwin_ABI = lp64 83 RT_x86_64-apple-darwin_INT128 = 1 84 RT_x86_64-apple-darwin_CORO = x86_64 85 86 RT_aarch64-linux_TARGET = aarch64-linux-gnu 87 RT_aarch64-linux_ABI = lp64 88 RT_aarch64-linux_INT128 = 1 89 RT_aarch64-linux_CORO = aarch64 90 RT_aarch64-linux_LDBL128 = 1 91 RT_EXTRA_SRCS_aarch64-linux = rt/lib/coro/aarch64_elf.s 92 93 RT_aarch64-apple-darwin_TARGET = aarch64-apple-darwin 94 RT_aarch64-apple-darwin_ABI = lp64 95 RT_aarch64-apple-darwin_INT128 = 1 96 RT_aarch64-apple-darwin_CORO = aarch64 97 RT_EXTRA_SRCS_aarch64-apple-darwin = rt/lib/coro/aarch64_macho.s 98 99 RT_aarch64-windows_TARGET = aarch64-w64-windows-gnu 100 RT_aarch64-windows_ABI = llp64 101 RT_aarch64-windows_INT128 = 1 102 RT_aarch64-windows_CORO = aarch64 103 RT_aarch64-windows_HOSTED = 1 104 105 RT_riscv64-linux_TARGET = riscv64-linux-gnu 106 RT_riscv64-linux_ABI = lp64 107 RT_riscv64-linux_INT128 = 1 108 RT_riscv64-linux_CORO = riscv64 109 # RISC-V `long double` is IEEE-754 binary128 per the psABI; ship the quad 110 # soft-float / __int128 runtime (fp_tf, fp_ti). 111 RT_riscv64-linux_LDBL128 = 1 112 RT_riscv64-linux_ARCH_FLAGS = -mabi=lp64d -march=rv64imafd 113 114 RT_riscv64-elf_TARGET = riscv64-unknown-elf 115 RT_riscv64-elf_ABI = lp64 116 RT_riscv64-elf_INT128 = 1 117 RT_riscv64-elf_CORO = riscv64 118 RT_riscv64-elf_LDBL128 = 1 119 RT_riscv64-elf_ARCH_FLAGS = -mabi=lp64 -march=rv64imafd 120 121 RT_riscv64-elf-save-restore_TARGET = riscv64-unknown-elf 122 RT_riscv64-elf-save-restore_ABI = lp64 123 RT_riscv64-elf-save-restore_INT128 = 1 124 RT_riscv64-elf-save-restore_CORO = riscv64 125 RT_riscv64-elf-save-restore_SAVE_RESTORE = 1 126 RT_riscv64-elf-save-restore_LDBL128 = 1 127 RT_riscv64-elf-save-restore_ARCH_FLAGS = -mabi=lp64 -march=rv64imafd 128 129 RT_x86_64-pc-windows_TARGET = x86_64-pc-windows-msvc 130 RT_x86_64-pc-windows_ABI = llp64 131 RT_x86_64-pc-windows_INT128 = 1 132 RT_x86_64-pc-windows_CORO = x86_64_win 133 RT_x86_64-pc-windows_HOSTED = 1 134 135 RT_i386-linux_TARGET = i386-linux-gnu 136 RT_i386-linux_ABI = ilp32 137 RT_i386-linux_INT128 = 0 138 RT_i386-linux_CORO = i386 139 140 RT_wasm32_TARGET = wasm32-unknown-unknown 141 RT_wasm32_ABI = ilp32 142 RT_wasm32_INT128 = 0 143 144 RT_riscv32-elf_TARGET = riscv32-unknown-elf 145 RT_riscv32-elf_ABI = ilp32 146 RT_riscv32-elf_INT128 = 0 147 RT_riscv32-elf_CORO = riscv32 148 RT_riscv32-elf_ARCH_FLAGS = -mabi=ilp32 -march=rv32imafd 149 150 RT_riscv32-elf-save-restore_TARGET = riscv32-unknown-elf 151 RT_riscv32-elf-save-restore_ABI = ilp32 152 RT_riscv32-elf-save-restore_INT128 = 0 153 RT_riscv32-elf-save-restore_CORO = riscv32 154 RT_riscv32-elf-save-restore_SAVE_RESTORE = 1 155 RT_riscv32-elf-save-restore_ARCH_FLAGS = -mabi=ilp32 -march=rv32imafd 156 157 RT_arm-eabi-thumb2_TARGET = arm-none-eabi 158 RT_arm-eabi-thumb2_ABI = ilp32 159 RT_arm-eabi-thumb2_INT128 = 0 160 RT_arm-eabi-thumb2_CORO = arm32 161 RT_arm-eabi-thumb2_AEABI = thumb2 162 163 RT_arm-eabi-thumb1_TARGET = arm-none-eabi 164 RT_arm-eabi-thumb1_ABI = ilp32 165 RT_arm-eabi-thumb1_INT128 = 0 166 RT_arm-eabi-thumb1_CORO = arm32_thumb1 167 RT_arm-eabi-thumb1_AEABI = thumb1 168 169 # ---------- sources and flags derived from features -------------------------- 170 RT_BASE_SRCS = \ 171 rt/lib/assert/assert.c \ 172 rt/lib/int/int.c \ 173 rt/lib/int/si_div.c \ 174 rt/lib/fp/fp.c \ 175 rt/lib/mem/mem.c \ 176 rt/lib/string/string.c \ 177 rt/lib/stdlib/stdlib.c \ 178 rt/lib/stdlib/qsort.c \ 179 rt/lib/stdio/printf.c \ 180 rt/lib/atomic/atomic_freestanding.c \ 181 rt/lib/cache/clear_cache.c \ 182 rt/lib/kit/ifunc_init.c 183 184 RT_COMPILER_SRCS = \ 185 rt/lib/int/int.c \ 186 rt/lib/int/si_div.c \ 187 rt/lib/fp/fp.c \ 188 rt/lib/atomic/atomic_freestanding.c \ 189 rt/lib/cache/clear_cache.c \ 190 rt/lib/kit/ifunc_init.c 191 192 RT_ABI_SRCS_lp64 = rt/lib/int64/int64.c 193 RT_ABI_SRCS_llp64 = rt/lib/int64/int64.c 194 RT_ABI_SRCS_ilp32 = rt/lib/int32/int32.c 195 196 RT_ABI_INC_lp64 = -Irt/lib/include/lp64_le 197 RT_ABI_INC_llp64 = -Irt/lib/include/llp64_le 198 RT_ABI_INC_ilp32 = -Irt/lib/include/ilp32_le 199 200 RT_CORO_SRCS_x86_64 = rt/lib/coro/x86_64.c rt/lib/coro/coro.c 201 RT_CORO_SRCS_x86_64_win = rt/lib/coro/x86_64_win.c rt/lib/coro/coro.c 202 RT_CORO_SRCS_i386 = rt/lib/coro/i386.c rt/lib/coro/coro.c 203 RT_CORO_SRCS_aarch64 = rt/lib/coro/aarch64.c rt/lib/coro/coro.c 204 RT_CORO_SRCS_arm32 = rt/lib/coro/arm32.c rt/lib/coro/coro.c 205 RT_CORO_SRCS_arm32_thumb1 = rt/lib/coro/arm32_thumb1.c rt/lib/coro/coro.c 206 RT_CORO_SRCS_riscv32 = rt/lib/coro/riscv32.c rt/lib/coro/coro.c 207 RT_CORO_SRCS_riscv64 = rt/lib/coro/riscv64.c rt/lib/coro/coro.c 208 209 RT_LDBL128_SRCS = rt/lib/fp_tf/fp_tf.c rt/lib/fp_ti/fp_ti.c 210 RT_LDBL128_FLAGS = -Irt/lib/include/lp64_le_ldbl128 -DKITRT_LDBL128=1 211 212 RT_SAVE_RESTORE_SRCS_lp64 = rt/lib/riscv/rv64.S 213 RT_SAVE_RESTORE_SRCS_ilp32 = rt/lib/riscv/rv32.S 214 RT_SAVE_RESTORE_FLAGS = -msave-restore 215 216 RT_AEABI_SRCS_thumb2 = rt/lib/arm/aeabi_thumb2.S rt/lib/arm/aeabi.c 217 RT_AEABI_SRCS_thumb1 = rt/lib/arm/aeabi_thumb1.S rt/lib/arm/aeabi.c 218 RT_AEABI_FLAGS_thumb2 = -march=armv7-a -mthumb -mfloat-abi=soft 219 RT_AEABI_FLAGS_thumb1 = -march=armv6-m -mthumb -mfloat-abi=soft 220 221 define RT_VARIANT_template 222 RT_SRCS_$(1) := \ 223 $$(if $$(RT_$(1)_HOSTED),$$(RT_COMPILER_SRCS),$$(RT_BASE_SRCS)) \ 224 $$(RT_ABI_SRCS_$$(RT_$(1)_ABI)) \ 225 $$(RT_CORO_SRCS_$$(RT_$(1)_CORO)) \ 226 $$(if $$(RT_$(1)_LDBL128),$$(RT_LDBL128_SRCS)) \ 227 $$(if $$(RT_$(1)_SAVE_RESTORE),$$(RT_SAVE_RESTORE_SRCS_$$(RT_$(1)_ABI))) \ 228 $$(RT_AEABI_SRCS_$$(RT_$(1)_AEABI)) \ 229 $$(RT_EXTRA_SRCS_$(1)) 230 RT_CFLAGS_$(1) := \ 231 $$(RT_COMMON_CFLAGS) $$(RT_LIB_INCS) \ 232 -target $$(RT_$(1)_TARGET) \ 233 -DHAS_INT128=$$(RT_$(1)_INT128) \ 234 $$(RT_ABI_INC_$$(RT_$(1)_ABI)) \ 235 $$(if $$(RT_$(1)_LDBL128),$$(RT_LDBL128_FLAGS)) \ 236 $$(if $$(RT_$(1)_CORO),-Irt/include) 237 RT_ASFLAGS_$(1) := \ 238 -target $$(RT_$(1)_TARGET) \ 239 -DHAS_INT128=$$(RT_$(1)_INT128) \ 240 -D__ASSEMBLER__=1 \ 241 $$(RT_ABI_INC_$$(RT_$(1)_ABI)) \ 242 $$(if $$(RT_$(1)_LDBL128),$$(RT_LDBL128_FLAGS)) \ 243 $$(if $$(RT_$(1)_CORO),-Irt/include) 244 RT_OBJS_$(1) := $$(patsubst rt/lib/%,$$(RT_BUILD_DIR)/$(1)/%.o,$$(RT_SRCS_$(1))) 245 246 rt-$(1): $$(RT_BUILD_DIR)/$(1)/libkit_rt.a 247 248 # Regular (not order-only) dep on $(BIN): kit compiles and archives its own 249 # runtime, so a codegen or `ar` change in the compiler must rebuild the rt. 250 # The archive lists $(RT_OBJS) explicitly rather than $^ so the kit binary 251 # (now a regular prereq) is not itself archived. 252 # 253 # Depend on rt/Makefile too: the member list (RT_*_SRCS) lives here, and 254 # `ar rcs` only adds/updates members. When the list grows, an existing 255 # archive whose objects happen to be newer would otherwise never regenerate 256 # and would silently drop the new members (e.g. a missing __clear_cache 257 # breaking links). With the makefile as a prereq, any list edit re-fires the 258 # `rm -f` + full re-archive below so the archive always matches RT_OBJS. 259 $$(RT_BUILD_DIR)/$(1)/libkit_rt.a: $$(RT_OBJS_$(1)) rt/Makefile $$(BIN) 260 @mkdir -p $$(dir $$@) 261 @rm -f $$@ 262 $$(RT_AR) rcs $$@ $$(RT_OBJS_$(1)) 263 264 $$(RT_BUILD_DIR)/$(1)/%.s.o: rt/lib/%.s $$(BIN) 265 @mkdir -p $$(dir $$@) 266 $$(RT_AS) $$(RT_ASFLAGS_$(1)) $$(RT_AS_COMPILE_FLAGS) $$< -o $$@ 267 268 $$(RT_BUILD_DIR)/$(1)/%.S.o: rt/lib/%.S $$(BIN) 269 @mkdir -p $$(dir $$@) 270 $$(RT_AS) $$(RT_ASFLAGS_$(1)) $$(RT_AS_COMPILE_FLAGS) $$< -o $$@ 271 272 $$(RT_BUILD_DIR)/$(1)/%.o: rt/lib/% $$(BIN) 273 @mkdir -p $$(dir $$@) 274 $$(RT_CC) $$(RT_CFLAGS_$(1)) -c $$< -o $$@ 275 276 $$(RT_BUILD_DIR)/$(1)/atomic/atomic_freestanding.c.o: rt/lib/atomic/atomic_common.inc 277 endef 278 279 $(foreach variant,$(RT_VARIANTS),$(eval $(call RT_VARIANT_template,$(variant)))) 280 281 clean: clean-rt 282 283 clean-rt: 284 rm -rf $(RT_BUILD_DIR)