1# ################################################################ 2# LZ4 - Makefile 3# Copyright (C) Yann Collet 2011-2023 4# All rights reserved. 5# 6# BSD license 7# Redistribution and use in source and binary forms, with or without modification, 8# are permitted provided that the following conditions are met: 9# 10# * Redistributions of source code must retain the above copyright notice, this 11# list of conditions and the following disclaimer. 12# 13# * Redistributions in binary form must reproduce the above copyright notice, this 14# list of conditions and the following disclaimer in the documentation and/or 15# other materials provided with the distribution. 16# 17# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 18# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 19# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 20# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR 21# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 22# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 23# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 24# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 26# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27# 28# You can contact the author at : 29# - LZ4 source repository : https://github.com/lz4/lz4 30# - LZ4 forum froup : https://groups.google.com/forum/#!forum/lz4c 31# ################################################################ 32 33LZ4DIR = lib 34PRGDIR = programs 35TESTDIR = tests 36EXDIR = examples 37FUZZDIR = ossfuzz 38 39include Makefile.inc 40 41 42.PHONY: default 43default: lib-release lz4-release 44 45# silent mode by default; verbose can be triggered by V=1 or VERBOSE=1 46$(V)$(VERBOSE).SILENT: 47 48.PHONY: all 49all: allmost examples manuals build_tests 50 51.PHONY: allmost 52allmost: lib lz4 53 54.PHONY: lib lib-release liblz4.a 55lib: liblz4.a 56lib lib-release liblz4.a: 57 $(MAKE) -C $(LZ4DIR) $@ 58 59.PHONY: lz4 lz4-release 60lz4 : liblz4.a 61lz4-release : lib-release 62lz4 lz4-release : 63 $(MAKE) -C $(PRGDIR) $@ 64 $(LN_SF) $(PRGDIR)/lz4$(EXT) . 65 echo lz4 build completed 66 67.PHONY: examples 68examples: liblz4.a 69 $(MAKE) -C $(EXDIR) all 70 71.PHONY: manuals 72manuals: 73 $(MAKE) -C contrib/gen_manual $@ 74 75.PHONY: build_tests 76build_tests: 77 $(MAKE) -C $(TESTDIR) all 78 79.PHONY: clean 80clean: 81 $(MAKE) -C $(LZ4DIR) $@ > $(VOID) 82 $(MAKE) -C $(PRGDIR) $@ > $(VOID) 83 $(MAKE) -C $(TESTDIR) $@ > $(VOID) 84 $(MAKE) -C $(EXDIR) $@ > $(VOID) 85 $(MAKE) -C $(FUZZDIR) $@ > $(VOID) 86 $(MAKE) -C contrib/gen_manual $@ > $(VOID) 87 $(RM) lz4$(EXT) 88 $(RM) -r $(CMAKE_BUILD_DIR) $(MESON_BUILD_DIR) 89 @echo Cleaning completed 90 91 92#----------------------------------------------------------------------------- 93# make install is validated only for Posix environments 94#----------------------------------------------------------------------------- 95ifeq ($(POSIX_ENV),Yes) 96HOST_OS = POSIX 97 98.PHONY: install uninstall 99install uninstall: 100 $(MAKE) -C $(LZ4DIR) $@ 101 $(MAKE) -C $(PRGDIR) $@ 102 103.PHONY: test-install 104test-install: 105 $(MAKE) -j1 install DESTDIR=~/install_test_dir 106 107endif # POSIX_ENV 108 109 110CMAKE ?= cmake 111CMAKE_BUILD_DIR ?= build/cmake/build 112ifneq (,$(filter MSYS%,$(shell $(UNAME)))) 113HOST_OS = MSYS 114CMAKE_PARAMS = -G"MSYS Makefiles" 115endif 116 117.PHONY: cmakebuild 118cmakebuild: 119 mkdir -p $(CMAKE_BUILD_DIR) 120 cd $(CMAKE_BUILD_DIR); $(CMAKE) $(CMAKE_PARAMS) ..; $(CMAKE) --build . 121 122MESON ?= meson 123MESON_BUILD_DIR ?= mesonBuildDir 124 125.PHONY: mesonbuild 126mesonbuild: 127 $(MESON) setup --fatal-meson-warnings --buildtype=debug -Db_lundef=false -Dauto_features=enabled -Dprograms=true -Dcontrib=true -Dtests=true -Dexamples=true build/meson $(MESON_BUILD_DIR) 128 $(MESON) test -C $(MESON_BUILD_DIR) 129 130#------------------------------------------------------------------------ 131# make tests validated only for MSYS and Posix environments 132#------------------------------------------------------------------------ 133ifneq (,$(filter $(HOST_OS),MSYS POSIX)) 134 135.PHONY: list 136list: 137 $(MAKE) -pRrq -f $(lastword $(MAKEFILE_LIST)) : 2>/dev/null | awk -v RS= -F: '/^# File/,/^# Finished Make data base/ {if ($$1 !~ "^[#.]") {print $$1}}' | sort | egrep -v -e '^[^[:alnum:]]' -e '^$@$$' | xargs 138 139.PHONY: check 140check: 141 $(MAKE) -C $(TESTDIR) test-lz4-essentials 142 143.PHONY: test 144test: 145 $(MAKE) -C $(TESTDIR) $@ 146 $(MAKE) -C $(EXDIR) $@ 147 148.PHONY: usan 149usan: CC = clang 150usan: CFLAGS = -O3 -g -fsanitize=undefined -fno-sanitize-recover=undefined -fsanitize-recover=pointer-overflow 151usan: LDFLAGS = $(CFLAGS) 152usan: clean 153 CC=$(CC) CFLAGS='$(CFLAGS)' LDFLAGS='$(LDFLAGS)' $(MAKE) test FUZZER_TIME="-T30s" NB_LOOPS=-i1 154 155.PHONY: usan32 156usan32: CFLAGS = -m32 -O3 -g -fsanitize=undefined -fno-sanitize-recover=undefined -fsanitize-recover=pointer-overflow 157usan32: LDFLAGS = $(CFLAGS) 158usan32: clean 159 CFLAGS='$(CFLAGS)' LDFLAGS='$(LDFLAGS)' $(MAKE) V=1 test FUZZER_TIME="-T30s" NB_LOOPS=-i1 160 161SCANBUILD ?= scan-build 162SCANBUILD_FLAGS += --status-bugs -v --force-analyze-debug-code 163.PHONY: staticAnalyze 164staticAnalyze: clean 165 CPPFLAGS=-DLZ4_DEBUG=1 CFLAGS=-g $(SCANBUILD) $(SCANBUILD_FLAGS) $(MAKE) all V=1 DEBUGLEVEL=1 166 167.PHONY: cppcheck 168cppcheck: 169 cppcheck . --force --enable=warning,portability,performance,style --error-exitcode=1 > /dev/null 170 171.PHONY: platformTest 172platformTest: clean 173 @echo "\n ---- test lz4 with $(CC) compiler ----" 174 $(CC) -v 175 CFLAGS="$(CFLAGS) -O3 -Werror" $(MAKE) -C $(LZ4DIR) all 176 CFLAGS="$(CFLAGS) -O3 -Werror -static" $(MAKE) -C $(PRGDIR) all 177 CFLAGS="$(CFLAGS) -O3 -Werror -static" $(MAKE) -C $(TESTDIR) all 178 $(MAKE) -C $(TESTDIR) test-platform 179 180.PHONY: versionsTest 181versionsTest: 182 $(MAKE) -C $(TESTDIR) clean 183 $(MAKE) -C $(TESTDIR) $@ 184 185.PHONY: test-freestanding 186test-freestanding: 187 $(MAKE) -C $(TESTDIR) clean 188 $(MAKE) -C $(TESTDIR) $@ 189 190# test linking C libraries from C++ executables 191.PHONY: ctocxxtest 192ctocxxtest: LIBCC="$(CC)" 193ctocxxtest: EXECC="$(CXX) -Wno-deprecated" 194ctocxxtest: CFLAGS=-O0 195ctocxxtest: 196 CC=$(LIBCC) $(MAKE) -C $(LZ4DIR) CFLAGS="$(CFLAGS)" all 197 CC=$(LIBCC) $(MAKE) -C $(TESTDIR) CFLAGS="$(CFLAGS)" lz4.o lz4hc.o lz4frame.o 198 CC=$(EXECC) $(MAKE) -C $(TESTDIR) CFLAGS="$(CFLAGS)" all 199 200.PHONY: cxxtest cxx32test 201cxx32test: CFLAGS += -m32 202cxxtest cxx32test: CC := "$(CXX) -Wno-deprecated" 203cxxtest cxx32test: CFLAGS = -O3 -Wall -Wextra -Wundef -Wshadow -Wcast-align -Werror 204cxxtest cxx32test: 205 $(CXX) -v 206 CC=$(CC) $(MAKE) -C $(LZ4DIR) all CFLAGS="$(CFLAGS)" 207 CC=$(CC) $(MAKE) -C $(PRGDIR) all CFLAGS="$(CFLAGS)" 208 CC=$(CC) $(MAKE) -C $(TESTDIR) all CFLAGS="$(CFLAGS)" 209 210.PHONY: cxx17build 211cxx17build : CC = "$(CXX) -Wno-deprecated" 212cxx17build : CFLAGS = -std=c++17 -Wall -Wextra -Wundef -Wshadow -Wcast-align -Werror -Wpedantic 213cxx17build : clean 214 $(CXX) -v 215 CC=$(CC) $(MAKE) -C $(LZ4DIR) all CFLAGS="$(CFLAGS)" 216 CC=$(CC) $(MAKE) -C $(PRGDIR) all CFLAGS="$(CFLAGS)" 217 CC=$(CC) $(MAKE) -C $(TESTDIR) all CFLAGS="$(CFLAGS)" 218 219.PHONY: c_standards 220c_standards: clean c_standards_c11 c_standards_c99 c_standards_c90 221 222.PHONY: c_standards_c90 223c_standards_c90: clean 224 $(MAKE) clean; CFLAGS="-std=c90 -Werror -Wpedantic -Wno-long-long -Wno-variadic-macros" $(MAKE) allmost 225 $(MAKE) clean; CFLAGS="-std=gnu90 -Werror -Wpedantic -Wno-long-long -Wno-variadic-macros" $(MAKE) allmost 226 227.PHONY: c_standards_c99 228c_standards_c99: clean 229 $(MAKE) clean; CFLAGS="-std=c99 -Werror -Wpedantic" $(MAKE) all 230 $(MAKE) clean; CFLAGS="-std=gnu99 -Werror -Wpedantic" $(MAKE) all 231 232.PHONY: c_standards_c11 233c_standards_c11: clean 234 $(MAKE) clean; CFLAGS="-std=c11 -Werror" $(MAKE) all 235 236# The following test ensures that standard Makefile variables set through environment 237# are correctly transmitted at compilation stage. 238# This test is meant to detect issues like https://github.com/lz4/lz4/issues/958 239.PHONY: standard_variables 240standard_variables: 241 $(MAKE) clean 242 @echo ================= 243 @echo Check support of Makefile Standard variables through environment 244 @echo note : this test requires V=1 to work properly 245 @echo ================= 246 CC="cc -DCC_TEST" \ 247 CFLAGS=-DCFLAGS_TEST \ 248 CPPFLAGS=-DCPPFLAGS_TEST \ 249 LDFLAGS=-DLDFLAGS_TEST \ 250 LDLIBS=-DLDLIBS_TEST \ 251 $(MAKE) V=1 > tmpsv 252 # Note: just checking the presence of custom flags 253 # would not detect situations where custom flags are 254 # supported in some part of the Makefile, and missed in others. 255 # So the test checks if they are present the _right nb of times_. 256 # However, checking static quantities makes this test brittle, 257 # because quantities (10, 2 and 1) can still evolve in future, 258 # for example when source directories or Makefile evolve. 259 if [ $$(grep CC_TEST tmpsv | wc -l) -ne 10 ]; then \ 260 echo "CC environment variable missed" && False; fi 261 if [ $$(grep CFLAGS_TEST tmpsv | wc -l) -ne 10 ]; then \ 262 echo "CFLAGS environment variable missed" && False; fi 263 if [ $$(grep CPPFLAGS_TEST tmpsv | wc -l) -ne 10 ]; then \ 264 echo "CPPFLAGS environment variable missed" && False; fi 265 if [ $$(grep LDFLAGS_TEST tmpsv | wc -l) -ne 2 ]; then \ 266 echo "LDFLAGS environment variable missed" && False; fi 267 if [ $$(grep LDLIBS_TEST tmpsv | wc -l) -ne 1 ]; then \ 268 echo "LDLIBS environment variable missed" && False; fi 269 @echo ================= 270 @echo all custom variables detected 271 @echo ================= 272 $(RM) tmpsv 273 274endif # MSYS POSIX 275