kit

kit
git clone https://git.ryansepassi.com/git/kit.git
Log | Files | Refs | README

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))))