Subversion Repositories Games.Chess Giants

Rev

Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

# To build crafty:
#
#  You want to set up for maximum optimization, but typically you will
#  need to experiment to see which options provide the fastest code.  The
#  following option descriptions explain each option.  To use one or more
#  of these options, to the "opt =" line that follows the explanations and
#  add the options you want, being careful to stay inside the single quote
#  marks.
#   
#   -DAFFINITY     Include code to set processor/thread affinity on Unix
#                  systems.  Note this will not work on Apple OS X as it does
#                  not support any sort of processor affinity mechanism.
#                  WARNING:  know what you are doing before using this.  If
#                  you test multiple copies of Crafty (each copy using just
#                  one thread) you can have bogus results because if compiled
#                  with -DAFFINITY, even a single-cpu execution will lock led
#                  itself onto processor zero (since it only has thread #0)  
#                  which is probably NOT what you want.  This is intended to 
#                  be used when you run Crafty using a complete dedicated
#                  machine with nothing else running at the same time.
#   -DBOOKDIR      Path to the directory containing the book binary files.
#                  The default for all such path values is "." if you don't
#                  specify a path with this macro definition.
#   -DCPUS=n       Defines the maximum number of CPUS Crafty will be able
#                  to use in a SMP system.  Note that this is the max you
#                  will be able to use.  You need to use the smpmt=n command
#                  to make crafty use more than the default 1 process.
#   -DDEBUG        This is used for testing changes.  Enabling this option
#                  greatly slows Crafty down, but every time a move is made,
#                  the corresponding position is checked to make sure all of
#                  the bitboards are set correctly.
#   -DEPD          If you want full EPD support built in.
#   -DINLINEASM    Compiles with the Intel assembly code for FirstOne(),
#                  LastOne() and PopCnt().  This is for gcc-style inlining
#                  and now works with the Intel C/C++ compiler as well.  It
#                  also has a MSVC compatible version included.
#   -DLOGDIR       Path to the directory where Crafty puts the log.nnn and
#                  game.nnn files.
#   -DNODES        This enables the sn=x command.  Crafty will search until
#                  exactly X nodes have been searched, then the search 
#                  terminates as if time ran out.
#   -DNOEGTB       Eliminates the egtb code for compilers that can't deal
#                  with the large egtb.cpp code/templates.
#   -DPOPCNT       Says this system is a newer Intel/AMD processor with the
#                  built-in hardware popcnt instruction.
#   -DPOSITIONS    Causes Crafty to emit FEN strings, one per book line, as
#                  it creates a book.  I use this to create positions to use
#                  for cluster testing.
#   -DRCDIR        Path to the directory where we look for the .craftyrc or
#                  crafty.rc (windows) file.
#   -DSKILL        Enables the "skill" command which allows you to arbitrarily
#                  lower Crafty's playing skill so it does not seem so
#                  invincible to non-GM-level players.
#   -DTBDIR        Path to the directory where the endgame tablebase files
#                  are found.  default = "./TB"
#   -DTEST         Displays evaluation table after each move (in the logfile)
#   -DTRACE        This enables the "trace" command so that the search tree
#                  can be dumped while running.
#   -DUNIX         This identifies the target O/S as being Unix-based, if this
#                  option is omitted, windows is assumed.

#       $(MAKE) -j unix-gcc
default:
        $(MAKE) -j unix-clang
help:
        @echo "You must specify the system which you want to compile for:"
        @echo ""
        @echo "make unix-gcc         Unix w/gcc compiler"
        @echo "make unix-icc         Unix w/icc compiler"
        @echo "make profile          profile-guided-optimizations"
        @echo "                      (edit Makefile to make the profile"
        @echo "                      option use the right compiler)"
        @echo ""

quick:
        $(MAKE) target=UNIX \
                CC=gcc CXX=g++ \
                opt='-DTEST -DTRACE -DINLINEASM -DPOPCNT -DCPUS=4' \
                CFLAGS='-Wall -Wno-array-bounds -pipe -O3 -pthread' \
                CXFLAGS='-Wall -Wno-array-bounds -pipe -O3 -pthread' \
                LDFLAGS='$(LDFLAGS) -lstdc++' \
                crafty-make

unix-gcc:
        $(MAKE) -j target=UNIX \
                CC=gcc CXX=g++ \
                opt='-DTEST -DINLINEASM -DPOPCNT -DCPUS=4' \
                CFLAGS='-Wall -Wno-array-bounds -pipe -O3 -fprofile-use \
                -fprofile-correction -pthread' \
                CXFLAGS='-Wall -Wno-array-bounds -pipe -O3 -fprofile-use \
                -fprofile-correction -pthread' \
                LDFLAGS='$(LDFLAGS) -fprofile-use -pthread -lstdc++' \
                crafty-make

