rt.mk (11543B)
1 # mk/rt.mk 2 # =========================================================================== 3 # Runtime (libkit_rt.a) variant selection and per-variant source/flag 4 # derivation -> RT_OBJS_<variant> / RT_CFLAGS_<variant> / RT_ASFLAGS_<variant>. 5 # 6 # The build rules that consume these live in the top-level Makefile. This file 7 # is the data: the variant table, the host-native variant detection, the 8 # feature->source/flag groups, and the template that expands one variant into 9 # its concrete source/object/flag lists. Paths are root-relative. 10 11 RT_BUILD_DIR ?= $(BUILD_DIR)/rt 12 RT_COMMON_CFLAGS = -Werror 13 RT_LIB_INCS = -Irt/lib/include/common -Irt/lib/impl 14 15 RT_VARIANTS = \ 16 x86_64-linux \ 17 x86_64-freebsd \ 18 x86_64-apple-darwin \ 19 x86_64-elf \ 20 aarch64-linux \ 21 aarch64-freebsd \ 22 aarch64-apple-darwin \ 23 aarch64-elf \ 24 riscv64-linux \ 25 riscv64-freebsd \ 26 riscv64-elf \ 27 riscv64-elf-save-restore \ 28 aarch64-windows \ 29 x86_64-pc-windows \ 30 i386-linux \ 31 wasm32 \ 32 riscv32-elf \ 33 riscv32-elf-save-restore \ 34 riscv32-elf-hardfloat \ 35 arm-eabi-thumb2 \ 36 arm-eabi-thumb1 37 38 RT_HOST_MACHINE ?= $(shell uname -m 2>/dev/null || printf unknown) 39 RT_NATIVE_VARIANT = 40 ifeq ($(HOST_UNAME),Darwin) 41 ifneq ($(filter arm64 aarch64,$(RT_HOST_MACHINE)),) 42 RT_NATIVE_VARIANT = aarch64-apple-darwin 43 else ifneq ($(filter x86_64 amd64,$(RT_HOST_MACHINE)),) 44 RT_NATIVE_VARIANT = x86_64-apple-darwin 45 endif 46 else ifeq ($(HOST_UNAME),Linux) 47 ifneq ($(filter x86_64 amd64,$(RT_HOST_MACHINE)),) 48 RT_NATIVE_VARIANT = x86_64-linux 49 else ifneq ($(filter arm64 aarch64,$(RT_HOST_MACHINE)),) 50 RT_NATIVE_VARIANT = aarch64-linux 51 else ifneq ($(filter riscv64,$(RT_HOST_MACHINE)),) 52 RT_NATIVE_VARIANT = riscv64-linux 53 else ifneq ($(filter i386 i486 i586 i686,$(RT_HOST_MACHINE)),) 54 RT_NATIVE_VARIANT = i386-linux 55 endif 56 else ifneq ($(filter MINGW% MSYS% CYGWIN%,$(HOST_UNAME)),) 57 ifneq ($(filter x86_64 amd64,$(RT_HOST_MACHINE)),) 58 RT_NATIVE_VARIANT = x86_64-pc-windows 59 else ifneq ($(filter arm64 aarch64,$(RT_HOST_MACHINE)),) 60 RT_NATIVE_VARIANT = aarch64-windows 61 endif 62 else ifeq ($(HOST_UNAME),FreeBSD) 63 ifneq ($(filter x86_64 amd64,$(RT_HOST_MACHINE)),) 64 RT_NATIVE_VARIANT = x86_64-freebsd 65 else ifneq ($(filter arm64 aarch64,$(RT_HOST_MACHINE)),) 66 RT_NATIVE_VARIANT = aarch64-freebsd 67 else ifneq ($(filter riscv64,$(RT_HOST_MACHINE)),) 68 RT_NATIVE_VARIANT = riscv64-freebsd 69 endif 70 endif 71 72 RT_DEFAULT_VARIANTS ?= $(RT_NATIVE_VARIANT) 73 74 # ---------- variant feature flags -------------------------------------------- 75 # TARGET - clang target triple 76 # ABI - lp64 | ilp32 | llp64 77 # INT128 - 0 | 1 78 # CORO - x86_64 | x86_64_win | i386 | aarch64 | 79 # arm32 | arm32_thumb1 | riscv32 | riscv64 | empty 80 # LDBL128 - 1 enables binary128 long double support 81 # SAVE_RESTORE - 1 enables RISC-V save-restore routines 82 # AEABI - thumb2 | thumb1 | empty 83 # ARCH_FLAGS - extra target-specific flags 84 85 RT_x86_64-linux_TARGET = x86_64-linux-gnu 86 RT_x86_64-linux_ABI = lp64 87 RT_x86_64-linux_INT128 = 1 88 RT_x86_64-linux_CORO = x86_64 89 90 RT_x86_64-freebsd_TARGET = x86_64-unknown-freebsd 91 RT_x86_64-freebsd_ABI = lp64 92 RT_x86_64-freebsd_INT128 = 1 93 RT_x86_64-freebsd_CORO = x86_64 94 95 RT_x86_64-apple-darwin_TARGET = x86_64-apple-darwin 96 RT_x86_64-apple-darwin_ABI = lp64 97 RT_x86_64-apple-darwin_INT128 = 1 98 RT_x86_64-apple-darwin_CORO = x86_64 99 100 RT_x86_64-elf_TARGET = x86_64-unknown-elf 101 RT_x86_64-elf_ABI = lp64 102 RT_x86_64-elf_INT128 = 1 103 RT_x86_64-elf_CORO = x86_64 104 105 RT_aarch64-linux_TARGET = aarch64-linux-gnu 106 RT_aarch64-linux_ABI = lp64 107 RT_aarch64-linux_INT128 = 1 108 RT_aarch64-linux_CORO = aarch64 109 RT_aarch64-linux_LDBL128 = 1 110 RT_EXTRA_SRCS_aarch64-linux = rt/lib/coro/aarch64_elf.s 111 112 RT_aarch64-freebsd_TARGET = aarch64-unknown-freebsd 113 RT_aarch64-freebsd_ABI = lp64 114 RT_aarch64-freebsd_INT128 = 1 115 RT_aarch64-freebsd_CORO = aarch64 116 RT_aarch64-freebsd_LDBL128 = 1 117 RT_EXTRA_SRCS_aarch64-freebsd = rt/lib/coro/aarch64_elf.s 118 119 RT_aarch64-apple-darwin_TARGET = aarch64-apple-darwin 120 RT_aarch64-apple-darwin_ABI = lp64 121 RT_aarch64-apple-darwin_INT128 = 1 122 RT_aarch64-apple-darwin_CORO = aarch64 123 RT_EXTRA_SRCS_aarch64-apple-darwin = rt/lib/coro/aarch64_macho.s 124 125 RT_aarch64-elf_TARGET = aarch64-unknown-elf 126 RT_aarch64-elf_ABI = lp64 127 RT_aarch64-elf_INT128 = 1 128 RT_aarch64-elf_CORO = aarch64 129 RT_aarch64-elf_LDBL128 = 1 130 RT_EXTRA_SRCS_aarch64-elf = rt/lib/coro/aarch64_elf.s 131 132 RT_aarch64-windows_TARGET = aarch64-w64-windows-gnu 133 RT_aarch64-windows_ABI = llp64 134 RT_aarch64-windows_INT128 = 1 135 RT_aarch64-windows_CORO = aarch64 136 RT_aarch64-windows_HOSTED = 1 137 138 RT_riscv64-linux_TARGET = riscv64-linux-gnu 139 RT_riscv64-linux_ABI = lp64 140 RT_riscv64-linux_INT128 = 1 141 RT_riscv64-linux_CORO = riscv64 142 # RISC-V `long double` is IEEE-754 binary128 per the psABI; ship the quad 143 # soft-float / __int128 runtime (fp_tf, fp_ti). 144 RT_riscv64-linux_LDBL128 = 1 145 RT_riscv64-linux_ARCH_FLAGS = -mabi=lp64d -march=rv64imafd 146 147 RT_riscv64-freebsd_TARGET = riscv64-unknown-freebsd 148 RT_riscv64-freebsd_ABI = lp64 149 RT_riscv64-freebsd_INT128 = 1 150 RT_riscv64-freebsd_CORO = riscv64 151 RT_riscv64-freebsd_LDBL128 = 1 152 RT_riscv64-freebsd_ARCH_FLAGS = -mabi=lp64d -march=rv64imafd 153 154 RT_riscv64-elf_TARGET = riscv64-unknown-elf 155 RT_riscv64-elf_ABI = lp64 156 RT_riscv64-elf_INT128 = 1 157 RT_riscv64-elf_CORO = riscv64 158 RT_riscv64-elf_LDBL128 = 1 159 RT_riscv64-elf_ARCH_FLAGS = -mabi=lp64 -march=rv64imafd 160 161 RT_riscv64-elf-save-restore_TARGET = riscv64-unknown-elf 162 RT_riscv64-elf-save-restore_ABI = lp64 163 RT_riscv64-elf-save-restore_INT128 = 1 164 RT_riscv64-elf-save-restore_CORO = riscv64 165 RT_riscv64-elf-save-restore_SAVE_RESTORE = 1 166 RT_riscv64-elf-save-restore_LDBL128 = 1 167 RT_riscv64-elf-save-restore_ARCH_FLAGS = -mabi=lp64 -march=rv64imafd 168 169 RT_x86_64-pc-windows_TARGET = x86_64-pc-windows-msvc 170 RT_x86_64-pc-windows_ABI = llp64 171 RT_x86_64-pc-windows_INT128 = 1 172 RT_x86_64-pc-windows_CORO = x86_64_win 173 RT_x86_64-pc-windows_HOSTED = 1 174 RT_EXTRA_SRCS_x86_64-pc-windows = rt/lib/stack/chkstk_x86_64_win.c 175 176 RT_i386-linux_TARGET = i386-linux-gnu 177 RT_i386-linux_ABI = ilp32 178 RT_i386-linux_INT128 = 0 179 RT_i386-linux_CORO = i386 180 181 RT_wasm32_TARGET = wasm32-unknown-unknown 182 RT_wasm32_ABI = ilp32 183 RT_wasm32_INT128 = 0 184 185 # Soft-float embedded RV32 (ABI=ilp32, no F/D): integer layout is ilp32 and 186 # all FP is soft, so it reuses RT_ABI_SRCS_ilp32 / RT_ABI_INC ilp32_le. 187 RT_riscv32-elf_TARGET = riscv32-unknown-elf 188 RT_riscv32-elf_ABI = ilp32 189 RT_riscv32-elf_INT128 = 0 190 RT_riscv32-elf_CORO = riscv32 191 RT_riscv32-elf_ARCH_FLAGS = -mabi=ilp32 -march=rv32imac 192 193 RT_riscv32-elf-save-restore_TARGET = riscv32-unknown-elf 194 RT_riscv32-elf-save-restore_ABI = ilp32 195 RT_riscv32-elf-save-restore_INT128 = 0 196 RT_riscv32-elf-save-restore_CORO = riscv32 197 RT_riscv32-elf-save-restore_SAVE_RESTORE = 1 198 RT_riscv32-elf-save-restore_ARCH_FLAGS = -mabi=ilp32 -march=rv32imac 199 200 # Hard-float (single-precision) RV32: ilp32f passes float in FP regs, but the 201 # integer layout is still ilp32 (double stays soft), so ABI=ilp32 here too and 202 # it reuses the same RT_ABI_SRCS_ilp32 / RT_ABI_INC ilp32_le as the soft variant. 203 RT_riscv32-elf-hardfloat_TARGET = riscv32-unknown-elf 204 RT_riscv32-elf-hardfloat_ABI = ilp32 205 RT_riscv32-elf-hardfloat_INT128 = 0 206 RT_riscv32-elf-hardfloat_CORO = riscv32 207 RT_riscv32-elf-hardfloat_ARCH_FLAGS = -mabi=ilp32f -march=rv32imafc 208 209 RT_arm-eabi-thumb2_TARGET = arm-none-eabi 210 RT_arm-eabi-thumb2_ABI = ilp32 211 RT_arm-eabi-thumb2_INT128 = 0 212 RT_arm-eabi-thumb2_CORO = arm32 213 RT_arm-eabi-thumb2_AEABI = thumb2 214 215 RT_arm-eabi-thumb1_TARGET = arm-none-eabi 216 RT_arm-eabi-thumb1_ABI = ilp32 217 RT_arm-eabi-thumb1_INT128 = 0 218 RT_arm-eabi-thumb1_CORO = arm32_thumb1 219 RT_arm-eabi-thumb1_AEABI = thumb1 220 221 # ---------- feature -> source/flag groups ------------------------------------ 222 RT_BASE_SRCS = \ 223 rt/lib/assert/assert.c \ 224 rt/lib/int/int.c \ 225 rt/lib/int/si_div.c \ 226 rt/lib/fp/fp.c \ 227 rt/lib/mem/mem.c \ 228 rt/lib/string/string.c \ 229 rt/lib/ctype/ctype.c \ 230 rt/lib/stdlib/stdlib.c \ 231 rt/lib/stdlib/qsort.c \ 232 rt/lib/stdio/printf.c \ 233 rt/lib/atomic/atomic_freestanding.c \ 234 rt/lib/cache/clear_cache.c \ 235 rt/lib/stack/backtrace.c \ 236 rt/lib/stack/print_backtrace.c \ 237 rt/lib/kit/ifunc_init.c 238 239 RT_COMPILER_SRCS = \ 240 rt/lib/int/int.c \ 241 rt/lib/int/si_div.c \ 242 rt/lib/fp/fp.c \ 243 rt/lib/atomic/atomic_freestanding.c \ 244 rt/lib/cache/clear_cache.c \ 245 rt/lib/kit/ifunc_init.c 246 247 RT_ABI_SRCS_lp64 = rt/lib/int64/int64.c 248 RT_ABI_SRCS_llp64 = rt/lib/int64/int64.c 249 RT_ABI_SRCS_ilp32 = rt/lib/int32/int32.c 250 251 RT_ABI_INC_lp64 = -Irt/lib/include/lp64_le 252 RT_ABI_INC_llp64 = -Irt/lib/include/llp64_le 253 RT_ABI_INC_ilp32 = -Irt/lib/include/ilp32_le 254 255 RT_CORO_SRCS_x86_64 = rt/lib/coro/x86_64.c rt/lib/coro/coro.c 256 RT_CORO_SRCS_x86_64_win = rt/lib/coro/x86_64_win.c rt/lib/coro/coro.c 257 RT_CORO_SRCS_i386 = rt/lib/coro/i386.c rt/lib/coro/coro.c 258 RT_CORO_SRCS_aarch64 = rt/lib/coro/aarch64.c rt/lib/coro/coro.c 259 RT_CORO_SRCS_arm32 = rt/lib/coro/arm32.c rt/lib/coro/coro.c 260 RT_CORO_SRCS_arm32_thumb1 = rt/lib/coro/arm32_thumb1.c rt/lib/coro/coro.c 261 RT_CORO_SRCS_riscv32 = rt/lib/coro/riscv32.c rt/lib/coro/coro.c 262 RT_CORO_SRCS_riscv64 = rt/lib/coro/riscv64.c rt/lib/coro/coro.c 263 264 RT_LDBL128_SRCS = rt/lib/fp_tf/fp_tf.c rt/lib/fp_ti/fp_ti.c 265 RT_LDBL128_FLAGS = -Irt/lib/include/lp64_le_ldbl128 -DKITRT_LDBL128=1 266 267 RT_SAVE_RESTORE_SRCS_lp64 = rt/lib/riscv/rv64.S 268 RT_SAVE_RESTORE_SRCS_ilp32 = rt/lib/riscv/rv32.S 269 RT_SAVE_RESTORE_FLAGS = -msave-restore 270 271 RT_AEABI_SRCS_thumb2 = rt/lib/arm/aeabi_thumb2.S rt/lib/arm/aeabi.c 272 RT_AEABI_SRCS_thumb1 = rt/lib/arm/aeabi_thumb1.S rt/lib/arm/aeabi.c 273 RT_AEABI_FLAGS_thumb2 = -march=armv7-a -mthumb -mfloat-abi=soft 274 RT_AEABI_FLAGS_thumb1 = -march=armv6-m -mthumb -mfloat-abi=soft 275 276 # ---------- per-variant derivation ------------------------------------------- 277 # Expand one variant into its concrete source/object/flag lists. `:=` makes 278 # each list concrete at eval time so the rule template in the top-level 279 # Makefile can reference RT_OBJS_<variant> directly. 280 define RT_VARIANT_srcs 281 RT_SRCS_$(1) := \ 282 $$(if $$(RT_$(1)_HOSTED),$$(RT_COMPILER_SRCS),$$(RT_BASE_SRCS)) \ 283 $$(RT_ABI_SRCS_$$(RT_$(1)_ABI)) \ 284 $$(RT_CORO_SRCS_$$(RT_$(1)_CORO)) \ 285 $$(if $$(RT_$(1)_LDBL128),$$(RT_LDBL128_SRCS)) \ 286 $$(if $$(RT_$(1)_SAVE_RESTORE),$$(RT_SAVE_RESTORE_SRCS_$$(RT_$(1)_ABI))) \ 287 $$(RT_AEABI_SRCS_$$(RT_$(1)_AEABI)) \ 288 $$(RT_EXTRA_SRCS_$(1)) 289 RT_CFLAGS_$(1) := \ 290 $$(RT_COMMON_CFLAGS) $$(RT_LIB_INCS) \ 291 -target $$(RT_$(1)_TARGET) \ 292 $$(RT_$(1)_ARCH_FLAGS) \ 293 -DHAS_INT128=$$(RT_$(1)_INT128) \ 294 $$(RT_ABI_INC_$$(RT_$(1)_ABI)) \ 295 $$(if $$(RT_$(1)_LDBL128),$$(RT_LDBL128_FLAGS)) \ 296 $$(if $$(RT_$(1)_CORO),-Irt/include) 297 RT_ASFLAGS_$(1) := \ 298 -target $$(RT_$(1)_TARGET) \ 299 $$(RT_$(1)_ARCH_FLAGS) \ 300 -DHAS_INT128=$$(RT_$(1)_INT128) \ 301 -D__ASSEMBLER__=1 \ 302 $$(RT_ABI_INC_$$(RT_$(1)_ABI)) \ 303 $$(if $$(RT_$(1)_LDBL128),$$(RT_LDBL128_FLAGS)) \ 304 $$(if $$(RT_$(1)_CORO),-Irt/include) 305 RT_OBJS_$(1) := $$(patsubst rt/lib/%,$$(RT_BUILD_DIR)/$(1)/%.o,$$(RT_SRCS_$(1))) 306 endef 307 308 $(foreach variant,$(RT_VARIANTS),$(eval $(call RT_VARIANT_srcs,$(variant))))