1# SPDX-License-Identifier: GPL-2.0-or-later 2# 3# Device Tree Compiler 4# 5 6# 7# Version information will be constructed in this order: 8# EXTRAVERSION might be "-rc", for example. 9# LOCAL_VERSION is likely from command line. 10# CONFIG_LOCALVERSION from some future config system. 11# 12VERSION = 1 13PATCHLEVEL = 6 14SUBLEVEL = 1 15EXTRAVERSION = 16LOCAL_VERSION = 17CONFIG_LOCALVERSION = 18 19# Control the assumptions made (e.g. risking security issues) in the code. 20# See libfdt_internal.h for details 21ASSUME_MASK ?= 0 22 23CPPFLAGS = -I libfdt -I . -DFDT_ASSUME_MASK=$(ASSUME_MASK) 24WARNINGS = -Wall -Wpointer-arith -Wcast-qual -Wnested-externs -Wsign-compare \ 25 -Wstrict-prototypes -Wmissing-prototypes -Wredundant-decls -Wshadow 26CFLAGS = -g -Os $(SHAREDLIB_CFLAGS) -Werror $(WARNINGS) $(EXTRA_CFLAGS) 27 28BISON = bison 29LEX = flex 30SWIG = swig 31PKG_CONFIG ?= pkg-config 32PYTHON ?= python3 33 34INSTALL = /usr/bin/install 35INSTALL_PROGRAM = $(INSTALL) 36INSTALL_LIB = $(INSTALL) 37INSTALL_DATA = $(INSTALL) -m 644 38INSTALL_SCRIPT = $(INSTALL) 39DESTDIR = 40PREFIX = $(HOME) 41BINDIR = $(PREFIX)/bin 42LIBDIR = $(PREFIX)/lib 43INCLUDEDIR = $(PREFIX)/include 44 45HOSTOS := $(shell uname -s | tr '[:upper:]' '[:lower:]' | \ 46 sed -e 's/\(cygwin\|msys\).*/\1/') 47 48NO_PYTHON ?= 0 49 50NO_VALGRIND := $(shell $(PKG_CONFIG) --exists valgrind; echo $$?) 51ifeq ($(NO_VALGRIND),1) 52 CPPFLAGS += -DNO_VALGRIND 53else 54 CFLAGS += $(shell $(PKG_CONFIG) --cflags valgrind) 55endif 56 57NO_YAML := $(shell $(PKG_CONFIG) --exists yaml-0.1; echo $$?) 58ifeq ($(NO_YAML),1) 59 CFLAGS += -DNO_YAML 60else 61 LDLIBS_dtc += $(shell $(PKG_CONFIG) --libs yaml-0.1) 62 CFLAGS += $(shell $(PKG_CONFIG) --cflags yaml-0.1) 63endif 64 65ifeq ($(HOSTOS),darwin) 66SHAREDLIB_EXT = dylib 67SHAREDLIB_CFLAGS = -fPIC 68SHAREDLIB_LDFLAGS = -fPIC -dynamiclib -Wl,-install_name -Wl, 69else ifeq ($(HOSTOS),$(filter $(HOSTOS),msys cygwin)) 70SHAREDLIB_EXT = so 71SHAREDLIB_CFLAGS = 72SHAREDLIB_LDFLAGS = -shared -Wl,--version-script=$(LIBFDT_version) -Wl,-soname, 73else 74SHAREDLIB_EXT = so 75SHAREDLIB_CFLAGS = -fPIC 76SHAREDLIB_LDFLAGS = -fPIC -shared -Wl,--version-script=$(LIBFDT_version) -Wl,-soname, 77endif 78 79# 80# Overall rules 81# 82ifdef V 83VECHO = : 84else 85VECHO = echo " " 86ARFLAGS = rc 87.SILENT: 88endif 89 90NODEPTARGETS = clean 91ifeq ($(MAKECMDGOALS),) 92DEPTARGETS = all 93else 94DEPTARGETS = $(filter-out $(NODEPTARGETS),$(MAKECMDGOALS)) 95endif 96 97# 98# Rules for versioning 99# 100 101DTC_VERSION = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION) 102VERSION_FILE = version_gen.h 103 104CONFIG_SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \ 105 else if [ -x /bin/bash ]; then echo /bin/bash; \ 106 else echo sh; fi ; fi) 107 108nullstring := 109space := $(nullstring) # end of line 110 111localver_config = $(subst $(space),, $(string) \ 112 $(patsubst "%",%,$(CONFIG_LOCALVERSION))) 113 114localver_cmd = $(subst $(space),, $(string) \ 115 $(patsubst "%",%,$(LOCALVERSION))) 116 117localver_scm = $(shell $(CONFIG_SHELL) ./scripts/setlocalversion) 118localver_full = $(localver_config)$(localver_cmd)$(localver_scm) 119 120dtc_version = $(DTC_VERSION)$(localver_full) 121 122# Contents of the generated version file. 123define filechk_version 124 (echo "#define DTC_VERSION \"DTC $(dtc_version)\""; ) 125endef 126 127define filechk 128 set -e; \ 129 echo ' CHK $@'; \ 130 mkdir -p $(dir $@); \ 131 $(filechk_$(1)) < $< > $@.tmp; \ 132 if [ -r $@ ] && cmp -s $@ $@.tmp; then \ 133 rm -f $@.tmp; \ 134 else \ 135 echo ' UPD $@'; \ 136 mv -f $@.tmp $@; \ 137 fi; 138endef 139 140 141include Makefile.convert-dtsv0 142include Makefile.dtc 143include Makefile.utils 144 145BIN += convert-dtsv0 146BIN += dtc 147BIN += fdtdump 148BIN += fdtget 149BIN += fdtput 150BIN += fdtoverlay 151 152SCRIPTS = dtdiff 153 154all: $(BIN) libfdt 155 156# We need both Python and swig to build/install pylibfdt. 157# This builds the given make ${target} if those deps are found. 158check_python_deps = \ 159 if $(PKG_CONFIG) --cflags $(PYTHON) >/dev/null 2>&1; then \ 160 if which swig >/dev/null 2>&1; then \ 161 can_build=yes; \ 162 fi; \ 163 fi; \ 164 if [ "$${can_build}" = "yes" ]; then \ 165 $(MAKE) $${target}; \ 166 else \ 167 echo "\#\# Skipping pylibfdt (install python dev and swig to build)"; \ 168 fi ; 169 170.PHONY: maybe_pylibfdt 171maybe_pylibfdt: FORCE 172 target=pylibfdt; $(check_python_deps) 173 174ifeq ($(NO_PYTHON),0) 175all: maybe_pylibfdt 176endif 177 178 179ifneq ($(DEPTARGETS),) 180ifneq ($(MAKECMDGOALS),libfdt) 181-include $(DTC_OBJS:%.o=%.d) 182-include $(CONVERT_OBJS:%.o=%.d) 183-include $(FDTDUMP_OBJS:%.o=%.d) 184-include $(FDTGET_OBJS:%.o=%.d) 185-include $(FDTPUT_OBJS:%.o=%.d) 186-include $(FDTOVERLAY_OBJS:%.o=%.d) 187endif 188endif 189 190 191 192# 193# Rules for libfdt 194# 195LIBFDT_dir = libfdt 196LIBFDT_archive = $(LIBFDT_dir)/libfdt.a 197LIBFDT_lib = $(LIBFDT_dir)/$(LIBFDT_LIB) 198LIBFDT_include = $(addprefix $(LIBFDT_dir)/,$(LIBFDT_INCLUDES)) 199LIBFDT_version = $(addprefix $(LIBFDT_dir)/,$(LIBFDT_VERSION)) 200 201include $(LIBFDT_dir)/Makefile.libfdt 202 203.PHONY: libfdt 204libfdt: $(LIBFDT_archive) $(LIBFDT_lib) 205 206$(LIBFDT_archive): $(addprefix $(LIBFDT_dir)/,$(LIBFDT_OBJS)) 207 208$(LIBFDT_lib): $(addprefix $(LIBFDT_dir)/,$(LIBFDT_OBJS)) $(LIBFDT_version) 209 @$(VECHO) LD $@ 210 $(CC) $(LDFLAGS) $(SHAREDLIB_LDFLAGS)$(LIBFDT_soname) -o $(LIBFDT_lib) \ 211 $(addprefix $(LIBFDT_dir)/,$(LIBFDT_OBJS)) 212 ln -sf $(LIBFDT_LIB) $(LIBFDT_dir)/$(LIBFDT_soname) 213 214ifneq ($(DEPTARGETS),) 215-include $(LIBFDT_OBJS:%.o=$(LIBFDT_dir)/%.d) 216endif 217 218# This stops make from generating the lex and bison output during 219# auto-dependency computation, but throwing them away as an 220# intermediate target and building them again "for real" 221.SECONDARY: $(DTC_GEN_SRCS) $(CONVERT_GEN_SRCS) 222 223install-bin: all $(SCRIPTS) 224 @$(VECHO) INSTALL-BIN 225 $(INSTALL) -d $(DESTDIR)$(BINDIR) 226 $(INSTALL_PROGRAM) $(BIN) $(DESTDIR)$(BINDIR) 227 $(INSTALL_SCRIPT) $(SCRIPTS) $(DESTDIR)$(BINDIR) 228 229install-lib: all 230 @$(VECHO) INSTALL-LIB 231 $(INSTALL) -d $(DESTDIR)$(LIBDIR) 232 $(INSTALL_LIB) $(LIBFDT_lib) $(DESTDIR)$(LIBDIR) 233 ln -sf $(notdir $(LIBFDT_lib)) $(DESTDIR)$(LIBDIR)/$(LIBFDT_soname) 234 ln -sf $(LIBFDT_soname) $(DESTDIR)$(LIBDIR)/libfdt.$(SHAREDLIB_EXT) 235 $(INSTALL_DATA) $(LIBFDT_archive) $(DESTDIR)$(LIBDIR) 236 237install-includes: 238 @$(VECHO) INSTALL-INC 239 $(INSTALL) -d $(DESTDIR)$(INCLUDEDIR) 240 $(INSTALL_DATA) $(LIBFDT_include) $(DESTDIR)$(INCLUDEDIR) 241 242install: install-bin install-lib install-includes 243 244.PHONY: maybe_install_pylibfdt 245maybe_install_pylibfdt: FORCE 246 target=install_pylibfdt; $(check_python_deps) 247 248ifeq ($(NO_PYTHON),0) 249install: maybe_install_pylibfdt 250endif 251 252$(VERSION_FILE): Makefile FORCE 253 $(call filechk,version) 254 255 256dtc: $(DTC_OBJS) 257 258convert-dtsv0: $(CONVERT_OBJS) 259 @$(VECHO) LD $@ 260 $(LINK.c) -o $@ $^ 261 262fdtdump: $(FDTDUMP_OBJS) 263 264fdtget: $(FDTGET_OBJS) $(LIBFDT_lib) 265 266fdtput: $(FDTPUT_OBJS) $(LIBFDT_lib) 267 268fdtoverlay: $(FDTOVERLAY_OBJS) $(LIBFDT_lib) 269 270dist: 271 git archive --format=tar --prefix=dtc-$(dtc_version)/ HEAD \ 272 > ../dtc-$(dtc_version).tar 273 cat ../dtc-$(dtc_version).tar | \ 274 gzip -9 > ../dtc-$(dtc_version).tar.gz 275 276 277# 278# Rules for pylibfdt 279# 280PYLIBFDT_dir = pylibfdt 281 282include $(PYLIBFDT_dir)/Makefile.pylibfdt 283 284.PHONY: pylibfdt 285pylibfdt: $(PYLIBFDT_dir)/_libfdt.so 286 287# 288# Release signing and uploading 289# This is for maintainer convenience, don't try this at home. 290# 291ifeq ($(MAINTAINER),y) 292GPG = gpg2 293KUP = kup 294KUPDIR = /pub/software/utils/dtc 295 296kup: dist 297 $(GPG) --detach-sign --armor -o ../dtc-$(dtc_version).tar.sign \ 298 ../dtc-$(dtc_version).tar 299 $(KUP) put ../dtc-$(dtc_version).tar.gz ../dtc-$(dtc_version).tar.sign \ 300 $(KUPDIR)/dtc-$(dtc_version).tar.gz 301endif 302 303tags: FORCE 304 rm -f tags 305 find . \( -name tests -type d -prune \) -o \ 306 \( ! -name '*.tab.[ch]' ! -name '*.lex.c' \ 307 -name '*.[chly]' -type f -print \) | xargs ctags -a 308 309# 310# Testsuite rules 311# 312TESTS_PREFIX=tests/ 313 314TESTS_BIN += dtc 315TESTS_BIN += convert-dtsv0 316TESTS_BIN += fdtput 317TESTS_BIN += fdtget 318TESTS_BIN += fdtdump 319TESTS_BIN += fdtoverlay 320ifeq ($(NO_PYTHON),0) 321TESTS_PYLIBFDT += maybe_pylibfdt 322endif 323 324ifneq ($(MAKECMDGOALS),libfdt) 325include tests/Makefile.tests 326endif 327 328# 329# Clean rules 330# 331STD_CLEANFILES = *~ *.o *.$(SHAREDLIB_EXT) *.d *.a *.i *.s core a.out vgcore.* \ 332 *.tab.[ch] *.lex.c *.output 333 334clean: libfdt_clean pylibfdt_clean tests_clean 335 @$(VECHO) CLEAN 336 rm -f $(STD_CLEANFILES) 337 rm -f $(VERSION_FILE) 338 rm -f $(BIN) 339 rm -f dtc-*.tar dtc-*.tar.sign dtc-*.tar.asc 340 341# 342# Generic compile rules 343# 344%: %.o 345 @$(VECHO) LD $@ 346 $(LINK.c) -o $@ $^ $(LDLIBS_$*) 347 348%.o: %.c 349 @$(VECHO) CC $@ 350 $(CC) $(CPPFLAGS) $(CFLAGS) -o $@ -c $< 351 352%.o: %.S 353 @$(VECHO) AS $@ 354 $(CC) $(CPPFLAGS) $(AFLAGS) -D__ASSEMBLY__ -o $@ -c $< 355 356%.d: %.c 357 @$(VECHO) DEP $< 358 $(CC) $(CPPFLAGS) $(CFLAGS) -MM -MG -MT "$*.o $@" $< > $@ 359 360%.d: %.S 361 @$(VECHO) DEP $< 362 $(CC) $(CPPFLAGS) -MM -MG -MT "$*.o $@" $< > $@ 363 364%.i: %.c 365 @$(VECHO) CPP $@ 366 $(CC) $(CPPFLAGS) -E $< > $@ 367 368%.s: %.c 369 @$(VECHO) CC -S $@ 370 $(CC) $(CPPFLAGS) $(CFLAGS) -o $@ -S $< 371 372%.a: 373 @$(VECHO) AR $@ 374 $(AR) $(ARFLAGS) $@ $^ 375 376%.lex.c: %.l 377 @$(VECHO) LEX $@ 378 $(LEX) -o$@ $< 379 380%.tab.c %.tab.h %.output: %.y 381 @$(VECHO) BISON $@ 382 $(BISON) -b $(basename $(basename $@)) -d $< 383 384FORCE: 385