Makefile 3.28 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14
# This is the main Makefile that is shipped as part of the source package.
# Keep in mind that the hierarchy that is shipped is not identical to the
# hierarchy within the svn repository: some sub-directories are not shipped;
# the documentation is pre-built.

# The hierarchy that is shipped includes:
#   demos
#   menhir.1
#   manual.pdf
#   src
#   Makefile (this one)

# ----------------------------------------------------------------------------

fpottier's avatar
fpottier committed
15 16 17 18 19 20 21 22 23 24 25 26
# The following variables must/can be configured.

ifndef PREFIX
  $(error Please define PREFIX)
endif

ifndef TARGET
  TARGET := native
endif

# ----------------------------------------------------------------------------

POTTIER Francois's avatar
POTTIER Francois committed
27
# By default, we attempt to use ocamlfind (if present in the PATH), but it
28 29 30 31 32 33 34 35 36 37
# is possible to prevent that externally by setting USE_OCAMLFIND to false.

ifndef USE_OCAMLFIND
  USE_OCAMLFIND = ocamlfind ocamlc -v >/dev/null 2>&1
endif

# ----------------------------------------------------------------------------

# A few settings differ on Windows versus Unix.

fpottier's avatar
fpottier committed
38 39 40 41 42 43 44 45 46
ifeq "$(shell ocamlc -config | grep ccomp_type)" "ccomp_type: msvc"
MENHIREXE    := menhir.exe
OBJ          := obj
# LIBSUFFIX    := lib
else
MENHIREXE    := menhir
OBJ          := o
# LIBSUFFIX    := a
endif
47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84

# ----------------------------------------------------------------------------
# Installation paths.

bindir          := ${PREFIX}/bin
docdir		:= ${PREFIX}/share/doc/menhir
libdir	        := ${PREFIX}/share/menhir
mandir          := ${PREFIX}/share/man/man1
MANS            := menhir.1
DOCS            := manual.pdf demos
MLYLIB          := src/standard.mly

# -------------------------------------------------------------------------

# Building menhirLib.

ifeq ($(TARGET),byte)
MENHIRLIB       := menhirLib.cmi menhirLib.cmo
else
MENHIRLIB       := menhirLib.cmi menhirLib.cmo menhirLib.cmx menhirLib.$(OBJ)
endif

# ----------------------------------------------------------------------------
# Compilation.

# Installation time settings are recorded within src/installation.ml.
# This file is recreated every time so as to avoid becoming stale.

.PHONY: all install uninstall

all:
	rm -f src/installation.ml
	echo "let libdir = \"${libdir}\"" > src/installation.ml
	if $(USE_OCAMLFIND) ; then \
	  echo "let ocamlfind = true" >> src/installation.ml ; \
	else \
	  echo "let ocamlfind = false" >> src/installation.ml ; \
	fi
fpottier's avatar
fpottier committed
85
	$(MAKE) -C src library bootstrap
86 87 88 89

# ----------------------------------------------------------------------------
# Installation.

fpottier's avatar
fpottier committed
90 91 92
# The directory where things have been built (by make all, above).
BUILDDIR := src/_stage2

93
install:
94 95 96 97
	mkdir -p $(bindir)
	mkdir -p $(libdir)
	mkdir -p $(docdir)
	mkdir -p $(mandir)
98
	install $(BUILDDIR)/menhir.$(TARGET) $(bindir)/$(MENHIREXE)
99 100 101
	install -m 644 $(MLYLIB) $(libdir)
	cp -r $(DOCS) $(docdir)
	cp -r $(MANS) $(mandir)
fpottier's avatar
fpottier committed
102
	@if $(USE_OCAMLFIND) ; then \
103
	  echo Installing MenhirLib via ocamlfind. ; \
fpottier's avatar
fpottier committed
104
	  ocamlfind install menhirLib src/META $(patsubst %,$(BUILDDIR)/%,$(MENHIRLIB)) ; \
105 106
	else \
	  echo Installing MenhirLib manually. ; \
fpottier's avatar
fpottier committed
107
	  install -m 644 $(patsubst %,$(BUILDDIR)/%,$(MENHIRLIB)) $(libdir) ; \
108 109 110 111 112 113 114 115 116 117 118
	fi

uninstall:
	rm -rf $(bindir)/$(MENHIREXE)
	rm -rf $(libdir)
	rm -rf $(docdir)
	rm -rf $(mandir)/$(MANS)
	@if $(USE_OCAMLFIND) ; then \
	  echo Un-installing MenhirLib via ocamlfind. ; \
	  ocamlfind remove menhirLib ; \
	fi