# Stockfish, a UCI chess playing engine derived from Glaurung 2.1
-# Copyright (C) 2004-2021 The Stockfish developers (see AUTHORS file)
+# Copyright (C) 2004-2022 The Stockfish developers (see AUTHORS file)
#
# Stockfish is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
### Section 1. General Configuration
### ==========================================================================
+### Establish the operating system name
+KERNEL = $(shell uname -s)
+ifeq ($(KERNEL),Linux)
+ OS = $(shell uname -o)
+endif
+
+### Target Windows OS
+ifeq ($(OS),Windows_NT)
+ ifneq ($(COMP),ndk)
+ target_windows = yes
+ endif
+else ifeq ($(COMP),mingw)
+ target_windows = yes
+ ifeq ($(WINE_PATH),)
+ WINE_PATH = $(shell which wine)
+ endif
+endif
+
### Executable name
-ifeq ($(COMP),mingw)
-EXE = stockfish.exe
+ifeq ($(target_windows),yes)
+ EXE = stockfish.exe
else
-EXE = stockfish
+ EXE = stockfish
endif
### Installation dir definitions
### Built-in benchmark for pgo-builds
ifeq ($(SDE_PATH),)
- PGOBENCH = ./$(EXE) bench
+ PGOBENCH = $(WINE_PATH) ./$(EXE) bench
else
- PGOBENCH = $(SDE_PATH) -- ./$(EXE) bench
+ PGOBENCH = $(SDE_PATH) -- $(WINE_PATH) ./$(EXE) bench
endif
### Source and object files
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
### ==========================================================================
vnni256 = no
vnni512 = no
neon = no
+arm_version = 0
STRIP = strip
### 2.2 Architecture specific
ifeq ($(findstring x86-32,$(ARCH)),x86-32)
arch = i386
bits = 32
- sse = yes
+ sse = no
mmx = yes
else
arch = x86_64
arch = armv7
prefetch = yes
bits = 32
+ arm_version = 7
endif
ifeq ($(ARCH),armv7-neon)
popcnt = yes
neon = yes
bits = 32
+ arm_version = 7
endif
ifeq ($(ARCH),armv8)
prefetch = yes
popcnt = yes
neon = yes
+ arm_version = 8
endif
ifeq ($(ARCH),apple-silicon)
prefetch = yes
popcnt = yes
neon = yes
+ arm_version = 8
endif
ifeq ($(ARCH),ppc-32)
endif
endif
+ifeq ($(target_windows),yes)
+ LDFLAGS += -static
+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
+ ifeq ($(bits),64)
+ ifeq ($(shell which x86_64-w64-mingw32-c++-posix 2> /dev/null),)
+ CXX=x86_64-w64-mingw32-c++
else
- ifeq ($(shell which i686-w64-mingw32-c++-posix),)
- CXX=i686-w64-mingw32-c++
- else
- CXX=i686-w64-mingw32-c++-posix
- endif
+ CXX=x86_64-w64-mingw32-c++-posix
endif
else
- CXX=g++
+ ifeq ($(shell which i686-w64-mingw32-c++-posix 2> /dev/null),)
+ CXX=i686-w64-mingw32-c++
+ else
+ CXX=i686-w64-mingw32-c++-posix
+ endif
endif
-
CXXFLAGS += -pedantic -Wextra -Wshadow
- LDFLAGS += -static
endif
ifeq ($(COMP),icc)
ifeq ($(COMP),clang)
comp=clang
CXX=clang++
+ ifeq ($(target_windows),yes)
+ CXX=x86_64-w64-mingw32-clang++
+ endif
+
CXXFLAGS += -pedantic -Wextra -Wshadow
- ifneq ($(KERNEL),Darwin)
- ifneq ($(KERNEL),OpenBSD)
- ifneq ($(KERNEL),FreeBSD)
+ ifeq ($(filter $(KERNEL),Darwin OpenBSD FreeBSD),)
+ ifeq ($(target_windows),)
ifneq ($(RTLIB),compiler-rt)
LDFLAGS += -latomic
endif
endif
endif
- endif
ifeq ($(arch),$(filter $(arch),armv7 armv8))
ifeq ($(OS),Android)
ifeq ($(arch),armv7)
CXX=armv7a-linux-androideabi16-clang++
CXXFLAGS += -mthumb -march=armv7-a -mfloat-abi=softfp -mfpu=neon
- STRIP=arm-linux-androideabi-strip
+ ifneq ($(shell which arm-linux-androideabi-strip 2>/dev/null),)
+ STRIP=arm-linux-androideabi-strip
+ else
+ STRIP=llvm-strip
+ endif
endif
ifeq ($(arch),armv8)
CXX=aarch64-linux-android21-clang++
- STRIP=aarch64-linux-android-strip
+ ifneq ($(shell which aarch64-linux-android-strip 2>/dev/null),)
+ STRIP=aarch64-linux-android-strip
+ else
+ STRIP=llvm-strip
+ endif
endif
LDFLAGS += -static-libstdc++ -pie -lm -latomic
endif
else
profile_make = gcc-profile-make
profile_use = gcc-profile-use
+ ifeq ($(KERNEL),Darwin)
+ EXTRAPROFILEFLAGS = -fvisibility=hidden
+ endif
endif
### Travis CI script uses COMPILER to overwrite CXX
endif
endif
- ifeq ($(comp),$(filter $(comp),gcc clang icc))
- ifeq ($(KERNEL),Darwin)
- CXXFLAGS += -mdynamic-no-pic
- endif
- endif
+ ifeq ($(KERNEL),Darwin)
+ ifeq ($(comp),$(filter $(comp),clang icc))
+ CXXFLAGS += -mdynamic-no-pic
+ endif
+
+ ifeq ($(comp),gcc)
+ ifneq ($(arch),arm64)
+ CXXFLAGS += -mdynamic-no-pic
+ endif
+ endif
+ endif
ifeq ($(comp),clang)
CXXFLAGS += -fexperimental-new-pass-manager
endif
ifeq ($(neon),yes)
- CXXFLAGS += -DUSE_NEON
+ CXXFLAGS += -DUSE_NEON=$(arm_version)
ifeq ($(KERNEL),Linux)
ifneq ($(COMP),ndk)
ifneq ($(arch),armv8)
ifeq ($(debug), no)
ifeq ($(comp),clang)
CXXFLAGS += -flto
- ifneq ($(findstring MINGW,$(KERNEL)),)
- CXXFLAGS += -fuse-ld=lld
- else ifneq ($(findstring MSYS,$(KERNEL)),)
+ ifeq ($(target_windows),yes)
CXXFLAGS += -fuse-ld=lld
endif
LDFLAGS += $(CXXFLAGS)
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
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.
+# To use LTO and static linking on Windows,
+# the tool chain requires gcc version 10.1 or later.
else ifeq ($(comp),mingw)
- ifeq ($(KERNEL),Linux)
ifneq ($(arch),i386)
CXXFLAGS += -flto
- LDFLAGS += $(CXXFLAGS) -flto=jobserver
- endif
+ LDFLAGS += $(CXXFLAGS) -save-temps
endif
endif
endif
install:
-mkdir -p -m 755 $(BINDIR)
-cp $(EXE) $(BINDIR)
- -strip $(BINDIR)/$(EXE)
+ $(STRIP) $(BINDIR)/$(EXE)
# clean all
clean: objclean profileclean
# clean binaries and objects
objclean:
- @rm -f $(EXE) *.o ./syzygy/*.o ./nnue/*.o ./nnue/features/*.o
+ @rm -f stockfish stockfish.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
- @rm -f stockfish.exe.lto_wrapper_args
- @rm -f stockfish.exe.ltrans.out
+ @rm -f stockfish.*args*
+ @rm -f stockfish.*lt*
+ @rm -f stockfish.res
@rm -f ./-lstdc++.res
default:
@echo "vnni256: '$(vnni256)'"
@echo "vnni512: '$(vnni512)'"
@echo "neon: '$(neon)'"
+ @echo "arm_version: '$(arm_version)'"
@echo ""
@echo "Flags:"
@echo "CXX: $(CXX)"
@mkdir -p profdir
$(MAKE) ARCH=$(ARCH) COMP=$(COMP) \
EXTRACXXFLAGS='-fprofile-generate=profdir' \
+ EXTRACXXFLAGS+=$(EXTRAPROFILEFLAGS) \
EXTRALDFLAGS='-lgcov' \
all
gcc-profile-use:
$(MAKE) ARCH=$(ARCH) COMP=$(COMP) \
EXTRACXXFLAGS='-fprofile-use=profdir -fno-peel-loops -fno-tracer' \
+ EXTRACXXFLAGS+=$(EXTRAPROFILEFLAGS) \
EXTRALDFLAGS='-lgcov' \
all