* Extract out common portion of `lib/Makefile` into `lib/libzstd.mk`. Most relevantly, the way we find library files. * Use `lib/libzstd.mk` in the other Makefiles instead of repeating the same code. * Add a test `tests/test-variants.sh` that checks that the builds of `make -C programs allVariants` are correct, and run it in Actions. * Adds support for ASM files in the CMake build. The Meson build is not updated because it lists every file in zstd, and supports ASM off the bat, so the Huffman ASM commit will just add the ASM file to the list. The Visual Studios build is not updated because I'm not adding ASM support to Visual Studios yet.
263 lines
7.1 KiB
Makefile
263 lines
7.1 KiB
Makefile
# ################################################################
|
|
# Copyright (c) 2016-present, Facebook, Inc.
|
|
# 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 := $(DESTDIR)$(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
|
|
|
|
PZSTD_CPPFLAGS = $(PZSTD_INC)
|
|
PZSTD_CCXXFLAGS =
|
|
PZSTD_CFLAGS = $(PZSTD_CCXXFLAGS)
|
|
PZSTD_CXXFLAGS = $(PZSTD_CCXXFLAGS) -std=c++11
|
|
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 $(BINDIR)/
|
|
install -m 755 pzstd$(EXT) $(BINDIR)/pzstd$(EXT)
|
|
|
|
.PHONY: uninstall
|
|
uninstall:
|
|
$(RM) $(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)))
|