mirror of
https://github.com/ivoszbg/uniLoader.git
synced 2024-12-04 17:51:10 +00:00
285 lines
7.9 KiB
Makefile
285 lines
7.9 KiB
Makefile
|
# ==========================================================================
|
||
|
# Building
|
||
|
# ==========================================================================
|
||
|
|
||
|
src := $(obj)
|
||
|
|
||
|
PHONY := __build
|
||
|
__build:
|
||
|
|
||
|
# Init all relevant variables used in kbuild files so
|
||
|
# 1) they have correct type
|
||
|
# 2) they do not inherit any value from the environment
|
||
|
obj-y :=
|
||
|
lib-y :=
|
||
|
soc-y :=
|
||
|
always :=
|
||
|
targets :=
|
||
|
subdir-y :=
|
||
|
EXTRA_AFLAGS :=
|
||
|
EXTRA_CFLAGS :=
|
||
|
EXTRA_CPPFLAGS :=
|
||
|
EXTRA_LDFLAGS :=
|
||
|
asflags-y :=
|
||
|
ccflags-y :=
|
||
|
cppflags-y :=
|
||
|
ldflags-y :=
|
||
|
|
||
|
subdir-asflags-y :=
|
||
|
subdir-ccflags-y :=
|
||
|
|
||
|
# Read auto.conf if it exists, otherwise ignore
|
||
|
-include include/config/auto.conf
|
||
|
|
||
|
include scripts/Kbuild.include
|
||
|
|
||
|
# For backward compatibility check that these variables do not change
|
||
|
save-cflags := $(CFLAGS)
|
||
|
|
||
|
# The filename Kbuild has precedence over Makefile
|
||
|
kbuild-dir := $(if $(filter /%,$(src)),$(src),$(srctree)/$(src))
|
||
|
kbuild-file := $(if $(wildcard $(kbuild-dir)/Kbuild),$(kbuild-dir)/Kbuild,$(kbuild-dir)/Makefile)
|
||
|
include $(kbuild-file)
|
||
|
|
||
|
# If the save-* variables changed error out
|
||
|
ifeq ($(KBUILD_NOPEDANTIC),)
|
||
|
ifneq ("$(save-cflags)","$(CFLAGS)")
|
||
|
$(error CFLAGS was changed in "$(kbuild-file)". Fix it to use EXTRA_CFLAGS)
|
||
|
endif
|
||
|
endif
|
||
|
|
||
|
#
|
||
|
# make W=... settings
|
||
|
#
|
||
|
# W=1 - warnings that may be relevant and does not occur too often
|
||
|
# W=2 - warnings that occur quite often but may still be relevant
|
||
|
# W=3 - the more obscure warnings, can most likely be ignored
|
||
|
#
|
||
|
# $(call cc-option, -W...) handles gcc -W.. options which
|
||
|
# are not supported by all versions of the compiler
|
||
|
ifdef KBUILD_ENABLE_EXTRA_GCC_CHECKS
|
||
|
warning- := $(empty)
|
||
|
|
||
|
warning-1 := -Wextra -Wunused -Wno-unused-parameter
|
||
|
warning-1 += -Wmissing-declarations
|
||
|
warning-1 += -Wmissing-format-attribute
|
||
|
warning-1 += -Wmissing-prototypes
|
||
|
warning-1 += -Wold-style-definition
|
||
|
warning-1 += $(call cc-option, -Wmissing-include-dirs)
|
||
|
warning-1 += $(call cc-option, -Wunused-but-set-variable)
|
||
|
|
||
|
warning-2 := -Waggregate-return
|
||
|
warning-2 += -Wcast-align
|
||
|
warning-2 += -Wdisabled-optimization
|
||
|
warning-2 += -Wnested-externs
|
||
|
warning-2 += -Wshadow
|
||
|
warning-2 += $(call cc-option, -Wlogical-op)
|
||
|
|
||
|
warning-3 := -Wbad-function-cast
|
||
|
warning-3 += -Wcast-qual
|
||
|
warning-3 += -Wconversion
|
||
|
warning-3 += -Wpacked
|
||
|
warning-3 += -Wpadded
|
||
|
warning-3 += -Wpointer-arith
|
||
|
warning-3 += -Wredundant-decls
|
||
|
warning-3 += -Wswitch-default
|
||
|
warning-3 += $(call cc-option, -Wpacked-bitfield-compat)
|
||
|
warning-3 += $(call cc-option, -Wvla)
|
||
|
|
||
|
warning := $(warning-$(findstring 1, $(KBUILD_ENABLE_EXTRA_GCC_CHECKS)))
|
||
|
warning += $(warning-$(findstring 2, $(KBUILD_ENABLE_EXTRA_GCC_CHECKS)))
|
||
|
warning += $(warning-$(findstring 3, $(KBUILD_ENABLE_EXTRA_GCC_CHECKS)))
|
||
|
|
||
|
ifeq ("$(strip $(warning))","")
|
||
|
$(error W=$(KBUILD_ENABLE_EXTRA_GCC_CHECKS) is unknown)
|
||
|
endif
|
||
|
|
||
|
KBUILD_CFLAGS += $(warning)
|
||
|
endif
|
||
|
|
||
|
include scripts/Makefile.lib
|
||
|
|
||
|
# Do not include host rules unless needed
|
||
|
ifneq ($(hostprogs-y),)
|
||
|
include scripts/Makefile.host
|
||
|
endif
|
||
|
|
||
|
ifneq ($(KBUILD_SRC),)
|
||
|
# Create output directory if not already present
|
||
|
_dummy := $(shell [ -d $(obj) ] || mkdir -p $(obj))
|
||
|
|
||
|
# Create directories for object files if directory does not exist
|
||
|
# Needed when obj-y := dir/file.o syntax is used
|
||
|
_dummy := $(foreach d,$(obj-dirs), $(shell [ -d $(d) ] || mkdir -p $(d)))
|
||
|
endif
|
||
|
|
||
|
ifndef obj
|
||
|
$(warning kbuild: Makefile.build is included improperly)
|
||
|
endif
|
||
|
|
||
|
# ===========================================================================
|
||
|
|
||
|
ifneq ($(strip $(lib-y) $(lib-)),)
|
||
|
lib-target := $(obj)/lib.a
|
||
|
endif
|
||
|
|
||
|
ifneq ($(strip $(obj-y) $(obj-)),)
|
||
|
builtin-target := $(obj)/built-in.o
|
||
|
endif
|
||
|
|
||
|
__build: $(builtin-target) $(lib-target) $(extra-y) $(subdir-ym) $(always)
|
||
|
@:
|
||
|
|
||
|
# Compile C sources (.c)
|
||
|
# ---------------------------------------------------------------------------
|
||
|
|
||
|
# Default is built-in, unless we know otherwise
|
||
|
modkern_cflags = $(KBUILD_CFLAGS_KERNEL) $(CFLAGS_KERNEL)
|
||
|
quiet_modtag := $(empty) $(empty)
|
||
|
|
||
|
quiet_cmd_cc_s_c = CC $(quiet_modtag) $@
|
||
|
cmd_cc_s_c = $(CC) $(c_flags) -fverbose-asm -S -o $@ $<
|
||
|
|
||
|
$(obj)/%.s: $(src)/%.c FORCE
|
||
|
$(call if_changed_dep,cc_s_c)
|
||
|
|
||
|
quiet_cmd_cc_i_c = CPP $(quiet_modtag) $@
|
||
|
cmd_cc_i_c = $(CPP) $(c_flags) -o $@ $<
|
||
|
|
||
|
$(obj)/%.i: $(src)/%.c FORCE
|
||
|
$(call if_changed_dep,cc_i_c)
|
||
|
|
||
|
# C (.c) files
|
||
|
# The C file is compiled and updated dependency information is generated.
|
||
|
# (See cmd_cc_o_c + relevant part of rule_cc_o_c)
|
||
|
|
||
|
quiet_cmd_cc_o_c = CC $(quiet_modtag) $@
|
||
|
cmd_cc_o_c = $(CC) $(c_flags) -c -o $@ $<
|
||
|
|
||
|
define rule_cc_o_c
|
||
|
$(call echo-cmd,cc_o_c) $(cmd_cc_o_c); \
|
||
|
scripts/basic/fixdep $(depfile) $@ '$(call make-cmd,cc_o_c)' > \
|
||
|
$(dot-target).tmp; \
|
||
|
rm -f $(depfile); \
|
||
|
mv -f $(dot-target).tmp $(dot-target).cmd
|
||
|
endef
|
||
|
|
||
|
# Built-in and composite module parts
|
||
|
$(obj)/%.o: $(src)/%.c FORCE
|
||
|
$(call if_changed_rule,cc_o_c)
|
||
|
|
||
|
quiet_cmd_cc_lst_c = MKLST $@
|
||
|
cmd_cc_lst_c = $(CC) $(c_flags) -g -c -o $*.o $< && \
|
||
|
$(CONFIG_SHELL) $(srctree)/scripts/makelst $*.o \
|
||
|
System.map $(OBJDUMP) > $@
|
||
|
|
||
|
$(obj)/%.lst: $(src)/%.c FORCE
|
||
|
$(call if_changed_dep,cc_lst_c)
|
||
|
|
||
|
# Compile assembler sources (.S)
|
||
|
# ---------------------------------------------------------------------------
|
||
|
|
||
|
modkern_aflags := $(KBUILD_AFLAGS_KERNEL) $(AFLAGS_KERNEL)
|
||
|
|
||
|
quiet_cmd_as_s_S = CPP $(quiet_modtag) $@
|
||
|
cmd_as_s_S = $(CPP) $(a_flags) -o $@ $<
|
||
|
|
||
|
$(obj)/%.s: $(src)/%.S FORCE
|
||
|
$(call if_changed_dep,as_s_S)
|
||
|
|
||
|
quiet_cmd_as_o_S = AS $(quiet_modtag) $@
|
||
|
cmd_as_o_S = $(CC) $(a_flags) -c -o $@ $<
|
||
|
|
||
|
$(obj)/%.o: $(src)/%.S FORCE
|
||
|
$(call if_changed_dep,as_o_S)
|
||
|
|
||
|
targets += $(real-objs-y) $(lib-y)
|
||
|
targets += $(real-objs-y) $(soc-y)
|
||
|
targets += $(extra-y) $(MAKECMDGOALS) $(always)
|
||
|
|
||
|
# Linker scripts preprocessor (.lds.S -> .lds)
|
||
|
# ---------------------------------------------------------------------------
|
||
|
quiet_cmd_cpp_lds_S = LDS $@
|
||
|
cmd_cpp_lds_S = $(CPP) $(cpp_flags) -P -C -U$(ARCH) \
|
||
|
-D__ASSEMBLY__ -DLINKER_SCRIPT -o $@ $<
|
||
|
|
||
|
$(obj)/%.lds: $(src)/%.lds.S FORCE
|
||
|
$(call if_changed_dep,cpp_lds_S)
|
||
|
|
||
|
# Build the compiled-in targets
|
||
|
# ---------------------------------------------------------------------------
|
||
|
|
||
|
# To build objects in subdirs, we need to descend into the directories
|
||
|
$(sort $(subdir-obj-y)): $(subdir-ym) ;
|
||
|
|
||
|
#
|
||
|
# Rule to compile a set of .o files into one .o file
|
||
|
#
|
||
|
ifdef builtin-target
|
||
|
quiet_cmd_link_o_target = LD $@
|
||
|
# If the list of objects to link is empty, just create an empty built-in.o
|
||
|
cmd_link_o_target = $(if $(strip $(obj-y)),\
|
||
|
$(LD) $(ld_flags) -r -o $@ $(filter $(obj-y), $^), \
|
||
|
rm -f $@; $(AR) rcs$(KBUILD_ARFLAGS) $@)
|
||
|
|
||
|
$(builtin-target): $(obj-y) FORCE
|
||
|
$(call if_changed,link_o_target)
|
||
|
|
||
|
targets += $(builtin-target)
|
||
|
endif # builtin-target
|
||
|
|
||
|
#
|
||
|
# Rule to compile a set of .o files into one .a file
|
||
|
#
|
||
|
ifdef lib-target
|
||
|
quiet_cmd_link_l_target = AR $@
|
||
|
cmd_link_l_target = rm -f $@; $(AR) rcs$(KBUILD_ARFLAGS) $@ $(lib-y)
|
||
|
|
||
|
$(lib-target): $(lib-y) FORCE
|
||
|
$(call if_changed,link_l_target)
|
||
|
|
||
|
targets += $(lib-target)
|
||
|
endif
|
||
|
|
||
|
ifdef soc-target
|
||
|
quiet_cmd_link_l_target = AR $@
|
||
|
cmd_link_l_target = rm -f $@; $(AR) rcs$(KBUILD_ARFLAGS) $@ $(soc-y)
|
||
|
|
||
|
$(soc-target): $(soc-y) FORCE
|
||
|
$(call if_changed,link_l_target)
|
||
|
|
||
|
targets += $(soc-target)
|
||
|
endif
|
||
|
|
||
|
|
||
|
# Descending
|
||
|
# ---------------------------------------------------------------------------
|
||
|
|
||
|
PHONY += $(subdir-ym)
|
||
|
$(subdir-ym):
|
||
|
$(Q)$(MAKE) $(build)=$@
|
||
|
|
||
|
# Add FORCE to the prequisites of a target to force it to be always rebuilt.
|
||
|
# ---------------------------------------------------------------------------
|
||
|
|
||
|
PHONY += FORCE
|
||
|
|
||
|
FORCE:
|
||
|
|
||
|
# Read all saved command lines and dependencies for the $(targets) we
|
||
|
# may be building above, using $(if_changed{,_dep}). As an
|
||
|
# optimization, we don't need to read them if the target does not
|
||
|
# exist, we will rebuild anyway in that case.
|
||
|
|
||
|
targets := $(wildcard $(sort $(targets)))
|
||
|
cmd_files := $(wildcard $(foreach f,$(targets),$(dir $(f)).$(notdir $(f)).cmd))
|
||
|
|
||
|
ifneq ($(cmd_files),)
|
||
|
include $(cmd_files)
|
||
|
endif
|
||
|
|
||
|
# Declare the contents of the .PHONY variable as phony. We keep that
|
||
|
# information in a variable se we can use it in if_changed and friends.
|
||
|
|
||
|
.PHONY: $(PHONY)
|