]> git.sesse.net Git - stockfish/blobdiff - src/Makefile
Merge remote-tracking branch 'upstream/master'
[stockfish] / src / Makefile
index 5b43c35fdd7e838ad4c54850520f73a338fcbf7f..c7531f014061ad12a0997745281d91f2a3ded68c 100644 (file)
@@ -1,5 +1,5 @@
 # Stockfish, a UCI chess playing engine derived from Glaurung 2.1
 # Stockfish, a UCI chess playing engine derived from Glaurung 2.1
-# Copyright (C) 2004-2023 The Stockfish developers (see AUTHORS file)
+# Copyright (C) 2004-2024 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
 #
 # Stockfish is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -20,9 +20,9 @@
 ### ==========================================================================
 
 ### Establish the operating system name
 ### ==========================================================================
 
 ### Establish the operating system name
-KERNEL = $(shell uname -s)
+KERNEL := $(shell uname -s)
 ifeq ($(KERNEL),Linux)
 ifeq ($(KERNEL),Linux)
-       OS = $(shell uname -o)
+       OS := $(shell uname -o)
 endif
 
 ### Target Windows OS
 endif
 
 ### Target Windows OS
@@ -33,7 +33,7 @@ ifeq ($(OS),Windows_NT)
 else ifeq ($(COMP),mingw)
        target_windows = yes
        ifeq ($(WINE_PATH),)
 else ifeq ($(COMP),mingw)
        target_windows = yes
        ifeq ($(WINE_PATH),)
-               WINE_PATH = $(shell which wine)
+               WINE_PATH := $(shell which wine)
        endif
 endif
 
        endif
 endif
 
@@ -55,9 +55,21 @@ PGOBENCH = $(WINE_PATH) ./$(EXE) bench
 SRCS = benchmark.cpp bitboard.cpp evaluate.cpp main.cpp \
        misc.cpp movegen.cpp movepick.cpp position.cpp \
        search.cpp thread.cpp timeman.cpp tt.cpp uci.cpp ucioption.cpp tune.cpp syzygy/tbprobe.cpp \
 SRCS = benchmark.cpp bitboard.cpp evaluate.cpp main.cpp \
        misc.cpp movegen.cpp movepick.cpp position.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_ka_v2_hm.cpp
+       nnue/nnue_misc.cpp nnue/features/half_ka_v2_hm.cpp nnue/network.cpp engine.cpp score.cpp memory.cpp
+
+SRCS += hashprobe.grpc.pb.cc hashprobe.pb.cc hash_probe_impl.cpp
+CLISRCS = client.cpp hashprobe.grpc.pb.cc hashprobe.pb.cc uci.cpp
+
+HEADERS = benchmark.h bitboard.h evaluate.h misc.h movegen.h movepick.h \
+               nnue/nnue_misc.h nnue/features/half_ka_v2_hm.h nnue/layers/affine_transform.h \
+               nnue/layers/affine_transform_sparse_input.h nnue/layers/clipped_relu.h nnue/layers/simd.h \
+               nnue/layers/sqr_clipped_relu.h nnue/nnue_accumulator.h nnue/nnue_architecture.h \
+               nnue/nnue_common.h nnue/nnue_feature_transformer.h position.h \
+               search.h syzygy/tbprobe.h thread.h thread_win32_osx.h timeman.h \
+               tt.h tune.h types.h uci.h ucioption.h perft.h nnue/network.h engine.h score.h numa.h memory.h
 
 OBJS = $(notdir $(SRCS:.cpp=.o))
 
 OBJS = $(notdir $(SRCS:.cpp=.o))
+CLIOBJS = $(notdir $(CLISRCS:.cpp=.o))
 
 VPATH = syzygy:nnue:nnue/features
 
 
 VPATH = syzygy:nnue:nnue/features
 
@@ -108,7 +120,7 @@ ifeq ($(ARCH),)
 endif
 
 ifeq ($(ARCH), native)
 endif
 
 ifeq ($(ARCH), native)
