mirror of
https://github.com/dgibson/dtc.git
synced 2025-10-13 16:27:39 -04:00
Currently the libfdt based tools (fdtput, fdtget, etc.) and all the test binaries using libfdt are linked against the static version of libfdt. That's made it very easy in the past to forget to properly update the version.lds file which is needed to make functions publicaly accessible from the shared library. To avoid problems like that in future, alter the build so that we link and run the tests against the shared library version of libfdt. That immediately points out several important symbols that are still missing from the version.lds, so fix those as well. Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
372 lines
8.2 KiB
Makefile
372 lines
8.2 KiB
Makefile
#
|
|
# 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 =
|
|
|
|
CPPFLAGS = -I libfdt -I .
|
|
WARNINGS = -Wall -Wpointer-arith -Wcast-qual -Wnested-externs \
|
|
-Wstrict-prototypes -Wmissing-prototypes -Wredundant-decls -Wshadow
|
|
CFLAGS = -g -Os $(SHAREDLIB_CFLAGS) -Werror $(WARNINGS)
|
|
|
|
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)
|
|
CFLAGS += -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 -s $(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) -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) -d $<
|
|
|
|
FORCE:
|