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