-   override ARCH = $(shell $(SHELL) ../scripts/get_native_properties.sh | cut -d " " -f 1)
+   override ARCH := $(shell $(SHELL) ../scripts/get_native_properties.sh | cut -d " " -f 1)
 endif
 
 # explicitly check for the list of supported architectures (as listed with make help),
 endif
 
 # explicitly check for the list of supported architectures (as listed with make help),
@@ -117,7 +129,7 @@ ifeq ($(ARCH), $(filter $(ARCH), \
                  x86-64-vnni512 x86-64-vnni256 x86-64-avx512 x86-64-avxvnni x86-64-bmi2 \
                  x86-64-avx2 x86-64-sse41-popcnt x86-64-modern x86-64-ssse3 x86-64-sse3-popcnt \
                  x86-64 x86-32-sse41-popcnt x86-32-sse2 x86-32 ppc-64 ppc-32 e2k \
                  x86-64-vnni512 x86-64-vnni256 x86-64-avx512 x86-64-avxvnni x86-64-bmi2 \
                  x86-64-avx2 x86-64-sse41-popcnt x86-64-modern x86-64-ssse3 x86-64-sse3-popcnt \
                  x86-64 x86-32-sse41-popcnt x86-32-sse2 x86-32 ppc-64 ppc-32 e2k \
-                 armv7 armv7-neon armv8 armv8-dotprod apple-silicon general-64 general-32 riscv64))
+                 armv7 armv7-neon armv8 armv8-dotprod apple-silicon general-64 general-32 riscv64 loongarch64))
    SUPPORTED_ARCH=true
 else
    SUPPORTED_ARCH=false
    SUPPORTED_ARCH=true
 else
    SUPPORTED_ARCH=false
@@ -145,6 +157,12 @@ dotprod = no
 arm_version = 0
 STRIP = strip
 
 arm_version = 0
 STRIP = strip
 
+ifneq ($(shell which clang-format-18 2> /dev/null),)
+       CLANG-FORMAT = clang-format-18
+else
+       CLANG-FORMAT = clang-format
+endif
+
 ### 2.2 Architecture specific
 
 ifeq ($(findstring x86,$(ARCH)),x86)
 ### 2.2 Architecture specific
 
 ifeq ($(findstring x86,$(ARCH)),x86)
@@ -355,6 +373,10 @@ endif
 ifeq ($(ARCH),riscv64)
        arch = riscv64
 endif
 ifeq ($(ARCH),riscv64)
        arch = riscv64
 endif
+
+ifeq ($(ARCH),loongarch64)
+       arch = loongarch64
+endif
 endif
 
 
 endif
 
 
@@ -380,7 +402,7 @@ endif
 ifeq ($(COMP),gcc)
        comp=gcc
        CXX=g++
 ifeq ($(COMP),gcc)
        comp=gcc
        CXX=g++
-       CXXFLAGS += -pedantic -Wextra -Wshadow -Wmissing-declarations
+       CXXFLAGS += -pedantic -Wextra -Wmissing-declarations
 
        ifeq ($(arch),$(filter $(arch),armv7 armv8 riscv64))
                ifeq ($(OS),Android)
 
        ifeq ($(arch),$(filter $(arch),armv7 armv8 riscv64))
                ifeq ($(OS),Android)
@@ -390,6 +412,8 @@ ifeq ($(COMP),gcc)
                ifeq ($(ARCH),riscv64)
                        CXXFLAGS += -latomic
                endif
                ifeq ($(ARCH),riscv64)
                        CXXFLAGS += -latomic
                endif
+       else ifeq ($(ARCH),loongarch64)
+               CXXFLAGS += -latomic
        else
                CXXFLAGS += -m$(bits)
                LDFLAGS += -m$(bits)
        else
                CXXFLAGS += -m$(bits)
                LDFLAGS += -m$(bits)
@@ -460,6 +484,8 @@ ifeq ($(COMP),clang)
                ifeq ($(ARCH),riscv64)
                        CXXFLAGS += -latomic
                endif
                ifeq ($(ARCH),riscv64)
                        CXXFLAGS += -latomic
                endif
