If a module sets MODULE_STATIC_LIB to true, that module will generate a .a file instead of a partially linked .o file. When WITH_LINKER_GC is enables, unreferenced code and data in c files are dropped from the final elf file. This does not work for most assembly files, since they put code and data directly into the .text and .data section. If a .a file is used instead however, files that have no external references are dropped regardless of which sections they have. If MODULE_STATIC_LIB is true, this change also disabled LK_INIT_HOOK* as files using this as the only entrypoint would also be dropped. Change-Id: I846ac1bf63018d1d713ca841e03191b1fac35bf4
143 lines
4.3 KiB
Makefile
143 lines
4.3 KiB
Makefile
|
|
# modules
|
|
#
|
|
# args:
|
|
# MODULE : module name (required)
|
|
# MODULE_SRCS : list of source files, local path (required)
|
|
# MODULE_STATIC_LIB : if true generate .a instead of .o
|
|
# 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)
|
|
|
|
# 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)
|
|
|
|
#$(info module $(MODULE))
|
|
#$(info MODULE_SRCDIR $(MODULE_SRCDIR))
|
|
#$(info MODULE_BUILDDIR $(MODULE_BUILDDIR))
|
|
#$(info MODULE_DEPS $(MODULE_DEPS))
|
|
#$(info MODULE_SRCS $(MODULE_SRCS))
|
|
|
|
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))\"
|
|
|
|
ifeq (true,$(call TOBOOL,$(MODULE_STATIC_LIB)))
|
|
MODULE_DEFINES += MODULE_STATIC_LIB=1
|
|
endif
|
|
|
|
# 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
|
|
ifeq (true,$(call TOBOOL,$(MODULE_STATIC_LIB)))
|
|
|
|
MODULE_OBJECT := $(call TOBUILDDIR,$(MODULE_SRCDIR).mod.a)
|
|
$(MODULE_OBJECT): $(MODULE_OBJS) $(MODULE_EXTRA_OBJS)
|
|
@$(MKDIR)
|
|
@echo creating $@
|
|
$(NOECHO)rm -f $@
|
|
$(NOECHO)$(AR) rcs $@ $^
|
|
|
|
else
|
|
|
|
MODULE_OBJECT := $(call TOBUILDDIR,$(MODULE_SRCDIR).mod.o)
|
|
$(MODULE_OBJECT): $(MODULE_OBJS) $(MODULE_EXTRA_OBJS)
|
|
@$(MKDIR)
|
|
@echo linking $@
|
|
$(NOECHO)$(LD) $(GLOBAL_MODULE_LDFLAGS) -r $^ -o $@
|
|
|
|
endif
|
|
|
|
# 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_STATIC_LIB :=
|
|
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 :=
|