mirror of
https://github.com/dgibson/dtc.git
synced 2025-12-07 05:35:07 -05:00
Add a new ASSUME_MASK option, which allows for some control over the checks used in libfdt. With all assumptions enabled, libfdt assumes that the input data and parameters are all correct and that internal errors cannot happen. By default no assumptions are made and all checks are enabled. Signed-off-by: Simon Glass <sjg@chromium.org> Message-Id: <20200220214557.176528-3-sjg@chromium.org> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
377 lines
8.4 KiB
Makefile
377 lines
8.4 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 = 5
|
|
SUBLEVEL = 0
|
|
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 \
|
|
-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_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)
|
|
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
|
|
|
|
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),)
|
|
all: maybe_pylibfdt
|
|
endif
|
|
|
|
|
|
ifneq ($(DEPTARGETS),)
|
|
-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
|
|
|
|
|
|
|
|
#
|
|
# 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))
|
|
|
|
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),)
|
|
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_lib)
|
|
|
|
fdtput: $(FDTPUT_OBJS) $(LIBFDT_lib)
|
|
|
|
fdtoverlay: $(FDTOVERLAY_OBJS) $(LIBFDT_lib)
|
|
|
|
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),)
|
|
TESTS_PYLIBFDT += maybe_pylibfdt
|
|
endif
|
|
|
|
include tests/Makefile.tests
|
|
|
|
#
|
|
# 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 $<
|
|
|
|
FORCE:
|