`make all` exercises substantially more than the default zstd binary. It also builds compression-only and decompression-only archives, older contrib tools that compile program C shims directly, and the single-file amalgamations. The Rust migration had changed symbol ownership without updating every one of those feature and link boundaries. The first failure came from `fileio_asyncio`: it is always compiled, but its codec bindings unconditionally referenced both `zstd_compress` and `zstd_decompress`. A compression-only archive therefore required disabled decoder modules, and the decompression-only configuration had the symmetric problem. Gate the concrete codec imports, callback types, helpers, and exports with their Cargo features. Keep the format probe compilable without the legacy decoder predicate when decompression is disabled. Once that boundary compiled, the remaining `make all` paths exposed related integration gaps. Move the C decompression projection declarations out of the compression preprocessor block, while leaving destination callback types shared. Link the Rust CLI helpers archive into zlibWrapper, pzstd, and largeNbDicts, whose util/time/data-generator C files are now declaration shims rather than implementations. The generated single-file C sources also call Rust-owned symbols now. Build and link an appropriately featured Rust archive in their native smoke tests, and include the pool configuration shim in the decoder case. The full amalgamation combines `zstd_lazy.c` and `zstd_opt.c` into one translation unit, so guard their otherwise translation-unit-local dictionary mode enum against duplicate definition. A Rust-backed amalgamation is no longer a standalone Emscripten input. Remove the obsolete emcc/Docker path and report that limitation explicitly; restoring the WebAssembly smoke test requires a Rust WebAssembly archive and a defined cross-language amalgamation contract. Test Plan: - `cargo check --manifest-path rust/Cargo.toml --no-default-features --features compression` -- passed - `cargo check --manifest-path rust/Cargo.toml --no-default-features --features decompression` -- passed - `sh -n build/single_file_libs/build_decoder_test.sh build/single_file_libs/build_library_test.sh` -- passed - `make all` -- passed, including native single-file and seekable-format tests - `git diff --cached --check` -- passed
285 lines
8.2 KiB
Makefile
285 lines
8.2 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
|
|
CARGO ?= cargo
|
|
RUSTDIR = ../../rust
|
|
RUST_CLI_DIR = $(RUSTDIR)/cli
|
|
RUST_CLI_MANIFEST = $(RUST_CLI_DIR)/Cargo.toml
|
|
RUST_CLI_HELPER_SOURCES = $(RUST_CLI_MANIFEST) $(RUST_CLI_DIR)/Cargo.lock \
|
|
$(RUST_CLI_DIR)/src/lib.rs \
|
|
$(RUSTDIR)/src/timefn.rs $(RUSTDIR)/src/benchfn.rs \
|
|
$(RUSTDIR)/src/datagen.rs $(RUSTDIR)/src/lorem.rs \
|
|
$(RUSTDIR)/src/util.rs
|
|
RUST_CLI_HELPERS_TARGET_DIR = $(RUSTDIR)/target/cli-helpers
|
|
RUST_CLI_HELPERS_STATICLIB = $(RUST_CLI_HELPERS_TARGET_DIR)/release/libzstd_cli_rs.a
|
|
RUST_CLI_HELPERS_CARGO_FLAGS = --manifest-path $(RUST_CLI_MANIFEST) --release \
|
|
--target-dir $(RUST_CLI_HELPERS_TARGET_DIR) \
|
|
--no-default-features --features helpers
|
|
|
|
# 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
|
|
|
|
# Set the minimum required by gtest
|
|
PZSTD_CXX_STD := -std=c++14
|
|
|
|
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 $(RUST_CLI_HELPERS_STATICLIB)
|
|
$(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
|
|
|
|
$(RUST_CLI_HELPERS_STATICLIB): $(RUST_CLI_HELPER_SOURCES)
|
|
$(CARGO) build $(RUST_CLI_HELPERS_CARGO_FLAGS)
|
|
|
|
# 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 \
|
|
$(RUST_CLI_HELPERS_STATICLIB)
|
|
$(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 \
|
|
$(RUST_CLI_HELPERS_STATICLIB)
|
|
$(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)))
|