Rev 154 | Rev 182 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 154 | Rev 169 | ||
|---|---|---|---|
| Line 2... | Line 2... | ||
| 2 | # Copyright (C) 2004-2008 Tord Romstad (Glaurung author) | 2 | # Copyright (C) 2004-2008 Tord Romstad (Glaurung author) | 
| 3 | # Copyright (C) 2008-2015 Marco Costalba, Joona Kiiski, Tord Romstad | 3 | # Copyright (C) 2008-2015 Marco Costalba, Joona Kiiski, Tord Romstad | 
| 4 | # Copyright (C) 2015- | 4 | # Copyright (C) 2015-2018 Marco Costalba, Joona Kiiski, Gary Linscott, Tord Romstad | 
| 5 | # | 5 | # | 
| 6 | # Stockfish is free software: you can redistribute it and/or modify | 6 | # Stockfish is free software: you can redistribute it and/or modify | 
| 7 | # it under the terms of the GNU General Public License as published by | 7 | # it under the terms of the GNU General Public License as published by | 
| 8 | # the Free Software Foundation, either version 3 of the License, or | 8 | # the Free Software Foundation, either version 3 of the License, or | 
| 9 | # (at your option) any later version. | 9 | # (at your option) any later version. | 
| Line 48... | Line 48... | ||
| 48 | # | 48 | # | 
| 49 | # flag --- Comp switch --- Description | 49 | # flag --- Comp switch --- Description | 
| 50 | # ---------------------------------------------------------------------------- | 50 | # ---------------------------------------------------------------------------- | 
| 51 | # | 51 | # | 
| 52 | # debug = yes/no --- -DNDEBUG --- Enable/Disable debug mode | 52 | # debug = yes/no --- -DNDEBUG --- Enable/Disable debug mode | 
| - | 53 | # sanitize = undefined/thread/no (-fsanitize ) | |
| 53 | # | 54 | # --- ( undefined ) --- enable undefined behavior checks | 
| - | 55 | # --- ( thread ) --- enable threading error checks | |
| 54 | # optimize = yes/no --- (-O3/-fast etc.) --- Enable/Disable optimizations | 56 | # optimize = yes/no --- (-O3/-fast etc.) --- Enable/Disable optimizations | 
| 55 | # arch = (name) --- (-arch) --- Target architecture | 57 | # arch = (name) --- (-arch) --- Target architecture | 
| 56 | # bits = 64/32 --- -DIS_64BIT --- 64-/32-bit operating system | 58 | # bits = 64/32 --- -DIS_64BIT --- 64-/32-bit operating system | 
| 57 | # prefetch = yes/no --- -DUSE_PREFETCH --- Use prefetch asm-instruction | 59 | # prefetch = yes/no --- -DUSE_PREFETCH --- Use prefetch asm-instruction | 
| 58 | # popcnt = yes/no --- -DUSE_POPCNT --- Use popcnt asm-instruction | 60 | # popcnt = yes/no --- -DUSE_POPCNT --- Use popcnt asm-instruction | 
| Line 137... | Line 139... | ||
| 137 | ### Section 3. Low-level configuration | 139 | ### Section 3. Low-level configuration | 
| 138 | ### ========================================================================== | 140 | ### ========================================================================== | 
| 139 | 141 | ||
| 140 | ### 3.1 Selecting compiler (default = gcc) | 142 | ### 3.1 Selecting compiler (default = gcc) | 
| 141 | 143 | ||
| 142 | CXXFLAGS += -Wall -Wcast-qual -fno-exceptions | 144 | CXXFLAGS += -Wall -Wcast-qual -fno-exceptions -std=c++11 $(EXTRACXXFLAGS) | 
| 143 | DEPENDFLAGS += -std=c++11 | 145 | DEPENDFLAGS += -std=c++11 | 
| 144 | LDFLAGS += $(EXTRALDFLAGS) | 146 | LDFLAGS += $(EXTRALDFLAGS) | 
| 145 | 147 | ||
| 146 | ifeq ($(COMP),) | 148 | ifeq ($(COMP),) | 
| 147 | COMP=gcc | 149 | COMP=gcc | 
| Line 153... | Line 155... | ||
| 153 | CXXFLAGS += -pedantic -Wextra -Wshadow | 155 | CXXFLAGS += -pedantic -Wextra -Wshadow | 
| 154 | 156 | ||
| 155 | ifeq ($(ARCH),armv7) | 157 | ifeq ($(ARCH),armv7) | 
| 156 | ifeq ($(OS),Android) | 158 | ifeq ($(OS),Android) | 
| 157 | CXXFLAGS += -m$(bits) | 159 | CXXFLAGS += -m$(bits) | 
| - | 160 | LDFLAGS += -m$(bits) | |
| 158 | endif | 161 | endif | 
| 159 | else | 162 | else | 
| 160 | CXXFLAGS += -m$(bits) | 163 | CXXFLAGS += -m$(bits) | 
| - | 164 | LDFLAGS += -m$(bits) | |
| 161 | endif | 165 | endif | 
| 162 | 166 | ||
| 163 | ifneq ($(KERNEL),Darwin) | 167 | ifneq ($(KERNEL),Darwin) | 
| 164 | LDFLAGS += -Wl,--no-as-needed | 168 | LDFLAGS += -Wl,--no-as-needed | 
| 165 | endif | 169 | endif | 
| Line 198... | Line 202... | ||
| 198 | 202 | ||
| 199 | ifeq ($(COMP),clang) | 203 | ifeq ($(COMP),clang) | 
| 200 | comp=clang | 204 | comp=clang | 
| 201 | CXX=clang++ | 205 | CXX=clang++ | 
| 202 | CXXFLAGS += -pedantic -Wextra -Wshadow | 206 | CXXFLAGS += -pedantic -Wextra -Wshadow | 
| - | 207 | ifneq ($(KERNEL),Darwin) | |
| - | 208 | ifneq ($(KERNEL),OpenBSD) | |
| - | 209 | LDFLAGS += -latomic | |
| - | 210 | endif | |
| - | 211 | endif | |
| 203 | 212 | ||
| 204 | ifeq ($(ARCH),armv7) | 213 | ifeq ($(ARCH),armv7) | 
| 205 | ifeq ($(OS),Android) | 214 | ifeq ($(OS),Android) | 
| 206 | CXXFLAGS += -m$(bits) | 215 | CXXFLAGS += -m$(bits) | 
| 207 | LDFLAGS += -m$(bits) | 216 | LDFLAGS += -m$(bits) | 
| 208 | endif | 217 | endif | 
| 209 | else | 218 | else | 
| 210 | CXXFLAGS += -m$(bits) | 219 | CXXFLAGS += -m$(bits) | 
| 211 | LDFLAGS += -m$(bits) | 220 | LDFLAGS += -m$(bits) | 
| 212 | endif | - | |
| 213 | - | ||
| 214 | ifeq ($(KERNEL),Darwin) | - | |
| 215 | CXXFLAGS += -stdlib=libc++ | - | |
| 216 | DEPENDFLAGS += -stdlib=libc++ | - | |
| 217 | endif | 221 | endif | 
| 218 | endif | 222 | endif | 
| 219 | 223 | ||
| 220 | ifeq ($(comp),icc) | 224 | ifeq ($(comp),icc) | 
| 221 | profile_prepare = icc-profile-prepare | - | |
| 222 | profile_make = icc-profile-make | 225 | profile_make = icc-profile-make | 
| 223 | profile_use = icc-profile-use | 226 | profile_use = icc-profile-use | 
| 224 | profile_clean = icc-profile-clean | - | |
| 225 | else | 227 | else | 
| - | 228 | ifeq ($(comp),clang) | |
| 226 | 
 | 229 | profile_make = clang-profile-make | 
