1#
2# Copyright (C) 2021, Stephan Mueller <smueller@chronox.de>
3#
4
5CC		:= gcc
6CFLAGS		+= -Wextra -Wall -pedantic -fPIC -O2 -std=gnu18
7#Hardening
8CFLAGS		+= -D_FORTIFY_SOURCE=2 -fstack-protector-strong -fwrapv --param ssp-buffer-size=4 -fvisibility=hidden -fPIE -Wconversion -Wcast-align -Wmissing-field-initializers -Wshadow -Wswitch-enum
9
10#Optimizations
11CFLAGS		+= -flto
12LDFLAGS		+= -flto
13
14UNAME_S := $(shell uname -s)
15ifeq ($(UNAME_S),Linux)
16LDFLAGS		+= -Wl,-z,relro,-z,now,--as-needed -pie
17endif
18
19NAME		:= gcd
20
21DESTDIR		:=
22ETCDIR		:= /etc
23BINDIR		:= /bin
24SBINDIR		:= /sbin
25SHAREDIR	:= /usr/share/keyutils
26MANDIR		:= /usr/share/man
27MAN1		:= $(MANDIR)/man1
28MAN3		:= $(MANDIR)/man3
29MAN5		:= $(MANDIR)/man5
30MAN7		:= $(MANDIR)/man7
31MAN8		:= $(MANDIR)/man8
32INCLUDEDIR	:= /usr/include
33LN		:= ln
34LNS		:= $(LN) -sf
35STRIP		?= strip -s
36
37###############################################################################
38#
39# Define compilation options
40#
41###############################################################################
42INCLUDE_DIRS	:= ../../ ../../src
43LIBRARY_DIRS	:=
44LIBRARIES	:=
45
46CFLAGS		+= $(foreach includedir,$(INCLUDE_DIRS),-I$(includedir))
47LDFLAGS		+= $(foreach librarydir,$(LIBRARY_DIRS),-L$(librarydir))
48LDFLAGS		+= $(foreach library,$(LIBRARIES),-l$(library))
49
50###############################################################################
51#
52# Get version name and cross check
53#
54###############################################################################
55VERFILE    := gcd.c
56
57APPMAJOR   := $(shell grep '^\#define.*MAJVERSION' $(VERFILE) | awk '{print $$3}')
58APPMINOR   := $(shell grep '^\#define.*MINVERSION' $(VERFILE) | awk '{print $$3}')
59APPPATCH   := $(shell grep '^\#define.*PATCHLEVEL' $(VERFILE) | awk '{print $$3}')
60APPVERSION := $(APPMAJOR).$(APPMINOR).$(APPPATCH)
61
62###############################################################################
63#
64# Guess at the appropriate lib directory and word size
65#
66###############################################################################
67ifeq ($(UNAME_S),Linux)
68
69ifeq ($(origin LIBDIR),undefined)
70LIBDIR		:= $(shell ldd /usr/bin/make | grep '\(/libc\.\)' | sed -e 's!.*\(/.*\)/libc[.].*!\1!')
71endif
72ifeq ($(origin USRLIBDIR),undefined)
73USRLIBDIR	:= $(patsubst /lib/%,/usr/lib/%,$(LIBDIR))
74endif
75BUILDFOR	:= $(shell file /usr/bin/make | sed -e 's!.*ELF \(32\|64\)-bit.*!\1!')-bit
76
77ifeq ($(origin CFLAGS),undefined)
78ifeq ($(BUILDFOR),32-bit)
79CFLAGS		+= -m32
80LIBDIR		:= /lib
81USRLIBDIR	:= /usr/lib
82else
83ifeq ($(BUILDFOR),64-bit)
84CFLAGS		+= -m64
85LIBDIR		:= /lib64
86USRLIBDIR	:= /usr/lib64
87endif
88endif
89endif
90
91else
92LIBDIR		:= /lib
93USRLIBDIR	:= /usr/lib
94endif
95
96
97###############################################################################
98#
99# Define files to be compiled
100#
101###############################################################################
102C_SRCS := $(wildcard *.c) ../../src/jitterentropy-gcd.c
103C_OBJS := ${C_SRCS:.c=.o}
104C_GCOV := ${C_SRCS:.c=.gcda}
105C_GCOV += ${C_SRCS:.c=.gcno}
106C_GCOV += ${C_SRCS:.c=.gcov}
107OBJS := $(C_OBJS)
108
109analyze_srcs = $(filter %.c, $(sort $(C_SRCS)))
110analyze_plists = $(analyze_srcs:%.c=%.plist)
111
112.PHONY: all scan install clean cppcheck distclean debug asanaddress asanthread leak gcov
113
114all: $(NAME)
115
116debug: CFLAGS += -g -DDEBUG
117debug: DBG-$(NAME)
118
119asanaddress: CFLAGS += -g -DDEBUG -fsanitize=address -fno-omit-frame-pointer
120asanaddress: LDFLAGS += -fsanitize=address
121asanaddress: DBG-$(NAME)
122
123asanthread: CFLAGS += -g -DDEBUG -fsanitize=thread -fno-omit-frame-pointer
124asanthread: LDFLAGS += -fsanitize=thread
125asanthread: DBG-$(NAME)
126
127leak: CFLAGS += -g -DDEBUG -fsanitize=leak -fno-omit-frame-pointer
128leak: LDFLAGS += -fsanitize=leak
129leak: DBG-$(NAME)
130
131# Compile for the use of GCOV
132# Usage after compilation: gcov <file>.c
133gcov: CFLAGS += -g -DDEBUG -fprofile-arcs -ftest-coverage
134gcov: LDFLAGS += -fprofile-arcs
135gcov: DBG-$(NAME)
136
137###############################################################################
138#
139# Build the library
140#
141##############################################################################
142
143$(NAME): $(OBJS)
144	$(CC) -o $(NAME) $(OBJS) $(LDFLAGS)
145	$(STRIP) $(NAME)
146
147DBG-$(NAME): $(OBJS)
148	$(CC) -g -DDEBUG -o $(NAME) $(OBJS) $(LDFLAGS)
149
150$(analyze_plists): %.plist: %.c
151	@echo "  CCSA  " $@
152	clang --analyze $(CFLAGS) $< -o $@
153
154scan: $(analyze_plists)
155
156cppcheck:
157	cppcheck --force -q --enable=performance --enable=warning --enable=portability *.h *.c ../lib/*.c ../lib/*.h
158
159asm:
160	$(foreach b, $(C_SRCS), $(CC) $(CFLAGS) -S -fverbose-asm -o ${b:.c=.s} $(b);)
161
162install:
163	install -m 0755 $(NAME) -D -t $(DESTDIR)$(BINDIR)/
164
165###############################################################################
166#
167# Clean
168#
169###############################################################################
170
171clean:
172	@- $(RM) $(OBJS)
173	@- $(RM) $(NAME)
174	@- $(RM) $(C_GCOV)
175	@- $(RM) *.gcov
176	@- $(RM) $(analyze_plists)
177
178distclean: clean
179
180###############################################################################
181#
182# Show variables
183#
184###############################################################################
185show_vars:
186	@echo APPVERSION=$(APPVERSION)
187	@echo DESTDIR=$(DESTDIR)
188	@echo BINDIR=$(BINDIR)
189	@echo LIBDIR=$(LIBDIR)
190	@echo USRLIBDIR=$(USRLIBDIR)
191	@echo BUILDFOR=$(BUILDFOR)
192	@echo NAME=$(NAME)
193	@echo LDFLAGS=$(LDFLAGS)
194	@echo CFLAGS=$(CFLAGS)
195