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