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