Home | History | Annotate | Line # | Download | only in pzstd
      1  1.1  christos # ################################################################
      2  1.1  christos # Copyright (c) Meta Platforms, Inc. and affiliates.
      3  1.1  christos # All rights reserved.
      4  1.1  christos #
      5  1.1  christos # This source code is licensed under both the BSD-style license (found in the
      6  1.1  christos # LICENSE file in the root directory of this source tree) and the GPLv2 (found
      7  1.1  christos # in the COPYING file in the root directory of this source tree).
      8  1.1  christos # ################################################################
      9  1.1  christos 
     10  1.1  christos # Standard variables for installation
     11  1.1  christos DESTDIR ?=
     12  1.1  christos PREFIX  ?= /usr/local
     13  1.1  christos BINDIR  := $(PREFIX)/bin
     14  1.1  christos 
     15  1.1  christos ZSTDDIR = ../../lib
     16  1.1  christos PROGDIR = ../../programs
     17  1.1  christos 
     18  1.1  christos # External program to use to run tests, e.g. qemu or valgrind
     19  1.1  christos TESTPROG  ?=
     20  1.1  christos # Flags to pass to the tests
     21  1.1  christos TESTFLAGS ?=
     22  1.1  christos 
     23  1.1  christos # We use gcc/clang to generate the header dependencies of files
     24  1.1  christos DEPFLAGS = -MMD -MP -MF $*.Td
     25  1.1  christos POSTCOMPILE = mv -f $*.Td $*.d
     26  1.1  christos 
     27  1.1  christos # CFLAGS, CXXFLAGS, CPPFLAGS, and LDFLAGS are for the users to override
     28  1.1  christos CFLAGS   ?= -O3 -Wall -Wextra
     29  1.1  christos CXXFLAGS ?= -O3 -Wall -Wextra -pedantic
     30  1.1  christos CPPFLAGS ?=
     31  1.1  christos LDFLAGS  ?=
     32  1.1  christos 
     33  1.1  christos # PZstd uses legacy APIs
     34  1.1  christos CFLAGS   += -Wno-deprecated-declarations
     35  1.1  christos 
     36  1.1  christos # Include flags
     37  1.1  christos PZSTD_INC  = -I$(ZSTDDIR) -I$(ZSTDDIR)/common -I$(PROGDIR) -I.
     38  1.1  christos GTEST_INC  = -isystem googletest/googletest/include
     39  1.1  christos 
     40  1.1  christos # Set the minimum required by gtest
     41  1.1  christos PZSTD_CXX_STD := -std=c++14
     42  1.1  christos 
     43  1.1  christos PZSTD_CPPFLAGS  = $(PZSTD_INC)
     44  1.1  christos PZSTD_CCXXFLAGS =
     45  1.1  christos PZSTD_CFLAGS    = $(PZSTD_CCXXFLAGS)
     46  1.1  christos PZSTD_CXXFLAGS  = $(PZSTD_CCXXFLAGS) $(PZSTD_CXX_STD)
     47  1.1  christos PZSTD_LDFLAGS   =
     48  1.1  christos EXTRA_FLAGS     =
     49  1.1  christos ALL_CFLAGS      = $(EXTRA_FLAGS) $(CPPFLAGS) $(PZSTD_CPPFLAGS) $(CFLAGS)   $(PZSTD_CFLAGS)
     50  1.1  christos ALL_CXXFLAGS    = $(EXTRA_FLAGS) $(CPPFLAGS) $(PZSTD_CPPFLAGS) $(CXXFLAGS) $(PZSTD_CXXFLAGS)
     51  1.1  christos ALL_LDFLAGS     = $(EXTRA_FLAGS) $(CXXFLAGS) $(LDFLAGS) $(PZSTD_LDFLAGS)
     52  1.1  christos 
     53  1.1  christos 
     54  1.1  christos # gtest libraries need to go before "-lpthread" because they depend on it.
     55  1.1  christos GTEST_LIB  = -L googletest/build/googlemock/gtest
     56  1.1  christos LIBS       =
     57  1.1  christos 
     58  1.1  christos # Compilation commands
     59  1.1  christos LD_COMMAND  = $(CXX) $^          $(ALL_LDFLAGS) $(LIBS) -pthread -o $@
     60  1.1  christos CC_COMMAND  = $(CC)  $(DEPFLAGS) $(ALL_CFLAGS)   -c $<  -o $@
     61  1.1  christos CXX_COMMAND = $(CXX) $(DEPFLAGS) $(ALL_CXXFLAGS) -c $<  -o $@
     62  1.1  christos 
     63  1.1  christos # List all the pzstd source files so we can determine their dependencies
     64  1.1  christos PZSTD_SRCS  := $(wildcard *.cpp)
     65  1.1  christos PZSTD_TESTS := $(wildcard test/*.cpp)
     66  1.1  christos UTILS_TESTS := $(wildcard utils/test/*.cpp)
     67  1.1  christos ALL_SRCS    := $(PZSTD_SRCS) $(PZSTD_TESTS) $(UTILS_TESTS)
     68  1.1  christos 
     69  1.1  christos 
     70  1.1  christos # Define *.exe as extension for Windows systems
     71  1.1  christos ifneq (,$(filter Windows%,$(OS)))
     72  1.1  christos EXT =.exe
     73  1.1  christos else
     74  1.1  christos EXT =
     75  1.1  christos endif
     76  1.1  christos 
     77  1.1  christos # Standard targets
     78  1.1  christos .PHONY: default
     79  1.1  christos default: all
     80  1.1  christos 
     81  1.1  christos .PHONY: test-pzstd
     82  1.1  christos test-pzstd: TESTFLAGS=--gtest_filter=-*ExtremelyLarge*
     83  1.1  christos test-pzstd: clean googletest pzstd tests check
     84  1.1  christos 
     85  1.1  christos .PHONY: test-pzstd32
     86  1.1  christos test-pzstd32: clean googletest32 all32 check
     87  1.1  christos 
     88  1.1  christos .PHONY: test-pzstd-tsan
     89  1.1  christos test-pzstd-tsan: LDFLAGS=-fuse-ld=gold
     90  1.1  christos test-pzstd-tsan: TESTFLAGS=--gtest_filter=-*ExtremelyLarge*
     91  1.1  christos test-pzstd-tsan: clean googletest tsan check
     92  1.1  christos 
     93  1.1  christos .PHONY: test-pzstd-asan
     94  1.1  christos test-pzstd-asan: LDFLAGS=-fuse-ld=gold
     95  1.1  christos test-pzstd-asan: TESTFLAGS=--gtest_filter=-*ExtremelyLarge*
     96  1.1  christos test-pzstd-asan: clean asan check
     97  1.1  christos 
     98  1.1  christos .PHONY: check
     99  1.1  christos check:
    100  1.1  christos 	$(TESTPROG) ./utils/test/BufferTest$(EXT) $(TESTFLAGS)
    101  1.1  christos 	$(TESTPROG) ./utils/test/RangeTest$(EXT) $(TESTFLAGS)
    102  1.1  christos 	$(TESTPROG) ./utils/test/ResourcePoolTest$(EXT) $(TESTFLAGS)
    103  1.1  christos 	$(TESTPROG) ./utils/test/ScopeGuardTest$(EXT) $(TESTFLAGS)
    104  1.1  christos 	$(TESTPROG) ./utils/test/ThreadPoolTest$(EXT) $(TESTFLAGS)
    105  1.1  christos 	$(TESTPROG) ./utils/test/WorkQueueTest$(EXT) $(TESTFLAGS)
    106  1.1  christos 	$(TESTPROG) ./test/OptionsTest$(EXT) $(TESTFLAGS)
    107  1.1  christos 	$(TESTPROG) ./test/PzstdTest$(EXT) $(TESTFLAGS)
    108  1.1  christos 
    109  1.1  christos .PHONY: install
    110  1.1  christos install: PZSTD_CPPFLAGS += -DNDEBUG
    111  1.1  christos install: pzstd$(EXT)
    112  1.1  christos 	install -d -m 755 $(DESTDIR)$(BINDIR)/
    113  1.1  christos 	install -m 755 pzstd$(EXT) $(DESTDIR)$(BINDIR)/pzstd$(EXT)
    114  1.1  christos 
    115  1.1  christos .PHONY: uninstall
    116  1.1  christos uninstall:
    117  1.1  christos 	$(RM) $(DESTDIR)$(BINDIR)/pzstd$(EXT)
    118  1.1  christos 
    119  1.1  christos # Targets for many different builds
    120  1.1  christos .PHONY: all
    121  1.1  christos all: PZSTD_CPPFLAGS += -DNDEBUG
    122  1.1  christos all: pzstd$(EXT)
    123  1.1  christos 
    124  1.1  christos .PHONY: debug
    125  1.1  christos debug: EXTRA_FLAGS += -g
    126  1.1  christos debug: pzstd$(EXT) tests roundtrip
    127  1.1  christos 
    128  1.1  christos .PHONY: tsan
    129  1.1  christos tsan: PZSTD_CCXXFLAGS += -fsanitize=thread -fPIC
    130  1.1  christos tsan: PZSTD_LDFLAGS   += -fsanitize=thread
    131  1.1  christos tsan: debug
    132  1.1  christos 
    133  1.1  christos .PHONY: asan
    134  1.1  christos asan: EXTRA_FLAGS += -fsanitize=address
    135  1.1  christos asan: debug
    136  1.1  christos 
    137  1.1  christos .PHONY: ubsan
    138  1.1  christos ubsan: EXTRA_FLAGS += -fsanitize=undefined
    139  1.1  christos ubsan: debug
    140  1.1  christos 
    141  1.1  christos .PHONY: all32
    142  1.1  christos all32: EXTRA_FLAGS += -m32
    143  1.1  christos all32: all tests roundtrip
    144  1.1  christos 
    145  1.1  christos .PHONY: debug32
    146  1.1  christos debug32: EXTRA_FLAGS += -m32
    147  1.1  christos debug32: debug
    148  1.1  christos 
    149  1.1  christos .PHONY: asan32
    150  1.1  christos asan32: EXTRA_FLAGS += -m32
    151  1.1  christos asan32: asan
    152  1.1  christos 
    153  1.1  christos .PHONY: tsan32
    154  1.1  christos tsan32: EXTRA_FLAGS += -m32
    155  1.1  christos tsan32: tsan
    156  1.1  christos 
    157  1.1  christos .PHONY: ubsan32
    158  1.1  christos ubsan32: EXTRA_FLAGS += -m32
    159  1.1  christos ubsan32: ubsan
    160  1.1  christos 
    161  1.1  christos # Run long round trip tests
    162  1.1  christos .PHONY: roundtripcheck
    163  1.1  christos roundtripcheck: roundtrip check
    164  1.1  christos 	$(TESTPROG) ./test/RoundTripTest$(EXT) $(TESTFLAGS)
    165  1.1  christos 
    166  1.1  christos # Build the main binary
    167  1.1  christos pzstd$(EXT): main.o $(PROGDIR)/util.o Options.o Pzstd.o SkippableFrame.o $(ZSTDDIR)/libzstd.a
    168  1.1  christos 	$(LD_COMMAND)
    169  1.1  christos 
    170  1.1  christos # Target that depends on all the tests
    171  1.1  christos .PHONY: tests
    172  1.1  christos tests: EXTRA_FLAGS += -Wno-deprecated-declarations
    173  1.1  christos tests: $(patsubst %,%$(EXT),$(basename $(PZSTD_TESTS) $(UTILS_TESTS)))
    174  1.1  christos 
    175  1.1  christos # Build the round trip tests
    176  1.1  christos .PHONY: roundtrip
    177  1.1  christos roundtrip: EXTRA_FLAGS += -Wno-deprecated-declarations
    178  1.1  christos roundtrip: test/RoundTripTest$(EXT)
    179  1.1  christos 
    180  1.1  christos # Use the static library that zstd builds for simplicity and
    181  1.1  christos # so we get the compiler options correct
    182  1.1  christos .PHONY: $(ZSTDDIR)/libzstd.a
    183  1.1  christos $(ZSTDDIR)/libzstd.a:
    184  1.1  christos 	CFLAGS="$(ALL_CFLAGS)" LDFLAGS="$(ALL_LDFLAGS)" $(MAKE) -C $(ZSTDDIR) libzstd.a
    185  1.1  christos 
    186  1.1  christos # Rules to build the tests
    187  1.1  christos test/RoundTripTest$(EXT): test/RoundTripTest.o $(PROGDIR)/datagen.o \
    188  1.1  christos                           $(PROGDIR)/util.o Options.o \
    189  1.1  christos                           Pzstd.o SkippableFrame.o $(ZSTDDIR)/libzstd.a
    190  1.1  christos 	$(LD_COMMAND)
    191  1.1  christos 
    192  1.1  christos test/%Test$(EXT): PZSTD_LDFLAGS += $(GTEST_LIB)
    193  1.1  christos test/%Test$(EXT): LIBS += -lgtest -lgtest_main
    194  1.1  christos test/%Test$(EXT): test/%Test.o $(PROGDIR)/datagen.o \
    195  1.1  christos                   $(PROGDIR)/util.o Options.o Pzstd.o \
    196  1.1  christos                   SkippableFrame.o $(ZSTDDIR)/libzstd.a
    197  1.1  christos 	$(LD_COMMAND)
    198  1.1  christos 
    199  1.1  christos utils/test/%Test$(EXT): PZSTD_LDFLAGS += $(GTEST_LIB)
    200  1.1  christos utils/test/%Test$(EXT): LIBS += -lgtest -lgtest_main
    201  1.1  christos utils/test/%Test$(EXT): utils/test/%Test.o
    202  1.1  christos 	$(LD_COMMAND)
    203  1.1  christos 
    204  1.1  christos 
    205  1.1  christos GTEST_CMAKEFLAGS =
    206  1.1  christos 
    207  1.1  christos # Install googletest
    208  1.1  christos .PHONY: googletest
    209  1.1  christos googletest: PZSTD_CCXXFLAGS += -fPIC
    210  1.1  christos googletest:
    211  1.1  christos 	@$(RM) -rf googletest
    212  1.1  christos 	@git clone https://github.com/google/googletest
    213  1.1  christos 	@mkdir -p googletest/build
    214  1.1  christos 	@cd googletest/build && cmake $(GTEST_CMAKEFLAGS) -DCMAKE_CXX_FLAGS="$(ALL_CXXFLAGS)" .. && $(MAKE)
    215  1.1  christos 
    216  1.1  christos .PHONY: googletest32
    217  1.1  christos googletest32: PZSTD_CCXXFLAGS  += -m32
    218  1.1  christos googletest32: googletest
    219  1.1  christos 
    220  1.1  christos .PHONY: googletest-mingw64
    221  1.1  christos googletest-mingw64: GTEST_CMAKEFLAGS += -G "MSYS Makefiles"
    222  1.1  christos googletest-mingw64: googletest
    223  1.1  christos 
    224  1.1  christos .PHONY: clean
    225  1.1  christos clean:
    226  1.1  christos 	$(RM) -f *.o pzstd$(EXT) *.Td *.d
    227  1.1  christos 	$(RM) -f test/*.o test/*Test$(EXT) test/*.Td test/*.d
    228  1.1  christos 	$(RM) -f utils/test/*.o utils/test/*Test$(EXT) utils/test/*.Td utils/test/*.d
    229  1.1  christos 	$(RM) -f $(PROGDIR)/*.o $(PROGDIR)/*.Td $(PROGDIR)/*.d
    230  1.1  christos 	$(MAKE) -C $(ZSTDDIR) clean
    231  1.1  christos 	@echo Cleaning completed
    232  1.1  christos 
    233  1.1  christos 
    234  1.1  christos # Cancel implicit rules
    235  1.1  christos %.o: %.c
    236  1.1  christos %.o: %.cpp
    237  1.1  christos 
    238  1.1  christos # Object file rules
    239  1.1  christos %.o: %.c
    240  1.1  christos 	$(CC_COMMAND)
    241  1.1  christos 	$(POSTCOMPILE)
    242  1.1  christos 
    243  1.1  christos $(PROGDIR)/%.o: $(PROGDIR)/%.c
    244  1.1  christos 	$(CC_COMMAND)
    245  1.1  christos 	$(POSTCOMPILE)
    246  1.1  christos 
    247  1.1  christos %.o: %.cpp
    248  1.1  christos 	$(CXX_COMMAND)
    249  1.1  christos 	$(POSTCOMPILE)
    250  1.1  christos 
    251  1.1  christos test/%.o: PZSTD_CPPFLAGS += $(GTEST_INC)
    252  1.1  christos test/%.o: test/%.cpp
    253  1.1  christos 	$(CXX_COMMAND)
    254  1.1  christos 	$(POSTCOMPILE)
    255  1.1  christos 
    256  1.1  christos utils/test/%.o: PZSTD_CPPFLAGS += $(GTEST_INC)
    257  1.1  christos utils/test/%.o: utils/test/%.cpp
    258  1.1  christos 	$(CXX_COMMAND)
    259  1.1  christos 	$(POSTCOMPILE)
    260  1.1  christos 
    261  1.1  christos # Dependency file stuff
    262  1.1  christos .PRECIOUS: %.d test/%.d utils/test/%.d
    263  1.1  christos 
    264  1.1  christos # Include rules that specify header file dependencies
    265  1.1  christos -include $(patsubst %,%.d,$(basename $(ALL_SRCS)))
    266