| - | 230 | profile_use = clang-profile-use | |
| - | 231 | else | |
| 227 | profile_make = gcc-profile-make | 232 | profile_make = gcc-profile-make | 
| 228 | profile_use = gcc-profile-use | 233 | profile_use = gcc-profile-use | 
| 229 | 
 | 234 | endif | 
| 230 | endif | 235 | endif | 
| 231 | 236 | ||
| 232 | ifeq ($(KERNEL),Darwin) | 237 | ifeq ($(KERNEL),Darwin) | 
| 233 | CXXFLAGS += -arch $(arch) -mmacosx-version-min=10.9 | 238 | CXXFLAGS += -arch $(arch) -mmacosx-version-min=10.9 | 
| 234 | LDFLAGS += -arch $(arch) -mmacosx-version-min=10.9 | 239 | LDFLAGS += -arch $(arch) -mmacosx-version-min=10.9 | 
| Line 261... | Line 266... | ||
| 261 | else | 266 | else | 
| 262 | CXXFLAGS += -g | 267 | CXXFLAGS += -g | 
| 263 | endif | 268 | endif | 
| 264 | 269 | ||
| 265 | ### 3.2.2 Debugging with undefined behavior sanitizers | 270 | ### 3.2.2 Debugging with undefined behavior sanitizers | 
| 266 | 
 | 271 | ifneq ($(sanitize),no) | 