+       else ifeq ($(ARCH),loongarch64)
+               CXXFLAGS += -latomic
        else
                CXXFLAGS += -m$(bits)
                LDFLAGS += -m$(bits)
        else
                CXXFLAGS += -m$(bits)
                LDFLAGS += -m$(bits)
@@ -467,8 +493,8 @@ ifeq ($(COMP),clang)
 endif
 
 ifeq ($(KERNEL),Darwin)
 endif
 
 ifeq ($(KERNEL),Darwin)
-       CXXFLAGS += -mmacosx-version-min=10.14
-       LDFLAGS += -mmacosx-version-min=10.14
+       CXXFLAGS += -mmacosx-version-min=10.15
+       LDFLAGS += -mmacosx-version-min=10.15
        ifneq ($(arch),any)
                CXXFLAGS += -arch $(arch)
                LDFLAGS += -arch $(arch)
        ifneq ($(arch),any)
                CXXFLAGS += -arch $(arch)
                LDFLAGS += -arch $(arch)
@@ -499,6 +525,14 @@ ifeq ($(COMP),ndk)
                        STRIP=llvm-strip
                endif
        endif
                        STRIP=llvm-strip
                endif
        endif
+       ifeq ($(arch),x86_64)
+               CXX=x86_64-linux-android21-clang++
+               ifneq ($(shell which x86_64-linux-android-strip 2>/dev/null),)
+                       STRIP=x86_64-linux-android-strip
+               else
+                       STRIP=llvm-strip
+               endif
+       endif
        LDFLAGS += -static-libstdc++ -pie -lm -latomic
 endif
 
        LDFLAGS += -static-libstdc++ -pie -lm -latomic
 endif
 
@@ -516,11 +550,6 @@ else
        endif
 endif
 
        endif
 endif
 
-### Travis CI script uses COMPILER to overwrite CXX
-ifdef COMPILER
-       COMPCXX=$(COMPILER)
-endif
-
 ### Allow overwriting CXX from command line
 ifdef COMPCXX
        CXX=$(COMPCXX)
 ### Allow overwriting CXX from command line
 ifdef COMPCXX
        CXX=$(COMPCXX)
@@ -528,8 +557,8 @@ endif
 
 ### Sometimes gcc is really clang
 ifeq ($(COMP),gcc)
 
 ### Sometimes gcc is really clang
 ifeq ($(COMP),gcc)
-       gccversion = $(shell $(CXX) --version 2>/dev/null)
-       gccisclang = $(findstring clang,$(gccversion))
+       gccversion := $(shell $(CXX) --version 2>/dev/null)
+       gccisclang := $(findstring clang,$(gccversion))
        ifneq ($(gccisclang),)
                profile_make = clang-profile-make
                profile_use = clang-profile-use
        ifneq ($(gccisclang),)
                profile_make = clang-profile-make
                profile_use = clang-profile-use
@@ -566,7 +595,7 @@ endif
 ### 3.3 Optimization
 ifeq ($(optimize),yes)
 
 ### 3.3 Optimization
 ifeq ($(optimize),yes)
 
-       CXXFLAGS += -O3 -funroll-loops
+       CXXFLAGS += -O3 -g -funroll-loops
 
        ifeq ($(comp),gcc)
                ifeq ($(OS), Android)
 
        ifeq ($(comp),gcc)
                ifeq ($(OS), Android)
@@ -587,7 +616,7 @@ ifeq ($(optimize),yes)
        endif
 
        ifeq ($(comp),clang)
        endif
 
        ifeq ($(comp),clang)
-               clangmajorversion = $(shell $(CXX) -dumpversion 2>/dev/null | cut -f1 -d.)
+               clangmajorversion := $(shell $(CXX) -dumpversion 2>/dev/null | cut -f1 -d.)
                ifeq ($(shell expr $(clangmajorversion) \< 16),1)
                        CXXFLAGS += -fexperimental-new-pass-manager
                endif
                ifeq ($(shell expr $(clangmajorversion) \< 16),1)
                        CXXFLAGS += -fexperimental-new-pass-manager
                endif
