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