fdtoverlaymerge is a command-line tool that merges two or more overlay blobs by making use of fdt_overlay_merge() API Change-Id: Idcd46e630436681a4bc640e7b53bc225cf5e4287 Signed-off-by: Srivatsa Vaddagiri <vatsa@codeaurora.org> Signed-off-by: Rama Aparna Mallavarapu <aparnam@codeaurora.org>
		
			
				
	
	
		
			399 lines
		
	
	
		
			8.9 KiB
		
	
	
	
		
			Makefile
		
	
	
	
	
	
			
		
		
	
	
			399 lines
		
	
	
		
			8.9 KiB
		
	
	
	
		
			Makefile
		
	
	
	
	
	
# SPDX-License-Identifier: GPL-2.0-or-later
 | 
						|
#
 | 
						|
# Device Tree Compiler
 | 
						|
#
 | 
						|
 | 
						|
#
 | 
						|
# Version information will be constructed in this order:
 | 
						|
# EXTRAVERSION might be "-rc", for example.
 | 
						|
# LOCAL_VERSION is likely from command line.
 | 
						|
# CONFIG_LOCALVERSION from some future config system.
 | 
						|
#
 | 
						|
VERSION = 1
 | 
						|
PATCHLEVEL = 6
 | 
						|
SUBLEVEL = 1
 | 
						|
EXTRAVERSION =
 | 
						|
LOCAL_VERSION =
 | 
						|
CONFIG_LOCALVERSION =
 | 
						|
 | 
						|
# Control the assumptions made (e.g. risking security issues) in the code.
 | 
						|
# See libfdt_internal.h for details
 | 
						|
ASSUME_MASK ?= 0
 | 
						|
 | 
						|
CPPFLAGS = -I libfdt -I . -DFDT_ASSUME_MASK=$(ASSUME_MASK)
 | 
						|
WARNINGS = -Wall -Wpointer-arith -Wcast-qual -Wnested-externs -Wsign-compare \
 | 
						|
	-Wstrict-prototypes -Wmissing-prototypes -Wredundant-decls -Wshadow
 | 
						|
CFLAGS = -g -Os $(SHAREDLIB_CFLAGS) -Werror $(WARNINGS) $(EXTRA_CFLAGS)
 | 
						|
 | 
						|
BISON = bison
 | 
						|
LEX = flex
 | 
						|
SWIG = swig
 | 
						|
PKG_CONFIG ?= pkg-config
 | 
						|
PYTHON ?= python3
 | 
						|
 | 
						|
INSTALL = /usr/bin/install
 | 
						|
INSTALL_PROGRAM = $(INSTALL)
 | 
						|
INSTALL_LIB = $(INSTALL)
 | 
						|
INSTALL_DATA = $(INSTALL) -m 644
 | 
						|
INSTALL_SCRIPT = $(INSTALL)
 | 
						|
DESTDIR =
 | 
						|
PREFIX = $(HOME)
 | 
						|
BINDIR = $(PREFIX)/bin
 | 
						|
LIBDIR = $(PREFIX)/lib
 | 
						|
INCLUDEDIR = $(PREFIX)/include
 | 
						|
 | 
						|
HOSTOS := $(shell uname -s | tr '[:upper:]' '[:lower:]' | \
 | 
						|
	    sed -e 's/\(cygwin\|msys\).*/\1/')
 | 
						|
 | 
						|
NO_PYTHON ?= 0
 | 
						|
 | 
						|
NO_VALGRIND := $(shell $(PKG_CONFIG) --exists valgrind; echo $$?)
 | 
						|
ifeq ($(NO_VALGRIND),1)
 | 
						|
	CPPFLAGS += -DNO_VALGRIND
 | 
						|
else
 | 
						|
	CFLAGS += $(shell $(PKG_CONFIG) --cflags valgrind)
 | 
						|
endif
 | 
						|
 | 
						|
NO_YAML := $(shell $(PKG_CONFIG) --exists yaml-0.1; echo $$?)
 | 
						|
ifeq ($(NO_YAML),1)
 | 
						|
	CFLAGS += -DNO_YAML
 | 
						|
else
 | 
						|
	LDLIBS_dtc += $(shell $(PKG_CONFIG) --libs yaml-0.1)
 | 
						|
	CFLAGS += $(shell $(PKG_CONFIG) --cflags yaml-0.1)
 | 
						|
endif
 | 
						|
 | 
						|
ifeq ($(HOSTOS),darwin)
 | 
						|
SHAREDLIB_EXT     = dylib
 | 
						|
