1*22ce4affSfengbojiang
2*22ce4affSfengbojiangDTC ?= dtc
3*22ce4affSfengbojiangCPP ?= cpp
4*22ce4affSfengbojiang
5*22ce4affSfengbojiang# Disable noisy checks by default
6*22ce4affSfengbojiangifeq ($(findstring 1,$(DTC_VERBOSE)),)
7*22ce4affSfengbojiangDTC_FLAGS += -Wno-unit_address_vs_reg \
8*22ce4affSfengbojiang        -Wno-unit_address_format \
9*22ce4affSfengbojiang        -Wno-avoid_unnecessary_addr_size \
10*22ce4affSfengbojiang        -Wno-alias_paths \
11*22ce4affSfengbojiang        -Wno-graph_child_address \
12*22ce4affSfengbojiang        -Wno-simple_bus_reg \
13*22ce4affSfengbojiang        -Wno-unique_unit_address \
14*22ce4affSfengbojiang        -Wno-pci_device_reg
15*22ce4affSfengbojiangendif
16*22ce4affSfengbojiang
17*22ce4affSfengbojiangifneq ($(findstring 2,$(DTC_VERBOSE)),)
18*22ce4affSfengbojiangDTC_FLAGS += -Wnode_name_chars_strict \
19*22ce4affSfengbojiang        -Wproperty_name_chars_strict
20*22ce4affSfengbojiangendif
21*22ce4affSfengbojiang
22*22ce4affSfengbojiangMAKEFLAGS += -rR --no-print-directory
23*22ce4affSfengbojiang
24*22ce4affSfengbojiangALL_ARCHES := $(patsubst src/%,%,$(wildcard src/*))
25*22ce4affSfengbojiang
26*22ce4affSfengbojiangPHONY += all
27*22ce4affSfengbojiangall: $(foreach i,$(ALL_ARCHES),all_$(i))
28*22ce4affSfengbojiang
29*22ce4affSfengbojiangPHONY += clean
30*22ce4affSfengbojiangclean: $(foreach i,$(ALL_ARCHES),clean_$(i))
31*22ce4affSfengbojiang
32*22ce4affSfengbojiang# Do not:
33*22ce4affSfengbojiang# o  use make's built-in rules and variables
34*22ce4affSfengbojiang#    (this increases performance and avoids hard-to-debug behaviour);
35*22ce4affSfengbojiang# o  print "Entering directory ...";
36*22ce4affSfengbojiangMAKEFLAGS += -rR --no-print-directory
37*22ce4affSfengbojiang
38*22ce4affSfengbojiang# To put more focus on warnings, be less verbose as default
39*22ce4affSfengbojiang# Use 'make V=1' to see the full commands
40*22ce4affSfengbojiang
41*22ce4affSfengbojiangifeq ("$(origin V)", "command line")
42*22ce4affSfengbojiang  KBUILD_VERBOSE = $(V)
43*22ce4affSfengbojiangendif
44*22ce4affSfengbojiangifndef KBUILD_VERBOSE
45*22ce4affSfengbojiang  KBUILD_VERBOSE = 0
46*22ce4affSfengbojiangendif
47*22ce4affSfengbojiang
48*22ce4affSfengbojiang# Beautify output
49*22ce4affSfengbojiang# ---------------------------------------------------------------------------
50*22ce4affSfengbojiang#
51*22ce4affSfengbojiang# Normally, we echo the whole command before executing it. By making
52*22ce4affSfengbojiang# that echo $($(quiet)$(cmd)), we now have the possibility to set
53*22ce4affSfengbojiang# $(quiet) to choose other forms of output instead, e.g.
54*22ce4affSfengbojiang#
55*22ce4affSfengbojiang#         quiet_cmd_cc_o_c = Compiling $(RELDIR)/$@
56*22ce4affSfengbojiang#         cmd_cc_o_c       = $(CC) $(c_flags) -c -o $@ $<
57*22ce4affSfengbojiang#
58*22ce4affSfengbojiang# If $(quiet) is empty, the whole command will be printed.
59*22ce4affSfengbojiang# If it is set to "quiet_", only the short version will be printed.
60*22ce4affSfengbojiang# If it is set to "silent_", nothing will be printed at all, since
61*22ce4affSfengbojiang# the variable $(silent_cmd_cc_o_c) doesn't exist.
62*22ce4affSfengbojiang#
63*22ce4affSfengbojiang# A simple variant is to prefix commands with $(Q) - that's useful
64*22ce4affSfengbojiang# for commands that shall be hidden in non-verbose mode.
65*22ce4affSfengbojiang#
66*22ce4affSfengbojiang#       $(Q)ln $@ :<
67*22ce4affSfengbojiang#
68*22ce4affSfengbojiang# If KBUILD_VERBOSE equals 0 then the above command will be hidden.
69*22ce4affSfengbojiang# If KBUILD_VERBOSE equals 1 then the above command is displayed.
70*22ce4affSfengbojiang
71*22ce4affSfengbojiangifeq ($(KBUILD_VERBOSE),1)
72*22ce4affSfengbojiang  quiet =
73*22ce4affSfengbojiang  Q =
74*22ce4affSfengbojiangelse
75*22ce4affSfengbojiang  quiet=quiet_
76*22ce4affSfengbojiang  Q = @
77*22ce4affSfengbojiangendif
78*22ce4affSfengbojiang
79*22ce4affSfengbojiang# If the user is running make -s (silent mode), suppress echoing of
80*22ce4affSfengbojiang# commands
81*22ce4affSfengbojiang
82*22ce4affSfengbojiangifneq ($(filter 4.%,$(MAKE_VERSION)),)	# make-4
83*22ce4affSfengbojiangifneq ($(filter %s ,$(firstword x$(MAKEFLAGS))),)
84*22ce4affSfengbojiang  quiet=silent_
85*22ce4affSfengbojiangendif
86*22ce4affSfengbojiangelse					# make-3.8x
87*22ce4affSfengbojiangifneq ($(filter s% -s%,$(MAKEFLAGS)),)
88*22ce4affSfengbojiang  quiet=silent_
89*22ce4affSfengbojiangendif
90*22ce4affSfengbojiangendif
91*22ce4affSfengbojiang
92*22ce4affSfengbojiangexport quiet Q KBUILD_VERBOSE
93*22ce4affSfengbojiang
94*22ce4affSfengbojiangall_%:
95*22ce4affSfengbojiang	$(Q)$(MAKE) ARCH=$* all_arch
96*22ce4affSfengbojiang
97*22ce4affSfengbojiangclean_%:
98*22ce4affSfengbojiang	$(Q)$(MAKE) ARCH=$* clean_arch
99*22ce4affSfengbojiang
100*22ce4affSfengbojiangifeq ($(ARCH),)
101*22ce4affSfengbojiang
102*22ce4affSfengbojiangALL_DTS		:= $(shell find src/* -name \*.dts)
103*22ce4affSfengbojiang
104*22ce4affSfengbojiangALL_DTB		:= $(patsubst %.dts,%.dtb,$(ALL_DTS))
105*22ce4affSfengbojiang
106*22ce4affSfengbojiang$(ALL_DTB): ARCH=$(word 2,$(subst /, ,$@))
107*22ce4affSfengbojiang$(ALL_DTB): FORCE
108*22ce4affSfengbojiang	$(Q)$(MAKE) ARCH=$(ARCH) $@
109*22ce4affSfengbojiang
110*22ce4affSfengbojiangelse
111*22ce4affSfengbojiang
112*22ce4affSfengbojiangARCH_DTS	:= $(shell find src/$(ARCH) -name \*.dts)
113*22ce4affSfengbojiang
114*22ce4affSfengbojiangARCH_DTB	:= $(patsubst %.dts,%.dtb,$(ARCH_DTS))
115*22ce4affSfengbojiang
116*22ce4affSfengbojiangsrc	:= src/$(ARCH)
117*22ce4affSfengbojiangobj	:= src/$(ARCH)
118*22ce4affSfengbojiang
119*22ce4affSfengbojianginclude scripts/Kbuild.include
120*22ce4affSfengbojiang
121*22ce4affSfengbojiangcmd_files := $(wildcard $(foreach f,$(ARCH_DTB),$(dir $(f)).$(notdir $(f)).cmd))
122*22ce4affSfengbojiang
123*22ce4affSfengbojiangifneq ($(cmd_files),)
124*22ce4affSfengbojiang  include $(cmd_files)
125*22ce4affSfengbojiangendif
126*22ce4affSfengbojiang
127*22ce4affSfengbojiangquiet_cmd_clean    = CLEAN   $(obj)
128*22ce4affSfengbojiang      cmd_clean    = rm -f $(__clean-files)
129*22ce4affSfengbojiang
130*22ce4affSfengbojiangdtc-tmp = $(subst $(comma),_,$(dot-target).dts.tmp)
131*22ce4affSfengbojiang
132*22ce4affSfengbojiangdtc_cpp_flags  = -Wp,-MD,$(depfile).pre.tmp -nostdinc		\
133*22ce4affSfengbojiang                 -Iinclude -I$(src) -Isrc -Itestcase-data	\
134*22ce4affSfengbojiang                 -undef -D__DTS__
135*22ce4affSfengbojiang
136*22ce4affSfengbojiangquiet_cmd_dtc = DTC     $@
137*22ce4affSfengbojiangcmd_dtc = $(CPP) $(dtc_cpp_flags) -x assembler-with-cpp -o $(dtc-tmp) $< ; \
138*22ce4affSfengbojiang        $(DTC) -O dtb -o $@ -b 0 \
139*22ce4affSfengbojiang                -i $(src) $(DTC_FLAGS) \
140*22ce4affSfengbojiang                -d $(depfile).dtc.tmp $(dtc-tmp) ; \
141*22ce4affSfengbojiang        cat $(depfile).pre.tmp $(depfile).dtc.tmp > $(depfile)
142*22ce4affSfengbojiang
143*22ce4affSfengbojiang$(obj)/%.dtb: $(src)/%.dts FORCE
144*22ce4affSfengbojiang	$(call if_changed_dep,dtc)
145*22ce4affSfengbojiang
146*22ce4affSfengbojiangPHONY += all_arch
147*22ce4affSfengbojiangall_arch: $(ARCH_DTB)
148*22ce4affSfengbojiang	@:
149*22ce4affSfengbojiang
150*22ce4affSfengbojiangRCS_FIND_IGNORE := \( -name SCCS -o -name BitKeeper -o -name .svn -o -name CVS \
151*22ce4affSfengbojiang                   -o -name .pc -o -name .hg -o -name .git \) -prune -o
152*22ce4affSfengbojiang
153*22ce4affSfengbojiangPHONY += clean_arch
154*22ce4affSfengbojiangclean_arch: __clean-files = $(ARCH_DTB)
155*22ce4affSfengbojiangclean_arch: FORCE
156*22ce4affSfengbojiang	$(call cmd,clean)
157*22ce4affSfengbojiang	@find . $(RCS_FIND_IGNORE) \
158*22ce4affSfengbojiang		\( -name '.*.cmd' \
159*22ce4affSfengbojiang		-o -name '.*.d' \
160*22ce4affSfengbojiang		-o -name '.*.tmp' \
161*22ce4affSfengbojiang		\) -type f -print | xargs rm -f
162*22ce4affSfengbojiang
163*22ce4affSfengbojiangendif
164*22ce4affSfengbojiang
165*22ce4affSfengbojianghelp:
166*22ce4affSfengbojiang	@echo "Targets:"
167*22ce4affSfengbojiang	@echo "  all:                   Build all device tree binaries for all architectures"
168*22ce4affSfengbojiang	@echo "  clean:                 Clean all generated files"
169*22ce4affSfengbojiang	@echo ""
170*22ce4affSfengbojiang	@echo "  all_<ARCH>:            Build all device tree binaries for <ARCH>"
171*22ce4affSfengbojiang	@echo "  clean_<ARCH>:          Clean all generated files for <ARCH>"
172*22ce4affSfengbojiang	@echo ""
173*22ce4affSfengbojiang	@echo "  src/<ARCH>/<DTS>.dtb   Build a single device tree binary"
174*22ce4affSfengbojiang	@echo ""
175*22ce4affSfengbojiang	@echo "Architectures: $(ALL_ARCHES)"
176*22ce4affSfengbojiang
177*22ce4affSfengbojiangPHONY += FORCE
178*22ce4affSfengbojiangFORCE:
179*22ce4affSfengbojiang
180*22ce4affSfengbojiang.PHONY: $(PHONY)
181