@@ -703,13 +732,13 @@ ifeq ($(pext),yes)
 endif
 
 ### 3.8.1 Try to include git commit sha for versioning
 endif
 
 ### 3.8.1 Try to include git commit sha for versioning
-GIT_SHA = $(shell git rev-parse HEAD 2>/dev/null | cut -c 1-8)
+GIT_SHA := $(shell git rev-parse HEAD 2>/dev/null | cut -c 1-8)
 ifneq ($(GIT_SHA), )
        CXXFLAGS += -DGIT_SHA=$(GIT_SHA)
 endif
 
 ### 3.8.2 Try to include git commit date for versioning
 ifneq ($(GIT_SHA), )
        CXXFLAGS += -DGIT_SHA=$(GIT_SHA)
 endif
 
 ### 3.8.2 Try to include git commit date for versioning
-GIT_DATE = $(shell git show -s --date=format:'%Y%m%d' --format=%cd HEAD 2>/dev/null)
+GIT_DATE := $(shell git show -s --date=format:'%Y%m%d' --format=%cd `git merge-base HEAD upstream/master` 2>/dev/null)
 ifneq ($(GIT_DATE), )
        CXXFLAGS += -DGIT_DATE=$(GIT_DATE)
 endif
 ifneq ($(GIT_DATE), )
        CXXFLAGS += -DGIT_DATE=$(GIT_DATE)
 endif
@@ -776,7 +805,7 @@ help:
        @echo "help                    > Display architecture details"
        @echo "profile-build           > standard build with profile-guided optimization"
        @echo "build                   > skip profile-guided optimization"
        @echo "help                    > Display architecture details"
        @echo "profile-build           > standard build with profile-guided optimization"
        @echo "build                   > skip profile-guided optimization"
-       @echo "net                     > Download the default nnue net"
+       @echo "net                     > Download the default nnue nets"
        @echo "strip                   > Strip executable"
        @echo "install                 > Install executable"
        @echo "clean                   > Clean up"
        @echo "strip                   > Strip executable"
        @echo "install                 > Install executable"
        @echo "clean                   > Clean up"
@@ -809,6 +838,7 @@ help:
        @echo "general-64              > unspecified 64-bit"
        @echo "general-32              > unspecified 32-bit"
        @echo "riscv64                 > RISC-V 64-bit"
        @echo "general-64              > unspecified 64-bit"
        @echo "general-32              > unspecified 32-bit"
        @echo "riscv64                 > RISC-V 64-bit"
+       @echo "loongarch64             > LoongArch 64-bit"
        @echo ""
        @echo "Supported compilers:"
        @echo ""
        @echo ""
        @echo "Supported compilers:"
        @echo ""
@@ -840,7 +870,8 @@ endif
        objclean profileclean config-sanity \
        icx-profile-use icx-profile-make \
        gcc-profile-use gcc-profile-make \
        objclean profileclean config-sanity \
        icx-profile-use icx-profile-make \
        gcc-profile-use gcc-profile-make \
-       clang-profile-use clang-profile-make FORCE
+       clang-profile-use clang-profile-make FORCE \
+       format analyze
 
 analyze: net config-sanity objclean
        $(MAKE) -k ARCH=$(ARCH) COMP=$(COMP) $(OBJS)
 
 analyze: net config-sanity objclean
        $(MAKE) -k ARCH=$(ARCH) COMP=$(COMP) $(OBJS)
@@ -890,51 +921,12 @@ profileclean:
        @rm -f stockfish.res
        @rm -f ./-lstdc++.res
 
        @rm -f stockfish.res
        @rm -f ./-lstdc++.res
 
