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)))
 |