Have the arch define additional compiler flags to explicit support or not support a floating point unit. Add ability for modules to per file or for the whole module mark code as needing floating point support. Add default flags for arm64, riscv, and x86 toolchains. Needed because gcc 12 is getting much more aggressive about using vector instructions for non float code, so getting away with avoiding it was no longer working. Still not perfect: printf code is being compiled with float, so it's possible to use floating point instructions inside core kernel or interrupt handling code if a printf is used. Possibly will have problems on architectures where mixing float and non float code at the linker generates issues, but so far seems to be okay.
146 lines
4.8 KiB
Makefile
146 lines
4.8 KiB
Makefile
|
|
# modules
|
|
#
|
|
# args:
|
|
# MODULE : module name (required)
|
|
# MODULE_SRCS : list of source files, local path (required)
|
|
# MODULE_FLOAT_SRCS : list of source files compiled with floating point support (if available)
|
|
# MODULE_DEPS : other modules that this one depends on
|
|
# MODULE_DEFINES : #defines local to this module
|
|
# MODULE_OPTFLAGS : OPTFLAGS local to this module
|
|
# MODULE_COMPILEFLAGS : COMPILEFLAGS local to this module
|
|
# MODULE_CFLAGS : CFLAGS local to this module
|
|
# MODULE_CPPFLAGS : CPPFLAGS local to this module
|
|
# MODULE_ASMFLAGS : ASMFLAGS local to this module
|
|
# MODULE_INCLUDES : include directories local to this module
|
|
# MODULE_SRCDEPS : extra dependencies that all of this module's files depend on
|
|
# MODULE_EXTRA_OBJS : extra .o files that should be linked with the module
|
|
|
|
# MODULE_ARM_OVERRIDE_SRCS : list of source files, local path that should be force compiled with ARM (if applicable)
|
|
|
|
# MODULE_OPTIONS : space delimited list of options
|
|
# currently defined options:
|
|
# float - module uses floating point instructions/code
|
|
|
|
# the minimum module rules.mk file is as follows:
|
|
#
|
|
# LOCAL_DIR := $(GET_LOCAL_DIR)
|
|
# MODULE := $(LOCAL_DIR)
|
|
#
|
|
# MODULE_SRCS := $(LOCAL_DIR)/at_least_one_source_file.c
|
|
#
|
|
# include make/module.mk
|
|
|
|
# test for old style rules.mk
|
|
ifneq ($(MODULE_OBJS),)
|
|
$(warning MODULE_OBJS = $(MODULE_OBJS))
|
|
$(error MODULE $(MODULE) is setting MODULE_OBJS, change to MODULE_SRCS)
|
|
endif
|
|
ifneq ($(OBJS),)
|
|
$(warning OBJS = $(OBJS))
|
|
$(error MODULE $(MODULE) is probably setting OBJS, change to MODULE_SRCS)
|
|
endif
|
|
|
|
MODULE_SRCDIR := $(MODULE)
|
|
MODULE_BUILDDIR := $(call TOBUILDDIR,$(MODULE_SRCDIR))
|
|
|
|
# add a local include dir to the global include path
|
|
GLOBAL_INCLUDES += $(MODULE_SRCDIR)/include
|
|
|
|
# add the listed module deps to the global list
|
|
MODULES += $(MODULE_DEPS)
|
|
|
|
# parse options
|
|
ifeq ($(filter float,$(MODULE_OPTIONS)),float)
|
|
# floating point option just forces all files in the module to be
|
|
# compiled with floating point compiler flags.
|
|
$(info MODULE $(MODULE) has float option)
|
|
MODULE_FLOAT_SRCS := $(sort $(MODULE_FLOAT_SRCS) $(MODULE_SRCS))
|
|
MODULE_SRCS :=
|
|
endif
|
|
|
|
#$(info module $(MODULE))
|
|
#$(info MODULE_COMPILEFLAGS = $(MODULE_COMPILEFLAGS))
|
|
#$(info MODULE_SRCDIR $(MODULE_SRCDIR))
|
|
#$(info MODULE_BUILDDIR $(MODULE_BUILDDIR))
|
|
#$(info MODULE_DEPS $(MODULE_DEPS))
|
|
#$(info MODULE_SRCS $(MODULE_SRCS))
|
|
#$(info MODULE_FLOAT_SRCS $(MODULE_SRCS))
|
|
#$(info MODULE_OPTIONS $(MODULE_OPTIONS))
|
|
|
|
MODULE_DEFINES += MODULE_NAME=\"$(subst $(SPACE),_,$(MODULE))\"
|
|
MODULE_DEFINES += MODULE_OPTIONS=\"$(subst $(SPACE),_,$(MODULE_OPTIONS))\"
|
|
MODULE_DEFINES += MODULE_COMPILEFLAGS=\"$(subst $(SPACE),_,$(MODULE_COMPILEFLAGS))\"
|
|
MODULE_DEFINES += MODULE_CFLAGS=\"$(subst $(SPACE),_,$(MODULE_CFLAGS))\"
|
|
MODULE_DEFINES += MODULE_CPPFLAGS=\"$(subst $(SPACE),_,$(MODULE_CPPFLAGS))\"
|
|
MODULE_DEFINES += MODULE_ASMFLAGS=\"$(subst $(SPACE),_,$(MODULE_ASMFLAGS))\"
|
|
MODULE_DEFINES += MODULE_LDFLAGS=\"$(subst $(SPACE),_,$(MODULE_LDFLAGS))\"
|
|
MODULE_DEFINES += MODULE_OPTFLAGS=\"$(subst $(SPACE),_,$(MODULE_OPTFLAGS))\"
|
|
MODULE_DEFINES += MODULE_INCLUDES=\"$(subst $(SPACE),_,$(MODULE_INCLUDES))\"
|
|
MODULE_DEFINES += MODULE_SRCDEPS=\"$(subst $(SPACE),_,$(MODULE_SRCDEPS))\"
|
|
MODULE_DEFINES += MODULE_DEPS=\"$(subst $(SPACE),_,$(MODULE_DEPS))\"
|
|
MODULE_DEFINES += MODULE_SRCS=\"$(subst $(SPACE),_,$(MODULE_SRCS))\"
|
|
MODULE_DEFINES += MODULE_FLOAT_SRCS=\"$(subst $(SPACE),_,$(MODULE_FLOAT_SRCS))\"
|
|
|
|
# generate a per-module config.h file
|
|
MODULE_CONFIG := $(MODULE_BUILDDIR)/module_config.h
|
|
|
|
$(MODULE_CONFIG): MODULE_DEFINES:=$(MODULE_DEFINES)
|
|
$(MODULE_CONFIG): configheader
|
|
@$(call MAKECONFIGHEADER,$@,MODULE_DEFINES)
|
|
|
|
GENERATED += $(MODULE_CONFIG)
|
|
|
|
MODULE_COMPILEFLAGS += -include $(MODULE_CONFIG)
|
|
|
|
MODULE_SRCDEPS += $(MODULE_CONFIG)
|
|
|
|
MODULE_INCLUDES := $(addprefix -I,$(MODULE_INCLUDES))
|
|
|
|
# include the rules to compile the module's object files
|
|
include make/compile.mk
|
|
|
|
# MODULE_OBJS is passed back from compile.mk
|
|
#$(info MODULE_OBJS = $(MODULE_OBJS))
|
|
|
|
# build a ld -r style combined object
|
|
MODULE_OBJECT := $(call TOBUILDDIR,$(MODULE_SRCDIR).mod.o)
|
|
$(MODULE_OBJECT): $(MODULE_OBJS) $(MODULE_EXTRA_OBJS)
|
|
@$(MKDIR)
|
|
$(info linking $@)
|
|
$(NOECHO)$(LD) $(GLOBAL_MODULE_LDFLAGS) -r $^ -o $@
|
|
|
|
# track all of the source files compiled
|
|
ALLSRCS += $(MODULE_SRCS)
|
|
|
|
# track all the objects built
|
|
ALLOBJS += $(MODULE_OBJS)
|
|
|
|
# track the module object for make clean
|
|
GENERATED += $(MODULE_OBJECT)
|
|
|
|
# make the rest of the build depend on our output
|
|
ALLMODULE_OBJS := $(ALLMODULE_OBJS) $(MODULE_OBJECT)
|
|
|
|
# empty out any vars set here
|
|
MODULE :=
|
|
MODULE_SRCDIR :=
|
|
MODULE_BUILDDIR :=
|
|
MODULE_DEPS :=
|
|
MODULE_SRCS :=
|
|
MODULE_FLOAT_SRCS :=
|
|
MODULE_OBJS :=
|
|
MODULE_DEFINES :=
|
|
MODULE_OPTFLAGS :=
|
|
MODULE_COMPILEFLAGS :=
|
|
MODULE_CFLAGS :=
|
|
MODULE_CPPFLAGS :=
|
|
MODULE_ASMFLAGS :=
|
|
MODULE_SRCDEPS :=
|
|
MODULE_INCLUDES :=
|
|
MODULE_EXTRA_OBJS :=
|
|
MODULE_CONFIG :=
|
|
MODULE_OBJECT :=
|
|
MODULE_ARM_OVERRIDE_SRCS :=
|
|
MODULE_OPTIONS :=
|