• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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