mirror of
https://github.com/official-stockfish/Stockfish.git
synced 2026-07-22 20:57:10 +00:00
In recent Macs, it is possible to use the Clang compiler provided by Apple
to compile Stockfish out of the box, and this is the method used by default
in our Makefile (the Makefile sets the macosx-version-min=10.14 flag to select
the right libc++ library for the Clang compiler with recent c++17 support).
But it is quite possible to compile and run Stockfish on older Macs! Below
we describe a method to install a recent GNU compiler on these Macs, to get
the c++17 support. We have tested the following procedure to install gcc10 on
machines running Mac OS 10.7, Mac OS 10.9 and Mac OS 10.13:
1) install XCode for your machine.
2) install Apple command-line developer tools for XCode, by typing the following
command in a Terminal:
```
sudo xcode-select --install
```
3) go to the Stockfish "src" directory, then try a default build and run Stockfish:
```
make clean
make build
make net
./stockfish
```
4) if step 3 worked, congrats! You have a compiler recent enough on your Mac
to compile Stockfish. If not, continue with step 5 to install GNU gcc10 :-)
5) install the MacPorts package manager (https://www.macports.org/install.php),
for instance using the fast method in the "macOS Package (.pkg) Installer"
section of the page.
6) use the "port" command to install the gcc10 package of MacPorts by typing the
following command:
```
sudo port install gcc10
```
With this step, MacPorts will install the gcc10 compiler under the name "g++-mp-10"
in the /opt/local/bin directory:
```
which g++-mp-10
/opt/local/bin/g++-mp-10 <--- answer
```
7) You can now go back to the "src" directory of Stockfish, and try to build
Stockfish by pointing at the right compiler:
```
make clean
make build COMP=gcc COMPCXX=/opt/local/bin/g++-mp-10
make net
./stockfish
```
8) Enjoy Stockfish on Macintosh!
See this pull request for further discussion:
https://github.com/official-stockfish/Stockfish/pull/3049
No functional change
843 lines
22 KiB
Makefile
843 lines
22 KiB
Makefile
# Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
|
# Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
|
# Copyright (C) 2008-2015 Marco Costalba, Joona Kiiski, Tord Romstad
|
|
# Copyright (C) 2015-2019 Marco Costalba, Joona Kiiski, Gary Linscott, Tord Romstad
|
|
#
|
|
# Stockfish is free software: you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation, either version 3 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# Stockfish is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
|
### ==========================================================================
|
|
### Section 1. General Configuration
|
|
### ==========================================================================
|
|
|
|
### Executable name
|
|
ifeq ($(COMP),mingw)
|
|
EXE = stockfish.exe
|
|
else
|
|
EXE = stockfish
|
|
endif
|
|
|
|
### Installation dir definitions
|
|
PREFIX = /usr/local
|
|
BINDIR = $(PREFIX)/bin
|
|
|
|
### Built-in benchmark for pgo-builds
|
|
PGOBENCH = ./$(EXE) bench
|
|
|
|
### Source and object files
|
|
SRCS = benchmark.cpp bitbase.cpp bitboard.cpp endgame.cpp evaluate.cpp main.cpp \
|
|
material.cpp misc.cpp movegen.cpp movepick.cpp pawns.cpp position.cpp psqt.cpp \
|
|
search.cpp thread.cpp timeman.cpp tt.cpp uci.cpp ucioption.cpp tune.cpp syzygy/tbprobe.cpp \
|
|
nnue/evaluate_nnue.cpp nnue/features/half_kp.cpp
|
|
|
|
OBJS = $(notdir $(SRCS:.cpp=.o))
|
|
|
|
VPATH = syzygy:nnue:nnue/features
|
|
|
|
### Establish the operating system name
|
|
KERNEL = $(shell uname -s)
|
|
ifeq ($(KERNEL),Linux)
|
|
OS = $(shell uname -o)
|
|
endif
|
|
|
|
### ==========================================================================
|
|
### Section 2. High-level Configuration
|
|
### ==========================================================================
|
|
#
|
|
# flag --- Comp switch --- Description
|
|
# ----------------------------------------------------------------------------
|
|
#
|
|
# debug = yes/no --- -DNDEBUG --- Enable/Disable debug mode
|
|
# sanitize = undefined/thread/no (-fsanitize )
|
|
# --- ( undefined ) --- enable undefined behavior checks
|
|
# --- ( thread ) --- enable threading error checks
|
|
# optimize = yes/no --- (-O3/-fast etc.) --- Enable/Disable optimizations
|
|
# arch = (name) --- (-arch) --- Target architecture
|
|
# bits = 64/32 --- -DIS_64BIT --- 64-/32-bit operating system
|
|
# prefetch = yes/no --- -DUSE_PREFETCH --- Use prefetch asm-instruction
|
|
# popcnt = yes/no --- -DUSE_POPCNT --- Use popcnt asm-instruction
|
|
# pext = yes/no --- -DUSE_PEXT --- Use pext x86_64 asm-instruction
|
|
# sse = yes/no --- -msse --- Use Intel Streaming SIMD Extensions
|
|
# mmx = yes/no --- -mmmx --- Use Intel MMX instructions
|
|
# sse2 = yes/no --- -msse2 --- Use Intel Streaming SIMD Extensions 2
|
|
# ssse3 = yes/no --- -mssse3 --- Use Intel Supplemental Streaming SIMD Extensions 3
|
|
# sse41 = yes/no --- -msse4.1 --- Use Intel Streaming SIMD Extensions 4.1
|
|
# avx2 = yes/no --- -mavx2 --- Use Intel Advanced Vector Extensions 2
|
|
# avx512 = yes/no --- -mavx512bw --- Use Intel Advanced Vector Extensions 512
|
|
# vnni = yes/no --- -mavx512vnni --- Use Intel Vector Neural Network Instructions 512
|
|
# neon = yes/no --- -DUSE_NEON --- Use ARM SIMD architecture
|
|
#
|
|
# Note that Makefile is space sensitive, so when adding new architectures
|
|
# or modifying existing flags, you have to make sure there are no extra spaces
|
|
# at the end of the line for flag values.
|
|
|
|
### 2.1. General and architecture defaults
|
|
|
|
ifeq ($(ARCH),)
|
|
empty_arch = yes
|
|
endif
|
|
|
|
optimize = yes
|
|
debug = no
|
|
sanitize = no
|
|
bits = 64
|
|
prefetch = no
|
|
popcnt = no
|
|
pext = no
|
|
sse = no
|
|
mmx = no
|
|
sse2 = no
|
|
ssse3 = no
|
|
sse41 = no
|
|
avx2 = no
|
|
avx512 = no
|
|
vnni = no
|
|
neon = no
|
|
ARCH = x86-64-modern
|
|
STRIP = strip
|
|
|
|
### 2.2 Architecture specific
|
|
|
|
ifeq ($(findstring x86,$(ARCH)),x86)
|
|
|
|
# x86-32/64
|
|
|
|
ifeq ($(findstring x86-32,$(ARCH)),x86-32)
|
|
arch = i386
|
|
bits = 32
|
|
sse = yes
|
|
mmx = yes
|
|
else
|
|
arch = x86_64
|
|
sse = yes
|
|
sse2 = yes
|
|
endif
|
|
|
|
ifeq ($(findstring -sse,$(ARCH)),-sse)
|
|
sse = yes
|
|
endif
|
|
|
|
ifeq ($(findstring -popcnt,$(ARCH)),-popcnt)
|
|
popcnt = yes
|
|
endif
|
|
|
|
ifeq ($(findstring -mmx,$(ARCH)),-mmx)
|
|
mmx = yes
|
|
endif
|
|
|
|
ifeq ($(findstring -sse2,$(ARCH)),-sse2)
|
|
sse = yes
|
|
sse2 = yes
|
|
endif
|
|
|
|
ifeq ($(findstring -ssse3,$(ARCH)),-ssse3)
|
|
sse = yes
|
|
sse2 = yes
|
|
ssse3 = yes
|
|
endif
|
|
|
|
ifeq ($(findstring -sse41,$(ARCH)),-sse41)
|
|
sse = yes
|
|
sse2 = yes
|
|
ssse3 = yes
|
|
sse41 = yes
|
|
endif
|
|
|
|
ifeq ($(findstring -modern,$(ARCH)),-modern)
|
|
popcnt = yes
|
|
sse = yes
|
|
sse2 = yes
|
|
ssse3 = yes
|
|
sse41 = yes
|
|
endif
|
|
|
|
ifeq ($(findstring -avx2,$(ARCH)),-avx2)
|
|
popcnt = yes
|
|
sse = yes
|
|
sse2 = yes
|
|
ssse3 = yes
|
|
sse41 = yes
|
|
avx2 = yes
|
|
endif
|
|
|
|
ifeq ($(findstring -bmi2,$(ARCH)),-bmi2)
|
|
popcnt = yes
|
|
sse = yes
|
|
sse2 = yes
|
|
ssse3 = yes
|
|
sse41 = yes
|
|
avx2 = yes
|
|
pext = yes
|
|
endif
|
|
|
|
ifeq ($(findstring -avx512,$(ARCH)),-avx512)
|
|
popcnt = yes
|
|
sse = yes
|
|
sse2 = yes
|
|
ssse3 = yes
|
|
sse41 = yes
|
|
avx2 = yes
|
|
pext = yes
|
|
avx512 = yes
|
|
endif
|
|
|
|
ifeq ($(findstring -vnni,$(ARCH)),-vnni)
|
|
popcnt = yes
|
|
sse = yes
|
|
sse2 = yes
|
|
ssse3 = yes
|
|
sse41 = yes
|
|
avx2 = yes
|
|
pext = yes
|
|
avx512 = yes
|
|
vnni = yes
|
|
endif
|
|
|
|
ifeq ($(sse),yes)
|
|
prefetch = yes
|
|
endif
|
|
|
|
# 64-bit pext is not available on x86-32
|
|
ifeq ($(bits),32)
|
|
pext = no
|
|
endif
|
|
|
|
else
|
|
|
|
# all other architectures
|
|
|
|
ifeq ($(ARCH),general-32)
|
|
arch = any
|
|
bits = 32
|
|
endif
|
|
|
|
ifeq ($(ARCH),general-64)
|
|
arch = any
|
|
endif
|
|
|
|
ifeq ($(ARCH),armv7)
|
|
arch = armv7
|
|
prefetch = yes
|
|
bits = 32
|
|
endif
|
|
|
|
ifeq ($(ARCH),armv7-neon)
|
|
arch = armv7
|
|
prefetch = yes
|
|
popcnt = yes
|
|
neon = yes
|
|
bits = 32
|
|
endif
|
|
|
|
ifeq ($(ARCH),armv8)
|
|
arch = armv8-a
|
|
prefetch = yes
|
|
popcnt = yes
|
|
neon = yes
|
|
endif
|
|
|
|
ifeq ($(ARCH),apple-silicon)
|
|
arch = arm64
|
|
prefetch = yes
|
|
popcnt = yes
|
|
neon = yes
|
|
endif
|
|
|
|
ifeq ($(ARCH),ppc-32)
|
|
arch = ppc
|
|
bits = 32
|
|
endif
|
|
|
|
ifeq ($(ARCH),ppc-64)
|
|
arch = ppc64
|
|
popcnt = yes
|
|
prefetch = yes
|
|
endif
|
|
|
|
endif
|
|
|
|
### ==========================================================================
|
|
### Section 3. Low-level Configuration
|
|
### ==========================================================================
|
|
|
|
### 3.1 Selecting compiler (default = gcc)
|
|
CXXFLAGS += -Wall -Wcast-qual -fno-exceptions -std=c++17 $(EXTRACXXFLAGS)
|
|
DEPENDFLAGS += -std=c++17
|
|
LDFLAGS += $(EXTRALDFLAGS)
|
|
|
|
ifeq ($(COMP),)
|
|
COMP=gcc
|
|
endif
|
|
|
|
ifeq ($(COMP),gcc)
|
|
comp=gcc
|
|
CXX=g++
|
|
CXXFLAGS += -pedantic -Wextra -Wshadow
|
|
|
|
ifeq ($(arch),$(filter $(arch),armv7 armv8-a))
|
|
ifeq ($(OS),Android)
|
|
CXXFLAGS += -m$(bits)
|
|
LDFLAGS += -m$(bits)
|
|
endif
|
|
else
|
|
CXXFLAGS += -m$(bits)
|
|
LDFLAGS += -m$(bits)
|
|
endif
|
|
|
|
ifeq ($(arch),$(filter $(arch),armv7))
|
|
LDFLAGS += -latomic
|
|
endif
|
|
|
|
ifneq ($(KERNEL),Darwin)
|
|
LDFLAGS += -Wl,--no-as-needed
|
|
endif
|
|
endif
|
|
|
|
ifeq ($(COMP),mingw)
|
|
comp=mingw
|
|
|
|
ifeq ($(KERNEL),Linux)
|
|
ifeq ($(bits),64)
|
|
ifeq ($(shell which x86_64-w64-mingw32-c++-posix),)
|
|
CXX=x86_64-w64-mingw32-c++
|
|
else
|
|
CXX=x86_64-w64-mingw32-c++-posix
|
|
endif
|
|
else
|
|
ifeq ($(shell which i686-w64-mingw32-c++-posix),)
|
|
CXX=i686-w64-mingw32-c++
|
|
else
|
|
CXX=i686-w64-mingw32-c++-posix
|
|
endif
|
|
endif
|
|
else
|
|
CXX=g++
|
|
endif
|
|
|
|
CXXFLAGS += -Wextra -Wshadow
|
|
LDFLAGS += -static
|
|
endif
|
|
|
|
ifeq ($(COMP),icc)
|
|
comp=icc
|
|
CXX=icpc
|
|
CXXFLAGS += -diag-disable 1476,10120 -Wcheck -Wabi -Wdeprecated -strict-ansi
|
|
endif
|
|
|
|
ifeq ($(COMP),clang)
|
|
comp=clang
|
|
CXX=clang++
|
|
CXXFLAGS += -pedantic -Wextra -Wshadow
|
|
|
|
ifneq ($(KERNEL),Darwin)
|
|
ifneq ($(KERNEL),OpenBSD)
|
|
LDFLAGS += -latomic
|
|
endif
|
|
endif
|
|
|
|
ifeq ($(arch),$(filter $(arch),armv7 armv8))
|
|
ifeq ($(OS),Android)
|
|
CXXFLAGS += -m$(bits)
|
|
LDFLAGS += -m$(bits)
|
|
endif
|
|
else
|
|
CXXFLAGS += -m$(bits)
|
|
LDFLAGS += -m$(bits)
|
|
endif
|
|
endif
|
|
|
|
ifeq ($(comp),icc)
|
|
profile_make = icc-profile-make
|
|
profile_use = icc-profile-use
|
|
else
|
|
ifeq ($(comp),clang)
|
|
profile_make = clang-profile-make
|
|
profile_use = clang-profile-use
|
|
else
|
|
profile_make = gcc-profile-make
|
|
profile_use = gcc-profile-use
|
|
endif
|
|
endif
|
|
|
|
ifeq ($(KERNEL),Darwin)
|
|
CXXFLAGS += -arch $(arch) -mmacosx-version-min=10.14
|
|
LDFLAGS += -arch $(arch) -mmacosx-version-min=10.14
|
|
XCRUN = xcrun
|
|
endif
|
|
|
|
# To cross-compile for Android, NDK version r21 or later is recommended.
|
|
# In earlier NDK versions, you'll need to pass -fno-addrsig if using GNU binutils.
|
|
# Currently we don't know how to make PGO builds with the NDK yet.
|
|
ifeq ($(COMP),ndk)
|
|
CXXFLAGS += -stdlib=libc++ -fPIE
|
|
ifeq ($(arch),armv7)
|
|
comp=armv7a-linux-androideabi16-clang
|
|
CXX=armv7a-linux-androideabi16-clang++
|
|
CXXFLAGS += -mthumb -march=armv7-a -mfloat-abi=softfp -mfpu=neon
|
|
STRIP=arm-linux-androideabi-strip
|
|
endif
|
|
ifeq ($(arch),armv8-a)
|
|
comp=aarch64-linux-android21-clang
|
|
CXX=aarch64-linux-android21-clang++
|
|
STRIP=aarch64-linux-android-strip
|
|
endif
|
|
LDFLAGS += -static-libstdc++ -pie -lm -latomic
|
|
endif
|
|
|
|
### Travis CI script uses COMPILER to overwrite CXX
|
|
ifdef COMPILER
|
|
COMPCXX=$(COMPILER)
|
|
endif
|
|
|
|
### Allow overwriting CXX from command line
|
|
ifdef COMPCXX
|
|
CXX=$(COMPCXX)
|
|
endif
|
|
|
|
### Sometimes gcc is really clang
|
|
ifeq ($(COMP),gcc)
|
|
gccversion = $(shell $(CXX) --version)
|
|
gccisclang = $(findstring clang,$(gccversion))
|
|
ifneq ($(gccisclang),)
|
|
profile_make = clang-profile-make
|
|
profile_use = clang-profile-use
|
|
endif
|
|
endif
|
|
|
|
### On mingw use Windows threads, otherwise POSIX
|
|
ifneq ($(comp),mingw)
|
|
CXXFLAGS += -DUSE_PTHREADS
|
|
# On Android Bionic's C library comes with its own pthread implementation bundled in
|
|
ifneq ($(OS),Android)
|
|
# Haiku has pthreads in its libroot, so only link it in on other platforms
|
|
ifneq ($(KERNEL),Haiku)
|
|
ifneq ($(COMP),ndk)
|
|
LDFLAGS += -lpthread
|
|
endif
|
|
endif
|
|
endif
|
|
endif
|
|
|
|
### 3.2.1 Debugging
|
|
ifeq ($(debug),no)
|
|
CXXFLAGS += -DNDEBUG
|
|
else
|
|
CXXFLAGS += -g
|
|
endif
|
|
|
|
### 3.2.2 Debugging with undefined behavior sanitizers
|
|
ifneq ($(sanitize),no)
|
|
CXXFLAGS += -g3 -fsanitize=$(sanitize)
|
|
LDFLAGS += -fsanitize=$(sanitize)
|
|
endif
|
|
|
|
### 3.3 Optimization
|
|
ifeq ($(optimize),yes)
|
|
|
|
CXXFLAGS += -O3
|
|
|
|
ifeq ($(comp),gcc)
|
|
ifeq ($(OS), Android)
|
|
CXXFLAGS += -fno-gcse -mthumb -march=armv7-a -mfloat-abi=softfp
|
|
endif
|
|
endif
|
|
|
|
ifeq ($(comp),$(filter $(comp),gcc clang icc))
|
|
ifeq ($(KERNEL),Darwin)
|
|
CXXFLAGS += -mdynamic-no-pic
|
|
endif
|
|
endif
|
|
endif
|
|
|
|
### 3.4 Bits
|
|
ifeq ($(bits),64)
|
|
CXXFLAGS += -DIS_64BIT
|
|
endif
|
|
|
|
### 3.5 prefetch
|
|
ifeq ($(prefetch),yes)
|
|
ifeq ($(sse),yes)
|
|
CXXFLAGS += -msse
|
|
endif
|
|
else
|
|
CXXFLAGS += -DNO_PREFETCH
|
|
endif
|
|
|
|
### 3.6 popcnt
|
|
ifeq ($(popcnt),yes)
|
|
ifeq ($(arch),$(filter $(arch),ppc64 armv7 armv8-a arm64))
|
|
CXXFLAGS += -DUSE_POPCNT
|
|
else ifeq ($(comp),icc)
|
|
CXXFLAGS += -msse3 -DUSE_POPCNT
|
|
else
|
|
CXXFLAGS += -msse3 -mpopcnt -DUSE_POPCNT
|
|
endif
|
|
endif
|
|
|
|
|
|
ifeq ($(avx2),yes)
|
|
CXXFLAGS += -DUSE_AVX2
|
|
ifeq ($(comp),$(filter $(comp),gcc clang mingw))
|
|
CXXFLAGS += -mavx2
|
|
endif
|
|
endif
|
|
|
|
ifeq ($(avx512),yes)
|
|
CXXFLAGS += -DUSE_AVX512
|
|
ifeq ($(comp),$(filter $(comp),gcc clang mingw))
|
|
CXXFLAGS += -mavx512f -mavx512bw
|
|
endif
|
|
endif
|
|
|
|
ifeq ($(vnni),yes)
|
|
CXXFLAGS += -DUSE_VNNI
|
|
ifeq ($(comp),$(filter $(comp),gcc clang mingw))
|
|
CXXFLAGS += -mavx512vnni -mavx512dq -mavx512vl
|
|
endif
|
|
endif
|
|
|
|
ifeq ($(sse41),yes)
|
|
CXXFLAGS += -DUSE_SSE41
|
|
ifeq ($(comp),$(filter $(comp),gcc clang mingw))
|
|
CXXFLAGS += -msse4.1
|
|
endif
|
|
endif
|
|
|
|
ifeq ($(ssse3),yes)
|
|
CXXFLAGS += -DUSE_SSSE3
|
|
ifeq ($(comp),$(filter $(comp),gcc clang mingw))
|
|
CXXFLAGS += -mssse3
|
|
endif
|
|
endif
|
|
|
|
ifeq ($(sse2),yes)
|
|
CXXFLAGS += -DUSE_SSE2
|
|
ifeq ($(comp),$(filter $(comp),gcc clang mingw))
|
|
CXXFLAGS += -msse2
|
|
endif
|
|
endif
|
|
|
|
ifeq ($(mmx),yes)
|
|
CXXFLAGS += -DUSE_MMX
|
|
ifeq ($(comp),$(filter $(comp),gcc clang mingw))
|
|
CXXFLAGS += -mmmx
|
|
endif
|
|
endif
|
|
|
|
ifeq ($(neon),yes)
|
|
CXXFLAGS += -DUSE_NEON
|
|
ifeq ($(KERNEL),Linux)
|
|
ifneq ($(COMP),ndk)
|
|
CXXFLAGS += -mfpu=neon
|
|
endif
|
|
endif
|
|
endif
|
|
|
|
### 3.7 pext
|
|
ifeq ($(pext),yes)
|
|
CXXFLAGS += -DUSE_PEXT
|
|
ifeq ($(comp),$(filter $(comp),gcc clang mingw))
|
|
CXXFLAGS += -mbmi2
|
|
endif
|
|
endif
|
|
|
|
### 3.8 Link Time Optimization
|
|
### This is a mix of compile and link time options because the lto link phase
|
|
### needs access to the optimization flags.
|
|
ifeq ($(optimize),yes)
|
|
ifeq ($(debug), no)
|
|
ifeq ($(COMP),ndk)
|
|
CXXFLAGS += -flto=thin
|
|
LDFLAGS += $(CXXFLAGS)
|
|
else ifeq ($(comp),clang)
|
|
CXXFLAGS += -flto=thin
|
|
LDFLAGS += $(CXXFLAGS)
|
|
|
|
# GCC and CLANG use different methods for parallelizing LTO and CLANG pretends to be
|
|
# GCC on some systems.
|
|
else ifeq ($(comp),gcc)
|
|
ifeq ($(gccisclang),)
|
|
CXXFLAGS += -flto
|
|
LDFLAGS += $(CXXFLAGS) -flto=jobserver
|
|
ifneq ($(findstring MINGW,$(KERNEL)),)
|
|
LDFLAGS += -save-temps
|
|
else ifneq ($(findstring MSYS,$(KERNEL)),)
|
|
LDFLAGS += -save-temps
|
|
endif
|
|
else
|
|
CXXFLAGS += -flto=thin
|
|
LDFLAGS += $(CXXFLAGS)
|
|
endif
|
|
|
|
# To use LTO and static linking on windows, the tool chain requires a recent gcc:
|
|
# gcc version 10.1 in msys2 or TDM-GCC version 9.2 are known to work, older might not.
|
|
# So, only enable it for a cross from Linux by default.
|
|
else ifeq ($(comp),mingw)
|
|
ifeq ($(KERNEL),Linux)
|
|
CXXFLAGS += -flto
|
|
LDFLAGS += $(CXXFLAGS) -flto=jobserver
|
|
endif
|
|
endif
|
|
endif
|
|
endif
|
|
|
|
### 3.9 Android 5 can only run position independent executables. Note that this
|
|
### breaks Android 4.0 and earlier.
|
|
ifeq ($(OS), Android)
|
|
CXXFLAGS += -fPIE
|
|
LDFLAGS += -fPIE -pie
|
|
endif
|
|
|
|
### ==========================================================================
|
|
### Section 4. Public Targets
|
|
### ==========================================================================
|
|
|
|
help:
|
|
@echo ""
|
|
@echo "To compile stockfish, type: "
|
|
@echo ""
|
|
@echo "make target ARCH=arch [COMP=compiler] [COMPCXX=cxx]"
|
|
@echo ""
|
|
@echo "Supported targets:"
|
|
@echo ""
|
|
@echo "help > Display architecture details"
|
|
@echo "build > Standard build"
|
|
@echo "net > Download the default nnue net"
|
|
@echo "profile-build > Faster build (with profile-guided optimization)"
|
|
@echo "strip > Strip executable"
|
|
@echo "install > Install executable"
|
|
@echo "clean > Clean up"
|
|
@echo ""
|
|
@echo "Supported archs:"
|
|
@echo ""
|
|
@echo "x86-64-vnni > x86 64-bit with vnni support"
|
|
@echo "x86-64-avx512 > x86 64-bit with avx512 support"
|
|
@echo "x86-64-bmi2 > x86 64-bit with bmi2 support"
|
|
@echo "x86-64-avx2 > x86 64-bit with avx2 support"
|
|
@echo "x86-64-sse41-popcnt > x86 64-bit with sse41 and popcnt support"
|
|
@echo "x86-64-modern > common modern CPU, currently x86-64-sse41-popcnt"
|
|
@echo "x86-64-ssse3 > x86 64-bit with ssse3 support"
|
|
@echo "x86-64-sse3-popcnt > x86 64-bit with sse3 and popcnt support"
|
|
@echo "x86-64 > x86 64-bit generic (with sse2 support)"
|
|
@echo "x86-32-sse41-popcnt > x86 32-bit with sse41 and popcnt support"
|
|
@echo "x86-32-sse2 > x86 32-bit with sse2 support"
|
|
@echo "x86-32 > x86 32-bit generic (with mmx and sse support)"
|
|
@echo "ppc-64 > PPC 64-bit"
|
|
@echo "ppc-32 > PPC 32-bit"
|
|
@echo "armv7 > ARMv7 32-bit"
|
|
@echo "armv7-neon > ARMv7 32-bit with popcnt and neon"
|
|
@echo "armv8 > ARMv8 64-bit with popcnt and neon"
|
|
@echo "apple-silicon > Apple silicon ARM64"
|
|
@echo "general-64 > unspecified 64-bit"
|
|
@echo "general-32 > unspecified 32-bit"
|
|
@echo ""
|
|
@echo "Supported compilers:"
|
|
@echo ""
|
|
@echo "gcc > Gnu compiler (default)"
|
|
@echo "mingw > Gnu compiler with MinGW under Windows"
|
|
@echo "clang > LLVM Clang compiler"
|
|
@echo "icc > Intel compiler"
|
|
@echo "ndk > Google NDK to cross-compile for Android"
|
|
@echo ""
|
|
@echo "Simple examples. If you don't know what to do, you likely want to run: "
|
|
@echo ""
|
|
@echo "make -j build ARCH=x86-64 (A portable, slow compile for 64-bit systems)"
|
|
@echo "make -j build ARCH=x86-32 (A portable, slow compile for 32-bit systems)"
|
|
@echo ""
|
|
@echo "Advanced examples, for experienced users looking for performance: "
|
|
@echo ""
|
|
@echo "make help ARCH=x86-64-bmi2"
|
|
@echo "make -j profile-build ARCH=x86-64-bmi2 COMP=gcc COMPCXX=g++-9.0"
|
|
@echo "make -j build ARCH=x86-64-ssse3 COMP=clang"
|
|
@echo ""
|
|
ifneq ($(empty_arch), yes)
|
|
@echo "-------------------------------"
|
|
@echo "The selected architecture $(ARCH) will enable the following configuration: "
|
|
@$(MAKE) ARCH=$(ARCH) COMP=$(COMP) config-sanity
|
|
endif
|
|
|
|
|
|
.PHONY: help build profile-build strip install clean net objclean profileclean \
|
|
config-sanity icc-profile-use icc-profile-make gcc-profile-use gcc-profile-make \
|
|
clang-profile-use clang-profile-make
|
|
|
|
build: config-sanity
|
|
$(MAKE) ARCH=$(ARCH) COMP=$(COMP) all
|
|
|
|
profile-build: net config-sanity objclean profileclean
|
|
@echo ""
|
|
@echo "Step 1/4. Building instrumented executable ..."
|
|
$(MAKE) ARCH=$(ARCH) COMP=$(COMP) $(profile_make)
|
|
@echo ""
|
|
@echo "Step 2/4. Running benchmark for pgo-build ..."
|
|
$(PGOBENCH) > /dev/null
|
|
@echo ""
|
|
@echo "Step 3/4. Building optimized executable ..."
|
|
$(MAKE) ARCH=$(ARCH) COMP=$(COMP) objclean
|
|
$(MAKE) ARCH=$(ARCH) COMP=$(COMP) $(profile_use)
|
|
@echo ""
|
|
@echo "Step 4/4. Deleting profile data ..."
|
|
$(MAKE) ARCH=$(ARCH) COMP=$(COMP) profileclean
|
|
|
|
strip:
|
|
$(STRIP) $(EXE)
|
|
|
|
install:
|
|
-mkdir -p -m 755 $(BINDIR)
|
|
-cp $(EXE) $(BINDIR)
|
|
-strip $(BINDIR)/$(EXE)
|
|
|
|
#clean all
|
|
clean: objclean profileclean
|
|
@rm -f .depend *~ core
|
|
|
|
net:
|
|
$(eval nnuenet := $(shell grep EvalFile ucioption.cpp | grep Option | sed 's/.*\(nn-[a-z0-9]\{12\}.nnue\).*/\1/'))
|
|
@echo "Default net: $(nnuenet)"
|
|
$(eval nnuedownloadurl := https://tests.stockfishchess.org/api/nn/$(nnuenet))
|
|
$(eval curl_or_wget := $(shell if hash curl 2>/dev/null; then echo "curl -skL"; elif hash wget 2>/dev/null; then echo "wget -qO-"; fi))
|
|
@if test -f "$(nnuenet)"; then \
|
|
echo "Already available."; \
|
|
else \
|
|
if [ "x$(curl_or_wget)" = "x" ]; then \
|
|
echo "Automatic download failed: neither curl nor wget is installed. Install one of these tools or download the net manually"; exit 1; \
|
|
else \
|
|
echo "Downloading $(nnuedownloadurl)"; $(curl_or_wget) $(nnuedownloadurl) > $(nnuenet);\
|
|
fi; \
|
|
fi;
|
|
$(eval shasum_command := $(shell if hash shasum 2>/dev/null; then echo "shasum -a 256 "; elif hash sha256sum 2>/dev/null; then echo "sha256sum "; fi))
|
|
@if [ "x$(shasum_command)" != "x" ]; then \
|
|
if [ "$(nnuenet)" != "nn-"`$(shasum_command) $(nnuenet) | cut -c1-12`".nnue" ]; then \
|
|
echo "Failed download or $(nnuenet) corrupted, please delete!"; exit 1; \
|
|
fi \
|
|
else \
|
|
echo "shasum / sha256sum not found, skipping net validation"; \
|
|
fi
|
|
|
|
|
|
# clean binaries and objects
|
|
objclean:
|
|
@rm -f $(EXE) *.o ./syzygy/*.o ./nnue/*.o ./nnue/features/*.o
|
|
|
|
# clean auxiliary profiling files
|
|
profileclean:
|
|
@rm -rf profdir
|
|
@rm -f bench.txt *.gcda *.gcno ./syzygy/*.gcda ./nnue/*.gcda ./nnue/features/*.gcda *.s
|
|
@rm -f stockfish.profdata *.profraw
|
|
|
|
default:
|
|
help
|
|
|
|
### ==========================================================================
|
|
### Section 5. Private Targets
|
|
### ==========================================================================
|
|
|
|
all: $(EXE) .depend
|
|
|
|
config-sanity:
|
|
@echo ""
|
|
@echo "Config:"
|
|
@echo "debug: '$(debug)'"
|
|
@echo "sanitize: '$(sanitize)'"
|
|
@echo "optimize: '$(optimize)'"
|
|
@echo "arch: '$(arch)'"
|
|
@echo "bits: '$(bits)'"
|
|
@echo "kernel: '$(KERNEL)'"
|
|
@echo "os: '$(OS)'"
|
|
@echo "prefetch: '$(prefetch)'"
|
|
@echo "popcnt: '$(popcnt)'"
|
|
@echo "pext: '$(pext)'"
|
|
@echo "sse: '$(sse)'"
|
|
@echo "mmx: '$(mmx)'"
|
|
@echo "sse2: '$(sse2)'"
|
|
@echo "ssse3: '$(ssse3)'"
|
|
@echo "sse41: '$(sse41)'"
|
|
@echo "avx2: '$(avx2)'"
|
|
@echo "avx512: '$(avx512)'"
|
|
@echo "vnni: '$(vnni)'"
|
|
@echo "neon: '$(neon)'"
|
|
@echo ""
|
|
@echo "Flags:"
|
|
@echo "CXX: $(CXX)"
|
|
@echo "CXXFLAGS: $(CXXFLAGS)"
|
|
@echo "LDFLAGS: $(LDFLAGS)"
|
|
@echo ""
|
|
@echo "Testing config sanity. If this fails, try 'make help' ..."
|
|
@echo ""
|
|
@test "$(debug)" = "yes" || test "$(debug)" = "no"
|
|
@test "$(sanitize)" = "undefined" || test "$(sanitize)" = "thread" || test "$(sanitize)" = "address" || test "$(sanitize)" = "no"
|
|
@test "$(optimize)" = "yes" || test "$(optimize)" = "no"
|
|
@test "$(arch)" = "any" || test "$(arch)" = "x86_64" || test "$(arch)" = "i386" || \
|
|
test "$(arch)" = "ppc64" || test "$(arch)" = "ppc" || \
|
|
test "$(arch)" = "armv7" || test "$(arch)" = "armv8-a" || test "$(arch)" = "arm64"
|
|
@test "$(bits)" = "32" || test "$(bits)" = "64"
|
|
@test "$(prefetch)" = "yes" || test "$(prefetch)" = "no"
|
|
@test "$(popcnt)" = "yes" || test "$(popcnt)" = "no"
|
|
@test "$(pext)" = "yes" || test "$(pext)" = "no"
|
|
@test "$(sse)" = "yes" || test "$(sse)" = "no"
|
|
@test "$(mmx)" = "yes" || test "$(mmx)" = "no"
|
|
@test "$(sse2)" = "yes" || test "$(sse2)" = "no"
|
|
@test "$(ssse3)" = "yes" || test "$(ssse3)" = "no"
|
|
@test "$(sse41)" = "yes" || test "$(sse41)" = "no"
|
|
@test "$(avx2)" = "yes" || test "$(avx2)" = "no"
|
|
@test "$(avx512)" = "yes" || test "$(avx512)" = "no"
|
|
@test "$(vnni)" = "yes" || test "$(vnni)" = "no"
|
|
@test "$(neon)" = "yes" || test "$(neon)" = "no"
|
|
@test "$(comp)" = "gcc" || test "$(comp)" = "icc" || test "$(comp)" = "mingw" || test "$(comp)" = "clang" \
|
|
|| test "$(comp)" = "armv7a-linux-androideabi16-clang" || test "$(comp)" = "aarch64-linux-android21-clang"
|
|
|
|
$(EXE): $(OBJS)
|
|
+$(CXX) -o $@ $(OBJS) $(LDFLAGS)
|
|
|
|
clang-profile-make:
|
|
$(MAKE) ARCH=$(ARCH) COMP=$(COMP) \
|
|
EXTRACXXFLAGS='-fprofile-instr-generate ' \
|
|
EXTRALDFLAGS=' -fprofile-instr-generate' \
|
|
all
|
|
|
|
clang-profile-use:
|
|
$(XCRUN) llvm-profdata merge -output=stockfish.profdata *.profraw
|
|
$(MAKE) ARCH=$(ARCH) COMP=$(COMP) \
|
|
EXTRACXXFLAGS='-fprofile-instr-use=stockfish.profdata' \
|
|
EXTRALDFLAGS='-fprofile-use ' \
|
|
all
|
|
|
|
gcc-profile-make:
|
|
$(MAKE) ARCH=$(ARCH) COMP=$(COMP) \
|
|
EXTRACXXFLAGS='-fprofile-generate' \
|
|
EXTRALDFLAGS='-lgcov' \
|
|
all
|
|
|
|
gcc-profile-use:
|
|
$(MAKE) ARCH=$(ARCH) COMP=$(COMP) \
|
|
EXTRACXXFLAGS='-fprofile-use -fno-peel-loops -fno-tracer' \
|
|
EXTRALDFLAGS='-lgcov' \
|
|
all
|
|
|
|
icc-profile-make:
|
|
@mkdir -p profdir
|
|
$(MAKE) ARCH=$(ARCH) COMP=$(COMP) \
|
|
EXTRACXXFLAGS='-prof-gen=srcpos -prof_dir ./profdir' \
|
|
all
|
|
|
|
icc-profile-use:
|
|
$(MAKE) ARCH=$(ARCH) COMP=$(COMP) \
|
|
EXTRACXXFLAGS='-prof_use -prof_dir ./profdir' \
|
|
all
|
|
|
|
.depend:
|
|
-@$(CXX) $(DEPENDFLAGS) -MM $(SRCS) > $@ 2> /dev/null
|
|
|
|
-include .depend
|