xref: /aosp_15_r20/external/zstd/lib/libzstd.mk (revision 01826a4963a0d8a59bc3812d29bdf0fb76416722)
1*01826a49SYabin Cui# ################################################################
2*01826a49SYabin Cui# Copyright (c) Meta Platforms, Inc. and affiliates.
3*01826a49SYabin Cui# All rights reserved.
4*01826a49SYabin Cui#
5*01826a49SYabin Cui# This source code is licensed under both the BSD-style license (found in the
6*01826a49SYabin Cui# LICENSE file in the root directory of this source tree) and the GPLv2 (found
7*01826a49SYabin Cui# in the COPYING file in the root directory of this source tree).
8*01826a49SYabin Cui# You may select, at your option, one of the above-listed licenses.
9*01826a49SYabin Cui# ################################################################
10*01826a49SYabin Cui
11*01826a49SYabin Cui# This included Makefile provides the following variables :
12*01826a49SYabin Cui# LIB_SRCDIR, LIB_BINDIR
13*01826a49SYabin Cui
14*01826a49SYabin Cui# Ensure the file is not included twice
15*01826a49SYabin Cui# Note : must be included after setting the default target
16*01826a49SYabin Cuiifndef LIBZSTD_MK_INCLUDED
17*01826a49SYabin CuiLIBZSTD_MK_INCLUDED := 1
18*01826a49SYabin Cui
19*01826a49SYabin Cui##################################################################
20*01826a49SYabin Cui# Input Variables
21*01826a49SYabin Cui##################################################################
22*01826a49SYabin Cui
23*01826a49SYabin Cui# By default, library's directory is same as this included makefile
24*01826a49SYabin CuiLIB_SRCDIR ?= $(dir $(realpath $(lastword $(MAKEFILE_LIST))))
25*01826a49SYabin CuiLIB_BINDIR ?= $(LIBSRC_DIR)
26*01826a49SYabin Cui
27*01826a49SYabin Cui# ZSTD_LIB_MINIFY is a helper variable that
28*01826a49SYabin Cui# configures a bunch of other variables to space-optimized defaults.
29*01826a49SYabin CuiZSTD_LIB_MINIFY ?= 0
30*01826a49SYabin Cui
31*01826a49SYabin Cui# Legacy support
32*01826a49SYabin Cuiifneq ($(ZSTD_LIB_MINIFY), 0)
33*01826a49SYabin Cui  ZSTD_LEGACY_SUPPORT ?= 0
34*01826a49SYabin Cuielse
35*01826a49SYabin Cui  ZSTD_LEGACY_SUPPORT ?= 5
36*01826a49SYabin Cuiendif
37*01826a49SYabin CuiZSTD_LEGACY_MULTITHREADED_API ?= 0
38*01826a49SYabin Cui
39*01826a49SYabin Cui# Build size optimizations
40*01826a49SYabin Cuiifneq ($(ZSTD_LIB_MINIFY), 0)
41*01826a49SYabin Cui  HUF_FORCE_DECOMPRESS_X1 ?= 1
42*01826a49SYabin Cui  HUF_FORCE_DECOMPRESS_X2 ?= 0
43*01826a49SYabin Cui  ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT ?= 1
44*01826a49SYabin Cui  ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG ?= 0
45*01826a49SYabin Cui  ZSTD_NO_INLINE ?= 1
46*01826a49SYabin Cui  ZSTD_STRIP_ERROR_STRINGS ?= 1
47*01826a49SYabin Cuielse
48*01826a49SYabin Cui  HUF_FORCE_DECOMPRESS_X1 ?= 0
49*01826a49SYabin Cui  HUF_FORCE_DECOMPRESS_X2 ?= 0
50*01826a49SYabin Cui  ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT ?= 0
51*01826a49SYabin Cui  ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG ?= 0
52*01826a49SYabin Cui  ZSTD_NO_INLINE ?= 0
53*01826a49SYabin Cui  ZSTD_STRIP_ERROR_STRINGS ?= 0
54*01826a49SYabin Cuiendif
55*01826a49SYabin Cui
56*01826a49SYabin Cui# Assembly support
57*01826a49SYabin CuiZSTD_NO_ASM ?= 0
58*01826a49SYabin Cui
59*01826a49SYabin CuiZSTD_LIB_EXCLUDE_COMPRESSORS_DFAST_AND_UP ?= 0
60*01826a49SYabin CuiZSTD_LIB_EXCLUDE_COMPRESSORS_GREEDY_AND_UP ?= 0
61*01826a49SYabin Cui
62*01826a49SYabin Cui##################################################################
63*01826a49SYabin Cui# libzstd helpers
64*01826a49SYabin Cui##################################################################
65*01826a49SYabin Cui
66*01826a49SYabin CuiVOID ?= /dev/null
67*01826a49SYabin Cui
68*01826a49SYabin Cui# Make 4.3 doesn't support '\#' anymore (https://lwn.net/Articles/810071/)
69*01826a49SYabin CuiNUM_SYMBOL := \#
70*01826a49SYabin Cui
71*01826a49SYabin Cui# define silent mode as default (verbose mode with V=1 or VERBOSE=1)
72*01826a49SYabin Cui# Note : must be defined _after_ the default target
73*01826a49SYabin Cui$(V)$(VERBOSE).SILENT:
74*01826a49SYabin Cui
75*01826a49SYabin Cui# When cross-compiling from linux to windows,
76*01826a49SYabin Cui# one might need to specify TARGET_SYSTEM as "Windows."
77*01826a49SYabin Cui# Building from Fedora fails without it.
78*01826a49SYabin Cui# (but Ubuntu and Debian don't need to set anything)
79*01826a49SYabin CuiTARGET_SYSTEM ?= $(OS)
80*01826a49SYabin Cui
81*01826a49SYabin Cui# Version numbers
82*01826a49SYabin CuiLIBVER_SRC := $(LIB_SRCDIR)/zstd.h
83*01826a49SYabin CuiLIBVER_MAJOR_SCRIPT:=`sed -n '/define ZSTD_VERSION_MAJOR/s/.*[[:blank:]]\([0-9][0-9]*\).*/\1/p' < $(LIBVER_SRC)`
84*01826a49SYabin CuiLIBVER_MINOR_SCRIPT:=`sed -n '/define ZSTD_VERSION_MINOR/s/.*[[:blank:]]\([0-9][0-9]*\).*/\1/p' < $(LIBVER_SRC)`
85*01826a49SYabin CuiLIBVER_PATCH_SCRIPT:=`sed -n '/define ZSTD_VERSION_RELEASE/s/.*[[:blank:]]\([0-9][0-9]*\).*/\1/p' < $(LIBVER_SRC)`
86*01826a49SYabin CuiLIBVER_SCRIPT:= $(LIBVER_MAJOR_SCRIPT).$(LIBVER_MINOR_SCRIPT).$(LIBVER_PATCH_SCRIPT)
87*01826a49SYabin CuiLIBVER_MAJOR := $(shell echo $(LIBVER_MAJOR_SCRIPT))
88*01826a49SYabin CuiLIBVER_MINOR := $(shell echo $(LIBVER_MINOR_SCRIPT))
89*01826a49SYabin CuiLIBVER_PATCH := $(shell echo $(LIBVER_PATCH_SCRIPT))
90*01826a49SYabin CuiLIBVER := $(shell echo $(LIBVER_SCRIPT))
91*01826a49SYabin CuiCCVER := $(shell $(CC) --version)
92*01826a49SYabin CuiZSTD_VERSION?= $(LIBVER)
93*01826a49SYabin Cui
94*01826a49SYabin Cuiifneq ($(ZSTD_LIB_MINIFY), 0)
95*01826a49SYabin Cui  HAVE_CC_OZ ?= $(shell echo "" | $(CC) -Oz -x c -c - -o /dev/null 2> /dev/null && echo 1 || echo 0)
96*01826a49SYabin Cuiifneq ($(HAVE_CC_OZ), 0)
97*01826a49SYabin Cui    # Some compilers (clang) support an even more space-optimized setting.
98*01826a49SYabin Cui    CFLAGS += -Oz
99*01826a49SYabin Cuielse
100*01826a49SYabin Cui    CFLAGS += -Os
101*01826a49SYabin Cuiendif
102*01826a49SYabin Cui  CFLAGS += -fno-stack-protector -fomit-frame-pointer -fno-ident \
103*01826a49SYabin Cui            -DDYNAMIC_BMI2=0 -DNDEBUG
104*01826a49SYabin Cuielse
105*01826a49SYabin Cui  CFLAGS ?= -O3
106*01826a49SYabin Cuiendif
107*01826a49SYabin Cui
108*01826a49SYabin CuiDEBUGLEVEL ?= 0
109*01826a49SYabin CuiCPPFLAGS += -DXXH_NAMESPACE=ZSTD_ -DDEBUGLEVEL=$(DEBUGLEVEL)
110*01826a49SYabin Cuiifeq ($(TARGET_SYSTEM),Windows_NT)   # MinGW assumed
111*01826a49SYabin Cui  CPPFLAGS += -D__USE_MINGW_ANSI_STDIO   # compatibility with %zu formatting
112*01826a49SYabin Cuiendif
113*01826a49SYabin CuiDEBUGFLAGS= -Wall -Wextra -Wcast-qual -Wcast-align -Wshadow \
114*01826a49SYabin Cui            -Wstrict-aliasing=1 -Wswitch-enum -Wdeclaration-after-statement \
115*01826a49SYabin Cui            -Wstrict-prototypes -Wundef -Wpointer-arith \
116*01826a49SYabin Cui            -Wvla -Wformat=2 -Winit-self -Wfloat-equal -Wwrite-strings \
117*01826a49SYabin Cui            -Wredundant-decls -Wmissing-prototypes -Wc++-compat
118*01826a49SYabin CuiCFLAGS   += $(DEBUGFLAGS) $(MOREFLAGS)
119*01826a49SYabin CuiASFLAGS  += $(DEBUGFLAGS) $(MOREFLAGS) $(CFLAGS)
120*01826a49SYabin CuiLDFLAGS  += $(MOREFLAGS)
121*01826a49SYabin CuiFLAGS     = $(CPPFLAGS) $(CFLAGS) $(ASFLAGS) $(LDFLAGS)
122*01826a49SYabin Cui
123*01826a49SYabin Cuiifndef ALREADY_APPENDED_NOEXECSTACK
124*01826a49SYabin Cuiexport ALREADY_APPENDED_NOEXECSTACK := 1
125*01826a49SYabin Cuiifeq ($(shell echo "int main(int argc, char* argv[]) { (void)argc; (void)argv; return 0; }" | $(CC) $(FLAGS) -z noexecstack -x c -Werror - -o $(VOID) 2>$(VOID) && echo 1 || echo 0),1)
126*01826a49SYabin CuiLDFLAGS += -z noexecstack
127*01826a49SYabin Cuiendif
128*01826a49SYabin Cuiifeq ($(shell echo | $(CC) $(FLAGS) -Wa,--noexecstack -x assembler -Werror -c - -o $(VOID) 2>$(VOID) && echo 1 || echo 0),1)
129*01826a49SYabin CuiCFLAGS  += -Wa,--noexecstack
130*01826a49SYabin Cui# CFLAGS are also added to ASFLAGS
131*01826a49SYabin Cuielse ifeq ($(shell echo | $(CC) $(FLAGS) -Qunused-arguments -Wa,--noexecstack -x assembler -Werror -c - -o $(VOID) 2>$(VOID) && echo 1 || echo 0),1)
132*01826a49SYabin Cui# See e.g.: https://github.com/android/ndk/issues/171
133*01826a49SYabin CuiCFLAGS  += -Qunused-arguments -Wa,--noexecstack
134*01826a49SYabin Cui# CFLAGS are also added to ASFLAGS
135*01826a49SYabin Cuiendif
136*01826a49SYabin Cuiendif
137*01826a49SYabin Cui
138*01826a49SYabin Cuiifeq ($(shell echo "int main(int argc, char* argv[]) { (void)argc; (void)argv; return 0; }" | $(CC) $(FLAGS) -z cet-report=error -x c -Werror - -o $(VOID) 2>$(VOID) && echo 1 || echo 0),1)
139*01826a49SYabin CuiLDFLAGS += -z cet-report=error
140*01826a49SYabin Cuiendif
141*01826a49SYabin Cui
142*01826a49SYabin CuiHAVE_COLORNEVER = $(shell echo a | grep --color=never a > /dev/null 2> /dev/null && echo 1 || echo 0)
143*01826a49SYabin CuiGREP_OPTIONS ?=
144*01826a49SYabin Cuiifeq ($(HAVE_COLORNEVER), 1)
145*01826a49SYabin Cui  GREP_OPTIONS += --color=never
146*01826a49SYabin Cuiendif
147*01826a49SYabin CuiGREP = grep $(GREP_OPTIONS)
148*01826a49SYabin Cui
149*01826a49SYabin CuiZSTD_COMMON_FILES := $(sort $(wildcard $(LIB_SRCDIR)/common/*.c))
150*01826a49SYabin CuiZSTD_COMPRESS_FILES := $(sort $(wildcard $(LIB_SRCDIR)/compress/*.c))
151*01826a49SYabin CuiZSTD_DECOMPRESS_FILES := $(sort $(wildcard $(LIB_SRCDIR)/decompress/*.c))
152*01826a49SYabin CuiZSTD_DICTBUILDER_FILES := $(sort $(wildcard $(LIB_SRCDIR)/dictBuilder/*.c))
153*01826a49SYabin CuiZSTD_DEPRECATED_FILES := $(sort $(wildcard $(LIB_SRCDIR)/deprecated/*.c))
154*01826a49SYabin CuiZSTD_LEGACY_FILES :=
155*01826a49SYabin Cui
156*01826a49SYabin CuiZSTD_DECOMPRESS_AMD64_ASM_FILES := $(sort $(wildcard $(LIB_SRCDIR)/decompress/*_amd64.S))
157*01826a49SYabin Cui
158*01826a49SYabin Cuiifneq ($(ZSTD_NO_ASM), 0)
159*01826a49SYabin Cui  CPPFLAGS += -DZSTD_DISABLE_ASM
160*01826a49SYabin Cuielse
161*01826a49SYabin Cui  # Unconditionally add the ASM files they are disabled by
162*01826a49SYabin Cui  # macros in the .S file.
163*01826a49SYabin Cui  ZSTD_DECOMPRESS_FILES += $(ZSTD_DECOMPRESS_AMD64_ASM_FILES)
164*01826a49SYabin Cuiendif
165*01826a49SYabin Cui
166*01826a49SYabin Cuiifneq ($(HUF_FORCE_DECOMPRESS_X1), 0)
167*01826a49SYabin Cui  CFLAGS += -DHUF_FORCE_DECOMPRESS_X1
168*01826a49SYabin Cuiendif
169*01826a49SYabin Cui
170*01826a49SYabin Cuiifneq ($(HUF_FORCE_DECOMPRESS_X2), 0)
171*01826a49SYabin Cui  CFLAGS += -DHUF_FORCE_DECOMPRESS_X2
172*01826a49SYabin Cuiendif
173*01826a49SYabin Cui
174*01826a49SYabin Cuiifneq ($(ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT), 0)
175*01826a49SYabin Cui  CFLAGS += -DZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT
176*01826a49SYabin Cuiendif
177*01826a49SYabin Cui
178*01826a49SYabin Cuiifneq ($(ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG), 0)
179*01826a49SYabin Cui  CFLAGS += -DZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG
180*01826a49SYabin Cuiendif
181*01826a49SYabin Cui
182*01826a49SYabin Cuiifneq ($(ZSTD_NO_INLINE), 0)
183*01826a49SYabin Cui  CFLAGS += -DZSTD_NO_INLINE
184*01826a49SYabin Cuiendif
185*01826a49SYabin Cui
186*01826a49SYabin Cuiifneq ($(ZSTD_STRIP_ERROR_STRINGS), 0)
187*01826a49SYabin Cui  CFLAGS += -DZSTD_STRIP_ERROR_STRINGS
188*01826a49SYabin Cuiendif
189*01826a49SYabin Cui
190*01826a49SYabin Cuiifneq ($(ZSTD_LEGACY_MULTITHREADED_API), 0)
191*01826a49SYabin Cui  CFLAGS += -DZSTD_LEGACY_MULTITHREADED_API
192*01826a49SYabin Cuiendif
193*01826a49SYabin Cui
194*01826a49SYabin Cuiifneq ($(ZSTD_LIB_EXCLUDE_COMPRESSORS_DFAST_AND_UP), 0)
195*01826a49SYabin Cui  CFLAGS += -DZSTD_EXCLUDE_DFAST_BLOCK_COMPRESSOR -DZSTD_EXCLUDE_GREEDY_BLOCK_COMPRESSOR -DZSTD_EXCLUDE_LAZY2_BLOCK_COMPRESSOR -DZSTD_EXCLUDE_BTLAZY2_BLOCK_COMPRESSOR -DZSTD_EXCLUDE_BTOPT_BLOCK_COMPRESSOR -DZSTD_EXCLUDE_BTULTRA_BLOCK_COMPRESSOR
196*01826a49SYabin Cuielse
197*01826a49SYabin Cuiifneq ($(ZSTD_LIB_EXCLUDE_COMPRESSORS_GREEDY_AND_UP), 0)
198*01826a49SYabin Cui  CFLAGS += -DZSTD_EXCLUDE_GREEDY_BLOCK_COMPRESSOR -DZSTD_EXCLUDE_LAZY2_BLOCK_COMPRESSOR -DZSTD_EXCLUDE_BTLAZY2_BLOCK_COMPRESSOR -DZSTD_EXCLUDE_BTOPT_BLOCK_COMPRESSOR -DZSTD_EXCLUDE_BTULTRA_BLOCK_COMPRESSOR
199*01826a49SYabin Cuiendif
200*01826a49SYabin Cuiendif
201*01826a49SYabin Cui
202*01826a49SYabin Cuiifneq ($(ZSTD_LEGACY_SUPPORT), 0)
203*01826a49SYabin Cuiifeq ($(shell test $(ZSTD_LEGACY_SUPPORT) -lt 8; echo $$?), 0)
204*01826a49SYabin Cui  ZSTD_LEGACY_FILES += $(shell ls $(LIB_SRCDIR)/legacy/*.c | $(GREP) 'v0[$(ZSTD_LEGACY_SUPPORT)-7]')
205*01826a49SYabin Cuiendif
206*01826a49SYabin Cuiendif
207*01826a49SYabin CuiCPPFLAGS  += -DZSTD_LEGACY_SUPPORT=$(ZSTD_LEGACY_SUPPORT)
208*01826a49SYabin Cui
209*01826a49SYabin CuiUNAME := $(shell uname)
210*01826a49SYabin Cui
211*01826a49SYabin Cuiifndef BUILD_DIR
212*01826a49SYabin Cuiifeq ($(UNAME), Darwin)
213*01826a49SYabin Cui  ifeq ($(shell md5 < /dev/null > /dev/null; echo $$?), 0)
214*01826a49SYabin Cui    HASH ?= md5
215*01826a49SYabin Cui  endif
216*01826a49SYabin Cuielse ifeq ($(UNAME), FreeBSD)
217*01826a49SYabin Cui  HASH ?= gmd5sum
218*01826a49SYabin Cuielse ifeq ($(UNAME), NetBSD)
219*01826a49SYabin Cui  HASH ?= md5 -n
220*01826a49SYabin Cuielse ifeq ($(UNAME), OpenBSD)
221*01826a49SYabin Cui  HASH ?= md5
222*01826a49SYabin Cuiendif
223*01826a49SYabin CuiHASH ?= md5sum
224*01826a49SYabin Cui
225*01826a49SYabin CuiHASH_DIR = conf_$(shell echo $(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) $(ZSTD_FILES) | $(HASH) | cut -f 1 -d " " )
226*01826a49SYabin CuiHAVE_HASH :=$(shell echo 1 | $(HASH) > /dev/null && echo 1 || echo 0)
227*01826a49SYabin Cuiifeq ($(HAVE_HASH),0)
228*01826a49SYabin Cui  $(info warning : could not find HASH ($(HASH)), needed to differentiate builds using different flags)
229*01826a49SYabin Cui  BUILD_DIR := obj/generic_noconf
230*01826a49SYabin Cuiendif
231*01826a49SYabin Cuiendif # BUILD_DIR
232*01826a49SYabin Cui
233*01826a49SYabin CuiZSTD_SUBDIR := $(LIB_SRCDIR)/common $(LIB_SRCDIR)/compress $(LIB_SRCDIR)/decompress $(LIB_SRCDIR)/dictBuilder $(LIB_SRCDIR)/legacy $(LIB_SRCDIR)/deprecated
234*01826a49SYabin Cuivpath %.c $(ZSTD_SUBDIR)
235*01826a49SYabin Cuivpath %.S $(ZSTD_SUBDIR)
236*01826a49SYabin Cui
237*01826a49SYabin Cuiendif # LIBZSTD_MK_INCLUDED
238