SHAREDLIB_CFLAGS  = -fPIC
 | 
						|
SHAREDLIB_LDFLAGS = -fPIC -dynamiclib -Wl,-install_name -Wl,
 | 
						|
else ifeq ($(HOSTOS),$(filter $(HOSTOS),msys cygwin))
 | 
						|
SHAREDLIB_EXT     = so
 | 
						|
SHAREDLIB_CFLAGS  =
 | 
						|
SHAREDLIB_LDFLAGS = -shared -Wl,--version-script=$(LIBFDT_version) -Wl,-soname,
 | 
						|
else
 | 
						|
SHAREDLIB_EXT     = so
 | 
						|
SHAREDLIB_CFLAGS  = -fPIC
 | 
						|
SHAREDLIB_LDFLAGS = -fPIC -shared -Wl,--version-script=$(LIBFDT_version) -Wl,-soname,
 | 
						|
endif
 | 
						|
 | 
						|
#
 | 
						|
# Overall rules
 | 
						|
#
 | 
						|
ifdef V
 | 
						|
VECHO = :
 | 
						|
else
 | 
						|
VECHO = echo "	"
 | 
						|
ARFLAGS = rc
 | 
						|
.SILENT:
 | 
						|
endif
 | 
						|
 | 
						|
NODEPTARGETS = clean
 | 
						|
ifeq ($(MAKECMDGOALS),)
 | 
						|
DEPTARGETS = all
 | 
						|
else
 | 
						|
DEPTARGETS = $(filter-out $(NODEPTARGETS),$(MAKECMDGOALS))
 | 
						|
endif
 | 
						|
 | 
						|
#
 | 
						|
# Rules for versioning
 | 
						|
#
 | 
						|
 | 
						|
DTC_VERSION = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)
 | 
						|
VERSION_FILE = version_gen.h
 | 
						|
 | 
						|
CONFIG_SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \
 | 
						|
	  else if [ -x /bin/bash ]; then echo /bin/bash; \
 | 
						|
	  else echo sh; fi ; fi)
 | 
						|
 | 
						|
nullstring :=
 | 
						|
space	:= $(nullstring) # end of line
 | 
						|
 | 
						|
localver_config = $(subst $(space),, $(string) \
 | 
						|
			      $(patsubst "%",%,$(CONFIG_LOCALVERSION)))
 | 
						|
 | 
						|
localver_cmd = $(subst $(space),, $(string) \
 | 
						|
			      $(patsubst "%",%,$(LOCALVERSION)))
 | 
						|
 | 
						|
localver_scm = $(shell $(CONFIG_SHELL) ./scripts/setlocalversion)
 | 
						|
localver_full  = $(localver_config)$(localver_cmd)$(localver_scm)
 | 
						|
 | 
						|
dtc_version = $(DTC_VERSION)$(localver_full)
 | 
						|
 | 
						|
# Contents of the generated version file.
 | 
						|
define filechk_version
 | 
						|
	(echo "#define DTC_VERSION \"DTC $(dtc_version)\""; )
 | 
						|
endef
 | 
						|
 | 
						|
define filechk
 | 
						|
	set -e;					\
 | 
						|
	echo '	CHK $@';			\
 | 
						|
	mkdir -p $(dir $@);			\
 | 
						|
	$(filechk_$(1)) < $< > $@.tmp;		\
 | 
						|
	if [ -r $@ ] && cmp -s $@ $@.tmp; then	\
 | 
						|
		rm -f $@.tmp;			\
 | 
						|
	else					\
 | 
						|
		echo '	UPD $@';		\
 | 
						|
		mv -f $@.tmp $@;		\
 | 
						|
	fi;
 | 
						|
endef
 | 
						|
 | 
						|
 | 
						|
include Makefile.convert-dtsv0
 | 
						|
include Makefile.dtc
 | 
						|
include Makefile.utils
 | 
						|
 | 
						|
BIN += convert-dtsv0
 | 
						|
BIN += dtc
 | 
						|
BIN += fdtdump
 | 
						|
BIN += fdtget
 | 
						|
BIN += fdtput
 | 
						|
BIN += fdtoverlay
 | 
						|
BIN += fdtoverlaymerge
 | 
						|
 | 
						|
SCRIPTS = dtdiff
 | 
						|
 | 
						|
all: $(BIN) libfdt
 | 
						|
 | 
						|
# We need both Python and swig to build/install pylibfdt.
 | 
						|
# This builds the given make ${target} if those deps are found.
 | 
						|
