Makefile revision 1.1.1.3 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