Rev 182 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed
# 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-2018 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### ==========================================================================### Establish the operating system name# Pierre-Marie Baty -- Windows doesn't know unameifeq ($(OS),Windows_NT)KERNEL = WindowselseKERNEL = $(shell uname -s)ifeq ($(KERNEL),Linux)OS = $(shell uname -o)endifendif### Executable name# Pierre-Marie Baty -- on Windows, add the .exe extensionifeq ($(OS),Windows_NT)EXE = stockfish.exeelseEXE = stockfishendif### Installation dir definitionsPREFIX = /usr/localBINDIR = $(PREFIX)/bin### Built-in benchmark for pgo-buildsPGOBENCH = ./$(EXE) bench### Object filesOBJS = benchmark.o bitbase.o bitboard.o endgame.o evaluate.o main.o \material.o misc.o movegen.o movepick.o pawns.o position.o psqt.o \search.o thread.o timeman.o tt.o uci.o ucioption.o syzygy/tbprobe.o### ==========================================================================### 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# sse = yes/no --- -msse --- Use Intel Streaming SIMD Extensions# pext = yes/no --- -DUSE_PEXT --- Use pext x86_64 asm-instruction## 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 defaultsoptimize = yesdebug = no#sanitize = nosanitize = addressbits = 32prefetch = nopopcnt = nosse = nopext = no### 2.2 Architecture specificifeq ($(ARCH),general-32)arch = anyendififeq ($(ARCH),x86-32-old)arch = i386endififeq ($(ARCH),x86-32)arch = i386prefetch = yessse = yesendififeq ($(ARCH),general-64)arch = anybits = 64endififeq ($(ARCH),x86-64)arch = x86_64bits = 64prefetch = yessse = yesendififeq ($(ARCH),x86-64-modern)arch = x86_64bits = 64prefetch = yespopcnt = yessse = yesendififeq ($(ARCH),x86-64-bmi2)arch = x86_64bits = 64prefetch = yespopcnt = yessse = yespext = yesendififeq ($(ARCH),armv7)arch = armv7prefetch = yesendififeq ($(ARCH),ppc-32)arch = ppcendififeq ($(ARCH),ppc-64)arch = ppc64bits = 64endif### ==========================================================================### Section 3. Low-level configuration### ==========================================================================### 3.1 Selecting compiler (default = gcc)ifeq ($(OS),Windows_NT)# Pierre-Marie Baty -- we need two extra flags AND the C++14 standard when building with Clang against the Visual Studio 2015 SDKCXXFLAGS += -Xclang -flto-visibility-public-std -Wall -Wcast-qual -std=c++14 $(EXTRACXXFLAGS)# -fno-exceptionsDEPENDFLAGS += -std=c++14elseCXXFLAGS += -Wall -Wcast-qual -fno-exceptions -std=c++11 $(EXTRACXXFLAGS)DEPENDFLAGS += -std=c++11endifLDFLAGS += $(EXTRALDFLAGS)#ifeq ($(COMP),)# COMP=gcc#endifCOMP=clangifeq ($(COMP),gcc)comp=gccCXX=g++CXXFLAGS += -pedantic -Wextra -Wshadowifeq ($(ARCH),armv7)ifeq ($(OS),Android)CXXFLAGS += -m$(bits)LDFLAGS += -m$(bits)endifelseCXXFLAGS += -m$(bits)LDFLAGS += -m$(bits)endififneq ($(KERNEL),Darwin)LDFLAGS += -Wl,--no-as-neededendifendififeq ($(COMP),mingw)comp=mingwifeq ($(KERNEL),Linux)ifeq ($(bits),64)ifeq ($(shell which x86_64-w64-mingw32-c++-posix),)CXX=x86_64-w64-mingw32-c++elseCXX=x86_64-w64-mingw32-c++-posixendifelseifeq ($(shell which i686-w64-mingw32-c++-posix),)CXX=i686-w64-mingw32-c++elseCXX=i686-w64-mingw32-c++-posixendifendifelseCXX=g++endifCXXFLAGS += -Wextra -WshadowLDFLAGS += -staticendififeq ($(COMP),icc)comp=iccCXX=icpcCXXFLAGS += -diag-disable 1476,10120 -Wcheck -Wabi -Wdeprecated -strict-ansiendififeq ($(COMP),clang)comp=clangCXX=clang++CXXFLAGS += -pedantic -Wextra -Wshadow# Pierre-Marie Baty -- also add the test case for Windowsifneq ($(OS),Windows_NT)ifneq ($(KERNEL),Darwin)ifneq ($(KERNEL),OpenBSD)LDFLAGS += -latomicendifendifendififeq ($(ARCH),armv7)ifeq ($(OS),Android)CXXFLAGS += -m$(bits)LDFLAGS += -m$(bits)endifelseCXXFLAGS += -m$(bits)LDFLAGS += -m$(bits)endifendififeq ($(comp),icc)profile_make = icc-profile-makeprofile_use = icc-profile-useelseifeq ($(comp),clang)profile_make = clang-profile-makeprofile_use = clang-profile-useelseprofile_make = gcc-profile-makeprofile_use = gcc-profile-useendifendififeq ($(KERNEL),Darwin)CXXFLAGS += -arch $(arch) -mmacosx-version-min=10.9LDFLAGS += -arch $(arch) -mmacosx-version-min=10.9endif### Travis CI script uses COMPILER to overwrite CXXifdef COMPILERCOMPCXX=$(COMPILER)endif### Allow overwriting CXX from command lineifdef COMPCXXCXX=$(COMPCXX)endif### On mingw use Windows threads, otherwise POSIXifneq ($(comp),mingw)# Pierre-Marie Baty -- also add the test case for Windowsifneq ($(OS),Windows_NT)# On Android Bionic's C library comes with its own pthread implementation bundled inifneq ($(OS),Android)# Haiku has pthreads in its libroot, so only link it in on other platformsifneq ($(KERNEL),Haiku)LDFLAGS += -lpthreadendifendifendifendif### 3.2.1 Debuggingifeq ($(debug),no)CXXFLAGS += -DNDEBUGelseCXXFLAGS += -gendif### 3.2.2 Debugging with undefined behavior sanitizersifneq ($(sanitize),no)CXXFLAGS += -g3 -fsanitize=$(sanitize)LDFLAGS += -fsanitize=$(sanitize)# Pierre-Marie Baty -- don't use any other linker than the system one on Windowsifneq ($(OS),Windows_NT)CXXFLAGS += -fuse-ld=goldLDFLAGS += -fuse-ld=goldendifendif### 3.3 Optimizationifeq ($(optimize),yes)CXXFLAGS += -O3ifeq ($(comp),gcc)ifeq ($(KERNEL),Darwin)ifeq ($(arch),i386)CXXFLAGS += -mdynamic-no-picendififeq ($(arch),x86_64)CXXFLAGS += -mdynamic-no-picendifendififeq ($(OS), Android)CXXFLAGS += -fno-gcse -mthumb -march=armv7-a -mfloat-abi=softfpendifendififeq ($(comp),icc)ifeq ($(KERNEL),Darwin)CXXFLAGS += -mdynamic-no-picendifendififeq ($(comp),clang)ifeq ($(KERNEL),Darwin)CXXFLAGS += -fltoLDFLAGS += $(CXXFLAGS)ifeq ($(arch),i386)CXXFLAGS += -mdynamic-no-picendififeq ($(arch),x86_64)CXXFLAGS += -mdynamic-no-picendifendifendifendif### 3.4 Bitsifeq ($(bits),64)CXXFLAGS += -DIS_64BITendif### 3.5 prefetchifeq ($(prefetch),yes)ifeq ($(sse),yes)CXXFLAGS += -msseDEPENDFLAGS += -msseendifelseCXXFLAGS += -DNO_PREFETCHendif### 3.6 popcntifeq ($(popcnt),yes)ifeq ($(comp),icc)CXXFLAGS += -msse3 -DUSE_POPCNTelseCXXFLAGS += -msse3 -mpopcnt -DUSE_POPCNTendifendif### 3.7 pextifeq ($(pext),yes)CXXFLAGS += -DUSE_PEXTifeq ($(comp),$(filter $(comp),gcc clang mingw))CXXFLAGS += -mbmi2endifendif### 3.8 Link Time Optimization, it works since gcc 4.5 but not on mingw under Windows.### This is a mix of compile and link time options because the lto link phase### needs access to the optimization flags.ifeq ($(comp),gcc)ifeq ($(optimize),yes)ifeq ($(debug),no)CXXFLAGS += -fltoLDFLAGS += $(CXXFLAGS)endifendifendififeq ($(comp),mingw)ifeq ($(KERNEL),Linux)ifeq ($(optimize),yes)ifeq ($(debug),no)CXXFLAGS += -fltoLDFLAGS += $(CXXFLAGS)endifendifendifendif### 3.9 Android 5 can only run position independent executables. Note that this### breaks Android 4.0 and earlier.ifeq ($(OS), Android)CXXFLAGS += -fPIELDFLAGS += -fPIE -pieendif### ==========================================================================### 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 "build > Standard build"@echo "profile-build > PGO build"@echo "strip > Strip executable"@echo "install > Install executable"@echo "clean > Clean up"@echo ""@echo "Supported archs:"@echo ""@echo "x86-64 > x86 64-bit"@echo "x86-64-modern > x86 64-bit with popcnt support"@echo "x86-64-bmi2 > x86 64-bit with pext support"@echo "x86-32 > x86 32-bit with SSE support"@echo "x86-32-old > x86 32-bit fall back for old hardware"@echo "ppc-64 > PPC 64-bit"@echo "ppc-32 > PPC 32-bit"@echo "armv7 > ARMv7 32-bit"@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 ""@echo "Simple examples. If you don't know what to do, you likely want to run: "@echo ""@echo "make build ARCH=x86-64 (This is for 64-bit systems)"@echo "make build ARCH=x86-32 (This is for 32-bit systems)"@echo ""@echo "Advanced examples, for experienced users: "@echo ""@echo "make build ARCH=x86-64 COMP=clang"@echo "make profile-build ARCH=x86-64-modern COMP=gcc COMPCXX=g++-4.8"@echo "".PHONY: help build profile-build strip install clean objclean profileclean help \config-sanity icc-profile-use icc-profile-make gcc-profile-use gcc-profile-make \clang-profile-use clang-profile-makebuild: config-sanity$(MAKE) ARCH=$(ARCH) COMP=$(COMP) allprofile-build: 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) profilecleanstrip:strip $(EXE)install:-mkdir -p -m 755 $(BINDIR)-cp $(EXE) $(BINDIR)-strip $(BINDIR)/$(EXE)#clean allclean: objclean profilecleanifneq ($(OS),Windows_NT)@rm -f .depend *~ coreelse@del /f .depend *~ core > nul 2>&1endif# clean binaries and objectsobjclean:ifneq ($(OS),Windows_NT)@rm -f $(EXE) $(EXE).exe *.o ./syzygy/*.oelse@del /f $(EXE) $(EXE).exe *.o .\syzygy\*.o > nul 2>&1endif# clean auxiliary profiling filesprofileclean:ifneq ($(OS),Windows_NT)@rm -rf profdir@rm -f bench.txt *.gcda ./syzygy/*.gcda *.gcno ./syzygy/*.gcno@rm -f stockfish.profdata *.profrawelse@del /f /s /q profdir > nul 2>&1@del /f bench.txt *.gcda .\syzygy\*.gcda *.gcno .\syzygy\*.gcno > nul 2>&1@del /f stockfish.profdata *.profraw > nul 2>&1endifdefault:help### ==========================================================================### Section 5. Private targets### ==========================================================================all: $(EXE) .dependconfig-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 "sse: '$(sse)'"@echo "pext: '$(pext)'"@echo ""@echo "Flags:"@echo "CXX: $(CXX)"@echo "CXXFLAGS: $(CXXFLAGS)"@echo "LDFLAGS: $(LDFLAGS)"@echo ""# Pierre-Marie Baty -- "test" doesn't exist on Windows, so just skip thatifneq ($(OS),Windows_NT)@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)" = "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 "$(bits)" = "32" || test "$(bits)" = "64"@test "$(prefetch)" = "yes" || test "$(prefetch)" = "no"@test "$(popcnt)" = "yes" || test "$(popcnt)" = "no"@test "$(sse)" = "yes" || test "$(sse)" = "no"@test "$(pext)" = "yes" || test "$(pext)" = "no"@test "$(comp)" = "gcc" || test "$(comp)" = "icc" || test "$(comp)" = "mingw" || test "$(comp)" = "clang"endif$(EXE): $(OBJS)$(CXX) -o $@ $(OBJS) $(LDFLAGS)clang-profile-make:$(MAKE) ARCH=$(ARCH) COMP=$(COMP) \EXTRACXXFLAGS='-fprofile-instr-generate ' \EXTRALDFLAGS=' -fprofile-instr-generate' \allclang-profile-use:llvm-profdata merge -output=stockfish.profdata *.profraw$(MAKE) ARCH=$(ARCH) COMP=$(COMP) \EXTRACXXFLAGS='-fprofile-instr-use=stockfish.profdata' \EXTRALDFLAGS='-fprofile-use ' \allgcc-profile-make:$(MAKE) ARCH=$(ARCH) COMP=$(COMP) \EXTRACXXFLAGS='-fprofile-generate' \EXTRALDFLAGS='-lgcov' \allgcc-profile-use:$(MAKE) ARCH=$(ARCH) COMP=$(COMP) \EXTRACXXFLAGS='-fprofile-use -fno-peel-loops -fno-tracer' \EXTRALDFLAGS='-lgcov' \allicc-profile-make:@mkdir -p profdir$(MAKE) ARCH=$(ARCH) COMP=$(COMP) \EXTRACXXFLAGS='-prof-gen=srcpos -prof_dir ./profdir' \allicc-profile-use:$(MAKE) ARCH=$(ARCH) COMP=$(COMP) \EXTRACXXFLAGS='-prof_use -prof_dir ./profdir' \all.depend:-@$(CXX) $(DEPENDFLAGS) -MM $(OBJS:.o=.cpp) > $@ 2> /dev/null-include .depend