#################################################################### # Makefile rules for compiling ocaml programs # #################################################################### #################################################################### ### Try to automatically guess OS ifeq (${OSCOMP},cygwingnuc) # Define this if compiling with Cygwin GNU C OSARCH=win32gnuc ETAGS=/bin/etags buildexecutable:: win32rc/unison.res.lib else # Win32 system ifeq (${OSTYPE},cygwin32) # Cygwin Beta 19 OSARCH=win32 ETAGS=/bin/etags else ifeq (${OSTYPE},cygwin) # Cygwin Beta 20 OSARCH=win32 ETAGS=/bin/etags else # Unix system ifeq ($(shell uname),SunOS) OSARCH=solaris else ifeq ($(shell uname),Darwin) OSARCH=osx else ifeq ($(shell uname),OpenBSD) OSARCH=OpenBSD endif endif endif ETAGS=etags endif endif endif # The OCaml lib dir is used by all versions # It is extracted from 'ocamlc -v' and Windows '\' separators are turned # to Unix '/' separators, and extraneous control-M's are deleted. # Unfortunately there is a literal control-M buried in this, I'd rather # get rid of it... # OCAMLLIBDIR=$(shell ocamlc -v | tail -n -1 | sed -e 's/.* //g' | sed -e 's/\\/\//g' | sed -e 's///g') # Better(?) version, June 2005: OCAMLLIBDIR=$(shell ocamlc -v | tail -n -1 | sed -e 's/.* //g' | sed -e 's/\\/\//g' | tr -d '\r') ## BCP (6/05) an alternative, but not quite working, version ## suggested by Nick Montfort: # OCAMLLIBDIR=$(shell ocamlc -v | sed -n '$p' | sed -e 's/^Standard library directory: //' | sed -e 's/\\/\//g' | sed -e 's/\r//g') # User interface style: # Legal values are # UISTYLE=text # UISTYLE=gtk # UISTYLE=gtk2 # UISTYLE=mac (old and limited, but working) # UISTYLE=macnew (spiffy, but not yet extensively tested) # # This should be set to an appropriate value automatically, depending # on whether the lablgtk library is available LABLGTKLIB=$(OCAMLLIBDIR)/lablgtk LABLGTK2LIB=$(OCAMLLIBDIR)/lablgtk2 ##BCP [3/2007]: Removed temporarily, since the OSX UI is not working well ## at the moment and we don't want to confuse people by building it by default ifeq ($(OSARCH),osx) UISTYLE=macnew else ifeq ($(wildcard $(LABLGTK2LIB)),$(LABLGTK2LIB)) UISTYLE=gtk2 else UISTYLE=text endif endif buildexecutable:: @echo UISTYLE = $(UISTYLE) #################################################################### ### Default parameters INCLFLAGS=-I lwt -I ubase CAMLFLAGS+=$(INCLFLAGS) ifeq ($(OSARCH),win32) # Win32 system EXEC_EXT=.exe OBJ_EXT=.obj CWD=. CLIBS+=-cclib win32rc/unison.res STATICLIBS+=-cclib win32rc/unison.res buildexecutable:: @echo Building for Windows else # Unix system, or Cygwin with GNU C compiler OBJ_EXT=.o CWD=$(shell pwd) ifeq ($(OSARCH),win32gnuc) EXEC_EXT=.exe CLIBS+=-cclib win32rc/unison.res.lib STATIC=false # Cygwin is not MinGW :-( buildexecutable:: @echo Building for Windows with Cygwin GNU C else EXEC_EXT= # openpty is in the libutil library ifneq ($(OSARCH),solaris) ifneq ($(OSARCH),osx) CLIBS+=-cclib -lutil endif endif buildexecutable:: @echo Building for Unix endif endif buildexecutable:: @echo NATIVE = $(NATIVE) @echo THREADS = $(THREADS) @echo STATIC = $(STATIC) @echo OSTYPE = $(OSTYPE) @echo OSARCH = $(OSARCH) ubase/projectInfo.ml: mkProjectInfo echo 'let myName = "'$(NAME)'";;' > $@ echo 'let myVersion = "'$(VERSION)'";;' >> $@ echo 'let myMajorVersion = "'$(MAJORVERSION)'";;' >> $@ clean:: $(RM) ubase/projectInfo.ml #################################################################### ### Unison objects and libraries ifeq ($(UISTYLE),mac) buildexecutable:: macexecutable UIMACDIR=uimac else ifeq ($(UISTYLE),macnew) buildexecutable:: macexecutable UIMACDIR=uimacnew else buildexecutable:: $(NAME)$(EXEC_EXT) endif endif # NOTE: the OCAMLLIBDIR is not getting passed correctly? # The two cases for cltool are needed because Xcode 2.1+ # builds in build/Default/, and earlier versions use build/ macexecutable: $(NAME)-blob.o sed -e's/@@VERSION@@/$(VERSION)/' $(UIMACDIR)/Info.plist.template > $(UIMACDIR)/Info.plist (cd $(UIMACDIR); xcodebuild OCAMLLIBDIR="$(OCAMLLIBDIR)") if [ -e $(UIMACDIR)/build/Default ]; then \ gcc $(UIMACDIR)/cltool.c -o $(UIMACDIR)/build/Default/Unison.app/Contents/MacOS/cltool -framework Carbon; \ else \ gcc $(UIMACDIR)/cltool.c -o $(UIMACDIR)/build/Unison.app/Contents/MacOS/cltool -framework Carbon; \ fi # OCaml objects for the bytecode version # File extensions will be substituted for the native code version OCAMLOBJS += \ ubase/projectInfo.cmo ubase/myMap.cmo ubase/safelist.cmo \ ubase/uprintf.cmo ubase/util.cmo ubase/rx.cmo ubase/uarg.cmo \ ubase/prefs.cmo ubase/trace.cmo \ \ lwt/pqueue.cmo lwt/lwt.cmo lwt/lwt_util.cmo lwt/lwt_unix.cmo \ \ case.cmo pred.cmo uutil.cmo \ fileutil.cmo name.cmo path.cmo fspath.cmo fingerprint.cmo \ abort.cmo osx.cmo \ props.cmo fileinfo.cmo os.cmo lock.cmo clroot.cmo common.cmo \ tree.cmo checksum.cmo terminal.cmo \ transfer.cmo xferhint.cmo remote.cmo globals.cmo copy.cmo \ stasher.cmo update.cmo \ files.cmo sortri.cmo recon.cmo transport.cmo \ strings.cmo uicommon.cmo uitext.cmo test.cmo OCAMLOBJS+=main.cmo # OCaml libraries for the bytecode version # File extensions will be substituted for the native code version OCAMLLIBS+=unix.cma str.cma COBJS+=osxsupport$(OBJ_EXT) pty$(OBJ_EXT) ######################################################################## ### User Interface setup ## Text UI ifeq ($(UISTYLE), text) OCAMLOBJS+=linktext.cmo endif ## Old Mac UI ifeq ($(UISTYLE),mac) OCAMLOBJS+=uimacbridge.cmo endif ## New Mac UI ifeq ($(UISTYLE),macnew) OCAMLOBJS+=uimacbridgenew.cmo THREADS=true OCAMLLIBS+=threads.cma INCLFLAGS+=-thread endif ## Graphic UI # Setup the lib directories # Win32 system : this very Makefile must be used with GNU Make, so that we # expect CygWin Bash to be used. # The directory must be provided following one of the model below : # - unix, relative ../../ocaml/lib/labltk # - unix, absolute d:/home/foobar/ocaml/lib/labltk # - dos, relative ..\\..\\ocaml\\lib\\labltk # - dos, absolute d:\\home\\foobar\\ocaml\\lib\\labltk # Patch to make a Windows GUI version come up with no # console when click-started # ifeq ($(OSARCH), win32) # COBJS+=winmain.c # CFLAGS+=-cclib /subsystem:windows # endif # Gtk GUI ifeq ($(UISTYLE), gtk) CAMLFLAGS+=-I +lablgtk OCAMLOBJS+=pixmaps.cmo uigtk.cmo linkgtk.cmo OCAMLLIBS+=lablgtk.cma endif # Gtk2 GUI ifeq ($(UISTYLE), gtk2) CAMLFLAGS+=-I +lablgtk2 OCAMLOBJS+=pixmaps.cmo uigtk2.cmo linkgtk2.cmo OCAMLLIBS+=lablgtk.cma endif #################################################################### ### Static build setup ifeq ($(STATIC), true) STATICLIBS+=-cclib -static endif #################################################################### ### Dependencies # Include an automatically generated list of dependencies include .depend ifeq ($(OSARCH), OpenBSD) ifeq ($(shell echo type ocamldot | ksh), file) OCAMLDOT=true endif else ifeq ($(shell echo type -t ocamldot | bash), file) OCAMLDOT=true endif endif # Rebuild dependencies (must be invoked manually) .PHONY: depend depend:: ocamldep $(INCLFLAGS) *.mli *.ml */*.ml */*.mli > .depend ifdef OCAMLDOT echo 'digraph G {' > dot.tmp echo '{ rank = same; "Fileinfo"; "Props"; "Fspath"; "Os"; "Path"; }'\ >>dot.tmp echo '{ rank = same; "Uitext"; "Uigtk"; }'>>dot.tmp echo '{ rank = same; "Recon"; "Update"; "Transport"; "Files"; }'\ >>dot.tmp echo '{ rank = same; "Tree"; "Safelist"; }'>>dot.tmp echo '{ rank = same; "Uarg"; "Prefs"; }'>>dot.tmp ocamldot .depend | tail -n +2 >> dot.tmp -dot -Tps -o DEPENDENCIES.ps dot.tmp endif #################################################################### ### Compilation boilerplate ifeq ($(DEBUGGING), false) ifneq ($(OSARCH), win32) ifneq ($(OSARCH), osx) # Strip the binary (does not work with MS compiler; might not work # under OSX) CFLAGS+=-cclib -Wl,-s endif endif endif ifeq ($(PROFILING), true) OCAMLC=ocamlcp else OCAMLC=ocamlc endif OCAMLOPT=ocamlopt ifeq ($(NATIVE), true) ## Set up for native code compilation CAMLC=$(OCAMLOPT) ifeq ($(PROFILING), true) CAMLFLAGS+=-p CLIBS+=-cclib -ldl endif CAMLOBJS=$(subst .cmo,.cmx, $(subst .cma,.cmxa, $(OCAMLOBJS))) CAMLLIBS=$(subst .cma,.cmxa, $(OCAMLLIBS)) else ## Set up for bytecode compilation CAMLC=$(OCAMLC) CAMLFLAGS+=-custom ifeq ($(DEBUGGING), true) CAMLFLAGS+=-g endif CAMLOBJS=$(OCAMLOBJS) CAMLLIBS=$(OCAMLLIBS) endif win32rc/unison.res.lib: win32rc/unison.res windres win32rc/unison.res win32rc/unison.res.lib %.ml: %.mll -$(RM) $@ ocamllex $< %.cmi : %.mli @echo "$(CAMLC): $< ---> $@" $(CAMLC) $(CAMLFLAGS) -c $(CWD)/$< %.cmo: %.ml @echo "$(OCAMLC): $< ---> $@" $(OCAMLC) $(CAMLFLAGS) -c $(CWD)/$< %.cmx: %.ml @echo "$(OCAMLOPT): $< ---> $@" $(OCAMLOPT) $(CAMLFLAGS) -c $(CWD)/$< %.o %.obj: %.c @echo "$(OCAMLOPT): $< ---> $@" $(CAMLC) $(CAMLFLAGS) -c $(CWD)/$< $(NAME)$(EXEC_EXT): $(CAMLOBJS) $(COBJS) @echo Linking $@ $(CAMLC) -verbose $(CAMLFLAGS) -o $@ $(CFLAGS) $(CAMLLIBS) $(CLIBS) $^ # Unfortunately -output-obj does not put .o files into the output, only .cmx # files, so we have to use $(LD) to take care of COBJS. $(NAME)-blob.o: $(CAMLOBJS) $(COBJS) @echo Linking $@ $(CAMLC) -output-obj -verbose $(CAMLFLAGS) -o u-b.o $(CFLAGS) $(CAMLLIBS) $(CLIBS) $(CAMLOBJS) $(LD) -r -o $@ u-b.o $(COBJS) $(RM) u-b.o %$(EXEC_EXT): %.ml $(OCAMLC) -verbose -o $@ $^ ###################################################################### ### Misc clean:: -$(RM) -r *.cmi *.cmo *.cmx *.cma *.cmxa TAGS tags -$(RM) -r *.o core gmon.out *~ .*~ -$(RM) -r *.obj *.lib *.exp -$(RM) -r *.tmp *.bak?.tmp .*.bak?.tmp paths: @echo PATH = $(PATH) @echo OCAMLLIBDIR = $(OCAMLLIBDIR)