Current section

Files

Jump to
Raw

Makefile

MAKEFLAGS += --no-builtin-rules
.ONESHELL:
# configurables
CC ?= cc
CC := $(CC)
CFLAGS ?= -O2
LDFLAGS ?=
# the following line could remove the need of setting ERLANGDIR externally
# however it hangs the whole castle when make is invoked through bear
# ERLANGDIR = $(shell erl -eval 'io:format("~s", [code:root_dir()])' -eval 'halt()' -noshell)
ERLANGDIR ?=
ZSTDVER := 1.5.2
ZSTDDIR := priv/zstd
ZSTDTAR := vendor/zstd.tar.gz
# end configurables
COMMON_CFLAGS := \
-fno-unwind-tables -fno-asynchronous-unwind-tables \
-fno-plt \
-fPIC
BASE_CFLAGS := \
-std=c11 \
-isystem$(ERLANGDIR)/usr/include \
-isystem$(ZSTDDIR) \
-DZSTD_STATIC_LINKING_ONLY=1 \
$(COMMON_CFLAGS)
WARNING_CFLAGS := \
-Wall -Wextra -Wvla -Wpedantic -Wconversion -Winline
BASE_LDFLAGS := \
-shared \
-L$(ERLANGDIR)/usr/lib \
-lei
DEPFLAGS = -MT $@ -MMD -MF priv/c_out/$*.d
SOURCES := $(wildcard c_src/*.c)
HEADERS := $(wildcard c_src/*.h)
OBJECTS := $(SOURCES:%.c=priv/c_out/%.o)
DEPFILES := $(SOURCES:%.c=priv/c_out/%.d)
ALL_OBJECTS := $(OBJECTS) $(ZSTDDIR)/libzstd.a
all: priv/c_out/ex_zstd_nif.so
priv/c_out/ex_zstd_nif.so: $(ALL_OBJECTS)
mkdir -p $(@D)
$(CC) $(ALL_OBJECTS) $(BASE_LDFLAGS) $(DEPFLAGS) $(LDFLAGS) -o $@
priv/c_out/c_src/%.o: c_src/%.c $(ZSTDDIR)/zstd.h
mkdir -p $(@D)
$(CC) $< $(BASE_CFLAGS) $(WARNING_CFLAGS) $(DEPFLAGS) $(CFLAGS) -c -o $@
$(ZSTDDIR)/libzstd.a: $(ZSTDDIR)/zstd.h
$(MAKE) \
CC="$(CC)" \
CFLAGS="$(COMMON_CFLAGS) $(CFLAGS)" \
LDFLAGS="$(LDFLAGS)" \
ZSTD_STATIC_LINKING_ONLY=1 \
ZSTD_LIB_COMPRESSION=1 \
ZSTD_LIB_DECOMPRESSION=1 \
ZSTD_LIB_DICTBUILDER=1 \
ZSTD_LIB_DEPRECATED=0 \
ZSTD_LIB_MINIFY=1 \
-C $(@D) \
libzstd.a-mt
# this has no explicit dependency on $(ZSTDTAR)
# this is intentional! The tar is part of the package, if it's missing human judgment is required.
$(ZSTDDIR)/zstd.h:
mkdir -p $(@D)
tar -zx -f $(ZSTDTAR) -C $(@D) --strip-components=2 zstd-$(ZSTDVER)/lib
-include $(DEPFILES)
.PHONY: format
format:
clang-format --style=file -i $(SOURCES) $(HEADERS)
.PHONY: lint
lint:
clang-tidy --fix $(SOURCES)
.PHONY: check
check: compile_commands.json
clang-format --style=file --dry-run $(SOURCES) $(HEADERS)
clang-tidy $(SOURCES)
.PHONY: clean
clean:
-$(MAKE) -C $(ZSTDDIR) clean
rm -rf priv/c_out
.PHONY: clean-all
clean-all: clean
rm -rf priv $(ZSTDDIR)
compile_commands.json: $(ZSTDDIR)/zstd.h
bear -- $(MAKE) $(OBJECTS)
$(ZSTDTAR):
mkdir -p $(@D)
curl -sSL -o $(ZSTDTAR) https://github.com/facebook/zstd/releases/download/v$(ZSTDVER)/zstd-$(ZSTDVER).tar.gz
$(ZSTDTAR).sig:
mkdir -p $(@D)
curl -sSL -o $(ZSTDTAR).sig https://github.com/facebook/zstd/releases/download/v$(ZSTDVER)/zstd-$(ZSTDVER).tar.gz.sig
$(ZSTDTAR).asc:
curl -sSL -o $(ZSTDTAR).asc http://zstd.net/signing-key.asc
.PHONY: zstd-pull
zstd-pull: $(ZSTDTAR) $(ZSTDTAR).sig $(ZSTDTAR).asc
.PHONY: zstd-verify
zstd-verify: $(ZSTDTAR) $(ZSTDTAR).sig $(ZSTDTAR).asc
gpg --import $(ZSTDTAR).asc
gpg --verify $(ZSTDTAR).sig $(ZSTDTAR)