-# set up shell variables for the net stuff
-netvariables:
-       $(eval nnuenet := $(shell grep EvalFileDefaultName evaluate.h | grep define | sed 's/.*\(nn-[a-z0-9]\{12\}.nnue\).*/\1/'))
-       $(eval nnuedownloadurl1 := https://tests.stockfishchess.org/api/nn/$(nnuenet))
-       $(eval nnuedownloadurl2 := https://github.com/official-stockfish/networks/raw/master/$(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))
-       $(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))
-
 # evaluation network (nnue)
 # evaluation network (nnue)
-net: netvariables
-       @echo "Default net: $(nnuenet)"
-       @if [ "x$(curl_or_wget)" = "x" ]; then \
-               echo "Neither curl nor wget is installed. Install one of these tools unless the net has been downloaded manually"; \
-       fi
-       @if [ "x$(shasum_command)" = "x" ]; then \
-               echo "shasum / sha256sum not found, skipping net validation"; \
-       elif test -f "$(nnuenet)"; then \
-               if [ "$(nnuenet)" != "nn-"`$(shasum_command) $(nnuenet) | cut -c1-12`".nnue" ]; then \
-                       echo "Removing invalid network"; rm -f $(nnuenet); \
-               fi; \
-       fi;
-       @for nnuedownloadurl in "$(nnuedownloadurl1)" "$(nnuedownloadurl2)"; do \
-               if test -f "$(nnuenet)"; then \
-                       echo "$(nnuenet) available : OK"; break; \
-               else \
-                       if [ "x$(curl_or_wget)" != "x" ]; then \
-                               echo "Downloading $${nnuedownloadurl}"; $(curl_or_wget) $${nnuedownloadurl} > $(nnuenet);\
-                       else \
-                               echo "No net found and download not possible"; exit 1;\
-                       fi; \
-               fi; \
-               if [ "x$(shasum_command)" != "x" ]; then \
-                       if [ "$(nnuenet)" != "nn-"`$(shasum_command) $(nnuenet) | cut -c1-12`".nnue" ]; then \
-                               echo "Removing failed download"; rm -f $(nnuenet); \
-                       fi; \
-               fi; \
-       done
-       @if ! test -f "$(nnuenet)"; then \
-               echo "Failed to download $(nnuenet)."; \
-       fi;
-       @if [ "x$(shasum_command)" != "x" ]; then \
-               if [ "$(nnuenet)" = "nn-"`$(shasum_command) $(nnuenet) | cut -c1-12`".nnue" ]; then \
-                       echo "Network validated"; break; \
-               fi; \
-       fi; \
+net:
+       @$(SHELL) ../scripts/net.sh
+
+format:
+       $(CLANG-FORMAT) -i $(SRCS) $(HEADERS) -style=file
 
 # default target
 default:
 
 # default target
 default:
@@ -944,6 +936,7 @@ default:
 ### Section 5. Private Targets
 ### ==========================================================================
 
 ### Section 5. Private Targets
 ### ==========================================================================
 
+# all: $(EXE) client .depend
 all: $(EXE) .depend
 
 config-sanity: net
 all: $(EXE) .depend
 
 config-sanity: net
@@ -986,7 +979,7 @@ config-sanity: net
        @test "$(SUPPORTED_ARCH)" = "true"
        @test "$(arch)" = "any" || test "$(arch)" = "x86_64" || test "$(arch)" = "i386" || \
         test "$(arch)" = "ppc64" || test "$(arch)" = "ppc" || test "$(arch)" = "e2k" || \
        @test "$(SUPPORTED_ARCH)" = "true"
        @test "$(arch)" = "any" || test "$(arch)" = "x86_64" || test "$(arch)" = "i386" || \
         test "$(arch)" = "ppc64" || test "$(arch)" = "ppc" || test "$(arch)" = "e2k" || \
-        test "$(arch)" = "armv7" || test "$(arch)" = "armv8" || test "$(arch)" = "arm64" || test "$(arch)" = "riscv64"
+        test "$(arch)" = "armv7" || test "$(arch)" = "armv8" || test "$(arch)" = "arm64" || test "$(arch)" = "riscv64" || test "$(arch)" = "loongarch64"
        @test "$(bits)" = "32" || test "$(bits)" = "64"
        @test "$(prefetch)" = "yes" || test "$(prefetch)" = "no"
        @test "$(popcnt)" = "yes" || test "$(popcnt)" = "no"
        @test "$(bits)" = "32" || test "$(bits)" = "64"
        @test "$(prefetch)" = "yes" || test "$(prefetch)" = "no"
        @test "$(popcnt)" = "yes" || test "$(popcnt)" = "no"
@@ -1013,14 +1006,14 @@ FORCE:
 
 clang-profile-make:
        $(MAKE) ARCH=$(ARCH) COMP=$(COMP) \
 
 clang-profile-make:
        $(MAKE) ARCH=$(ARCH) COMP=$(COMP) \
-       EXTRACXXFLAGS='-fprofile-instr-generate ' \
-       EXTRALDFLAGS=' -fprofile-instr-generate' \
+       EXTRACXXFLAGS='-fprofile-generate ' \
+       EXTRALDFLAGS=' -fprofile-generate' \
        all
 
 clang-profile-use:
        $(XCRUN) llvm-profdata merge -output=stockfish.profdata *.profraw
        $(MAKE) ARCH=$(ARCH) COMP=$(COMP) \
        all
 
 clang-profile-use:
        $(XCRUN) llvm-profdata merge -output=stockfish.profdata *.profraw
        $(MAKE) ARCH=$(ARCH) COMP=$(COMP) \
-       EXTRACXXFLAGS='-fprofile-instr-use=stockfish.profdata' \
+       EXTRACXXFLAGS='-fprofile-use=stockfish.profdata' \
        EXTRALDFLAGS='-fprofile-use ' \
        all
 
        EXTRALDFLAGS='-fprofile-use ' \
        all
 
@@ -1052,6 +1045,32 @@ icx-profile-use:
        EXTRALDFLAGS='-fprofile-use ' \
        all
 
        EXTRALDFLAGS='-fprofile-use ' \
        all
 
+### GRPC
+
+PROTOS_PATH = .
+PROTOC = protoc
+GRPC_CPP_PLUGIN = grpc_cpp_plugin
+GRPC_CPP_PLUGIN_PATH ?= `which $(GRPC_CPP_PLUGIN)`
+
+%.grpc.pb.h %.grpc.pb.cc: %.proto
+       $(PROTOC) -I $(PROTOS_PATH) --grpc_out=. --plugin=protoc-gen-grpc=$(GRPC_CPP_PLUGIN_PATH) $<
+
+# oh my
+%.cpp: %.cc
+       cp $< $@
+
+%.pb.h %.pb.cc: %.proto
+       $(PROTOC) -I $(PROTOS_PATH) --cpp_out=. $<
+
+#LDFLAGS += -Wl,-Bstatic -Wl,-\( -lprotobuf -lgrpc++_unsecure -lgrpc_unsecure -lgrpc -lz -Wl,-\) -Wl,-Bdynamic -ldl
+LDFLAGS += -Wl,--start-group /usr/lib/x86_64-linux-gnu/libprotobuf.a /usr/lib/x86_64-linux-gnu/libgrpc++_unsecure.a /usr/lib/x86_64-linux-gnu/libgrpc_unsecure.a /usr/lib/x86_64-linux-gnu/libgrpc.a /usr/lib/x86_64-linux-gnu/libaddress_sorting.a /usr/lib/x86_64-linux-gnu/libupb.a /usr/lib/x86_64-linux-gnu/libcares.a /usr/lib/x86_64-linux-gnu/libgpr.a /usr/lib/x86_64-linux-gnu/libabsl_*.a -Wl,--end-group -ldl -lz
+#LDFLAGS += /usr/lib/x86_64-linux-gnu/libprotobuf.a /usr/lib/libgrpc++_unsecure.a /usr/lib/libgrpc_unsecure.a /usr/lib/libgrpc.a /usr/lib/x86_64-linux-gnu/libcares.a -ldl -lz
+
+client: $(CLIOBJS)
+       $(CXX) -o $@ $(CLIOBJS) $(LDFLAGS)
+
+# Other stuff
+
 .depend: $(SRCS)
        -@$(CXX) $(DEPENDFLAGS) -MM $(SRCS) > $@ 2> /dev/null
 
 .depend: $(SRCS)
        -@$(CXX) $(DEPENDFLAGS) -MM $(SRCS) > $@ 2> /dev/null