unix-gcc-profile:
        $(MAKE) -j target=UNIX \
                CC=gcc CXX=g++ \
                opt='-DTEST -DINLINEASM -DPOPCNT -DCPUS=4' \
                CFLAGS='-Wall -Wno-array-bounds -pipe -O3 -fprofile-arcs \
                -pthread' \
                CXFLAGS='-Wall -Wno-array-bounds -pipe -O3 -fprofile-arcs \
                -pthread' \
                LDFLAGS='$(LDFLAGS) -fprofile-arcs -pthread -lstdc++ ' \
                crafty-make

unix-clang:
        @/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/llvm-profdata merge -output=crafty.profdata *.profraw
        $(MAKE) -j target=UNIX \
                CC=clang CXX=clang++ \
                opt='-DTEST -DINLINEASM -DPOPCNT -DCPUS=4' \
                CFLAGS='-Wall -Wno-array-bounds -pipe -O3 \
                        -fprofile-instr-use=crafty.profdata' \
                CXFLAGS='-Wall -Wno-array-bounds -pipe -O3 \
                        -fprofile-instr-use=crafty.profdata' \
                LDFLAGS='$(LDFLAGS) -fprofile-use -lstdc++' \
                crafty-make

unix-clang-profile:
        $(MAKE) -j target=UNIX \
                CC=clang CXX=clang++ \
                opt='-DTEST -DINLINEASM -DPOPCNT -DCPUS=4' \
                CFLAGS='-Wall -Wno-array-bounds -pipe -O3 \
                        -fprofile-instr-generate' \
                CXFLAGS='-Wall -Wno-array-bounds -pipe -O3 \
                        -fprofile-instr-generate' \
                LDFLAGS='$(LDFLAGS) -fprofile-instr-generate -lstdc++ ' \
                crafty-make

unix-icc:
        $(MAKE) -j target=UNIX \
                CC=icc CXX=icc \
                opt='-DTEST -DINLINEASM -DPOPCNT -DCPUS=4' \
                CFLAGS='-Wall -w -O2 -prof_use -prof_dir ./prof -fno-alias \
                        -pthread' \
                CXFLAGS='-Wall -w -O2 -prof_use -prof_dir ./prof -pthread' \
                LDFLAGS='$(LDFLAGS) -pthread -lstdc++' \
                crafty-make

unix-icc-profile:
        $(MAKE) -j target=UNIX \
                CC=icc CXX=icc \
                opt='-DTEST -DINLINEASM -DPOPCNT -DCPUS=4' \
                CFLAGS='-Wall -w -O2 -prof_gen -prof_dir ./prof -fno-alias \
                        -pthread' \
                CXFLAGS='-Wall -w -O2 -prof_gen -prof_dir ./prof -pthread' \
                LDFLAGS='$(LDFLAGS) -pthread -lstdc++ ' \
                crafty-make

profile:
        @rm -rf *.o
        @rm -rf log.*
        @rm -rf game.*
        @rm -rf prof
        @rm -rf *.gcda
        @mkdir prof
        @touch *.c *.cpp *.h
        $(MAKE) -j unix-clang-profile
        @echo "#!/bin/csh" > runprof
        @echo "./crafty <<EOF" >>runprof
        @echo "pgo -1" >>runprof
        @echo "mt=0" >>runprof
        @echo "quit" >>runprof
        @echo "EOF" >>runprof
        @chmod +x runprof
        @./runprof
        @rm runprof
        @touch *.c *.cpp *.h
        $(MAKE) -j unix-clang


#
#  one of the two following definitions for "objects" should be used.  The
#  default is to compile everything separately.  However, if you use the 
#  definition that refers to crafty.o, that will compile using the file crafty.c
#  which #includes every source file into one large glob.  This gives the
#  compiler max opportunity to inline functions as appropriate.  You should try
#  compiling both ways to see which way produces the fastest code.
#

#objects = main.o iterate.o time.o search.o quiesce.o evaluate.o thread.o \
       repeat.o hash.o next.o history.o movgen.o make.o unmake.o attacks.o \
       see.o boolean.o utility.o probe.o book.o drawn.o epd.o epdglue.o \
       init.o input.o autotune.o interrupt.o option.o output.o ponder.o \
       resign.o root.o learn.o setboard.o test.o validate.o annotate.o \
       analyze.o evtest.o bench.o edit.o data.o

objects = crafty.o

# Do not change anything below this line!

opts = $(opt) -D$(target)

#       @$(MAKE) -j opt='$(opt)' CXFLAGS='$(CXFLAGS)' CFLAGS='$(CFLAGS)' crafty
crafty-make:
        @$(MAKE) opt='$(opt)' CXFLAGS='$(CXFLAGS)' CFLAGS='$(CFLAGS)' crafty

crafty.o: *.c *.h

crafty: $(objects) egtb.o
        $(CC) $(LDFLAGS) -o crafty $(objects) egtb.o -lm  $(LIBS)

evaluate.o: evaluate.h

egtb.o: egtb.cpp
        $(CXX) -c $(CXFLAGS) $(opts) egtb.cpp
clean:
        -rm -f *.o crafty

$(objects): chess.h data.h

.c.o:
        $(CC) $(CFLAGS) $(opts) -c $*.c

.s.o:
        $(AS) $(AFLAGS) -o $*.o $*.s