mirror of
https://github.com/sockspls/badfish
synced 2025-05-01 09:13:08 +00:00

STANDALONE-TOOLCHAIN.html in Android NDK says: It is recommended to use the -mthumb compiler flag to force the generation of 16-bit Thumb-1 instructions (the default being 32-bit ARM ones). If you want to target the 'armeabi-v7a' ABI, you will need ensure that the following two flags are being used: CFLAGS='-march=armv7-a -mfloat-abi=softfp' Note: The first flag enables Thumb-2 instructions, and the second one enables H/W FPU instructions while ensuring that floating-point parameters are passed in core registers, which is critical for ABI compatibility. Do *not* use these flags separately! Thanks to Peter Osterlund for pointout this doc and for showing me an example Makefile to follow. No functional change.
565 lines
14 KiB
Makefile
565 lines
14 KiB
Makefile
# Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
|
# Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
|
# Copyright (C) 2008-2013 Marco Costalba, Joona Kiiski, 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
|
|
UNAME = $(shell uname)
|
|
|
|
### Executable name
|
|
EXE = stockfish
|
|
|
|
### Installation dir definitions
|
|
PREFIX = /usr/local
|
|
# Haiku has a non-standard filesystem layout
|
|
ifeq ($(UNAME),Haiku)
|
|
PREFIX=/boot/common
|
|
endif
|
|
BINDIR = $(PREFIX)/bin
|
|
|
|
### Built-in benchmark for pgo-builds and signature
|
|
PGOBENCH = ./$(EXE) bench 32 1 10 default depth
|
|
SIGNBENCH = ./$(EXE) bench
|
|
|
|
### Object files
|
|
OBJS = benchmark.o bitbase.o bitboard.o book.o endgame.o evaluate.o main.o \
|
|
material.o misc.o movegen.o movepick.o notation.o pawns.o position.o \
|
|
search.o thread.o timeman.o tt.o uci.o ucioption.o
|
|
|
|
### ==========================================================================
|
|
### Section 2. High-level Configuration
|
|
### ==========================================================================
|
|
#
|
|
# flag --- Comp switch --- Description
|
|
# ----------------------------------------------------------------------------
|
|
#
|
|
# debug = yes/no --- -DNDEBUG --- Enable/Disable debug mode
|
|
# optimize = yes/no --- (-O3/-fast etc.) --- Enable/Disable optimizations
|
|
# arch = (name) --- (-arch) --- Target architecture
|
|
# os = (name) --- --- Target operating system
|
|
# bits = 64/32 --- -DIS_64BIT --- 64-/32-bit operating system
|
|
# prefetch = yes/no --- -DUSE_PREFETCH --- Use prefetch x86 asm-instruction
|
|
# bsfq = yes/no --- -DUSE_BSFQ --- Use bsfq x86_64 asm-instruction (only
|
|
# with GCC and ICC 64-bit)
|
|
# popcnt = yes/no --- -DUSE_POPCNT --- Use popcnt x86_64 asm-instruction
|
|
# sse = yes/no --- -msse --- Use Intel Streaming SIMD Extensions
|
|
#
|
|
# 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
|
|
debug = no
|
|
optimize = yes
|
|
|
|
### 2.2 Architecture specific
|
|
|
|
# General-section
|
|
ifeq ($(ARCH),general-64)
|
|
arch = any
|
|
os = any
|
|
bits = 64
|
|
prefetch = no
|
|
bsfq = no
|
|
popcnt = no
|
|
sse = no
|
|
endif
|
|
|
|
ifeq ($(ARCH),general-32)
|
|
arch = any
|
|
os = any
|
|
bits = 32
|
|
prefetch = no
|
|
bsfq = no
|
|
popcnt = no
|
|
sse = no
|
|
endif
|
|
|
|
# x86-section
|
|
ifeq ($(ARCH),x86-64)
|
|
arch = x86_64
|
|
os = any
|
|
bits = 64
|
|
prefetch = yes
|
|
bsfq = yes
|
|
popcnt = no
|
|
sse = yes
|
|
endif
|
|
|
|
ifeq ($(ARCH),x86-64-modern)
|
|
arch = x86_64
|
|
os = any
|
|
bits = 64
|
|
prefetch = yes
|
|
bsfq = yes
|
|
popcnt = yes
|
|
sse = yes
|
|
endif
|
|
|
|
ifeq ($(ARCH),x86-32)
|
|
arch = i386
|
|
os = any
|
|
bits = 32
|
|
prefetch = yes
|
|
bsfq = no
|
|
popcnt = no
|
|
sse = yes
|
|
endif
|
|
|
|
ifeq ($(ARCH),x86-32-old)
|
|
arch = i386
|
|
os = any
|
|
bits = 32
|
|
prefetch = no
|
|
bsfq = no
|
|
popcnt = no
|
|
sse = no
|
|
endif
|
|
|
|
#arm section
|
|
ifeq ($(ARCH),armv7)
|
|
arch = armv7
|
|
os = any
|
|
bits = 32
|
|
prefetch = yes
|
|
bsfq = yes
|
|
popcnt = no
|
|
sse = no
|
|
endif
|
|
|
|
# osx-section
|
|
ifeq ($(ARCH),osx-ppc-64)
|
|
arch = ppc64
|
|
os = osx
|
|
bits = 64
|
|
prefetch = no
|
|
bsfq = no
|
|
popcnt = no
|
|
sse = no
|
|
endif
|
|
|
|
ifeq ($(ARCH),osx-ppc-32)
|
|
arch = ppc
|
|
os = osx
|
|
bits = 32
|
|
prefetch = no
|
|
bsfq = no
|
|
popcnt = no
|
|
sse = no
|
|
endif
|
|
|
|
ifeq ($(ARCH),osx-x86-64)
|
|
arch = x86_64
|
|
os = osx
|
|
bits = 64
|
|
prefetch = yes
|
|
bsfq = yes
|
|
popcnt = no
|
|
sse = yes
|
|
endif
|
|
|
|
ifeq ($(ARCH),osx-x86-32)
|
|
arch = i386
|
|
os = osx
|
|
bits = 32
|
|
prefetch = yes
|
|
bsfq = no
|
|
popcnt = no
|
|
sse = yes
|
|
endif
|
|
|
|
|
|
### ==========================================================================
|
|
### Section 3. Low-level configuration
|
|
### ==========================================================================
|
|
|
|
### 3.1 Selecting compiler (default = gcc)
|
|
ifeq ($(COMP),)
|
|
COMP=gcc
|
|
endif
|
|
|
|
ifeq ($(COMP),mingw)
|
|
comp=mingw
|
|
CXX=g++
|
|
profile_prepare = gcc-profile-prepare
|
|
profile_make = gcc-profile-make
|
|
profile_use = gcc-profile-use
|
|
profile_clean = gcc-profile-clean
|
|
endif
|
|
|
|
ifeq ($(COMP),gcc)
|
|
comp=gcc
|
|
CXX=g++
|
|
profile_prepare = gcc-profile-prepare
|
|
profile_make = gcc-profile-make
|
|
profile_use = gcc-profile-use
|
|
profile_clean = gcc-profile-clean
|
|
endif
|
|
|
|
ifeq ($(COMP),icc)
|
|
comp=icc
|
|
CXX=icpc
|
|
profile_prepare = icc-profile-prepare
|
|
profile_make = icc-profile-make
|
|
profile_use = icc-profile-use
|
|
profile_clean = icc-profile-clean
|
|
endif
|
|
|
|
ifeq ($(COMP),clang)
|
|
comp=clang
|
|
CXX=clang++
|
|
profile_prepare = gcc-profile-prepare
|
|
profile_make = gcc-profile-make
|
|
profile_use = gcc-profile-use
|
|
profile_clean = gcc-profile-clean
|
|
endif
|
|
|
|
### 3.2 General compiler settings
|
|
CXXFLAGS = -Wall -Wcast-qual -fno-exceptions -fno-rtti $(EXTRACXXFLAGS)
|
|
|
|
ifeq ($(comp),gcc)
|
|
CXXFLAGS += -ansi -pedantic -Wno-long-long -Wextra -Wshadow
|
|
endif
|
|
|
|
ifeq ($(comp),mingw)
|
|
CXXFLAGS += -Wextra -Wshadow
|
|
endif
|
|
|
|
ifeq ($(comp),icc)
|
|
CXXFLAGS += -wd383,981,1418,1419,1476,10187,10188,11505,11503 -Wcheck -Wabi -Wdeprecated -strict-ansi
|
|
endif
|
|
|
|
ifeq ($(comp),clang)
|
|
CXXFLAGS += -ansi -pedantic -Wno-long-long -Wextra -Wshadow
|
|
endif
|
|
|
|
ifeq ($(os),osx)
|
|
CXXFLAGS += -arch $(arch) -mmacosx-version-min=10.0
|
|
endif
|
|
|
|
### 3.3 General linker settings
|
|
LDFLAGS = $(EXTRALDFLAGS)
|
|
|
|
ifeq ($(comp),mingw)
|
|
LDFLAGS += -static-libstdc++ -static-libgcc
|
|
endif
|
|
|
|
### On mingw use Windows threads, otherwise POSIX
|
|
ifneq ($(comp),mingw)
|
|
# Haiku has pthreads in its libroot, so only link it in on other platforms
|
|
ifneq ($(UNAME),Haiku)
|
|
LDFLAGS += -lpthread
|
|
endif
|
|
endif
|
|
|
|
ifeq ($(os),osx)
|
|
LDFLAGS += -arch $(arch) -mmacosx-version-min=10.0
|
|
endif
|
|
|
|
### 3.4 Debugging
|
|
ifeq ($(debug),no)
|
|
CXXFLAGS += -DNDEBUG
|
|
else
|
|
CXXFLAGS += -g
|
|
endif
|
|
|
|
### 3.5 Optimization
|
|
ifeq ($(optimize),yes)
|
|
|
|
ifeq ($(comp),gcc)
|
|
CXXFLAGS += -O3
|
|
|
|
ifeq ($(os),osx)
|
|
ifeq ($(arch),i386)
|
|
CXXFLAGS += -mdynamic-no-pic
|
|
endif
|
|
ifeq ($(arch),x86_64)
|
|
CXXFLAGS += -mdynamic-no-pic
|
|
endif
|
|
endif
|
|
|
|
ifeq ($(arch),armv7)
|
|
CXXFLAGS += -fno-gcse -mthumb -march=armv7-a -mfloat-abi=softfp
|
|
endif
|
|
endif
|
|
|
|
ifeq ($(comp),mingw)
|
|
CXXFLAGS += -O3
|
|
endif
|
|
|
|
ifeq ($(comp),icc)
|
|
ifeq ($(os),osx)
|
|
CXXFLAGS += -fast -mdynamic-no-pic
|
|
else
|
|
CXXFLAGS += -O3
|
|
endif
|
|
endif
|
|
|
|
ifeq ($(comp),clang)
|
|
### -O4 requires a linker that supports LLVM's LTO
|
|
CXXFLAGS += -O3
|
|
|
|
ifeq ($(os),osx)
|
|
ifeq ($(arch),i386)
|
|
CXXFLAGS += -mdynamic-no-pic
|
|
endif
|
|
ifeq ($(arch),x86_64)
|
|
CXXFLAGS += -mdynamic-no-pic
|
|
endif
|
|
endif
|
|
endif
|
|
endif
|
|
|
|
### 3.6. Bits
|
|
ifeq ($(bits),64)
|
|
CXXFLAGS += -DIS_64BIT
|
|
endif
|
|
|
|
### 3.7 prefetch
|
|
ifeq ($(prefetch),yes)
|
|
ifeq ($(sse),yes)
|
|
CXXFLAGS += -msse
|
|
DEPENDFLAGS += -msse
|
|
endif
|
|
else
|
|
CXXFLAGS += -DNO_PREFETCH
|
|
endif
|
|
|
|
### 3.8 bsfq
|
|
ifeq ($(bsfq),yes)
|
|
CXXFLAGS += -DUSE_BSFQ
|
|
endif
|
|
|
|
### 3.9 popcnt
|
|
ifeq ($(popcnt),yes)
|
|
CXXFLAGS += -msse3 -DUSE_POPCNT
|
|
endif
|
|
|
|
### 3.10 Link Time Optimization, it works since gcc 4.5 but not on mingw.
|
|
### 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)
|
|
GCC_MAJOR := `$(CXX) -dumpversion | cut -f1 -d.`
|
|
GCC_MINOR := `$(CXX) -dumpversion | cut -f2 -d.`
|
|
ifeq (1,$(shell expr \( $(GCC_MAJOR) \> 4 \) \| \( $(GCC_MAJOR) \= 4 \& $(GCC_MINOR) \>= 5 \)))
|
|
CXXFLAGS += -flto
|
|
LDFLAGS += $(CXXFLAGS)
|
|
endif
|
|
endif
|
|
endif
|
|
endif
|
|
|
|
### ==========================================================================
|
|
### Section 4. Public targets
|
|
### ==========================================================================
|
|
|
|
help:
|
|
@echo ""
|
|
@echo "To compile stockfish, type: "
|
|
@echo ""
|
|
@echo "make target ARCH=arch [COMP=comp]"
|
|
@echo ""
|
|
@echo "Supported targets:"
|
|
@echo ""
|
|
@echo "build > Standard build"
|
|
@echo "signature-build > Standard build with embedded signature"
|
|
@echo "profile-build > PGO build"
|
|
@echo "signature-profile-build > PGO build with embedded signature"
|
|
@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-32 > x86 32-bit with SSE support"
|
|
@echo "x86-32-old > x86 32-bit fall back for old hardware"
|
|
@echo "osx-ppc-64 > PPC-Mac OS X 64 bit"
|
|
@echo "osx-ppc-32 > PPC-Mac OS X 32 bit"
|
|
@echo "osx-x86-64 > x86-Mac OS X 64 bit"
|
|
@echo "osx-x86-32 > x86-Mac OS X 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 "Non-standard targets:"
|
|
@echo ""
|
|
@echo "make hpux > Compile for HP-UX. Compiler = aCC"
|
|
@echo ""
|
|
@echo "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 ""
|
|
|
|
.PHONY: build profile-build embed-signature
|
|
build:
|
|
$(MAKE) ARCH=$(ARCH) COMP=$(COMP) config-sanity
|
|
$(MAKE) ARCH=$(ARCH) COMP=$(COMP) all
|
|
|
|
profile-build:
|
|
$(MAKE) ARCH=$(ARCH) COMP=$(COMP) config-sanity
|
|
@echo ""
|
|
@echo "Step 0/4. Preparing for profile build."
|
|
$(MAKE) ARCH=$(ARCH) COMP=$(COMP) $(profile_prepare)
|
|
@echo ""
|
|
@echo "Step 1/4. Building executable for benchmark ..."
|
|
@touch *.cpp *.h
|
|
$(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 final executable ..."
|
|
@touch *.cpp
|
|
$(MAKE) ARCH=$(ARCH) COMP=$(COMP) $(profile_use)
|
|
@echo ""
|
|
@echo "Step 4/4. Deleting profile data ..."
|
|
$(MAKE) ARCH=$(ARCH) COMP=$(COMP) $(profile_clean)
|
|
|
|
embed-signature:
|
|
@echo "Running benchmark for getting the signature ..."
|
|
@$(SIGNBENCH) 2>&1 | sed -n 's/Nodes searched : \(.*\)/\/string Version\/s\/"\\(.*\\)"\/"sig-\1"\//p' > sign.txt
|
|
@sed -f sign.txt misc.cpp > misc2.cpp
|
|
@mv misc2.cpp misc.cpp
|
|
@rm sign.txt
|
|
|
|
signature-build: build embed-signature
|
|
$(MAKE) ARCH=$(ARCH) COMP=$(COMP) all
|
|
|
|
signature-profile-build: build embed-signature profile-build
|
|
|
|
strip:
|
|
strip $(EXE)
|
|
|
|
install:
|
|
-mkdir -p -m 755 $(BINDIR)
|
|
-cp $(EXE) $(BINDIR)
|
|
-strip $(BINDIR)/$(EXE)
|
|
|
|
clean:
|
|
$(RM) $(EXE) $(EXE).exe *.o .depend *~ core bench.txt *.gcda
|
|
|
|
default:
|
|
help
|
|
|
|
### ==========================================================================
|
|
### Section 5. Private targets
|
|
### ==========================================================================
|
|
|
|
all: $(EXE) .depend
|
|
|
|
config-sanity:
|
|
@echo ""
|
|
@echo "Config:"
|
|
@echo "debug: '$(debug)'"
|
|
@echo "optimize: '$(optimize)'"
|
|
@echo "arch: '$(arch)'"
|
|
@echo "os: '$(os)'"
|
|
@echo "bits: '$(bits)'"
|
|
@echo "prefetch: '$(prefetch)'"
|
|
@echo "bsfq: '$(bsfq)'"
|
|
@echo "popcnt: '$(popcnt)'"
|
|
@echo "sse: '$(sse)'"
|
|
@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 "$(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 "$(os)" = "any" || test "$(os)" = "osx"
|
|
@test "$(bits)" = "32" || test "$(bits)" = "64"
|
|
@test "$(prefetch)" = "yes" || test "$(prefetch)" = "no"
|
|
@test "$(bsfq)" = "yes" || test "$(bsfq)" = "no"
|
|
@test "$(popcnt)" = "yes" || test "$(popcnt)" = "no"
|
|
@test "$(sse)" = "yes" || test "$(sse)" = "no"
|
|
@test "$(comp)" = "gcc" || test "$(comp)" = "icc" || test "$(comp)" = "mingw" || test "$(comp)" = "clang"
|
|
|
|
$(EXE): $(OBJS)
|
|
$(CXX) -o $@ $(OBJS) $(LDFLAGS)
|
|
|
|
gcc-profile-prepare:
|
|
$(MAKE) ARCH=$(ARCH) COMP=$(COMP) gcc-profile-clean
|
|
|
|
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' \
|
|
EXTRALDFLAGS='-lgcov' \
|
|
all
|
|
|
|
gcc-profile-clean:
|
|
@rm -rf *.gcda *.gcno bench.txt
|
|
|
|
icc-profile-prepare:
|
|
$(MAKE) ARCH=$(ARCH) COMP=$(COMP) icc-profile-clean
|
|
@mkdir profdir
|
|
|
|
icc-profile-make:
|
|
$(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
|
|
|
|
icc-profile-clean:
|
|
@rm -rf profdir bench.txt
|
|
|
|
.depend:
|
|
-@$(CXX) $(DEPENDFLAGS) -MM $(OBJS:.o=.cpp) > $@ 2> /dev/null
|
|
|
|
-include .depend
|
|
|
|
|
|
### ==========================================================================
|
|
### Section 6. Non-standard targets
|
|
### ==========================================================================
|
|
|
|
hpux:
|
|
$(MAKE) \
|
|
CXX='/opt/aCC/bin/aCC -AA +hpxstd98 -mt +O3 -DNDEBUG -DNO_PREFETCH' \
|
|
CXXFLAGS="" \
|
|
LDFLAGS="" \
|
|
all
|
|
|