1# To build crafty: 2# 3# You want to set up for maximum optimization, but typically you will 4# need to experiment to see which options provide the fastest code. The 5# following option descriptions explain each option. To use one or more 6# of these options, to the "opt =" line that follows the explanations and 7# add the options you want, being careful to stay inside the single quote 8# marks. 9# 10# -DAFFINITY Include code to set processor/thread affinity on Unix 11# systems. Note this will not work on Apple OS X as it does 12# not support any sort of processor affinity mechanism. 13# WARNING: know what you are doing before using this. If 14# you test multiple copies of Crafty (each copy using just 15# one thread) you can have bogus results because if compiled 16# with -DAFFINITY, even a single-cpu execution will lock led 17# itself onto processor zero (since it only has thread #0) 18# which is probably NOT what you want. This is intended to 19# be used when you run Crafty using a complete dedicated 20# machine with nothing else running at the same time. 21# -DBOOKDIR Path to the directory containing the book binary files. 22# The default for all such path values is "." if you don't 23# specify a path with this macro definition. 24# -DCPUS=n Defines the maximum number of CPUS Crafty will be able 25# to use in a SMP system. Note that this is the max you 26# will be able to use. You need to use the smpmt=n command 27# to make crafty use more than the default 1 process. 28# -DDEBUG This is used for testing changes. Enabling this option 29# greatly slows Crafty down, but every time a move is made, 30# the corresponding position is checked to make sure all of 31# the bitboards are set correctly. 32# -DEPD If you want full EPD support built in. 33# -DLOGDIR Path to the directory where Crafty puts the log.nnn and 34# game.nnn files. 35# -DNODES This enables the sn=x command. Crafty will search until 36# exactly X nodes have been searched, then the search 37# terminates as if time ran out. 38# -DPOSITIONS Causes Crafty to emit FEN strings, one per book line, as 39# it creates a book. I use this to create positions to use 40# for cluster testing. 41# -DRCDIR Path to the directory where we look for the .craftyrc or 42# crafty.rc (windows) file. 43# -DSKILL Enables the "skill" command which allows you to arbitrarily 44# lower Crafty's playing skill so it does not seem so 45# invincible to non-GM-level players. 46# -DSYZYGY This enables syzygy endgame tables (both WDL and DTC) 47# -DTBDIR Path to the directory where the endgame tablebase files 48# are found. default = "./TB" 49# -DTEST Displays evaluation table after each move (in the logfile) 50# -DTRACE This enables the "trace" command so that the search tree 51# can be dumped while running. 52# -DUNIX This identifies the target O/S as being Unix-based, if this 53# option is omitted, windows is assumed. 54# 55# Note: If you compile on a machine with the hardware popcnt 56# instruction, you should use the -mpopcnt compiler option 57# to make the built-in intrinsic use the hardware rather than 58# the "folding" approach. That is the default in this 59# Makefile so if you do NOT have hardware popcnt, remove all 60# of the -mpopcnt strings in the Makefile lines below. 61# 62default: 63 $(MAKE) -j unix-clang 64help: 65 @echo "You must specify the system which you want to compile for:" 66 @echo "" 67 @echo "make unix-clang Unix w/clang compiler (MacOS usually)" 68 @echo "make unix-gcc Unix w/gcc compiler" 69 @echo "make unix-icc Unix w/icc compiler" 70 @echo "make profile profile-guided-optimizations" 71 @echo " (edit Makefile to make the profile" 72 @echo " option use the right compiler)" 73 @echo "" 74 75 76quick: 77 $(MAKE) target=UNIX \ 78 CC=clang \ 79 opt='-DSYZYGY -DTEST -DTRACE -DCPUS=4' \ 80 CFLAGS='-mpopcnt -Wall -Wno-array-bounds -pipe -O3' \ 81 LDFLAGS='$(LDFLAGS) -lstdc++' \ 82 crafty-make 83 84unix-gcc: 85 $(MAKE) -j target=UNIX \ 86 CC=$(CC) \ 87 opt='$(opt) -DSYZYGY -DTEST -DCPUS=4' \ 88 CFLAGS='$(CFLAGS) -Wall -Wno-array-bounds -pipe -O3 \ 89 -mpopcnt -pthread' \ 90 LDFLAGS='$(LDFLAGS) -pthread -lstdc++' \ 91 crafty-make 92 93unix-gcc-profile: 94 $(MAKE) -j target=UNIX \ 95 CC=gcc \ 96 opt='-DSYZYGY -DTEST -DCPUS=4' \ 97 CFLAGS='-Wall -Wno-array-bounds -pipe -O3 -fprofile-arcs \ 98 -mpopcnt -pthread' \ 99 LDFLAGS='$(LDFLAGS) -fprofile-arcs -pthread -lstdc++ ' \ 100 crafty-make 101 102unix-clang: 103 @/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/llvm-profdata merge -output=crafty.profdata *.profraw 104 $(MAKE) -j target=UNIX \ 105 CC=clang \ 106 opt='-DSYZYGY -DTEST -DCPUS=4' \ 107 CFLAGS='-Wall -Wno-array-bounds -pipe -O3 \ 108 -mpopcnt -fprofile-instr-use=crafty.profdata' \ 109 LDFLAGS='$(LDFLAGS) -fprofile-use -lstdc++' \ 110 crafty-make 111 112unix-clang-profile: 113 $(MAKE) -j target=UNIX \ 114 CC=clang \ 115 opt='-DSYZYGY -DTEST -DCPUS=4' \ 116 CFLAGS='-Wall -Wno-array-bounds -pipe -O3 \ 117 -mpopcnt -fprofile-instr-generate' \ 118 LDFLAGS='$(LDFLAGS) -fprofile-instr-generate -lstdc++ ' \ 119 crafty-make 120 121unix-icc: 122 $(MAKE) -j target=UNIX \ 123 CC=icc \ 124 opt='-DSYZYGY -DTEST -DCPUS=4' \ 125 CFLAGS='-Wall -w -O2 -prof_use -prof_dir ./prof -fno-alias \ 126 -mpopcnt -pthread' \ 127 LDFLAGS='$(LDFLAGS) -pthread -lstdc++' \ 128 crafty-make 129 130unix-icc-profile: 131 $(MAKE) -j target=UNIX \ 132 CC=icc \ 133 opt='-DSYZYGY -DTEST -DCPUS=4' \ 134 CFLAGS='-Wall -w -O2 -prof_gen -prof_dir ./prof -fno-alias \ 135 -mpopcnt -pthread' \ 136 LDFLAGS='$(LDFLAGS) -pthread -lstdc++ ' \ 137 crafty-make 138 139profile: 140 @rm -rf *.o 141 @rm -rf log.* 142 @rm -rf game.* 143 @rm -rf prof 144 @rm -rf *.gcda 145 @mkdir prof 146 @touch *.c *.h 147 $(MAKE) -j unix-clang-profile 148 @echo "#!/bin/csh" > runprof 149 @echo "./crafty <<EOF" >>runprof 150 @echo "bench" >>runprof 151 @echo "mt=0" >>runprof 152 @echo "quit" >>runprof 153 @echo "EOF" >>runprof 154 @chmod +x runprof 155 @./runprof 156 @rm runprof 157 @touch *.c *.h 158 $(MAKE) -j unix-clang 159 160 161# 162# one of the two following definitions for "objects" should be used. The 163# default is to compile everything separately. However, if you use the 164# definition that refers to crafty.o, that will compile using the file crafty.c 165# which #includes every source file into one large glob. This gives the 166# compiler max opportunity to inline functions as appropriate. You should try 167# compiling both ways to see which way produces the fastest code. 168# 169 170#objects = main.o iterate.o time.o search.o quiesce.o evaluate.o thread.o \ 171 repeat.o hash.o next.o history.o movgen.o make.o unmake.o attacks.o \ 172 see.o tbprobe.o boolean.o utility.o book.o drawn.o epd.o \ 173 epdglue.o init.o input.o autotune.o interrupt.o option.o output.o \ 174 ponder.o resign.o root.o learn.o setboard.o test.o validate.o \ 175 annotate.o analyze.o evtest.o bench.o edit.o data.o 176 177objects = crafty.o 178 179# Do not change anything below this line! 180 181opts = $(opt) -D$(target) 182 183crafty-make: 184 @$(MAKE) opt='$(opt)' CFLAGS='$(CFLAGS)' crafty 185 186crafty.o: *.c *.h 187 188crafty: $(objects) 189 $(CC) $(LDFLAGS) -g -o crafty $(objects) -lm $(LIBS) 190 191evaluate.o: evaluate.h 192 193clean: 194 -rm -f *.o crafty 195 196$(objects): chess.h data.h 197 198.c.o: 199 $(CC) $(CFLAGS) $(opts) -c $*.c 200 201.s.o: 202 $(AS) $(AFLAGS) -o $*.o $*.s 203