check_python_deps = \
 | 
						|
	if $(PKG_CONFIG) --cflags $(PYTHON) >/dev/null 2>&1; then \
 | 
						|
		if which swig >/dev/null 2>&1; then \
 | 
						|
			can_build=yes; \
 | 
						|
		fi; \
 | 
						|
	fi; \
 | 
						|
	if [ "$${can_build}" = "yes" ]; then \
 | 
						|
		$(MAKE) $${target}; \
 | 
						|
	else \
 | 
						|
		echo "\#\# Skipping pylibfdt (install python dev and swig to build)"; \
 | 
						|
	fi ;
 | 
						|
 | 
						|
.PHONY: maybe_pylibfdt
 | 
						|
maybe_pylibfdt: FORCE
 | 
						|
	target=pylibfdt; $(check_python_deps)
 | 
						|
 | 
						|
ifeq ($(NO_PYTHON),0)
 | 
						|
all: maybe_pylibfdt
 | 
						|
endif
 | 
						|
 | 
						|
 | 
						|
ifneq ($(DEPTARGETS),)
 | 
						|
ifneq ($(MAKECMDGOALS),libfdt)
 | 
						|
-include $(DTC_OBJS:%.o=%.d)
 | 
						|
-include $(CONVERT_OBJS:%.o=%.d)
 | 
						|
-include $(FDTDUMP_OBJS:%.o=%.d)
 | 
						|
-include $(FDTGET_OBJS:%.o=%.d)
 | 
						|
-include $(FDTPUT_OBJS:%.o=%.d)
 | 
						|
-include $(FDTOVERLAY_OBJS:%.o=%.d)
 | 
						|
endif
 | 
						|
endif
 | 
						|
 | 
						|
 | 
						|
 | 
						|
#
 | 
						|
# Rules for libfdt
 | 
						|
#
 | 
						|
LIBFDT_dir = libfdt
 | 
						|
LIBFDT_archive = $(LIBFDT_dir)/libfdt.a
 | 
						|
LIBFDT_lib = $(LIBFDT_dir)/$(LIBFDT_LIB)
 | 
						|
LIBFDT_include = $(addprefix $(LIBFDT_dir)/,$(LIBFDT_INCLUDES))
 | 
						|
LIBFDT_version = $(addprefix $(LIBFDT_dir)/,$(LIBFDT_VERSION))
 | 
						|
 | 
						|
ifeq ($(STATIC_BUILD),1)
 | 
						|
	CFLAGS += -static
 | 
						|
	LIBFDT_dep = $(LIBFDT_archive)
 | 
						|
else
 | 
						|
	LIBFDT_dep = $(LIBFDT_lib)
 | 
						|
endif
 | 
						|
 | 
						|
include $(LIBFDT_dir)/Makefile.libfdt
 | 
						|
 | 
						|
.PHONY: libfdt
 | 
						|
libfdt: $(LIBFDT_archive) $(LIBFDT_lib)
 | 
						|
 | 
						|
$(LIBFDT_archive): $(addprefix $(LIBFDT_dir)/,$(LIBFDT_OBJS))
 | 
						|
 | 
						|
$(LIBFDT_lib): $(addprefix $(LIBFDT_dir)/,$(LIBFDT_OBJS)) $(LIBFDT_version)
 | 
						|
	@$(VECHO) LD $@
 | 
						|
	$(CC) $(LDFLAGS) $(SHAREDLIB_LDFLAGS)$(LIBFDT_soname) -o $(LIBFDT_lib) \
 | 
						|
		$(addprefix $(LIBFDT_dir)/,$(LIBFDT_OBJS))
 | 
						|
	ln -sf $(LIBFDT_LIB) $(LIBFDT_dir)/$(LIBFDT_soname)
 | 
						|
 | 
						|
ifneq ($(DEPTARGETS),)
 | 
						|
-include $(LIBFDT_OBJS:%.o=$(LIBFDT_dir)/%.d)
 | 
						|
endif
 | 
						|
 | 
						|
# This stops make from generating the lex and bison output during
 | 
						|
# auto-dependency computation, but throwing them away as an
 | 
						|
# intermediate target and building them again "for real"
 | 
						|
.SECONDARY: $(DTC_GEN_SRCS) $(CONVERT_GEN_SRCS)
 | 
						|
 | 
						|
