kit

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

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)