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