BIN := csv_view
PREFIX := /usr/local
CONFIG := Release
MAKEFLAGS := $(MAKEFLAGS) -r
ifeq ($(CONFIG), Asan)
CFLAGS += -Og -g3 -fsanitize=address
LDFLAGS += -fsanitize=address
else ifeq ($(CONFIG), Ubsan)
CFLAGS += -Og -g3 -fsanitize=undefined
LDFLAGS += -fsanitize=undefined
else ifeq ($(CONFIG), Lsan)
CFLAGS += -Og -g3 -fsanitize=leak
LDFLAGS += -fsanitize=leak
else ifeq ($(CONFIG), Profile)
CFLAGS += -Og -g3
CPPFLAGS += -DNDEBUG
else ifeq ($(CONFIG), Release)
LTO ?= yes
STRIP ?= yes
CFLAGS += -O3
CPPFLAGS += -DNDEBUG
LDFLAGS += -Wl,-O1,--as-needed,-z,now,-z,defs
else
$(error CONFIG: invalid value; must be "Asan", "Ubsan", "Lsan", "Profile" or "Release")
endif
ifeq ($(LTO), yes)
CFLAGS += -flto
LDFLAGS += -fuse-linker-plugin $(CFLAGS)
endif
ifeq ($(STATIC), yes)
LDFLAGS += -static
endif
ifeq ($(STRIP), yes)
LDFLAGS += -s
endif
override CFLAGS += -std=c11 -pedantic -Wall -Wextra -Wno-char-subscripts \
-funsigned-char
override CPPFLAGS += -Iinclude -D_DEFAULT_SOURCE \
-DPROG_NAME="\"$(BIN)\"" \
-DPROG_VERSION="\"$(shell git rev-parse --short HEAD)\""
override LDFLAGS +=
override LDLIBS += -lncurses -ltinfo
SRC := $(wildcard src/*.c)
OBJ := $(SRC:src/%.c=obj/%.o)
.PHONY: all clean install uninstall lint test pgo-gcc
all: $(BIN)
clean:
rm -rf -- $(BIN) obj/
install: $(BIN)
mkdir -p -- $(DESTDIR)$(PREFIX)/bin
cp -f -- $(BIN) $(DESTDIR)$(PREFIX)/bin
chmod 755 -- $(addprefix $(DESTDIR)$(PREFIX)/bin/, $(BIN))
uninstall: | $(SUBMAKE)
rm -- $(addprefix $(DESTDIR)$(PREFIX)/bin/, $(BIN))
lint: clean
@command -v scan-build >/dev/null && scan-build -analyze-headers \
-no-failure-reports $(MAKE) CFLAGS="-O0";
test: $(BIN)
test/test.sh all
pgo-gcc: clean
@ CFLAGS="-fprofile-generate" LDFLAGS="-fprofile-generate" $(MAKE) test
rm -f -- $(BIN) obj/*.o
@ CFLAGS="-fprofile-use" $(MAKE)
$(BIN): $(OBJ)
$(CC) $(LDFLAGS) $^ -o $@ $(LDLIBS)
obj/%.o: src/%.c | obj/
$(CC) $(CPPFLAGS) $(CFLAGS) -c $< -o $@
obj/:
@mkdir obj/