xref: /freebsd/sys/contrib/zstd/lib/libzstd.mk (revision 5ff13fbc199bdf5f0572845351c68ee5ca828e71)
1*5ff13fbcSAllan Jude# ################################################################
2*5ff13fbcSAllan Jude# Copyright (c) Yann Collet, Facebook, Inc.
3*5ff13fbcSAllan Jude# All rights reserved.
4*5ff13fbcSAllan Jude#
5*5ff13fbcSAllan Jude# This source code is licensed under both the BSD-style license (found in the
6*5ff13fbcSAllan Jude# LICENSE file in the root directory of this source tree) and the GPLv2 (found
7*5ff13fbcSAllan Jude# in the COPYING file in the root directory of this source tree).
8*5ff13fbcSAllan Jude# You may select, at your option, one of the above-listed licenses.
9*5ff13fbcSAllan Jude# ################################################################
10*5ff13fbcSAllan Jude
11*5ff13fbcSAllan Jude##################################################################
12*5ff13fbcSAllan Jude# Input Variables
13*5ff13fbcSAllan Jude##################################################################
14*5ff13fbcSAllan Jude
15*5ff13fbcSAllan Jude# Zstd lib directory
16*5ff13fbcSAllan JudeLIBZSTD ?= ./
17*5ff13fbcSAllan Jude
18*5ff13fbcSAllan Jude# Legacy support
19*5ff13fbcSAllan JudeZSTD_LEGACY_SUPPORT ?= 5
20*5ff13fbcSAllan JudeZSTD_LEGACY_MULTITHREADED_API ?= 0
21*5ff13fbcSAllan Jude
22*5ff13fbcSAllan Jude# Build size optimizations
23*5ff13fbcSAllan JudeHUF_FORCE_DECOMPRESS_X1 ?= 0
24*5ff13fbcSAllan JudeHUF_FORCE_DECOMPRESS_X2 ?= 0
25*5ff13fbcSAllan JudeZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT ?= 0
26*5ff13fbcSAllan JudeZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG ?= 0
27*5ff13fbcSAllan JudeZSTD_NO_INLINE ?= 0
28*5ff13fbcSAllan JudeZSTD_STRIP_ERROR_STRINGS ?= 0
29*5ff13fbcSAllan Jude
30*5ff13fbcSAllan Jude# Assembly support
31*5ff13fbcSAllan JudeZSTD_NO_ASM ?= 0
32*5ff13fbcSAllan Jude
33*5ff13fbcSAllan Jude##################################################################
34*5ff13fbcSAllan Jude# libzstd helpers
35*5ff13fbcSAllan Jude##################################################################
36*5ff13fbcSAllan Jude
37*5ff13fbcSAllan JudeVOID ?= /dev/null
38*5ff13fbcSAllan Jude
39*5ff13fbcSAllan Jude# Make 4.3 doesn't support '\#' anymore (https://lwn.net/Articles/810071/)
40*5ff13fbcSAllan JudeNUM_SYMBOL := \#
41*5ff13fbcSAllan Jude
42*5ff13fbcSAllan Jude# define silent mode as default (verbose mode with V=1 or VERBOSE=1)
43*5ff13fbcSAllan Jude$(V)$(VERBOSE).SILENT:
44*5ff13fbcSAllan Jude
45*5ff13fbcSAllan Jude# When cross-compiling from linux to windows,
46*5ff13fbcSAllan Jude# one might need to specify TARGET_SYSTEM as "Windows."
47*5ff13fbcSAllan Jude# Building from Fedora fails without it.
48*5ff13fbcSAllan Jude# (but Ubuntu and Debian don't need to set anything)
49*5ff13fbcSAllan JudeTARGET_SYSTEM ?= $(OS)
50*5ff13fbcSAllan Jude
51*5ff13fbcSAllan Jude# Version numbers
52*5ff13fbcSAllan JudeLIBVER_SRC := $(LIBZSTD)/zstd.h
53*5ff13fbcSAllan JudeLIBVER_MAJOR_SCRIPT:=`sed -n '/define ZSTD_VERSION_MAJOR/s/.*[[:blank:]]\([0-9][0-9]*\).*/\1/p' < $(LIBVER_SRC)`
54*5ff13fbcSAllan JudeLIBVER_MINOR_SCRIPT:=`sed -n '/define ZSTD_VERSION_MINOR/s/.*[[:blank:]]\([0-9][0-9]*\).*/\1/p' < $(LIBVER_SRC)`
55*5ff13fbcSAllan JudeLIBVER_PATCH_SCRIPT:=`sed -n '/define ZSTD_VERSION_RELEASE/s/.*[[:blank:]]\([0-9][0-9]*\).*/\1/p' < $(LIBVER_SRC)`
56*5ff13fbcSAllan JudeLIBVER_SCRIPT:= $(LIBVER_MAJOR_SCRIPT).$(LIBVER_MINOR_SCRIPT).$(LIBVER_PATCH_SCRIPT)
57*5ff13fbcSAllan JudeLIBVER_MAJOR := $(shell echo $(LIBVER_MAJOR_SCRIPT))
58*5ff13fbcSAllan JudeLIBVER_MINOR := $(shell echo $(LIBVER_MINOR_SCRIPT))
59*5ff13fbcSAllan JudeLIBVER_PATCH := $(shell echo $(LIBVER_PATCH_SCRIPT))
60*5ff13fbcSAllan JudeLIBVER := $(shell echo $(LIBVER_SCRIPT))
61*5ff13fbcSAllan JudeCCVER := $(shell $(CC) --version)
62*5ff13fbcSAllan JudeZSTD_VERSION?= $(LIBVER)
63*5ff13fbcSAllan Jude
64*5ff13fbcSAllan Jude# ZSTD_LIB_MINIFY is a helper variable that
65*5ff13fbcSAllan Jude# configures a bunch of other variables to space-optimized defaults.
66*5ff13fbcSAllan JudeZSTD_LIB_MINIFY ?= 0
67*5ff13fbcSAllan Judeifneq ($(ZSTD_LIB_MINIFY), 0)
68*5ff13fbcSAllan Jude  HAVE_CC_OZ ?= $(shell echo "" | $(CC) -Oz -x c -c - -o /dev/null 2> /dev/null && echo 1 || echo 0)
69*5ff13fbcSAllan Jude  ZSTD_LEGACY_SUPPORT ?= 0
70*5ff13fbcSAllan Jude  ZSTD_LIB_DEPRECATED ?= 0
71*5ff13fbcSAllan Jude  HUF_FORCE_DECOMPRESS_X1 ?= 1
72*5ff13fbcSAllan Jude  ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT ?= 1
73*5ff13fbcSAllan Jude  ZSTD_NO_INLINE ?= 1
74*5ff13fbcSAllan Jude  ZSTD_STRIP_ERROR_STRINGS ?= 1
75*5ff13fbcSAllan Judeifneq ($(HAVE_CC_OZ), 0)
76*5ff13fbcSAllan Jude    # Some compilers (clang) support an even more space-optimized setting.
77*5ff13fbcSAllan Jude    CFLAGS += -Oz
78*5ff13fbcSAllan Judeelse
79*5ff13fbcSAllan Jude    CFLAGS += -Os
80*5ff13fbcSAllan Judeendif
81*5ff13fbcSAllan Jude  CFLAGS += -fno-stack-protector -fomit-frame-pointer -fno-ident \
82*5ff13fbcSAllan Jude            -DDYNAMIC_BMI2=0 -DNDEBUG
83*5ff13fbcSAllan Judeelse
84*5ff13fbcSAllan Jude  CFLAGS ?= -O3
85*5ff13fbcSAllan Judeendif
86*5ff13fbcSAllan Jude
87*5ff13fbcSAllan JudeDEBUGLEVEL ?= 0
88*5ff13fbcSAllan JudeCPPFLAGS += -DXXH_NAMESPACE=ZSTD_ -DDEBUGLEVEL=$(DEBUGLEVEL)
89*5ff13fbcSAllan Judeifeq ($(TARGET_SYSTEM),Windows_NT)   # MinGW assumed
90*5ff13fbcSAllan Jude  CPPFLAGS += -D__USE_MINGW_ANSI_STDIO   # compatibility with %zu formatting
91*5ff13fbcSAllan Judeendif
92*5ff13fbcSAllan JudeDEBUGFLAGS= -Wall -Wextra -Wcast-qual -Wcast-align -Wshadow \
93*5ff13fbcSAllan Jude            -Wstrict-aliasing=1 -Wswitch-enum -Wdeclaration-after-statement \
94*5ff13fbcSAllan Jude            -Wstrict-prototypes -Wundef -Wpointer-arith \
95*5ff13fbcSAllan Jude            -Wvla -Wformat=2 -Winit-self -Wfloat-equal -Wwrite-strings \
96*5ff13fbcSAllan Jude            -Wredundant-decls -Wmissing-prototypes -Wc++-compat
97*5ff13fbcSAllan JudeCFLAGS   += $(DEBUGFLAGS) $(MOREFLAGS)
98*5ff13fbcSAllan JudeASFLAGS  += $(DEBUGFLAGS) $(MOREFLAGS) $(CFLAGS)
99*5ff13fbcSAllan JudeLDFLAGS  += $(MOREFLAGS)
100*5ff13fbcSAllan JudeFLAGS     = $(CPPFLAGS) $(CFLAGS) $(ASFLAGS) $(LDFLAGS)
101*5ff13fbcSAllan Jude
102*5ff13fbcSAllan Judeifndef ALREADY_APPENDED_NOEXECSTACK
103*5ff13fbcSAllan Judeexport ALREADY_APPENDED_NOEXECSTACK := 1
104*5ff13fbcSAllan Judeifeq ($(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)
105*5ff13fbcSAllan JudeLDFLAGS += -z noexecstack
106*5ff13fbcSAllan Judeendif
107*5ff13fbcSAllan Judeifeq ($(shell echo | $(CC) $(FLAGS) -Wa,--noexecstack -x assembler -Werror -c - -o $(VOID) 2>$(VOID) && echo 1 || echo 0),1)
108*5ff13fbcSAllan JudeCFLAGS  += -Wa,--noexecstack
109*5ff13fbcSAllan Jude# CFLAGS are also added to ASFLAGS
110*5ff13fbcSAllan Judeelse ifeq ($(shell echo | $(CC) $(FLAGS) -Qunused-arguments -Wa,--noexecstack -x assembler -Werror -c - -o $(VOID) 2>$(VOID) && echo 1 || echo 0),1)
111*5ff13fbcSAllan Jude# See e.g.: https://github.com/android/ndk/issues/171
112*5ff13fbcSAllan JudeCFLAGS  += -Qunused-arguments -Wa,--noexecstack
113*5ff13fbcSAllan Jude# CFLAGS are also added to ASFLAGS
114*5ff13fbcSAllan Judeendif
115*5ff13fbcSAllan Judeendif
116*5ff13fbcSAllan Jude
117*5ff13fbcSAllan JudeHAVE_COLORNEVER = $(shell echo a | grep --color=never a > /dev/null 2> /dev/null && echo 1 || echo 0)
118*5ff13fbcSAllan JudeGREP_OPTIONS ?=
119*5ff13fbcSAllan Judeifeq ($HAVE_COLORNEVER, 1)
120*5ff13fbcSAllan Jude  GREP_OPTIONS += --color=never
121*5ff13fbcSAllan Judeendif
122*5ff13fbcSAllan JudeGREP = grep $(GREP_OPTIONS)
123*5ff13fbcSAllan JudeSED_ERE_OPT ?= -E
124*5ff13fbcSAllan Jude
125*5ff13fbcSAllan JudeZSTD_COMMON_FILES := $(sort $(wildcard $(LIBZSTD)/common/*.c))
126*5ff13fbcSAllan JudeZSTD_COMPRESS_FILES := $(sort $(wildcard $(LIBZSTD)/compress/*.c))
127*5ff13fbcSAllan JudeZSTD_DECOMPRESS_FILES := $(sort $(wildcard $(LIBZSTD)/decompress/*.c))
128*5ff13fbcSAllan JudeZSTD_DICTBUILDER_FILES := $(sort $(wildcard $(LIBZSTD)/dictBuilder/*.c))
129*5ff13fbcSAllan JudeZSTD_DEPRECATED_FILES := $(sort $(wildcard $(LIBZSTD)/deprecated/*.c))
130*5ff13fbcSAllan JudeZSTD_LEGACY_FILES :=
131*5ff13fbcSAllan Jude
132*5ff13fbcSAllan JudeZSTD_DECOMPRESS_AMD64_ASM_FILES := $(sort $(wildcard $(LIBZSTD)/decompress/*_amd64.S))
133*5ff13fbcSAllan Jude
134*5ff13fbcSAllan Judeifneq ($(ZSTD_NO_ASM), 0)
135*5ff13fbcSAllan Jude  CPPFLAGS += -DZSTD_DISABLE_ASM
136*5ff13fbcSAllan Judeelse
137*5ff13fbcSAllan Jude  # Unconditionally add the ASM files they are disabled by
138*5ff13fbcSAllan Jude  # macros in the .S file.
139*5ff13fbcSAllan Jude  ZSTD_DECOMPRESS_FILES += $(ZSTD_DECOMPRESS_AMD64_ASM_FILES)
140*5ff13fbcSAllan Judeendif
141*5ff13fbcSAllan Jude
142*5ff13fbcSAllan Judeifneq ($(HUF_FORCE_DECOMPRESS_X1), 0)
143*5ff13fbcSAllan Jude  CFLAGS += -DHUF_FORCE_DECOMPRESS_X1
144*5ff13fbcSAllan Judeendif
145*5ff13fbcSAllan Jude
146*5ff13fbcSAllan Judeifneq ($(HUF_FORCE_DECOMPRESS_X2), 0)
147*5ff13fbcSAllan Jude  CFLAGS += -DHUF_FORCE_DECOMPRESS_X2
148*5ff13fbcSAllan Judeendif
149*5ff13fbcSAllan Jude
150*5ff13fbcSAllan Judeifneq ($(ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT), 0)
151*5ff13fbcSAllan Jude  CFLAGS += -DZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT
152*5ff13fbcSAllan Judeendif
153*5ff13fbcSAllan Jude
154*5ff13fbcSAllan Judeifneq ($(ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG), 0)
155*5ff13fbcSAllan Jude  CFLAGS += -DZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG
156*5ff13fbcSAllan Judeendif
157*5ff13fbcSAllan Jude
158*5ff13fbcSAllan Judeifneq ($(ZSTD_NO_INLINE), 0)
159*5ff13fbcSAllan Jude  CFLAGS += -DZSTD_NO_INLINE
160*5ff13fbcSAllan Judeendif
161*5ff13fbcSAllan Jude
162*5ff13fbcSAllan Judeifneq ($(ZSTD_STRIP_ERROR_STRINGS), 0)
163*5ff13fbcSAllan Jude  CFLAGS += -DZSTD_STRIP_ERROR_STRINGS
164*5ff13fbcSAllan Judeendif
165*5ff13fbcSAllan Jude
166*5ff13fbcSAllan Judeifneq ($(ZSTD_LEGACY_MULTITHREADED_API), 0)
167*5ff13fbcSAllan Jude  CFLAGS += -DZSTD_LEGACY_MULTITHREADED_API
168*5ff13fbcSAllan Judeendif
169*5ff13fbcSAllan Jude
170*5ff13fbcSAllan Judeifneq ($(ZSTD_LEGACY_SUPPORT), 0)
171*5ff13fbcSAllan Judeifeq ($(shell test $(ZSTD_LEGACY_SUPPORT) -lt 8; echo $$?), 0)
172*5ff13fbcSAllan Jude  ZSTD_LEGACY_FILES += $(shell ls $(LIBZSTD)/legacy/*.c | $(GREP) 'v0[$(ZSTD_LEGACY_SUPPORT)-7]')
173*5ff13fbcSAllan Judeendif
174*5ff13fbcSAllan Judeendif
175*5ff13fbcSAllan JudeCPPFLAGS  += -DZSTD_LEGACY_SUPPORT=$(ZSTD_LEGACY_SUPPORT)
176*5ff13fbcSAllan Jude
177*5ff13fbcSAllan JudeUNAME := $(shell uname)
178*5ff13fbcSAllan Jude
179*5ff13fbcSAllan Judeifndef BUILD_DIR
180*5ff13fbcSAllan Judeifeq ($(UNAME), Darwin)
181*5ff13fbcSAllan Jude  ifeq ($(shell md5 < /dev/null > /dev/null; echo $$?), 0)
182*5ff13fbcSAllan Jude    HASH ?= md5
183*5ff13fbcSAllan Jude  endif
184*5ff13fbcSAllan Judeelse ifeq ($(UNAME), FreeBSD)
185*5ff13fbcSAllan Jude  HASH ?= gmd5sum
186*5ff13fbcSAllan Judeelse ifeq ($(UNAME), NetBSD)
187*5ff13fbcSAllan Jude  HASH ?= md5 -n
188*5ff13fbcSAllan Judeelse ifeq ($(UNAME), OpenBSD)
189*5ff13fbcSAllan Jude  HASH ?= md5
190*5ff13fbcSAllan Judeendif
191*5ff13fbcSAllan JudeHASH ?= md5sum
192*5ff13fbcSAllan Jude
193*5ff13fbcSAllan JudeHASH_DIR = conf_$(shell echo $(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) $(ZSTD_FILES) | $(HASH) | cut -f 1 -d " " )
194*5ff13fbcSAllan JudeHAVE_HASH :=$(shell echo 1 | $(HASH) > /dev/null && echo 1 || echo 0)
195*5ff13fbcSAllan Judeifeq ($(HAVE_HASH),0)
196*5ff13fbcSAllan Jude  $(info warning : could not find HASH ($(HASH)), needed to differentiate builds using different flags)
197*5ff13fbcSAllan Jude  BUILD_DIR := obj/generic_noconf
198*5ff13fbcSAllan Judeendif
199*5ff13fbcSAllan Judeendif # BUILD_DIR
200*5ff13fbcSAllan Jude
201*5ff13fbcSAllan JudeZSTD_SUBDIR := $(LIBZSTD)/common $(LIBZSTD)/compress $(LIBZSTD)/decompress $(LIBZSTD)/dictBuilder $(LIBZSTD)/legacy $(LIBZSTD)/deprecated
202*5ff13fbcSAllan Judevpath %.c $(ZSTD_SUBDIR)
203*5ff13fbcSAllan Judevpath %.S $(ZSTD_SUBDIR)
204