Clean up make targets list-arch and list-toolchain to be much faster and work without needing to invoke the archtecture's arch rules.mk. This should make it work on machines that do not have that particular toolchain in the path. This is setting up for using it in the github action script.
397 lines
9.0 KiB
Makefile
397 lines
9.0 KiB
Makefile
LOCAL_DIR := $(GET_LOCAL_DIR)
|
|
|
|
MODULE := $(LOCAL_DIR)
|
|
|
|
# can override this in local.mk
|
|
ENABLE_THUMB?=true
|
|
|
|
# default to the regular arm subarch
|
|
SUBARCH := arm
|
|
|
|
GLOBAL_DEFINES += \
|
|
ARM_CPU_$(ARM_CPU)=1
|
|
|
|
# do set some options based on the cpu core
|
|
HANDLED_CORE := false
|
|
ifeq ($(ARM_CPU),cortex-m0)
|
|
GLOBAL_DEFINES += \
|
|
ARM_CPU_CORTEX_M0=1 \
|
|
ARM_ISA_ARMV6M=1 \
|
|
ARM_WITH_THUMB=1 \
|
|
USE_BUILTIN_ATOMICS=0
|
|
HANDLED_CORE := true
|
|
ENABLE_THUMB := true
|
|
SUBARCH := arm-m
|
|
endif
|
|
ifeq ($(ARM_CPU),cortex-m0plus)
|
|
GLOBAL_DEFINES += \
|
|
ARM_CPU_CORTEX_M0_PLUS=1 \
|
|
ARM_ISA_ARMV6M=1 \
|
|
ARM_WITH_THUMB=1 \
|
|
USE_BUILTIN_ATOMICS=0
|
|
HANDLED_CORE := true
|
|
ENABLE_THUMB := true
|
|
SUBARCH := arm-m
|
|
endif
|
|
ifeq ($(ARM_CPU),cortex-m3)
|
|
GLOBAL_DEFINES += \
|
|
ARM_CPU_CORTEX_M3=1 \
|
|
ARM_ISA_ARMv7=1 \
|
|
ARM_ISA_ARMv7M=1 \
|
|
ARM_WITH_THUMB=1 \
|
|
ARM_WITH_THUMB2=1
|
|
HANDLED_CORE := true
|
|
ENABLE_THUMB := true
|
|
SUBARCH := arm-m
|
|
endif
|
|
ifeq ($(ARM_CPU),cortex-m4)
|
|
GLOBAL_DEFINES += \
|
|
ARM_CPU_CORTEX_M4=1 \
|
|
ARM_ISA_ARMv7=1 \
|
|
ARM_ISA_ARMv7M=1 \
|
|
ARM_WITH_THUMB=1 \
|
|
ARM_WITH_THUMB2=1
|
|
HANDLED_CORE := true
|
|
ENABLE_THUMB := true
|
|
SUBARCH := arm-m
|
|
endif
|
|
ifeq ($(ARM_CPU),cortex-m4f)
|
|
GLOBAL_DEFINES += \
|
|
ARM_CPU_CORTEX_M4=1 \
|
|
ARM_CPU_CORTEX_M4F=1 \
|
|
ARM_ISA_ARMv7=1 \
|
|
ARM_ISA_ARMv7M=1 \
|
|
ARM_WITH_THUMB=1 \
|
|
ARM_WITH_THUMB2=1 \
|
|
ARM_WITH_VFP=1 \
|
|
ARM_WITH_VFP_SP_ONLY=1
|
|
HANDLED_CORE := true
|
|
ENABLE_THUMB := true
|
|
SUBARCH := arm-m
|
|
endif
|
|
ifeq ($(ARM_CPU),cortex-m55)
|
|
GLOBAL_DEFINES += \
|
|
ARM_CPU_CORTEX_M55=1 \
|
|
ARM_ISA_ARMv7=1 \
|
|
ARM_ISA_ARMv7M=1 \
|
|
ARM_WITH_THUMB=1 \
|
|
ARM_WITH_THUMB2=1 \
|
|
ARM_WITH_CACHE=1
|
|
HANDLED_CORE := true
|
|
ENABLE_THUMB := true
|
|
SUBARCH := arm-m
|
|
endif
|
|
ifeq ($(ARM_CPU),cortex-m7)
|
|
GLOBAL_DEFINES += \
|
|
ARM_CPU_CORTEX_M7=1 \
|
|
ARM_ISA_ARMv7=1 \
|
|
ARM_ISA_ARMv7M=1 \
|
|
ARM_WITH_THUMB=1 \
|
|
ARM_WITH_THUMB2=1 \
|
|
ARM_WITH_CACHE=1
|
|
HANDLED_CORE := true
|
|
ENABLE_THUMB := true
|
|
SUBARCH := arm-m
|
|
endif
|
|
ifeq ($(ARM_CPU),cortex-m7-fpu-sp-d16)
|
|
GLOBAL_DEFINES += \
|
|
ARM_CPU_CORTEX_M7=1 \
|
|
ARM_ISA_ARMv7=1 \
|
|
ARM_ISA_ARMv7M=1 \
|
|
ARM_WITH_THUMB=1 \
|
|
ARM_WITH_THUMB2=1 \
|
|
ARM_WITH_CACHE=1 \
|
|
ARM_WITH_VFP=1 \
|
|
ARM_WITH_VFP_SP_ONLY=1
|
|
HANDLED_CORE := true
|
|
ENABLE_THUMB := true
|
|
SUBARCH := arm-m
|
|
endif
|
|
ifeq ($(ARM_CPU),cortex-a7)
|
|
GLOBAL_DEFINES += \
|
|
ARM_WITH_CP15=1 \
|
|
ARCH_HAS_MMU=1 \
|
|
ARM_ISA_ARMv7=1 \
|
|
ARM_ISA_ARMv7A=1 \
|
|
ARM_WITH_VFP=1 \
|
|
ARM_WITH_NEON=1 \
|
|
ARM_WITH_THUMB=1 \
|
|
ARM_WITH_THUMB2=1 \
|
|
ARM_WITH_CACHE=1 \
|
|
ARM_WITH_HYP=1
|
|
HANDLED_CORE := true
|
|
endif
|
|
ifeq ($(ARM_CPU),cortex-a15)
|
|
GLOBAL_DEFINES += \
|
|
ARM_WITH_CP15=1 \
|
|
ARCH_HAS_MMU=1 \
|
|
ARM_ISA_ARMv7=1 \
|
|
ARM_ISA_ARMv7A=1 \
|
|
ARM_WITH_THUMB=1 \
|
|
ARM_WITH_THUMB2=1 \
|
|
ARM_WITH_CACHE=1 \
|
|
ARM_WITH_L2=1
|
|
ifneq ($(ARM_WITHOUT_VFP_NEON),true)
|
|
GLOBAL_DEFINES += \
|
|
ARM_WITH_VFP=1 \
|
|
ARM_WITH_NEON=1
|
|
endif
|
|
HANDLED_CORE := true
|
|
endif
|
|
ifeq ($(ARM_CPU),cortex-a8)
|
|
GLOBAL_DEFINES += \
|
|
ARM_WITH_CP15=1 \
|
|
ARCH_HAS_MMU=1 \
|
|
ARM_ISA_ARMv7=1 \
|
|
ARM_ISA_ARMv7A=1 \
|
|
ARM_WITH_VFP=1 \
|
|
ARM_WITH_NEON=1 \
|
|
ARM_WITH_THUMB=1 \
|
|
ARM_WITH_THUMB2=1 \
|
|
ARM_WITH_CACHE=1 \
|
|
ARM_WITH_L2=1
|
|
HANDLED_CORE := true
|
|
endif
|
|
ifeq ($(ARM_CPU),cortex-a9)
|
|
GLOBAL_DEFINES += \
|
|
ARM_WITH_CP15=1 \
|
|
ARCH_HAS_MMU=1 \
|
|
ARM_ISA_ARMv7=1 \
|
|
ARM_ISA_ARMv7A=1 \
|
|
ARM_WITH_THUMB=1 \
|
|
ARM_WITH_THUMB2=1 \
|
|
ARM_WITH_CACHE=1
|
|
HANDLED_CORE := true
|
|
endif
|
|
ifeq ($(ARM_CPU),cortex-a9-neon)
|
|
GLOBAL_DEFINES += \
|
|
ARM_CPU_CORTEX_A9=1 \
|
|
ARM_WITH_CP15=1 \
|
|
ARCH_HAS_MMU=1 \
|
|
ARM_ISA_ARMv7=1 \
|
|
ARM_ISA_ARMv7A=1 \
|
|
ARM_WITH_VFP=1 \
|
|
ARM_WITH_NEON=1 \
|
|
ARM_WITH_THUMB=1 \
|
|
ARM_WITH_THUMB2=1 \
|
|
ARM_WITH_CACHE=1
|
|
HANDLED_CORE := true
|
|
endif
|
|
ifeq ($(ARM_CPU),arm1136j-s)
|
|
GLOBAL_DEFINES += \
|
|
ARM_WITH_CP15=1 \
|
|
ARCH_HAS_MMU=1 \
|
|
ARM_ISA_ARMv6=1 \
|
|
ARM_WITH_THUMB=1 \
|
|
ARM_WITH_CACHE=1 \
|
|
ARM_CPU_ARM1136=1
|
|
HANDLED_CORE := true
|
|
endif
|
|
ifeq ($(ARM_CPU),arm1176jzf-s)
|
|
GLOBAL_DEFINES += \
|
|
ARM_WITH_CP15=1 \
|
|
ARCH_HAS_MMU=1 \
|
|
ARM_ISA_ARMv6=1 \
|
|
ARM_WITH_VFP=1 \
|
|
ARM_WITH_THUMB=1 \
|
|
ARM_WITH_CACHE=1 \
|
|
ARM_CPU_ARM1136=1
|
|
HANDLED_CORE := true
|
|
endif
|
|
ifeq ($(ARM_CPU),cortex-r4f)
|
|
GLOBAL_DEFINES += \
|
|
ARM_CPU_CORTEX_R4F=1 \
|
|
ARM_ISA_ARMv7=1 \
|
|
ARM_WITH_VFP=1 \
|
|
ARM_WITH_THUMB=1
|
|
ENABLE_THUMB := true
|
|
HANDLED_CORE := true
|
|
endif
|
|
ifeq ($(ARM_CPU),armemu)
|
|
# flavor of emulated cpu by the armemu project
|
|
GLOBAL_DEFINES += \
|
|
ARM_WITH_CP15=1 \
|
|
ARM_ISA_ARMv7=1 \
|
|
ARM_ISA_ARMv7A=1 \
|
|
ARM_WITH_CACHE=1
|
|
HANDLED_CORE := true
|
|
ENABLE_THUMB := false # armemu doesn't currently support thumb properly
|
|
endif
|
|
|
|
ifneq ($(HANDLED_CORE),true)
|
|
$(error $(LOCAL_DIR)/rules.mk doesnt have logic for arm core $(ARM_CPU))
|
|
endif
|
|
|
|
THUMBCFLAGS :=
|
|
THUMBINTERWORK :=
|
|
ifeq ($(ENABLE_THUMB),true)
|
|
THUMBCFLAGS := -mthumb -D__thumb__
|
|
ifneq ($(SUBARCH),arm-m)
|
|
# Only enable thumb interworking switch if we're compiling in a mixed
|
|
# arm/thumb environment. Also possible this switch is not needed anymore.
|
|
THUMBINTERWORK := -mthumb-interwork
|
|
endif
|
|
endif
|
|
|
|
GLOBAL_INCLUDES += \
|
|
$(LOCAL_DIR)/$(SUBARCH)/include
|
|
|
|
ifeq ($(SUBARCH),arm)
|
|
MODULE_SRCS += \
|
|
$(LOCAL_DIR)/arm/start.S \
|
|
$(LOCAL_DIR)/arm/asm.S \
|
|
$(LOCAL_DIR)/arm/cache-ops.S \
|
|
$(LOCAL_DIR)/arm/cache.c \
|
|
$(LOCAL_DIR)/arm/debug.c \
|
|
$(LOCAL_DIR)/arm/ops.S \
|
|
$(LOCAL_DIR)/arm/faults.c \
|
|
$(LOCAL_DIR)/arm/mmu.c \
|
|
$(LOCAL_DIR)/arm/thread.c
|
|
|
|
MODULE_FLOAT_SRCS += \
|
|
$(LOCAL_DIR)/arm/exceptions.S \
|
|
$(LOCAL_DIR)/arm/fpu.c \
|
|
|
|
MODULE_ARM_OVERRIDE_SRCS := \
|
|
$(LOCAL_DIR)/arm/arch.c
|
|
|
|
GLOBAL_DEFINES += \
|
|
ARCH_DEFAULT_STACK_SIZE=4096
|
|
|
|
ARCH_OPTFLAGS := -O2
|
|
WITH_LINKER_GC ?= 1
|
|
|
|
# use the numeric registers when disassembling code
|
|
ARCH_OBJDUMP_FLAGS := -Mreg-names-raw
|
|
|
|
# we have a mmu and want the vmm/pmm
|
|
WITH_KERNEL_VM ?= 1
|
|
|
|
# for arm, have the kernel occupy the entire top 3GB of virtual space,
|
|
# but put the kernel itself at 0x80000000.
|
|
# this leaves 0x40000000 - 0x80000000 open for kernel space to use.
|
|
GLOBAL_DEFINES += \
|
|
KERNEL_ASPACE_BASE=0x40000000 \
|
|
KERNEL_ASPACE_SIZE=0xc0000000
|
|
|
|
KERNEL_BASE ?= 0x80000000
|
|
KERNEL_LOAD_OFFSET ?= 0
|
|
|
|
GLOBAL_DEFINES += \
|
|
KERNEL_BASE=$(KERNEL_BASE) \
|
|
KERNEL_LOAD_OFFSET=$(KERNEL_LOAD_OFFSET)
|
|
|
|
# if its requested we build with SMP, arm generically supports 4 cpus
|
|
ifeq ($(WITH_SMP),1)
|
|
SMP_MAX_CPUS ?= 4
|
|
SMP_CPU_CLUSTER_SHIFT ?= 8
|
|
SMP_CPU_ID_BITS ?= 24
|
|
|
|
GLOBAL_DEFINES += \
|
|
WITH_SMP=1 \
|
|
SMP_MAX_CPUS=$(SMP_MAX_CPUS) \
|
|
SMP_CPU_CLUSTER_SHIFT=$(SMP_CPU_CLUSTER_SHIFT) \
|
|
SMP_CPU_ID_BITS=$(SMP_CPU_ID_BITS)
|
|
|
|
MODULE_SRCS += \
|
|
$(LOCAL_DIR)/arm/mp.c
|
|
else
|
|
GLOBAL_DEFINES += \
|
|
SMP_MAX_CPUS=1
|
|
endif
|
|
|
|
ifeq (true,$(call TOBOOL,$(WITH_NS_MAPPING)))
|
|
GLOBAL_DEFINES += \
|
|
WITH_ARCH_MMU_PICK_SPOT=1
|
|
endif
|
|
|
|
endif
|
|
ifeq ($(SUBARCH),arm-m)
|
|
MODULE_SRCS += \
|
|
$(LOCAL_DIR)/arm-m/arch.c \
|
|
$(LOCAL_DIR)/arm-m/cache.c \
|
|
$(LOCAL_DIR)/arm-m/exceptions.c \
|
|
$(LOCAL_DIR)/arm-m/spin_cycles.c \
|
|
$(LOCAL_DIR)/arm-m/start.c \
|
|
$(LOCAL_DIR)/arm-m/thread.c \
|
|
$(LOCAL_DIR)/arm-m/vectab.c
|
|
|
|
# we're building for small binaries
|
|
GLOBAL_DEFINES += \
|
|
ARM_ONLY_THUMB=1 \
|
|
ARCH_DEFAULT_STACK_SIZE=1024 \
|
|
SMP_MAX_CPUS=1
|
|
|
|
MODULE_DEPS += \
|
|
arch/arm/arm-m/CMSIS
|
|
|
|
ARCH_OPTFLAGS := -Os
|
|
WITH_LINKER_GC ?= 1
|
|
endif
|
|
|
|
# try to find toolchain
|
|
include $(LOCAL_DIR)/toolchain.mk
|
|
TOOLCHAIN_PREFIX := $(ARCH_$(ARCH)_TOOLCHAIN_PREFIX)
|
|
|
|
ARCH_COMPILEFLAGS += $(ARCH_$(ARCH)_COMPILEFLAGS)
|
|
ARCH_COMPILEFLAGS_NOFLOAT :=
|
|
ARCH_COMPILEFLAGS_FLOAT := $(ARCH_$(ARCH)_COMPILEFLAGS_FLOAT)
|
|
|
|
GLOBAL_COMPILEFLAGS += $(THUMBINTERWORK)
|
|
|
|
# set the max page size to something more reasonable (defaults to 64K or above)
|
|
ARCH_LDFLAGS += -z max-page-size=4096
|
|
|
|
# find the direct path to libgcc.a for our particular multilib variant
|
|
LIBGCC := $(shell $(TOOLCHAIN_PREFIX)gcc $(GLOBAL_COMPILEFLAGS) $(ARCH_COMPILEFLAGS) $(THUMBCFLAGS) -print-libgcc-file-name)
|
|
#$(info LIBGCC = $(LIBGCC))
|
|
#$(info LIBGCC COMPILEFLAGS = $(GLOBAL_COMPILEFLAGS) $(ARCH_COMPILEFLAGS) $(THUMBCFLAGS))
|
|
|
|
# make sure some bits were set up
|
|
MEMVARS_SET := 0
|
|
ifneq ($(MEMBASE),)
|
|
MEMVARS_SET := 1
|
|
endif
|
|
ifneq ($(MEMSIZE),)
|
|
MEMVARS_SET := 1
|
|
endif
|
|
ifeq ($(MEMVARS_SET),0)
|
|
$(error missing MEMBASE or MEMSIZE variable, please set in target rules.mk)
|
|
endif
|
|
|
|
GLOBAL_DEFINES += \
|
|
MEMBASE=$(MEMBASE) \
|
|
MEMSIZE=$(MEMSIZE)
|
|
|
|
# potentially generated files that should be cleaned out with clean make rule
|
|
GENERATED += \
|
|
$(BUILDDIR)/system-onesegment.ld \
|
|
$(BUILDDIR)/system-twosegment.ld
|
|
|
|
# rules for generating the linker scripts
|
|
$(BUILDDIR)/system-onesegment.ld: $(LOCAL_DIR)/system-onesegment.ld $(wildcard arch/*.ld) linkerscript.phony
|
|
@echo generating $@
|
|
@$(MKDIR)
|
|
$(NOECHO)sed "s/%MEMBASE%/$(MEMBASE)/;s/%MEMSIZE%/$(MEMSIZE)/;s/%KERNEL_BASE%/$(KERNEL_BASE)/;s/%KERNEL_LOAD_OFFSET%/$(KERNEL_LOAD_OFFSET)/" < $< > $@.tmp
|
|
@$(call TESTANDREPLACEFILE,$@.tmp,$@)
|
|
|
|
$(BUILDDIR)/system-twosegment.ld: $(LOCAL_DIR)/system-twosegment.ld $(wildcard arch/*.ld) linkerscript.phony
|
|
@echo generating $@
|
|
@$(MKDIR)
|
|
$(NOECHO)sed "s/%ROMBASE%/$(ROMBASE)/;s/%MEMBASE%/$(MEMBASE)/;s/%MEMSIZE%/$(MEMSIZE)/" < $< > $@.tmp
|
|
@$(call TESTANDREPLACEFILE,$@.tmp,$@)
|
|
|
|
linkerscript.phony:
|
|
.PHONY: linkerscript.phony
|
|
|
|
# arm specific script to try to guess stack usage
|
|
$(OUTELF).stack: LOCAL_DIR:=$(LOCAL_DIR)
|
|
$(OUTELF).stack: $(OUTELF)
|
|
$(NOECHO)echo generating stack usage $@
|
|
$(NOECHO)$(OBJDUMP) $(ARCH_OBJDUMP_FLAGS) -d $< | $(LOCAL_DIR)/stackusage | $(CPPFILT) | sort -n -k 1 -r > $@
|
|
|
|
EXTRA_BUILDDEPS += $(OUTELF).stack
|
|
GENERATED += $(OUTELF).stack
|
|
|
|
include make/module.mk
|