#BUILDING MOSES # #PACKAGES #Language models (optional): #--with-irstlm=/path/to/irstlm #--with-srilm=/path/to/srilm See moses/src/LM/Jamfile for more options. #--with-randlm=/path/to/randlm #KenLM is always compiled. # #--with-boost=/path/to/boost #If Boost is in a non-standard location, specify it here. This directory is #expected to contain include and lib or lib64. # #--with-xmlrpc-c=/path/to/xmlrpc-c for libxmlrpc-c (used by server) #Note that, like language models, this is the --prefix where the library was #installed, not some executable within the library. # #--with-giza=/path/to/giza #Indicates where binaries GIZA++, snt2cooc.out, and mkcls live. #Builds scripts/training/train-model.perl using these paths. # #Thread-caching malloc (optional): #--with-tcmalloc # #REGRESSION TESTING #--with-regtest=/path/to/moses-reg-test-data # # #INSTALLATION #--prefix=/path/to/prefix sets the install prefix [dist]. #--bindir=/path/to/prefix/bin sets the bin directory [PREFIX/bin] #--libdir=/path/to/prefix/lib sets the lib directory [PREFIX/lib] #--includedir=/path/to/prefix/include installs headers. # Does not install if missing. No argument defaults to PREFIX/include . #--install-scripts=/path/to/scripts copies scripts into a directory. #--git appends the git revision to the prefix directory. # # #BUILD OPTIONS # By default, the build is multi-threaded, optimized, and statically linked. # Pass these to change the build: # # threading=single|multi controls threading (default multi) # # variant=release|debug|profile builds optimized (default), for debug, or for # profiling # # link=static|shared controls linking (default static) # # debug-symbols=on|off include (default) or exclude debugging # information also known as -g # # --notrace compiles without TRACE macros # # --enable-boost-pool uses Boost pools for the memory SCFG table # # #CONTROLLING THE BUILD #-a to build from scratch #-j$NCPUS to compile in parallel #--clean to clean import option ; import modules ; path-constant TOP : . ; # Shell with trailing line removed http://lists.boost.org/boost-build/2007/08/17051.php rule trim-nl ( str extras * ) { return [ MATCH "([^ ]*)" : $(str) ] $(extras) ; } rule _shell ( cmd : extras * ) { return [ trim-nl [ SHELL $(cmd) : $(extras) ] ] ; } local cleaning = [ option.get "clean" : : yes ] ; cleaning ?= [ option.get "clean-all" : no : yes ] ; if "clean" in [ modules.peek : ARGV ] { cleaning = yes ; } constant CLEANING : $(cleaning) ; #Run g++ with empty main and these arguments to see if it passes. rule test_flags ( flags ) { if [ SHELL $(TOP)"/jam-files/test.sh "$(flags) ] = 0 { return true ; } else { return ; } } #Determine if a library can be compiled statically. rule auto_shared ( name : additional ? ) { additional ?= "" ; if [ test_flags $(additional)" -static -l"$(name) ] { return ; } else { return "shared" ; } } with-boost = [ option.get "with-boost" ] ; if $(with-boost) { L-boost-search = -L$(with-boost)/lib" "-L$(with-boost)/lib64 ; boost-search = $(with-boost)/lib $(with-boost)/lib64 ; I-boost-include = -I$(with-boost)/include ; boost-include = $(with-boost)/include ; } else { L-boost-search = "" ; boost-search = ; I-boost-include = "" ; boost-include = ; } boost-shell = [ SHELL "g++ "$(I-boost-include)" -dM -x c++ -E /dev/null -include boost/version.hpp 2>/dev/null |grep '#define BOOST_VERSION '" : exit-status ] ; if $(boost-shell[2]) != 0 && $(CLEANING) = no { exit Boost does not seem to be installed or g++ is confused. : 1 ; } boost-version = [ MATCH "#define BOOST_VERSION ([0-9]*)" : $(boost-shell[1]) ] ; if $(boost-version) < 103600 && $(cleaning) = no { exit You have Boost $(boost-version). Moses requires at least 103600 (and preferably newer). : 1 ; } #Are we linking static binaries against shared boost? boost-auto-shared = [ auto_shared "boost_program_options" : $(L-boost-search) ] ; #Convenience rule for boost libraries. Defines library boost_$(name). rule boost_lib ( name macro ) { #Link multi-threaded programs against the -mt version if available. Old #versions of boost do not have -mt tagged versions of all libraries. Sadly, #boost.jam does not handle this correctly. if [ test_flags $(L-boost-search)" -lboost_"$(name)"-mt" ] { lib inner_boost_$(name) : : single $(boost-search) boost_$(name) ; lib inner_boost_$(name) : : multi $(boost-search) boost_$(name)-mt ; } else { lib inner_boost_$(name) : : $(boost-search) boost_$(name) ; } alias boost_$(name) : inner_boost_$(name) : $(boost-auto-shared) : : shared:BOOST_$(macro) $(boost-include) ; } #See tools/build/v2/contrib/boost.jam in a boost distribution for a table of macros to define. boost_lib thread THREAD_DYN_DLL ; boost_lib program_options PROGRAM_OPTIONS_DYN_LINK ; boost_lib unit_test_framework TEST_DYN_LINK ; #Link normally to a library, but sometimes static isn't installed so fall back to dynamic. rule external_lib ( name ) { lib $(name) : : [ auto_shared $(name) ] ; } external_lib z ; requirements = ; #libSegFault prints a stack trace on segfault. Link against it if available. if [ test_flags "-lSegfault" ] { external_lib SegFault ; requirements += SegFault ; } if [ option.get "with-tcmalloc" : : "yes" ] { external_lib tcmalloc ; requirements += tcmalloc ; } requirements += [ option.get "notrace" : TRACE_ENABLE=1 ] ; requirements += [ option.get "enable-boost-pool" : : USE_BOOST_POOL ] ; import os ; cxxflags = [ os.environ "CXXFLAGS" ] ; cflags = [ os.environ "CFLAGS" ] ; ldflags = [ os.environ "LDFLAGS" ] ; project : default-build multi on on release static ; project : requirements multi:WITH_THREADS multi:boost_thread _FILE_OFFSET_BITS=64 _LARGE_FILES $(requirements) $(cxxflags) $(cflags) $(ldflags) ; #Add directories here if you want their incidental targets too (i.e. tests). build-project lm ; build-project util ; #Trigger instllation into legacy paths. build-project mert ; build-project moses-cmd/src ; build-project moses-chart-cmd/src ; #Scripts have their own binaries. build-project scripts ; #Regression tests (only does anything if --with-regtest is passed) build-project regression-testing ; if [ option.get "git" : : "yes" ] { local revision = [ _shell "git rev-parse --verify HEAD |head -c 7" ] ; constant GITTAG : "/"$(revision) ; } else { constant GITTAG : "" ; } alias programs : lm//query lm//build_binary moses-chart-cmd/src//moses_chart moses-cmd/src//programs OnDiskPt//CreateOnDisk mert//programs contrib/server//mosesserver misc//programs ; prefix = [ option.get "prefix" : $(TOP)/dist$(GITTAG) ] ; bindir = [ option.get "bindir" : $(prefix)/bin ] ; libdir = [ option.get "libdir" : $(prefix)/lib ] ; install prefix-bin : programs : $(bindir) on EXE shared:$(libdir) ; install prefix-lib : programs : $(libdir) on LIB shared:$(libdir) ; includedir = [ option.get "includedir" : : $(prefix)/include ] ; if $(includedir) { install prefix-header : [ glob-tree *.h *.hh : jam-files dist kenlm moses ] : $(includedir) . ; install prefix-moses-header : moses/src//headers-to-install : $(includedir) moses/src ; }