install-bin: all $(SCRIPTS)
 | 
						|
	@$(VECHO) INSTALL-BIN
 | 
						|
	$(INSTALL) -d $(DESTDIR)$(BINDIR)
 | 
						|
	$(INSTALL_PROGRAM) $(BIN) $(DESTDIR)$(BINDIR)
 | 
						|
	$(INSTALL_SCRIPT) $(SCRIPTS) $(DESTDIR)$(BINDIR)
 | 
						|
 | 
						|
install-lib: all
 | 
						|
	@$(VECHO) INSTALL-LIB
 | 
						|
	$(INSTALL) -d $(DESTDIR)$(LIBDIR)
 | 
						|
	$(INSTALL_LIB) $(LIBFDT_lib) $(DESTDIR)$(LIBDIR)
 | 
						|
	ln -sf $(notdir $(LIBFDT_lib)) $(DESTDIR)$(LIBDIR)/$(LIBFDT_soname)
 | 
						|
	ln -sf $(LIBFDT_soname) $(DESTDIR)$(LIBDIR)/libfdt.$(SHAREDLIB_EXT)
 | 
						|
	$(INSTALL_DATA) $(LIBFDT_archive) $(DESTDIR)$(LIBDIR)
 | 
						|
 | 
						|
install-includes:
 | 
						|
	@$(VECHO) INSTALL-INC
 | 
						|
	$(INSTALL) -d $(DESTDIR)$(INCLUDEDIR)
 | 
						|
	$(INSTALL_DATA) $(LIBFDT_include) $(DESTDIR)$(INCLUDEDIR)
 | 
						|
 | 
						|
install: install-bin install-lib install-includes
 | 
						|
 | 
						|
.PHONY: maybe_install_pylibfdt
 | 
						|
maybe_install_pylibfdt: FORCE
 | 
						|
	target=install_pylibfdt; $(check_python_deps)
 | 
						|
 | 
						|
ifeq ($(NO_PYTHON),0)
 | 
						|
install: maybe_install_pylibfdt
 | 
						|
endif
 | 
						|
 | 
						|
$(VERSION_FILE): Makefile FORCE
 | 
						|
	$(call filechk,version)
 | 
						|
 | 
						|
 | 
						|
dtc: $(DTC_OBJS)
 | 
						|
 | 
						|
convert-dtsv0: $(CONVERT_OBJS)
 | 
						|
	@$(VECHO) LD $@
 | 
						|
	$(LINK.c) -o $@ $^
 | 
						|
 | 
						|
fdtdump:	$(FDTDUMP_OBJS)
 | 
						|
 | 
						|
fdtget:	$(FDTGET_OBJS) $(LIBFDT_dep)
 | 
						|
 | 
						|
fdtput:	$(FDTPUT_OBJS) $(LIBFDT_dep)
 | 
						|
 | 
						|
fdtoverlay: $(FDTOVERLAY_OBJS) $(LIBFDT_dep)
 | 
						|
 | 
						|
fdtoverlaymerge: $(FDTOVERLAYMERGE_OBJS) $(LIBFDT_archive)
 | 
						|
 | 
						|
dist:
 | 
						|
	git archive --format=tar --prefix=dtc-$(dtc_version)/ HEAD \
 | 
						|
		> ../dtc-$(dtc_version).tar
 | 
						|
	cat ../dtc-$(dtc_version).tar | \
 | 
						|
		gzip -9 > ../dtc-$(dtc_version).tar.gz
 | 
						|
 | 
						|
 | 
						|
#
 | 
						|
# Rules for pylibfdt
 | 
						|
#
 | 
						|
PYLIBFDT_dir = pylibfdt
 | 
						|
 | 
						|
include $(PYLIBFDT_dir)/Makefile.pylibfdt
 | 
						|
 | 
						|
.PHONY: pylibfdt
 | 
						|
pylibfdt: $(PYLIBFDT_dir)/_libfdt.so
 | 
						|
 | 
						|
#
 | 
						|
# Release signing and uploading
 | 
						|
# This is for maintainer convenience, don't try this at home.
 | 
						|
#
 | 
						|
ifeq ($(MAINTAINER),y)
 | 
						|
GPG = gpg2
 | 
						|
KUP = kup
 | 
						|
KUPDIR = /pub/software/utils/dtc
 | 
						|
 | 
						|
kup: dist
 | 
						|
	$(GPG) --detach-sign --armor -o ../dtc-$(dtc_version).tar.sign \
 | 
						|
		../dtc-$(dtc_version).tar
 | 
						|
	$(KUP) put ../dtc-$(dtc_version).tar.gz ../dtc-$(dtc_version).tar.sign \
 | 
						|
		$(KUPDIR)/dtc-$(dtc_version).tar.gz
 | 
						|
