kbuild: Add support for DT binding schema checks
This adds the build infrastructure for checking DT binding schema documents and validating dts files using the binding schema. Check DT binding schema documents: make dt_binding_check Build dts files and check using DT binding schema: make dtbs_check Optionally, DT_SCHEMA_FILES can be passed in with a schema file(s) to use for validation. This makes it easier to find and fix errors generated by a specific schema. Currently, the validation targets are separate from a normal build to avoid a hard dependency on the external DT schema project and because there are lots of warnings generated. Cc: Jonathan Corbet <corbet@lwn.net> Cc: Mark Rutland <mark.rutland@arm.com> Acked-by: Masahiro Yamada <yamada.masahiro@socionext.com> Cc: Michal Marek <michal.lkml@markovi.net> Cc: linux-doc@vger.kernel.org Cc: devicetree@vger.kernel.org Cc: linux-kbuild@vger.kernel.org Signed-off-by: Rob Herring <robh@kernel.org>
This commit is contained in:
parent
ccda4af0f4
commit
4f0e3a57d6
|
@ -15,6 +15,7 @@
|
||||||
*.bin
|
*.bin
|
||||||
*.bz2
|
*.bz2
|
||||||
*.c.[012]*.*
|
*.c.[012]*.*
|
||||||
|
*.dt.yaml
|
||||||
*.dtb
|
*.dtb
|
||||||
*.dtb.S
|
*.dtb.S
|
||||||
*.dwo
|
*.dwo
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
# Makefile for Sphinx documentation
|
# Makefile for Sphinx documentation
|
||||||
#
|
#
|
||||||
|
|
||||||
subdir-y :=
|
subdir-y := devicetree/bindings/
|
||||||
|
|
||||||
# You can set these variables from the command line.
|
# You can set these variables from the command line.
|
||||||
SPHINXBUILD = sphinx-build
|
SPHINXBUILD = sphinx-build
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
*.example.dts
|
||||||
|
processed-schema.yaml
|
|
@ -0,0 +1,27 @@
|
||||||
|
# SPDX-License-Identifier: GPL-2.0
|
||||||
|
DT_DOC_CHECKER ?= dt-doc-validate
|
||||||
|
DT_EXTRACT_EX ?= dt-extract-example
|
||||||
|
DT_MK_SCHEMA ?= dt-mk-schema
|
||||||
|
DT_MK_SCHEMA_FLAGS := $(if $(DT_SCHEMA_FILES), -u)
|
||||||
|
|
||||||
|
quiet_cmd_chk_binding = CHKDT $(patsubst $(srctree)/%,%,$<)
|
||||||
|
cmd_chk_binding = $(DT_DOC_CHECKER) $< ; \
|
||||||
|
$(DT_EXTRACT_EX) $< > $@
|
||||||
|
|
||||||
|
$(obj)/%.example.dts: $(src)/%.yaml FORCE
|
||||||
|
$(call if_changed,chk_binding)
|
||||||
|
|
||||||
|
DT_TMP_SCHEMA := processed-schema.yaml
|
||||||
|
extra-y += $(DT_TMP_SCHEMA)
|
||||||
|
|
||||||
|
quiet_cmd_mk_schema = SCHEMA $@
|
||||||
|
cmd_mk_schema = $(DT_MK_SCHEMA) $(DT_MK_SCHEMA_FLAGS) -o $@ $(filter-out FORCE, $^)
|
||||||
|
|
||||||
|
DT_DOCS = $(shell cd $(srctree)/$(src) && find * -name '*.yaml')
|
||||||
|
DT_SCHEMA_FILES ?= $(addprefix $(src)/,$(DT_DOCS))
|
||||||
|
|
||||||
|
extra-y += $(patsubst $(src)/%.yaml,%.example.dts, $(DT_SCHEMA_FILES))
|
||||||
|
extra-y += $(patsubst $(src)/%.yaml,%.example.dtb, $(DT_SCHEMA_FILES))
|
||||||
|
|
||||||
|
$(obj)/$(DT_TMP_SCHEMA): $(DT_SCHEMA_FILES) FORCE
|
||||||
|
$(call if_changed,mk_schema)
|
13
Makefile
13
Makefile
|
@ -1232,10 +1232,13 @@ ifneq ($(dtstree),)
|
||||||
%.dtb: prepare3 scripts_dtc
|
%.dtb: prepare3 scripts_dtc
|
||||||
$(Q)$(MAKE) $(build)=$(dtstree) $(dtstree)/$@
|
$(Q)$(MAKE) $(build)=$(dtstree) $(dtstree)/$@
|
||||||
|
|
||||||
PHONY += dtbs dtbs_install
|
PHONY += dtbs dtbs_install dt_binding_check
|
||||||
dtbs: prepare3 scripts_dtc
|
dtbs dtbs_check: prepare3 scripts_dtc
|
||||||
$(Q)$(MAKE) $(build)=$(dtstree)
|
$(Q)$(MAKE) $(build)=$(dtstree)
|
||||||
|
|
||||||
|
dtbs_check: export CHECK_DTBS=1
|
||||||
|
dtbs_check: dt_binding_check
|
||||||
|
|
||||||
dtbs_install:
|
dtbs_install:
|
||||||
$(Q)$(MAKE) $(dtbinst)=$(dtstree)
|
$(Q)$(MAKE) $(dtbinst)=$(dtstree)
|
||||||
|
|
||||||
|
@ -1249,6 +1252,9 @@ PHONY += scripts_dtc
|
||||||
scripts_dtc: scripts_basic
|
scripts_dtc: scripts_basic
|
||||||
$(Q)$(MAKE) $(build)=scripts/dtc
|
$(Q)$(MAKE) $(build)=scripts/dtc
|
||||||
|
|
||||||
|
dt_binding_check: scripts_dtc
|
||||||
|
$(Q)$(MAKE) $(build)=Documentation/devicetree/bindings
|
||||||
|
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
# Modules
|
# Modules
|
||||||
|
|
||||||
|
@ -1611,7 +1617,8 @@ clean: $(clean-dirs)
|
||||||
$(call cmd,rmfiles)
|
$(call cmd,rmfiles)
|
||||||
@find $(if $(KBUILD_EXTMOD), $(KBUILD_EXTMOD), .) $(RCS_FIND_IGNORE) \
|
@find $(if $(KBUILD_EXTMOD), $(KBUILD_EXTMOD), .) $(RCS_FIND_IGNORE) \
|
||||||
\( -name '*.[aios]' -o -name '*.ko' -o -name '.*.cmd' \
|
\( -name '*.[aios]' -o -name '*.ko' -o -name '.*.cmd' \
|
||||||
-o -name '*.ko.*' -o -name '*.dtb' -o -name '*.dtb.S' \
|
-o -name '*.ko.*' \
|
||||||
|
-o -name '*.dtb' -o -name '*.dtb.S' -o -name '*.dt.yaml' \
|
||||||
-o -name '*.dwo' -o -name '*.lst' \
|
-o -name '*.dwo' -o -name '*.lst' \
|
||||||
-o -name '*.su' \
|
-o -name '*.su' \
|
||||||
-o -name '.*.d' -o -name '.*.tmp' -o -name '*.mod.c' \
|
-o -name '.*.d' -o -name '.*.tmp' -o -name '*.mod.c' \
|
||||||
|
|
|
@ -61,6 +61,11 @@ real-obj-m := $(foreach m, $(obj-m), $(if $(strip $($(m:.o=-objs)) $($(m:.o=-y))
|
||||||
extra-y += $(dtb-y)
|
extra-y += $(dtb-y)
|
||||||
extra-$(CONFIG_OF_ALL_DTBS) += $(dtb-)
|
extra-$(CONFIG_OF_ALL_DTBS) += $(dtb-)
|
||||||
|
|
||||||
|
ifneq ($(CHECK_DTBS),)
|
||||||
|
extra-y += $(patsubst %.dtb,%.dt.yaml, $(dtb-y))
|
||||||
|
extra-$(CONFIG_OF_ALL_DTBS) += $(patsubst %.dtb,%.dt.yaml, $(dtb-))
|
||||||
|
endif
|
||||||
|
|
||||||
# Add subdir path
|
# Add subdir path
|
||||||
|
|
||||||
extra-y := $(addprefix $(obj)/,$(extra-y))
|
extra-y := $(addprefix $(obj)/,$(extra-y))
|
||||||
|
@ -284,13 +289,28 @@ $(obj)/%.dtb.S: $(obj)/%.dtb FORCE
|
||||||
quiet_cmd_dtc = DTC $@
|
quiet_cmd_dtc = DTC $@
|
||||||
cmd_dtc = mkdir -p $(dir ${dtc-tmp}) ; \
|
cmd_dtc = mkdir -p $(dir ${dtc-tmp}) ; \
|
||||||
$(HOSTCC) -E $(dtc_cpp_flags) -x assembler-with-cpp -o $(dtc-tmp) $< ; \
|
$(HOSTCC) -E $(dtc_cpp_flags) -x assembler-with-cpp -o $(dtc-tmp) $< ; \
|
||||||
$(DTC) -O dtb -o $@ -b 0 \
|
$(DTC) -O $(2) -o $@ -b 0 \
|
||||||
$(addprefix -i,$(dir $<) $(DTC_INCLUDE)) $(DTC_FLAGS) \
|
$(addprefix -i,$(dir $<) $(DTC_INCLUDE)) $(DTC_FLAGS) \
|
||||||
-d $(depfile).dtc.tmp $(dtc-tmp) ; \
|
-d $(depfile).dtc.tmp $(dtc-tmp) ; \
|
||||||
cat $(depfile).pre.tmp $(depfile).dtc.tmp > $(depfile)
|
cat $(depfile).pre.tmp $(depfile).dtc.tmp > $(depfile)
|
||||||
|
|
||||||
$(obj)/%.dtb: $(src)/%.dts $(DTC) FORCE
|
$(obj)/%.dtb: $(src)/%.dts $(DTC) FORCE
|
||||||
$(call if_changed_dep,dtc)
|
$(call if_changed_dep,dtc,dtb)
|
||||||
|
|
||||||
|
DT_CHECKER ?= dt-validate
|
||||||
|
DT_BINDING_DIR := Documentation/devicetree/bindings
|
||||||
|
DT_TMP_SCHEMA := $(objtree)/$(DT_BINDING_DIR)/processed-schema.yaml
|
||||||
|
|
||||||
|
quiet_cmd_dtb_check = CHECK $@
|
||||||
|
cmd_dtb_check = $(DT_CHECKER) -p $(DT_TMP_SCHEMA) $@ ;
|
||||||
|
|
||||||
|
define rule_dtc_dt_yaml
|
||||||
|
$(call cmd_and_fixdep,dtc,yaml) \
|
||||||
|
$(call echo-cmd,dtb_check) $(cmd_dtb_check)
|
||||||
|
endef
|
||||||
|
|
||||||
|
$(obj)/%.dt.yaml: $(src)/%.dts $(DTC) $(DT_TMP_SCHEMA) FORCE
|
||||||
|
$(call if_changed_rule,dtc_dt_yaml)
|
||||||
|
|
||||||
dtc-tmp = $(subst $(comma),_,$(dot-target).dts.tmp)
|
dtc-tmp = $(subst $(comma),_,$(dot-target).dts.tmp)
|
||||||
|
|
||||||
|
|
|
@ -12,6 +12,10 @@ dtc-objs += dtc-lexer.lex.o dtc-parser.tab.o
|
||||||
HOST_EXTRACFLAGS := -I$(src)/libfdt
|
HOST_EXTRACFLAGS := -I$(src)/libfdt
|
||||||
|
|
||||||
ifeq ($(wildcard /usr/include/yaml.h),)
|
ifeq ($(wildcard /usr/include/yaml.h),)
|
||||||
|
ifneq ($(CHECK_DTBS),)
|
||||||
|
$(error dtc needs libyaml for DT schema validation support. \
|
||||||
|
Install the necessary libyaml development package.)
|
||||||
|
endif
|
||||||
HOST_EXTRACFLAGS += -DNO_YAML
|
HOST_EXTRACFLAGS += -DNO_YAML
|
||||||
else
|
else
|
||||||
dtc-objs += yamltree.o
|
dtc-objs += yamltree.o
|
||||||
|
|
Loading…
Reference in New Issue