| 267 | 
 | 272 | CXXFLAGS += -g3 -fsanitize=$(sanitize) -fuse-ld=gold | 
| - | 273 | LDFLAGS += -fsanitize=$(sanitize) -fuse-ld=gold | |
| 268 | endif | 274 | endif | 
| 269 | 275 | ||
| 270 | ### 3.3 Optimization | 276 | ### 3.3 Optimization | 
| 271 | ifeq ($(optimize),yes) | 277 | ifeq ($(optimize),yes) | 
| 272 | 278 | ||
| Line 294... | Line 300... | ||
| 294 | endif | 300 | endif | 
| 295 | endif | 301 | endif | 
| 296 | 302 | ||
| 297 | ifeq ($(comp),clang) | 303 | ifeq ($(comp),clang) | 
| 298 | ifeq ($(KERNEL),Darwin) | 304 | ifeq ($(KERNEL),Darwin) | 
| 299 | ifeq ($(pext),no) | - | |
| 300 | CXXFLAGS += -flto | 305 | CXXFLAGS += -flto | 
| 301 | LDFLAGS += $(CXXFLAGS) | 306 | LDFLAGS += $(CXXFLAGS) | 
| 302 | endif | - | |
| 303 | ifeq ($(arch),i386) | 307 | ifeq ($(arch),i386) | 
| 304 | CXXFLAGS += -mdynamic-no-pic | 308 | CXXFLAGS += -mdynamic-no-pic | 
| 305 | endif | 309 | endif | 
| 306 | ifeq ($(arch),x86_64) | 310 | ifeq ($(arch),x86_64) | 
| 307 | CXXFLAGS += -mdynamic-no-pic | 311 | CXXFLAGS += -mdynamic-no-pic | 
| Line 421... | Line 425... | ||
| 421 | @echo "make build ARCH=x86-64 COMP=clang" | 425 | @echo "make build ARCH=x86-64 COMP=clang" | 
| 422 | @echo "make profile-build ARCH=x86-64-modern COMP=gcc COMPCXX=g++-4.8" | 426 | @echo "make profile-build ARCH=x86-64-modern COMP=gcc COMPCXX=g++-4.8" | 
| 423 | @echo "" | 427 | @echo "" | 
| 424 | 428 | ||
| 425 | 429 | ||
| - | 430 | .PHONY: help build profile-build strip install clean objclean profileclean help \ | |
| - | 431 | config-sanity icc-profile-use icc-profile-make gcc-profile-use gcc-profile-make \ | |
| 426 | 
 | 432 | clang-profile-use clang-profile-make | 
| 427 | build: | 433 | |
| 428 | 
 | 434 | build: config-sanity | 
