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