1### 2# Main build makefile. 3# 4# Lots of this code have been borrowed or heavily inspired from parts 5# of kbuild code, which is not credited, but mostly developed by: 6# 7# Copyright (C) Sam Ravnborg <sam@mars.ravnborg.org>, 2015 8# Copyright (C) Linus Torvalds <torvalds@linux-foundation.org>, 2015 9# 10 11PHONY := __build 12__build: 13 14ifeq ($(V),1) 15 quiet = 16 Q = 17else 18 quiet=quiet_ 19 Q=@ 20endif 21 22ifneq ($(filter 4.%,$(MAKE_VERSION)),) # make-4 23ifneq ($(filter %s ,$(firstword x$(MAKEFLAGS))),) 24 quiet=silent_ 25endif 26else # make-3.8x 27ifneq ($(filter s% -s%,$(MAKEFLAGS)),) 28 quiet=silent_ 29endif 30endif 31 32build-dir := $(srctree)/tools/build 33 34# Define $(fixdep) for dep-cmd function 35ifeq ($(OUTPUT),) 36 fixdep := $(build-dir)/fixdep 37else 38 fixdep := $(OUTPUT)/fixdep 39endif 40 41# Generic definitions 42include $(build-dir)/Build.include 43 44# do not force detected configuration 45-include $(OUTPUT).config-detected 46 47# Init all relevant variables used in build files so 48# 1) they have correct type 49# 2) they do not inherit any value from the environment 50subdir-y := 51obj-y := 52subdir-y := 53subdir-obj-y := 54 55# Build definitions 56build-file := $(dir)/Build 57-include $(build-file) 58 59quiet_cmd_flex = FLEX $@ 60quiet_cmd_bison = BISON $@ 61 62# Create directory unless it exists 63quiet_cmd_mkdir = MKDIR $(dir $@) 64 cmd_mkdir = mkdir -p $(dir $@) 65 rule_mkdir = $(if $(wildcard $(dir $@)),,@$(call echo-cmd,mkdir) $(cmd_mkdir)) 66 67# Compile command 68quiet_cmd_cc_o_c = CC $@ 69 cmd_cc_o_c = $(CC) $(c_flags) -c -o $@ $< 70 71quiet_cmd_host_cc_o_c = HOSTCC $@ 72 cmd_host_cc_o_c = $(HOSTCC) $(host_c_flags) -c -o $@ $< 73 74quiet_cmd_cxx_o_c = CXX $@ 75 cmd_cxx_o_c = $(CXX) $(cxx_flags) -c -o $@ $< 76 77quiet_cmd_cpp_i_c = CPP $@ 78 cmd_cpp_i_c = $(CC) $(c_flags) -E -o $@ $< 79 80quiet_cmd_cc_s_c = AS $@ 81 cmd_cc_s_c = $(CC) $(c_flags) -S -o $@ $< 82 83quiet_cmd_gen = GEN $@ 84 85# Link agregate command 86# If there's nothing to link, create empty $@ object. 87quiet_cmd_ld_multi = LD $@ 88 cmd_ld_multi = $(if $(strip $(obj-y)),\ 89 $(LD) -r -o $@ $(filter $(obj-y),$^),rm -f $@; $(AR) rcs $@) 90 91quiet_cmd_host_ld_multi = HOSTLD $@ 92 cmd_host_ld_multi = $(if $(strip $(obj-y)),\ 93 $(HOSTLD) -r -o $@ $(filter $(obj-y),$^),rm -f $@; $(HOSTAR) rcs $@) 94 95ifneq ($(filter $(obj),$(hostprogs)),) 96 host = host_ 97endif 98 99# Build rules 100$(OUTPUT)%.o: %.c FORCE 101 $(call rule_mkdir) 102 $(call if_changed_dep,$(host)cc_o_c) 103 104$(OUTPUT)%.o: %.cpp FORCE 105 $(call rule_mkdir) 106 $(call if_changed_dep,cxx_o_c) 107 108$(OUTPUT)%.o: %.S FORCE 109 $(call rule_mkdir) 110 $(call if_changed_dep,$(host)cc_o_c) 111 112$(OUTPUT)%.i: %.c FORCE 113 $(call rule_mkdir) 114 $(call if_changed_dep,cpp_i_c) 115 116$(OUTPUT)%.s: %.S FORCE 117 $(call rule_mkdir) 118 $(call if_changed_dep,cpp_i_c) 119 120$(OUTPUT)%.s: %.c FORCE 121 $(call rule_mkdir) 122 $(call if_changed_dep,cc_s_c) 123 124# Gather build data: 125# obj-y - list of build objects 126# subdir-y - list of directories to nest 127# subdir-obj-y - list of directories objects 'dir/$(obj)-in.o' 128obj-y := $($(obj)-y) 129subdir-y := $(patsubst %/,%,$(filter %/, $(obj-y))) 130obj-y := $(patsubst %/, %/$(obj)-in.o, $(obj-y)) 131subdir-obj-y := $(filter %/$(obj)-in.o, $(obj-y)) 132 133# '$(OUTPUT)/dir' prefix to all objects 134objprefix := $(subst ./,,$(OUTPUT)$(dir)/) 135obj-y := $(addprefix $(objprefix),$(obj-y)) 136subdir-obj-y := $(addprefix $(objprefix),$(subdir-obj-y)) 137 138# Final '$(obj)-in.o' object 139in-target := $(objprefix)$(obj)-in.o 140 141PHONY += $(subdir-y) 142 143$(subdir-y): 144 $(Q)$(MAKE) -f $(build-dir)/Makefile.build dir=$(dir)/$@ obj=$(obj) 145 146$(sort $(subdir-obj-y)): $(subdir-y) ; 147 148$(in-target): $(obj-y) FORCE 149 $(call rule_mkdir) 150 $(call if_changed,$(host)ld_multi) 151 152__build: $(in-target) 153 @: 154 155PHONY += FORCE 156FORCE: 157 158# Include all cmd files to get all the dependency rules 159# for all objects included 160targets := $(wildcard $(sort $(obj-y) $(in-target) $(MAKECMDGOALS))) 161cmd_files := $(wildcard $(foreach f,$(targets),$(dir $(f)).$(notdir $(f)).cmd)) 162 163ifneq ($(cmd_files),) 164 include $(cmd_files) 165endif 166 167.PHONY: $(PHONY) 168