| 429 | $(MAKE) ARCH=$(ARCH) COMP=$(COMP) all | 435 | $(MAKE) ARCH=$(ARCH) COMP=$(COMP) all | 
| 430 | 436 | ||
| 431 | profile-build: | - | |
| 432 | $(MAKE) ARCH=$(ARCH) COMP=$(COMP) config-sanity | - | |
| 433 | @echo "" | - | |
| 434 | 
 | 437 | profile-build: config-sanity objclean profileclean | 
| 435 | $(MAKE) ARCH=$(ARCH) COMP=$(COMP) $(profile_prepare) | - | |
| 436 | @echo "" | 438 | @echo "" | 
| 437 | @echo "Step 1/4. Building | 439 | @echo "Step 1/4. Building instrumented executable ..." | 
| 438 | @touch *.cpp *.h syzygy/*.cpp syzygy/*.h | - | |
| 439 | $(MAKE) ARCH=$(ARCH) COMP=$(COMP) $(profile_make) | 440 | $(MAKE) ARCH=$(ARCH) COMP=$(COMP) $(profile_make) | 
| 440 | @echo "" | 441 | @echo "" | 
| 441 | @echo "Step 2/4. Running benchmark for pgo-build ..." | 442 | @echo "Step 2/4. Running benchmark for pgo-build ..." | 
| 442 | $(PGOBENCH) > /dev/null | 443 | $(PGOBENCH) > /dev/null | 
| 443 | @echo "" | 444 | @echo "" | 
| 444 | @echo "Step 3/4. Building | 445 | @echo "Step 3/4. Building optimized executable ..." | 
| 445 | 
 | 446 | $(MAKE) ARCH=$(ARCH) COMP=$(COMP) objclean | 
| 446 | $(MAKE) ARCH=$(ARCH) COMP=$(COMP) $(profile_use) | 447 | $(MAKE) ARCH=$(ARCH) COMP=$(COMP) $(profile_use) | 
| 447 | @echo "" | 448 | @echo "" | 
| 448 | @echo "Step 4/4. Deleting profile data ..." | 449 | @echo "Step 4/4. Deleting profile data ..." | 
| 449 | $(MAKE) ARCH=$(ARCH) COMP=$(COMP) | 450 | $(MAKE) ARCH=$(ARCH) COMP=$(COMP) profileclean | 
| 450 | 451 | ||
| 451 | strip: | 452 | strip: | 
| 452 | strip $(EXE) | 453 | strip $(EXE) | 
| 453 | 454 | ||
| 454 | install: | 455 | install: | 
| 455 | -mkdir -p -m 755 $(BINDIR) | 456 | -mkdir -p -m 755 $(BINDIR) | 
| 456 | -cp $(EXE) $(BINDIR) | 457 | -cp $(EXE) $(BINDIR) | 
| 457 | -strip $(BINDIR)/$(EXE) | 458 | -strip $(BINDIR)/$(EXE) | 
| 458 | 459 | ||
| - | 460 | #clean all | |
| - | 461 | clean: objclean profileclean | |
| - | 462 | @rm -f .depend *~ core | |
| - | 463 | ||
| - | 464 | # clean binaries and objects | |
| 459 | 
 | 465 | objclean: | 
| - | 466 | @rm -f $(EXE) $(EXE).exe *.o ./syzygy/*.o | |
| - | 467 | ||
| - | 468 | # clean auxiliary profiling files | |
| - | 469 | profileclean: | |
| - | 470 | @rm -rf profdir | |
| 460 | 
 | 471 | @rm -f bench.txt *.gcda ./syzygy/*.gcda *.gcno ./syzygy/*.gcno | 
| - | 472 | @rm -f stockfish.profdata *.profraw | |
| 461 | 473 | ||
| 462 | default: | 474 | default: | 
| 463 | help | 475 | help | 
| 464 | 476 | ||
| 465 | ### ========================================================================== | 477 | ### ========================================================================== | 
| Line 470... | Line 482... | ||
| 470 | 482 | ||
| 471 | config-sanity: | 483 | config-sanity: | 
| 472 | @echo "" | 484 | @echo "" | 
| 473 | @echo "Config:" | 485 | @echo "Config:" | 
| 474 | @echo "debug: '$(debug)'" | 486 | @echo "debug: '$(debug)'" | 
| - | 487 | @echo "sanitize: '$(sanitize)'" | |
| 475 | @echo "optimize: '$(optimize)'" | 488 | @echo "optimize: '$(optimize)'" | 
| 476 | @echo "arch: '$(arch)'" | 489 | @echo "arch: '$(arch)'" | 
| 477 | @echo "bits: '$(bits)'" | 490 | @echo "bits: '$(bits)'" | 
| 478 | @echo "kernel: '$(KERNEL)'" | 491 | @echo "kernel: '$(KERNEL)'" | 
| 479 | @echo "os: '$(OS)'" | 492 | @echo "os: '$(OS)'" | 
| Line 488... | Line 501... | ||
| 488 | @echo "LDFLAGS: $(LDFLAGS)" | 501 | @echo "LDFLAGS: $(LDFLAGS)" | 
| 489 | @echo "" | 502 | @echo "" | 
| 490 | @echo "Testing config sanity. If this fails, try 'make help' ..." | 503 | @echo "Testing config sanity. If this fails, try 'make help' ..." | 
| 491 | @echo "" | 504 | @echo "" | 
| 492 | @test "$(debug)" = "yes" || test "$(debug)" = "no" | 505 | @test "$(debug)" = "yes" || test "$(debug)" = "no" | 
| - | 506 | @test "$(sanitize)" = "undefined" || test "$(sanitize)" = "thread" || test "$(sanitize)" = "no" | |
| 493 | @test "$(optimize)" = "yes" || test "$(optimize)" = "no" | 507 | @test "$(optimize)" = "yes" || test "$(optimize)" = "no" | 
| 494 | @test "$(arch)" = "any" || test "$(arch)" = "x86_64" || test "$(arch)" = "i386" || \ | 508 | @test "$(arch)" = "any" || test "$(arch)" = "x86_64" || test "$(arch)" = "i386" || \ | 
| 495 | test "$(arch)" = "ppc64" || test "$(arch)" = "ppc" || test "$(arch)" = "armv7" | 509 | test "$(arch)" = "ppc64" || test "$(arch)" = "ppc" || test "$(arch)" = "armv7" | 
| 496 | @test "$(bits)" = "32" || test "$(bits)" = "64" | 510 | @test "$(bits)" = "32" || test "$(bits)" = "64" | 
| 497 | @test "$(prefetch)" = "yes" || test "$(prefetch)" = "no" | 511 | @test "$(prefetch)" = "yes" || test "$(prefetch)" = "no" | 
| Line 501... | Line 515... | ||
| 501 | @test "$(comp)" = "gcc" || test "$(comp)" = "icc" || test "$(comp)" = "mingw" || test "$(comp)" = "clang" | 515 | @test "$(comp)" = "gcc" || test "$(comp)" = "icc" || test "$(comp)" = "mingw" || test "$(comp)" = "clang" | 
| 502 | 516 | ||
| 503 | $(EXE): $(OBJS) | 517 | $(EXE): $(OBJS) | 
| 504 | $(CXX) -o $@ $(OBJS) $(LDFLAGS) | 518 | $(CXX) -o $@ $(OBJS) $(LDFLAGS) | 
| 505 | 519 | ||
| 506 | 
 | 520 | clang-profile-make: | 
| - | 521 | $(MAKE) ARCH=$(ARCH) COMP=$(COMP) \ | |
| - | 522 | EXTRACXXFLAGS='-fprofile-instr-generate ' \ | |
| - | 523 | EXTRALDFLAGS=' -fprofile-instr-generate' \ | |
| - | 524 | all | |
| - | 525 | ||
| - | 526 | clang-profile-use: | |
| - | 527 | llvm-profdata merge -output=stockfish.profdata *.profraw | |
| 507 | $(MAKE) ARCH=$(ARCH) COMP=$(COMP) | 528 | $(MAKE) ARCH=$(ARCH) COMP=$(COMP) \ | 
| - | 529 | EXTRACXXFLAGS='-fprofile-instr-use=stockfish.profdata' \ | |
| - | 530 | EXTRALDFLAGS='-fprofile-use ' \ | |
| - | 531 | all | |
| 508 | 532 | ||
| 509 | gcc-profile-make: | 533 | gcc-profile-make: | 
| 510 | $(MAKE) ARCH=$(ARCH) COMP=$(COMP) \ | 534 | $(MAKE) ARCH=$(ARCH) COMP=$(COMP) \ | 
| 511 | EXTRACXXFLAGS='-fprofile-generate' \ | 535 | EXTRACXXFLAGS='-fprofile-generate' \ | 
| 512 | EXTRALDFLAGS='-lgcov' \ | 536 | EXTRALDFLAGS='-lgcov' \ | 
| Line 515... | Line 539... | ||
| 515 | gcc-profile-use: | 539 | gcc-profile-use: | 
| 516 | $(MAKE) ARCH=$(ARCH) COMP=$(COMP) \ | 540 | $(MAKE) ARCH=$(ARCH) COMP=$(COMP) \ | 
| 517 | EXTRACXXFLAGS='-fprofile-use -fno-peel-loops -fno-tracer' \ | 541 | EXTRACXXFLAGS='-fprofile-use -fno-peel-loops -fno-tracer' \ | 
| 518 | EXTRALDFLAGS='-lgcov' \ | 542 | EXTRALDFLAGS='-lgcov' \ | 
| 519 | all | 543 | all | 
| 520 | - | ||
| 521 | gcc-profile-clean: | - | |
| 522 | @rm -rf *.gcda *.gcno syzygy/*.gcda syzygy/*.gcno bench.txt | - | |
| 523 | - | ||
| 524 | icc-profile-prepare: | - | |
| 525 | $(MAKE) ARCH=$(ARCH) COMP=$(COMP) icc-profile-clean | - | |
| 526 | @mkdir profdir | - | |
| 527 | 544 | ||
| 528 | icc-profile-make: | 545 | icc-profile-make: | 
| - | 546 | @mkdir -p profdir | |
| 529 | $(MAKE) ARCH=$(ARCH) COMP=$(COMP) \ | 547 | $(MAKE) ARCH=$(ARCH) COMP=$(COMP) \ | 
| 530 | EXTRACXXFLAGS='-prof-gen=srcpos -prof_dir ./profdir' \ | 548 | EXTRACXXFLAGS='-prof-gen=srcpos -prof_dir ./profdir' \ | 
| 531 | all | 549 | all | 
| 532 | 550 | ||
| 533 | icc-profile-use: | 551 | icc-profile-use: | 
| 534 | $(MAKE) ARCH=$(ARCH) COMP=$(COMP) \ | 552 | $(MAKE) ARCH=$(ARCH) COMP=$(COMP) \ | 
| 535 | EXTRACXXFLAGS='-prof_use -prof_dir ./profdir' \ | 553 | EXTRACXXFLAGS='-prof_use -prof_dir ./profdir' \ | 
| 536 | all | 554 | all | 
| 537 | - | ||
| 538 | icc-profile-clean: | - | |
| 539 | @rm -rf profdir bench.txt | - | |
| 540 | 555 | ||
| 541 | .depend: | 556 | .depend: | 
| 542 | -@$(CXX) $(DEPENDFLAGS) -MM $(OBJS:.o=.cpp) > $@ 2> /dev/null | 557 | -@$(CXX) $(DEPENDFLAGS) -MM $(OBJS:.o=.cpp) > $@ 2> /dev/null | 
| 543 | 558 | ||
| 544 | -include .depend | 559 | -include .depend |