Fix UB: Make read_int() follow SEI CERT INT13-C and INT34-C.
[metastore.git] / Makefile
blob364825cc5067174ae32488607291cdc0171d58af
1 ## Almost Universal Makefile
2 ## Author: Przemysław Pawełczyk
4 BINS := \
5 metastore
7 LIBS := \
9 ### Directories
10 PROJ_DIR := $(dir $(lastword $(MAKEFILE_LIST)))
11 SRCS_DIR = $(PROJ_DIR)src/
12 INCS_DIR = $(PROJ_DIR)include/
13 CFGS_DIR = $(PROJ_DIR)etc/
14 SHRS_DIR = $(PROJ_DIR)share/
15 OBJS_DIR = $(PROJ_DIR)obj/
16 BINS_DIR = $(PROJ_DIR)bin/
17 LIBS_DIR = $(PROJ_DIR)lib/
18 DOCS_DIR = $(PROJ_DIR)
19 MANS_DIR = $(PROJ_DIR)
21 ###
22 METASTORE_VER := $(shell "$(PROJ_DIR)"/version.sh)
23 UNAME_S := $(shell uname -s)
25 ###
27 DOCS := \
28 AUTHORS \
29 FILEFORMAT \
30 LICENSE.GPLv2 \
31 NEWS \
32 README \
33 metastore.txt \
34 examples \
36 metastore_COMP := CC
38 metastore_SRCS := \
39 metaentry.c \
40 metastore.c \
41 utils.c \
43 metastore_DLIBS := \
45 metastore_MANS := \
46 man1/metastore.1 \
48 ifeq ($(findstring BSD,$(UNAME_S)),)
49 ifneq (DragonFly,$(UNAME_S))
50 ifneq (Darwin,$(UNAME_S))
51 metastore_DLIBS += -lbsd
52 endif
53 endif
54 endif
56 ifneq (,$(NO_XATTR))
57 ifneq (0,$(NO_XATTR))
58 ADDITIONAL_FLAGS += -DNO_XATTR
59 endif
60 endif
62 PVER := $(PROJ_DIR)Makefile.ver
64 SDEP := Makefile.dep
66 -include $(PVER)
68 # when building from project tree, then always use the same output layout
69 # otherwise use current working directory
70 ifneq (,$(findstring ^$(realpath $(PROJ_DIR)),^$(realpath ./)))
71 SDEP := $(PROJ_DIR)$(SDEP)
72 else
73 OBJS_DIR := ./obj/
74 BINS_DIR := ./bin/
75 LIBS_DIR := ./lib/
76 endif
79 # library name prefix
80 LIB_PRE := lib
81 # Dynamic Shared Object extension
82 DSO_EXT := .so
83 # Statically-Linked Library extension
84 SLL_EXT := .a
87 ### Default target
88 all: libs bins
90 bins: $(BINS)
91 libs: $(LIBS)
93 ### Flags
94 MUSTHAVE_FLAGS := \
95 -DMETASTORE_VER="\"$(METASTORE_VER)\"" \
96 -D_FILE_OFFSET_BITS=64 \
97 -Wall -Wextra -pedantic \
98 -g \
99 $(ADDITIONAL_FLAGS) \
101 MUSTHAVE_CFLAGS := -std=c99
102 MUSTHAVE_CXXFLAGS := -std=c++11
103 OPTIONAL_FLAGS := -O2
105 ### Install paths
106 PREFIX := /usr/local
107 EXECPREFIX := $(PREFIX)
108 BINDIR := $(EXECPREFIX)/bin
109 LIBDIR := $(EXECPREFIX)/lib
110 INCLUDEDIR := $(PREFIX)/include
111 SYSCONFDIR := $(PREFIX)/etc
112 DATAROOTDIR := $(PREFIX)/share
113 DATADIR := $(DATAROOTDIR)
114 DOCDIR := ${DATAROOTDIR}/doc/metastore
115 MANDIR := ${DATAROOTDIR}/man
117 ### Phony targets
118 .PHONY: \
119 all bins libs \
120 strip strip-bins strips-libs \
121 install install-bins install-libs install-includes \
122 install-configs install-docs install-mans install-shares \
123 uninstall uninstall-bins uninstall-libs uninstall-includes \
124 clean distclean \
125 dep \
126 printvars \
128 ### Debug
129 printvars:
130 @$(foreach V, $(sort $(.VARIABLES)), \
131 $(if $(filter-out environment% default automatic, $(origin $V)), \
132 $(warning $V = $(value $V)) \
133 $(if $(findstring ^$(value $V)%,^$($V)%),,$(warning $V == $($V))) \
137 ### Install tools
138 INSTALL := install
139 INSTALL_EXEC := $(INSTALL) -m 0755
140 COPY_NODEREF := cp -P
142 ### Build tools
143 DEFCC := gcc
144 DEFCXX := g++
145 ifeq ($(origin CC),default)
146 CC := $(DEFCC)
147 endif
148 ifeq ($(origin CXX),default)
149 CXX := $(DEFCXX)
150 endif
151 ifneq ($(origin CC),environment)
152 CC := $(CROSS_COMPILE)$(CC)
153 endif
154 ifneq ($(origin CXX),environment)
155 CXX := $(CROSS_COMPILE)$(CXX)
156 endif
157 ifneq ($(origin CCLD),environment)
158 CCLD := $(CC)
159 endif
160 ifneq ($(origin CXXLD),environment)
161 CXXLD := $(CXX)
162 endif
163 ifneq ($(origin STRIP),environment)
164 STRIP := $(CROSS_COMPILE)strip
165 endif
166 CC_PARAMS = $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH)
167 CXX_PARAMS = $(CXXFLAGS) $(CPPFLAGS) $(TARGET_ARCH)
169 ### Final flags
170 ifneq ($(origin CFLAGS),environment)
171 CFLAGS = $(OPTIONAL_FLAGS)
172 endif
173 ifneq ($(origin CXXFLAGS),environment)
174 CXXFLAGS = $(OPTIONAL_FLAGS)
175 endif
176 override CFLAGS += $(MUSTHAVE_FLAGS) $(MUSTHAVE_CFLAGS) \
177 $(if $(INCS_DIR),-I$(INCS_DIR),) -I$(SRCS_DIR)
178 override CXXFLAGS += $(MUSTHAVE_FLAGS) $(MUSTHAVE_CXXFLAGS) \
179 $(if $(INCS_DIR),-I$(INCS_DIR),) -I$(SRCS_DIR)
181 vpath %.h $(SRCS_DIR) $(INCS_DIR)
182 vpath %.c $(SRCS_DIR)
183 vpath %.cpp $(SRCS_DIR)
185 ### Support for hiding command-line
186 V ?= 0
187 HIDE_0 := @
188 HIDE_1 :=
189 HIDE := $(HIDE_$(V))
192 ### Rules for directories
194 $(sort $(OBJS_DIR) $(BINS_DIR) $(LIBS_DIR)):
195 @mkdir -p $@
197 ### Templated rules
199 define BIN_template
201 $(1)_OBJS := $$(addsuffix .o,$$(basename $$($(1)_SRCS)))
203 $$(BINS_DIR)$(1): \
204 $$(addsuffix $$(DSO_EXT),$$(addprefix $$(LIBS_DIR)$$(LIB_PRE),$$($(1)_DEPS))) \
205 $$(addsuffix $$(SLL_EXT),$$(addprefix $$(LIBS_DIR)$$(LIB_PRE),$$($(1)_DEPS))) \
206 $$(addprefix $$(OBJS_DIR),$$($(1)_OBJS)) $$(SDEP) | $$(BINS_DIR)
207 ifeq ($$($(1)_COMP),CC)
208 @echo " CCLD $$@"
209 else
210 @echo " CXXLD $$@"
211 endif
212 $$(HIDE)$$($$($(1)_COMP)LD) $$(LDFLAGS) $$(TARGET_ARCH) \
213 -o $$@ $$(filter %.o,$$^) \
214 -Wl,-Bstatic $$($(1)_SLIBS) -Wl,-Bdynamic $$($(1)_DLIBS)
216 $(1): $$(BINS_DIR)$(1)
217 .PHONY: $(1)
219 SRCS += $$($(1)_SRCS)
220 OBJS += $$($(1)_OBJS)
222 CFGS += $$($(1)_CFGS)
223 MANS += $$($(1)_MANS)
224 SHRS += $$($(1)_SHRS)
226 endef
228 define LIB_template
230 $(1)_OBJS := $$(addsuffix .o,$$(basename $$($(1)_SRCS)))
232 $(1)_SOLINK := $$(LIB_PRE)$(1)$$(DSO_EXT)
233 $(1)_SONAME := $$(LIB_PRE)$(1)$$(DSO_EXT).$$($(1)_MAJV)
234 $(1)_SOFILE := $$(LIB_PRE)$(1)$$(DSO_EXT).$$($(1)_MAJV)$$($(1)_MINV)
235 $(1)_ARFILE := $$(LIB_PRE)$(1)$$(SLL_EXT)
237 $$(LIBS_DIR)$$($(1)_SOLINK): $$(LIBS_DIR)$$($(1)_SONAME)
238 @echo " LN $$@ -> $$($(1)_SONAME)"
239 $$(HIDE)(cd "$(LIBS_DIR)" && ln -sf $$($(1)_SONAME) $$($(1)_SOLINK))
241 ifneq ($$($(1)_SONAME),$$($(1)_SOFILE))
242 $$(LIBS_DIR)$$($(1)_SONAME): $$(LIBS_DIR)$$($(1)_SOFILE)
243 @echo " LN $$@ -> $$($(1)_SOFILE)"
244 $$(HIDE)(cd "$$(LIBS_DIR)" && ln -sf $$($(1)_SOFILE) $$($(1)_SONAME))
245 endif
247 $$(LIBS_DIR)$$($(1)_SOFILE): \
248 $$(addsuffix $$(DSO_EXT),$$(addprefix $$(LIBS_DIR)$$(LIB_PRE),$$($(1)_DEPS))) \
249 $$(addsuffix $$(SLL_EXT),$$(addprefix $$(LIBS_DIR)$$(LIB_PRE),$$($(1)_DEPS))) \
250 $$(addprefix $$(OBJS_DIR),$$($(1)_OBJS)) $$(SDEP) | $$(LIBS_DIR)
251 ifeq ($$($(1)_COMP),CC)
252 @echo " CCLD $$@"
253 else
254 @echo " CXXLD $$@"
255 endif
256 $$(HIDE)$$($$($(1)_COMP)LD) $$(LDFLAGS) $$(TARGET_ARCH) \
257 -shared -Wl,-soname,$$($(1)_SONAME) \
258 -o $$@ $$(filter %.o,$$^) \
259 -Wl,-Bstatic $$($(1)_SLIBS) -Wl,-Bdynamic $$($(1)_DLIBS)
261 $$(LIBS_DIR)$$($(1)_ARFILE): \
262 $$(addprefix $$(OBJS_DIR),$$($(1)_OBJS)) $$(SDEP) | $$(LIBS_DIR)
263 @echo " AR $$@"
264 $$(HIDE)$$(AR) r $$@ $$(filter %.o,$$^)
266 $(1): \
267 $$(LIBS_DIR)$$($(1)_SOFILE) \
268 $$(LIBS_DIR)$$($(1)_SOLINK) \
269 $$(LIBS_DIR)$$($(1)_ARFILE)
270 .PHONY: $(1)
272 SRCS += $$($(1)_SRCS)
273 OBJS += $$($(1)_OBJS)
275 INCS += $$($(1)_INCS)
276 CFGS += $$($(1)_CFGS)
277 MANS += $$($(1)_MANS)
278 SHRS += $$($(1)_SHRS)
280 LIBS_FILES += $$($(1)_SOFILE) $$($(1)_ARFILE)
281 LIBS_ALL_FILES += $$($(1)_SOLINK) $$($(1)_SONAME) $$($(1)_SOFILE) \
282 $$($(1)_ARFILE)
284 endef
286 $(foreach BIN,$(BINS),$(eval $(call BIN_template,$(BIN))))
288 $(foreach LIB,$(LIBS),$(eval $(call LIB_template,$(LIB))))
291 ### Rules for normal targets
293 $(OBJS_DIR)%.o: %.c
294 @echo " CC $@"
295 $(HIDE)mkdir -p $(dir $@)
296 $(HIDE)$(CC) $(CC_PARAMS) -c -o $@ $<
298 $(OBJS_DIR)%.o: %.cpp
299 @echo " CXX $@"
300 $(HIDE)mkdir -p $(dir $@)
301 $(HIDE)$(CXX) $(CXX_PARAMS) -c -o $@ $<
303 $(SDEP): SRCS_PATH := $(SRCS_DIR)
304 $(SDEP): SRCS_DIR := ./
305 $(SDEP): PROJ_DIR := ../
306 $(SDEP): $(SRCS) $(PROJ_DIR)Makefile
307 @echo " DEPS";
308 $(HIDE)echo "# This file is automatically (re)generated by make." >$(SDEP)
309 $(HIDE)echo >>$(SDEP)
310 $(HIDE)(cd "$(SRCS_PATH)" && for FILE in $(SRCS); do \
311 if [ "$${FILE##*.}" = "c" ]; then \
312 $(CC) $(CFLAGS) -MT "\$$(OBJS_DIR)$${FILE%.*}.o" -MM "$$FILE"; \
313 else \
314 $(CXX) $(CXXFLAGS) -MT "\$$(OBJS_DIR)$${FILE%.*}.o" -MM "$$FILE"; \
315 fi \
316 done) >>$(SDEP)
318 $(DOCS_DIR)%.txt: $(MANS_DIR)/man1/%.1
319 @echo " GROFF $@"
320 $(HIDE)groff -mandoc -Kutf8 -Tutf8 $^ | col -bx >$@
323 ### Rules for phony targets
325 clean:
326 @echo " CLEAN"
327 $(HIDE)$(RM) $(addprefix $(BINS_DIR),$(BINS)) \
328 $(addprefix $(LIBS_DIR),$(LIBS_ALL_FILES)) \
329 $(addprefix $(OBJS_DIR),$(OBJS)) \
330 $(SDEP)
332 distclean: clean
333 $(HIDE)(find \
334 $(OBJS_DIR) \
335 $(LIBS_DIR) \
336 $(BINS_DIR) \
337 -type d -exec rmdir --parents {} \; \
338 2>/dev/null ; exit 0)
340 dep: $(SDEP)
342 strip: strip-bins strip-libs
344 strip-bins: $(addprefix $(BINS_DIR),$(BINS))
345 ifneq ($(strip $(BINS)),)
346 @echo " STRIP $^"
347 $(HIDE)$(STRIP) $^
348 endif
350 strip-libs: $(addprefix $(LIBS_DIR),$(LIBS_FILES))
351 ifneq ($(strip $(LIBS)),)
352 @echo " STRIP $^"
353 $(HIDE)$(STRIP) $^
354 endif
356 install: install-bins install-libs install-includes \
357 install-configs install-docs install-mans install-shares \
359 install-bins: $(addprefix $(BINS_DIR),$(BINS))
360 ifneq ($(strip $(BINS)),)
361 @echo " INSTALL $^"
362 $(HIDE)$(INSTALL) -d $(DESTDIR)$(BINDIR)
363 $(HIDE)$(INSTALL_EXEC) \
364 $(addprefix $(BINS_DIR),$(BINS)) \
365 $(DESTDIR)$(BINDIR)/
366 endif
368 install-libs: $(addprefix $(LIBS_DIR),$(LIBS_ALL_FILES))
369 ifneq ($(strip $(LIBS)),)
370 @echo " INSTALL $^"
371 $(HIDE)$(INSTALL) -d $(DESTDIR)$(LIBDIR)
372 $(HIDE)$(COPY_NODEREF) \
373 $(addprefix $(LIBS_DIR),$(LIBS_ALL_FILES)) \
374 $(DESTDIR)$(LIBDIR)/
375 endif
377 install-includes: $(addprefix $(INCS_DIR),$(INCS))
378 ifneq ($(strip $(INCS)),)
379 @echo " INSTALL $^"
380 $(HIDE)$(INSTALL) -d $(DESTDIR)$(INCLUDEDIR)
381 $(HIDE)( cd $(INCS_DIR) && $(COPY_NODEREF) --parents \
382 $(INCS) \
383 $(DESTDIR)$(INCLUDEDIR)/ \
385 endif
387 install-configs: $(addprefix $(CFGS_DIR),$(CFGS))
388 ifneq ($(strip $(CFGS)),)
389 @echo " INSTALL $^"
390 $(HIDE)$(INSTALL) -d $(DESTDIR)$(SYSCONFDIR)
391 $(HIDE)( cd $(CFGS_DIR) && $(COPY_NODEREF) --parents \
392 $(CFGS) \
393 $(DESTDIR)$(SYSCONFDIR)/ \
395 endif
397 install-docs: $(addprefix $(DOCS_DIR),$(DOCS))
398 ifneq ($(strip $(DOCS)),)
399 @echo " INSTALL $^"
400 $(HIDE)$(INSTALL) -d $(DESTDIR)$(DOCDIR)
401 $(HIDE)( cd $(DOCS_DIR) && $(COPY_NODEREF) --parents -r \
402 $(DOCS) \
403 $(DESTDIR)$(DOCDIR)/ \
405 endif
407 install-mans: $(addprefix $(MANS_DIR),$(MANS))
408 ifneq ($(strip $(MANS)),)
409 @echo " INSTALL $^"
410 $(HIDE)$(INSTALL) -d $(DESTDIR)$(MANDIR)
411 $(HIDE)( cd $(MANS_DIR) && $(COPY_NODEREF) --parents \
412 $(MANS) \
413 $(DESTDIR)$(MANDIR)/ \
415 endif
417 install-shares: $(addprefix $(SHRS_DIR),$(SHRS))
418 ifneq ($(strip $(SHRS)),)
419 @echo " INSTALL $^"
420 $(HIDE)$(INSTALL) -d $(DESTDIR)$(DATADIR)
421 $(HIDE)( cd $(SHRS_DIR) && $(COPY_NODEREF) --parents \
422 $(SHRS) \
423 $(DESTDIR)$(DATADIR)/ \
425 endif
427 uninstall: uninstall-bins uninstall-libs uninstall-includes \
428 uninstall-docs uninstall-mans uninstall-shares \
430 uninstall-bins:
431 ifneq ($(strip $(BINS)),)
432 @echo " UNINST $(addprefix $(DESTDIR)$(BINDIR)/,$(BINS))"
433 $(HIDE)$(RM) $(addprefix $(DESTDIR)$(BINDIR)/,$(BINS))
434 endif
436 uninstall-libs:
437 ifneq ($(strip $(LIBS)),)
438 @echo " UNINST $(addprefix $(DESTDIR)$(LIBDIR)/,$(LIBS_ALL_FILES))"
439 $(HIDE)$(RM) $(addprefix $(DESTDIR)$(LIBDIR)/,$(LIBS_ALL_FILES))
440 endif
442 uninstall-includes:
443 ifneq ($(strip $(INCS)),)
444 @echo " UNINST $(addprefix $(DESTDIR)$(INCLUDEDIR)/,$(INCS))"
445 $(HIDE)$(RM) $(addprefix $(DESTDIR)$(INCLUDEDIR)/,$(INCS))
446 endif
448 uninstall-docs:
449 ifneq ($(strip $(DOCS)),)
450 @echo " UNINST $(addprefix $(DESTDIR)$(DOCDIR)/,$(DOCS))"
451 $(HIDE)$(RM) -r $(addprefix $(DESTDIR)$(DOCDIR)/,$(DOCS))
452 endif
454 uninstall-mans:
455 ifneq ($(strip $(MANS)),)
456 @echo " UNINST $(addprefix $(DESTDIR)$(MANDIR)/,$(MANS))"
457 $(HIDE)$(RM) $(addprefix $(DESTDIR)$(MANDIR)/,$(MANS))
458 endif
460 uninstall-shares:
461 ifneq ($(strip $(SHRS)),)
462 @echo " UNINST $(addprefix $(DESTDIR)$(DATADIR)/,$(SHRS))"
463 $(HIDE)$(RM) $(addprefix $(DESTDIR)$(DATADIR)/,$(SHRS))
464 endif
467 ### Dependencies
468 ifneq ($(MAKECMDGOALS),distclean)
469 ifneq ($(MAKECMDGOALS),clean)
470 -include $(SDEP)
471 endif
472 endif