Home | History | Annotate | Line # | Download | only in dist
      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