endif
 | 
						|
 | 
						|
tags: FORCE
 | 
						|
	rm -f tags
 | 
						|
	find . \( -name tests -type d -prune \) -o \
 | 
						|
	       \( ! -name '*.tab.[ch]' ! -name '*.lex.c' \
 | 
						|
	       -name '*.[chly]' -type f -print \) | xargs ctags -a
 | 
						|
 | 
						|
#
 | 
						|
# Testsuite rules
 | 
						|
#
 | 
						|
TESTS_PREFIX=tests/
 | 
						|
 | 
						|
TESTS_BIN += dtc
 | 
						|
TESTS_BIN += convert-dtsv0
 | 
						|
TESTS_BIN += fdtput
 | 
						|
TESTS_BIN += fdtget
 | 
						|
TESTS_BIN += fdtdump
 | 
						|
TESTS_BIN += fdtoverlay
 | 
						|
ifeq ($(NO_PYTHON),0)
 | 
						|
TESTS_PYLIBFDT += maybe_pylibfdt
 | 
						|
endif
 | 
						|
 | 
						|
ifneq ($(MAKECMDGOALS),libfdt)
 | 
						|
include tests/Makefile.tests
 | 
						|
endif
 | 
						|
 | 
						|
#
 | 
						|
# Clean rules
 | 
						|
#
 | 
						|
STD_CLEANFILES = *~ *.o *.$(SHAREDLIB_EXT) *.d *.a *.i *.s core a.out vgcore.* \
 | 
						|
	*.tab.[ch] *.lex.c *.output
 | 
						|
 | 
						|
clean: libfdt_clean pylibfdt_clean tests_clean
 | 
						|
	@$(VECHO) CLEAN
 | 
						|
	rm -f $(STD_CLEANFILES)
 | 
						|
	rm -f $(VERSION_FILE)
 | 
						|
	rm -f $(BIN)
 | 
						|
	rm -f dtc-*.tar dtc-*.tar.sign dtc-*.tar.asc
 | 
						|
 | 
						|
#
 | 
						|
# Generic compile rules
 | 
						|
#
 | 
						|
%: %.o
 | 
						|
	@$(VECHO) LD $@
 | 
						|
	$(LINK.c) -o $@ $^ $(LDLIBS_$*)
 | 
						|
 | 
						|
%.o: %.c
 | 
						|
	@$(VECHO) CC $@
 | 
						|
	$(CC) $(CPPFLAGS) $(CFLAGS) -o $@ -c $<
 | 
						|
 | 
						|
%.o: %.S
 | 
						|
	@$(VECHO) AS $@
 | 
						|
	$(CC) $(CPPFLAGS) $(AFLAGS) -D__ASSEMBLY__ -o $@ -c $<
 | 
						|
 | 
						|
%.d: %.c
 | 
						|
	@$(VECHO) DEP $<
 | 
						|
	$(CC) $(CPPFLAGS) $(CFLAGS) -MM -MG -MT "$*.o $@" $< > $@
 | 
						|
 | 
						|
%.d: %.S
 | 
						|
	@$(VECHO) DEP $<
 | 
						|
	$(CC) $(CPPFLAGS) -MM -MG -MT "$*.o $@" $< > $@
 | 
						|
 | 
						|
%.i:	%.c
 | 
						|
	@$(VECHO) CPP $@
 | 
						|
	$(CC) $(CPPFLAGS) -E $< > $@
 | 
						|
 | 
						|
%.s:	%.c
 | 
						|
	@$(VECHO) CC -S $@
 | 
						|
	$(CC) $(CPPFLAGS) $(CFLAGS) -o $@ -S $<
 | 
						|
 | 
						|
%.a:
 | 
						|
	@$(VECHO) AR $@
 | 
						|
	$(AR) $(ARFLAGS) $@ $^
 | 
						|
 | 
						|
%.lex.c: %.l
 | 
						|
	@$(VECHO) LEX $@
 | 
						|
	$(LEX) -o$@ $<
 | 
						|
 | 
						|
%.tab.c %.tab.h %.output: %.y
 | 
						|
	@$(VECHO) BISON $@
 | 
						|
	$(BISON) -b $(basename $(basename $@)) -d $<
 | 
						|
 | 
						|
# Some checks expect dtc-parser.h, so create link
 | 
						|
dtc-parser.h: dtc-parser.tab.h
 | 
						|
	ln -s $^ $@
 | 
						|
 | 
						|
FORCE:
 |