269 lines
7.4 KiB
Makefile
269 lines
7.4 KiB
Makefile
# ################################################################
|
|
# Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
# All rights reserved.
|
|
#
|
|
# This source code is licensed under both the BSD-style license (found in the
|
|
# LICENSE file in the root directory of this source tree) and the GPLv2 (found
|
|
# in the COPYING file in the root directory of this source tree).
|
|
# ################################################################
|
|
|
|
# Standard variables for installation
|
|
DESTDIR ?=
|
|
PREFIX ?= /usr/local
|
|
BINDIR := $(PREFIX)/bin
|
|
|
|
ZSTDDIR = ../../lib
|
|
PROGDIR = ../../programs
|
|
|
|
# External program to use to run tests, e.g. qemu or valgrind
|
|
TESTPROG ?=
|
|
# Flags to pass to the tests
|
|
TESTFLAGS ?=
|
|
|
|
# We use gcc/clang to generate the header dependencies of files
|
|
DEPFLAGS = -MMD -MP -MF $*.Td
|
|
POSTCOMPILE = mv -f $*.Td $*.d
|
|
|
|
# CFLAGS, CXXFLAGS, CPPFLAGS, and LDFLAGS are for the users to override
|
|
CFLAGS ?= -O3 -Wall -Wextra
|
|
CXXFLAGS ?= -O3 -Wall -Wextra -pedantic
|
|
CPPFLAGS ?=
|
|
LDFLAGS ?=
|
|
|
|
# PZstd uses legacy APIs
|
|
CFLAGS += -Wno-deprecated-declarations
|
|
|
|
# Include flags
|
|
PZSTD_INC = -I$(ZSTDDIR) -I$(ZSTDDIR)/common -I$(PROGDIR) -I.
|
|
GTEST_INC = -isystem googletest/googletest/include
|
|
|
|
# If default C++ version is older than C++11, explicitly set C++11, which is the
|
|
# minimum required by the code.
|
|
ifeq ($(shell echo "\043if __cplusplus < 201103L\n\043error\n\043endif" | $(CXX) -x c++ -Werror -c - -o /dev/null 2>/dev/null && echo 1 || echo 0),0)
|
|
PZSTD_CXX_STD := -std=c++11
|
|
endif
|
|
|
|
PZSTD_CPPFLAGS = $(PZSTD_INC)
|
|
PZSTD_CCXXFLAGS =
|
|
PZSTD_CFLAGS = $(PZSTD_CCXXFLAGS)
|
|
PZSTD_CXXFLAGS = $(PZSTD_CCXXFLAGS) $(PZSTD_CXX_STD)
|
|
PZSTD_LDFLAGS =
|
|
EXTRA_FLAGS =
|
|
ALL_CFLAGS = $(EXTRA_FLAGS) $(CPPFLAGS) $(PZSTD_CPPFLAGS) $(CFLAGS) $(PZSTD_CFLAGS)
|
|
ALL_CXXFLAGS = $(EXTRA_FLAGS) $(CPPFLAGS) $(PZSTD_CPPFLAGS) $(CXXFLAGS) $(PZSTD_CXXFLAGS)
|
|
ALL_LDFLAGS = $(EXTRA_FLAGS) $(CXXFLAGS) $(LDFLAGS) $(PZSTD_LDFLAGS)
|
|
|
|
|
|
# gtest libraries need to go before "-lpthread" because they depend on it.
|
|
GTEST_LIB = -L googletest/build/googlemock/gtest
|
|
LIBS =
|
|
|
|
# Compilation commands
|
|
LD_COMMAND = $(CXX) $^ $(ALL_LDFLAGS) $(LIBS) -pthread -o $@
|
|
CC_COMMAND = $(CC) $(DEPFLAGS) $(ALL_CFLAGS) -c $< -o $@
|
|
CXX_COMMAND = $(CXX) $(DEPFLAGS) $(ALL_CXXFLAGS) -c $< -o $@
|
|
|
|
# List all the pzstd source files so we can determine their dependencies
|
|
PZSTD_SRCS := $(wildcard *.cpp)
|
|
PZSTD_TESTS := $(wildcard test/*.cpp)
|
|
UTILS_TESTS := $(wildcard utils/test/*.cpp)
|
|
ALL_SRCS := $(PZSTD_SRCS) $(PZSTD_TESTS) $(UTILS_TESTS)
|
|
|
|
|
|
# Define *.exe as extension for Windows systems
|
|
ifneq (,$(filter Windows%,$(OS)))
|
|
EXT =.exe
|
|
else
|
|
EXT =
|
|
endif
|
|
|
|
# Standard targets
|
|
.PHONY: default
|
|
default: all
|
|
|
|
.PHONY: test-pzstd
|
|
test-pzstd: TESTFLAGS=--gtest_filter=-*ExtremelyLarge*
|
|
test-pzstd: clean googletest pzstd tests check
|
|
|
|
.PHONY: test-pzstd32
|
|
test-pzstd32: clean googletest32 all32 check
|
|
|
|
.PHONY: test-pzstd-tsan
|
|
test-pzstd-tsan: LDFLAGS=-fuse-ld=gold
|
|
test-pzstd-tsan: TESTFLAGS=--gtest_filter=-*ExtremelyLarge*
|
|
test-pzstd-tsan: clean googletest tsan check
|
|
|
|
.PHONY: test-pzstd-asan
|
|
test-pzstd-asan: LDFLAGS=-fuse-ld=gold
|
|
test-pzstd-asan: TESTFLAGS=--gtest_filter=-*ExtremelyLarge*
|
|
test-pzstd-asan: clean asan check
|
|
|
|
.PHONY: check
|
|
check:
|
|
$(TESTPROG) ./utils/test/BufferTest$(EXT) $(TESTFLAGS)
|
|
$(TESTPROG) ./utils/test/RangeTest$(EXT) $(TESTFLAGS)
|
|
$(TESTPROG) ./utils/test/ResourcePoolTest$(EXT) $(TESTFLAGS)
|
|
$(TESTPROG) ./utils/test/ScopeGuardTest$(EXT) $(TESTFLAGS)
|
|
$(TESTPROG) ./utils/test/ThreadPoolTest$(EXT) $(TESTFLAGS)
|
|
$(TESTPROG) ./utils/test/WorkQueueTest$(EXT) $(TESTFLAGS)
|
|
$(TESTPROG) ./test/OptionsTest$(EXT) $(TESTFLAGS)
|
|
$(TESTPROG) ./test/PzstdTest$(EXT) $(TESTFLAGS)
|
|
|
|
.PHONY: install
|
|
install: PZSTD_CPPFLAGS += -DNDEBUG
|
|
install: pzstd$(EXT)
|
|
install -d -m 755 $(DESTDIR)$(BINDIR)/
|
|
install -m 755 pzstd$(EXT) $(DESTDIR)$(BINDIR)/pzstd$(EXT)
|
|
|
|
.PHONY: uninstall
|
|
uninstall:
|
|
$(RM) $(DESTDIR)$(BINDIR)/pzstd$(EXT)
|
|
|
|
# Targets for many different builds
|
|
.PHONY: all
|
|
all: PZSTD_CPPFLAGS += -DNDEBUG
|
|
all: pzstd$(EXT)
|
|
|
|
.PHONY: debug
|
|
debug: EXTRA_FLAGS += -g
|
|
debug: pzstd$(EXT) tests roundtrip
|
|
|
|
.PHONY: tsan
|
|
tsan: PZSTD_CCXXFLAGS += -fsanitize=thread -fPIC
|
|
tsan: PZSTD_LDFLAGS += -fsanitize=thread
|
|
tsan: debug
|
|
|
|
.PHONY: asan
|
|
asan: EXTRA_FLAGS += -fsanitize=address
|
|
asan: debug
|
|
|
|
.PHONY: ubsan
|
|
ubsan: EXTRA_FLAGS += -fsanitize=undefined
|
|
ubsan: debug
|
|
|
|
.PHONY: all32
|
|
all32: EXTRA_FLAGS += -m32
|
|
all32: all tests roundtrip
|
|
|
|
.PHONY: debug32
|
|
debug32: EXTRA_FLAGS += -m32
|
|
debug32: debug
|
|
|
|
.PHONY: asan32
|
|
asan32: EXTRA_FLAGS += -m32
|
|
asan32: asan
|
|
|
|
.PHONY: tsan32
|
|
tsan32: EXTRA_FLAGS += -m32
|
|
tsan32: tsan
|
|
|
|
.PHONY: ubsan32
|
|
ubsan32: EXTRA_FLAGS += -m32
|
|
ubsan32: ubsan
|
|
|
|
# Run long round trip tests
|
|
.PHONY: roundtripcheck
|
|
roundtripcheck: roundtrip check
|
|
$(TESTPROG) ./test/RoundTripTest$(EXT) $(TESTFLAGS)
|
|
|
|
# Build the main binary
|
|
pzstd$(EXT): main.o $(PROGDIR)/util.o Options.o Pzstd.o SkippableFrame.o $(ZSTDDIR)/libzstd.a
|
|
$(LD_COMMAND)
|
|
|
|
# Target that depends on all the tests
|
|
.PHONY: tests
|
|
tests: EXTRA_FLAGS += -Wno-deprecated-declarations
|
|
tests: $(patsubst %,%$(EXT),$(basename $(PZSTD_TESTS) $(UTILS_TESTS)))
|
|
|
|
# Build the round trip tests
|
|
.PHONY: roundtrip
|
|
roundtrip: EXTRA_FLAGS += -Wno-deprecated-declarations
|
|
roundtrip: test/RoundTripTest$(EXT)
|
|
|
|
# Use the static library that zstd builds for simplicity and
|
|
# so we get the compiler options correct
|
|
.PHONY: $(ZSTDDIR)/libzstd.a
|
|
$(ZSTDDIR)/libzstd.a:
|
|
CFLAGS="$(ALL_CFLAGS)" LDFLAGS="$(ALL_LDFLAGS)" $(MAKE) -C $(ZSTDDIR) libzstd.a
|
|
|
|
# Rules to build the tests
|
|
test/RoundTripTest$(EXT): test/RoundTripTest.o $(PROGDIR)/datagen.o \
|
|
$(PROGDIR)/util.o Options.o \
|
|
Pzstd.o SkippableFrame.o $(ZSTDDIR)/libzstd.a
|
|
$(LD_COMMAND)
|
|
|
|
test/%Test$(EXT): PZSTD_LDFLAGS += $(GTEST_LIB)
|
|
test/%Test$(EXT): LIBS += -lgtest -lgtest_main
|
|
test/%Test$(EXT): test/%Test.o $(PROGDIR)/datagen.o \
|
|
$(PROGDIR)/util.o Options.o Pzstd.o \
|
|
SkippableFrame.o $(ZSTDDIR)/libzstd.a
|
|
$(LD_COMMAND)
|
|
|
|
utils/test/%Test$(EXT): PZSTD_LDFLAGS += $(GTEST_LIB)
|
|
utils/test/%Test$(EXT): LIBS += -lgtest -lgtest_main
|
|
utils/test/%Test$(EXT): utils/test/%Test.o
|
|
$(LD_COMMAND)
|
|
|
|
|
|
GTEST_CMAKEFLAGS =
|
|
|
|
# Install googletest
|
|
.PHONY: googletest
|
|
googletest: PZSTD_CCXXFLAGS += -fPIC
|
|
googletest:
|
|
@$(RM) -rf googletest
|
|
@git clone https://github.com/google/googletest
|
|
@mkdir -p googletest/build
|
|
@cd googletest/build && cmake $(GTEST_CMAKEFLAGS) -DCMAKE_CXX_FLAGS="$(ALL_CXXFLAGS)" .. && $(MAKE)
|
|
|
|
.PHONY: googletest32
|
|
googletest32: PZSTD_CCXXFLAGS += -m32
|
|
googletest32: googletest
|
|
|
|
.PHONY: googletest-mingw64
|
|
googletest-mingw64: GTEST_CMAKEFLAGS += -G "MSYS Makefiles"
|
|
googletest-mingw64: googletest
|
|
|
|
.PHONY: clean
|
|
clean:
|
|
$(RM) -f *.o pzstd$(EXT) *.Td *.d
|
|
$(RM) -f test/*.o test/*Test$(EXT) test/*.Td test/*.d
|
|
$(RM) -f utils/test/*.o utils/test/*Test$(EXT) utils/test/*.Td utils/test/*.d
|
|
$(RM) -f $(PROGDIR)/*.o $(PROGDIR)/*.Td $(PROGDIR)/*.d
|
|
$(MAKE) -C $(ZSTDDIR) clean
|
|
@echo Cleaning completed
|
|
|
|
|
|
# Cancel implicit rules
|
|
%.o: %.c
|
|
%.o: %.cpp
|
|
|
|
# Object file rules
|
|
%.o: %.c
|
|
$(CC_COMMAND)
|
|
$(POSTCOMPILE)
|
|
|
|
$(PROGDIR)/%.o: $(PROGDIR)/%.c
|
|
$(CC_COMMAND)
|
|
$(POSTCOMPILE)
|
|
|
|
%.o: %.cpp
|
|
$(CXX_COMMAND)
|
|
$(POSTCOMPILE)
|
|
|
|
test/%.o: PZSTD_CPPFLAGS += $(GTEST_INC)
|
|
test/%.o: test/%.cpp
|
|
$(CXX_COMMAND)
|
|
$(POSTCOMPILE)
|
|
|
|
utils/test/%.o: PZSTD_CPPFLAGS += $(GTEST_INC)
|
|
utils/test/%.o: utils/test/%.cpp
|
|
$(CXX_COMMAND)
|
|
$(POSTCOMPILE)
|
|
|
|
# Dependency file stuff
|
|
.PRECIOUS: %.d test/%.d utils/test/%.d
|
|
|
|
# Include rules that specify header file dependencies
|
|
-include $(patsubst %,%.d,$(basename $(ALL_SRCS)))
|