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 # 12 VERSION = 1 13 PATCHLEVEL = 5 14 SUBLEVEL = 0 15 EXTRAVERSION = 16 LOCAL_VERSION = 17 CONFIG_LOCALVERSION = 18 19 CPPFLAGS = -I libfdt -I . 20 WARNINGS = -Wall -Wpointer-arith -Wcast-qual -Wnested-externs \ 21 -Wstrict-prototypes -Wmissing-prototypes -Wredundant-decls -Wshadow 22 CFLAGS = -g -Os $(SHAREDLIB_CFLAGS) -Werror $(WARNINGS) $(EXTRA_CFLAGS) 23 24 BISON = bison 25 LEX = flex 26 SWIG = swig 27 PKG_CONFIG ?= pkg-config 28 PYTHON ?= python3 29 30 INSTALL = /usr/bin/install 31 INSTALL_PROGRAM = $(INSTALL) 32 INSTALL_LIB = $(INSTALL) 33 INSTALL_DATA = $(INSTALL) -m 644 34 INSTALL_SCRIPT = $(INSTALL) 35 DESTDIR = 36 PREFIX = $(HOME) 37 BINDIR = $(PREFIX)/bin 38 LIBDIR = $(PREFIX)/lib 39 INCLUDEDIR = $(PREFIX)/include 40 41 HOSTOS := $(shell uname -s | tr '[:upper:]' '[:lower:]' | \ 42 sed -e 's/\(cygwin\|msys\).*/\1/') 43 44 NO_VALGRIND := $(shell $(PKG_CONFIG) --exists valgrind; echo $$?) 45 ifeq ($(NO_VALGRIND),1) 46 CFLAGS += -DNO_VALGRIND 47 else 48 CFLAGS += $(shell $(PKG_CONFIG) --cflags valgrind) 49 endif 50 51 NO_YAML := $(shell $(PKG_CONFIG) --exists yaml-0.1; echo $$?) 52 ifeq ($(NO_YAML),1) 53 CFLAGS += -DNO_YAML 54 else 55 LDLIBS_dtc += $(shell $(PKG_CONFIG) --libs yaml-0.1) 56 endif 57 58 ifeq ($(HOSTOS),darwin) 59 SHAREDLIB_EXT = dylib 60 SHAREDLIB_CFLAGS = -fPIC 61 SHAREDLIB_LDFLAGS = -fPIC -dynamiclib -Wl,-install_name -Wl, 62 else ifeq ($(HOSTOS),$(filter $(HOSTOS),msys cygwin)) 63 SHAREDLIB_EXT = so 64 SHAREDLIB_CFLAGS = 65 SHAREDLIB_LDFLAGS = -shared -Wl,--version-script=$(LIBFDT_version) -Wl,-soname, 66 else 67 SHAREDLIB_EXT = so 68 SHAREDLIB_CFLAGS = -fPIC 69 SHAREDLIB_LDFLAGS = -fPIC -shared -Wl,--version-script=$(LIBFDT_version) -Wl,-soname, 70 endif 71 72 # 73 # Overall rules 74 # 75 ifdef V 76 VECHO = : 77 else 78 VECHO = echo " " 79 ARFLAGS = rc 80 .SILENT: 81 endif 82 83 NODEPTARGETS = clean 84 ifeq ($(MAKECMDGOALS),) 85 DEPTARGETS = all 86 else 87 DEPTARGETS = $(filter-out $(NODEPTARGETS),$(MAKECMDGOALS)) 88 endif 89 90 # 91 # Rules for versioning 92 # 93 94 DTC_VERSION = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION) 95 VERSION_FILE = version_gen.h 96 97 CONFIG_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 101 nullstring := 102 space := $(nullstring) # end of line 103 104 localver_config = $(subst $(space),, $(string) \ 105 $(patsubst "%",%,$(CONFIG_LOCALVERSION))) 106 107 localver_cmd = $(subst $(space),, $(string) \ 108 $(patsubst "%",%,$(LOCALVERSION))) 109 110 localver_scm = $(shell $(CONFIG_SHELL) ./scripts/setlocalversion) 111 localver_full = $(localver_config)$(localver_cmd)$(localver_scm) 112 113 dtc_version = $(DTC_VERSION)$(localver_full) 114 115 # Contents of the generated version file. 116 define filechk_version 117 (echo "#define DTC_VERSION \"DTC $(dtc_version)\""; ) 118 endef 119 120 define 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; 131 endef 132 133 134 include Makefile.convert-dtsv0 135 include Makefile.dtc 136 include Makefile.utils 137 138 BIN += convert-dtsv0 139 BIN += dtc 140 BIN += fdtdump 141 BIN += fdtget 142 BIN += fdtput 143 BIN += fdtoverlay 144 145 SCRIPTS = dtdiff 146 147 all: $(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. 151 check_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 164 maybe_pylibfdt: FORCE 165 target=pylibfdt; $(check_python_deps) 166 167 ifeq ($(NO_PYTHON),) 168 all: maybe_pylibfdt 169 endif 170 171 172 ifneq ($(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) 179 endif 180 181 182 183 # 184 # Rules for libfdt 185 # 186 LIBFDT_dir = libfdt 187 LIBFDT_archive = $(LIBFDT_dir)/libfdt.a 188 LIBFDT_lib = $(LIBFDT_dir)/$(LIBFDT_LIB) 189 LIBFDT_include = $(addprefix $(LIBFDT_dir)/,$(LIBFDT_INCLUDES)) 190 LIBFDT_version = $(addprefix $(LIBFDT_dir)/,$(LIBFDT_VERSION)) 191 192 include $(LIBFDT_dir)/Makefile.libfdt 193 194 .PHONY: libfdt 195 libfdt: $(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 205 ifneq ($(DEPTARGETS),) 206 -include $(LIBFDT_OBJS:%.o=$(LIBFDT_dir)/%.d) 207 endif 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 214 install-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 220 install-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 228 install-includes: 229 @$(VECHO) INSTALL-INC 230 $(INSTALL) -d $(DESTDIR)$(INCLUDEDIR) 231 $(INSTALL_DATA) $(LIBFDT_include) $(DESTDIR)$(INCLUDEDIR) 232 233 install: install-bin install-lib install-includes 234 235 .PHONY: maybe_install_pylibfdt 236 maybe_install_pylibfdt: FORCE 237 target=install_pylibfdt; $(check_python_deps) 238 239 ifeq ($(NO_PYTHON),) 240 install: maybe_install_pylibfdt 241 endif 242 243 $(VERSION_FILE): Makefile FORCE 244 $(call filechk,version) 245 246 247 dtc: $(DTC_OBJS) 248 249 convert-dtsv0: $(CONVERT_OBJS) 250 @$(VECHO) LD $@ 251 $(LINK.c) -o $@ $^ 252 253 fdtdump: $(FDTDUMP_OBJS) 254 255 fdtget: $(FDTGET_OBJS) $(LIBFDT_lib) 256 257 fdtput: $(FDTPUT_OBJS) $(LIBFDT_lib) 258 259 fdtoverlay: $(FDTOVERLAY_OBJS) $(LIBFDT_lib) 260 261 dist: 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 # 271 PYLIBFDT_dir = pylibfdt 272 273 include $(PYLIBFDT_dir)/Makefile.pylibfdt 274 275 .PHONY: pylibfdt 276 pylibfdt: $(PYLIBFDT_dir)/_libfdt.so 277 278 # 279 # Release signing and uploading 280 # This is for maintainer convenience, don't try this at home. 281 # 282 ifeq ($(MAINTAINER),y) 283 GPG = gpg2 284 KUP = kup 285 KUPDIR = /pub/software/utils/dtc 286 287 kup: 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 292 endif 293 294 tags: 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 # 303 TESTS_PREFIX=tests/ 304 305 TESTS_BIN += dtc 306 TESTS_BIN += convert-dtsv0 307 TESTS_BIN += fdtput 308 TESTS_BIN += fdtget 309 TESTS_BIN += fdtdump 310 TESTS_BIN += fdtoverlay 311 ifeq ($(NO_PYTHON),) 312 TESTS_PYLIBFDT += maybe_pylibfdt 313 endif 314 315 include tests/Makefile.tests 316 317 # 318 # Clean rules 319 # 320 STD_CLEANFILES = *~ *.o *.$(SHAREDLIB_EXT) *.d *.a *.i *.s core a.out vgcore.* \ 321 *.tab.[ch] *.lex.c *.output 322 323 clean: 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 373 FORCE: 374