#
# ${R_HOME}/src/library/Makefile

VPATH = @srcdir@
srcdir = @srcdir@
top_srcdir = @top_srcdir@

top_builddir = ../..
subdir = src/library

include $(top_builddir)/Makeconf

distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
DISTFILES = Makefile.in Makefile.win

SUBDIRS = profile $(R_PKGS_BASE) translations Recommended

R_EXE = $(top_builddir)/bin/R --vanilla --slave

.SUFFIXES: .inn .Rdts .Rdh

all: Makefile R

Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
	@cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@

@BYTE_COMPILE_PACKAGES_FALSE@R_NO_BASE_COMPILE = true

## FIXME: do some of this in parallel?
## Beware there is a bootstrapping problem here: tools uses tools to
## dump its namespace. So it works initially, but not to update.
## When base is made we need to use 'date' to set the timestamp in
## its DESCRIPTION, so we remake it before dumping the DESCRIPTION files.

R:
	@$(MKINSTALLDIRS) $(top_builddir)/library
	@for pkg in profile translations base tools compiler; do \
	  (cd $${pkg} && $(MAKE) all) || exit 1; \
	done
	@if test -z "$(R_NO_BASE_COMPILE)"; then \
	  for pkg in base tools; do \
	    (cd $${pkg} && $(MAKE) mklazycomp) || exit 1; \
	  done; \
	else \
	  for pkg in base tools; do \
	    (cd $${pkg} && $(MAKE) Rlazy) || exit 1; \
	  done; \
	fi
	@for pkg in $(R_PKGS_BASE1); do \
	  (cd $${pkg} && $(MAKE) all) || exit 1; \
	done
	@(cd base && $(MAKE) mkdesc)
	@$(ECHO) "tools:::.vinstall_package_descriptions_as_RDS(\"$(top_builddir)/library\", \"$(R_PKGS_BASE)\")" | \
	  R_DEFAULT_PACKAGES=tools LC_ALL=C $(R_EXE) > /dev/null
	@$(ECHO) "installing parsed NAMESPACE files"
	@rm -f $(top_builddir)/library/tools/Meta/nsInfo.rds
	@$(ECHO) "tools:::.vinstall_package_namespaces_as_RDS(\"$(top_builddir)/library\", \"$(R_PKGS_BASE)\")" | \
	  R_DEFAULT_PACKAGES=tools LC_ALL=C $(R_EXE) > /dev/null

## do Rdobjects before metadata before help indices
docs:
	@$(MAKE) Rdobjects
	@$(MAKE) metadata
	@$(MAKE) help-indices
	@@BUILD_HTML_TRUE@$(MAKE) Rdfiles
	@touch stamp-docs

# fix the order to make best use of parallel builds
RD-TS = base.Rdts stats.Rdts utils.Rdts methods.Rdts graphics.Rdts grDevices.Rdts datasets.Rdts grid.Rdts tools.Rdts tcltk.Rdts splines.Rdts stats4.Rdts compiler.Rdts parallel.Rdts
# RD-TS = $(R_PKGS_BASE:=.Rdts)

.inn.Rdts:
	@$(ECHO) "options(warn=1);tools:::.install_package_Rd_objects('$(srcdir)/$*',\
	   '$(top_builddir)/library/$*')" | \
	    R_DEFAULT_PACKAGES=NULL $(R_EXE) || exit 1
	@$(ECHO) "  $*"

Rdobjects:
	@$(ECHO) "installing parsed Rd"
	@for pkg in $(R_PKGS_BASE); do touch $${pkg}.inn; done
	@$(MAKE) $(RD-TS)

.inn.Rdh:
	@$(ECHO) "tools:::.writePkgIndices(\"$(srcdir)/$*\", \"$(top_builddir)/library/$*\")" | R_DEFAULT_PACKAGES=utils LC_ALL=C $(R_EXE) || exit 1

RD-H = $(R_PKGS_BASE:=.Rdh)

help-indices:
	@$(ECHO) "writing package indices"
	@for pkg in $(R_PKGS_BASE); do touch $${pkg}.inn; done
	@$(MAKE) $(RD-H)

## FIXME: do this in parallel (but avoid interleaving output)
Rdfiles:
	@$(ECHO) "building all R object docs"
	@for pkg in $(R_PKGS_BASE); do \
	  $(ECHO) "tools:::.convertRdfiles(\"$(srcdir)/$${pkg}\", \"$(top_builddir)/library/$${pkg}\", silent = TRUE)" | LC_ALL=C $(R_EXE) || exit 1; \
	done

PDFLATEX = @PDFLATEX@
@USE_RECOMMENDED_PACKAGES_TRUE@ vignettes: vignettes-lattice
@USE_RECOMMENDED_PACKAGES_FALSE@ vignettes: vignettes-no-lattice

vignettes-lattice:
	@if test -z "$(PDFLATEX)"; then \
	  $(ECHO) "'pdflatex' is needed to make vignettes but is missing on your system."; \
	else \
	  for pkg in grid parallel utils; do \
	    $(ECHO) "building/updating vignettes for package '$${pkg}' ..."; \
	    ($(ECHO) "tools:::.install_package_vignettes(\"$(srcdir)/$${pkg}\", \"$(top_builddir)/library/$${pkg}\")") | \
	        R_DEFAULT_PACKAGES="utils,tools" LC_ALL=C \
		  R_LIBS_USER= R_LIBS_SITE= \
	          $(R_EXE) > /dev/null; \
	  done \
	fi

vignettes-no-lattice:
	@mv $(srcdir)/grid/vignettes/grid.Rnw $(srcdir)/grid/vignettes/grid.Rnw-lattice
	@cp $(srcdir)/grid/vignettes/grid.Rnw-nolattice $(srcdir)/grid/vignettes/grid.Rnw
	@if test -z "$(PDFLATEX)"; then \
	  $(ECHO) "'pdflatex' is needed to make vignettes but is missing on your system."; \
	else \
	  for pkg in grid parallel utils; do \
	    $(ECHO) "building/updating vignettes for package '$${pkg}' ..."; \
	    ($(ECHO) "tools:::.install_package_vignettes(\"$(srcdir)/$${pkg}\", \"$(top_builddir)/library/$${pkg}\")") | \
	        R_DEFAULT_PACKAGES="utils,tools" LC_ALL=C \
		  R_LIBS_USER= R_LIBS_SITE= \
	          $(R_EXE) > /dev/null; \
	  done \
	fi
	@mv $(srcdir)/grid/vignettes/grid.Rnw-lattice $(srcdir)/grid/vignettes/grid.Rnw

metadata:
	@$(ECHO) "building/updating package metadata ..."
	@$(ECHO) "tools:::.vinstall_package_indices(\"$(srcdir)\", \"$(top_builddir)/library\", \"$(R_PKGS_BASE)\")" | \
	  R_DEFAULT_PACKAGES=tools LC_ALL=C $(R_EXE) > /dev/null

install: installdirs
	@$(ECHO) "installing packages ..."
	@cp -R $(top_builddir)/library "$(DESTDIR)$(rhome)" || \
	  (cd $(top_builddir)/library; \
	    $(TAR) cf - . | (cd "$(DESTDIR)$(rhome)/library"; $(TAR) xmof -))
	@$(ECHO) "  building HTML index ..."
	@$(ECHO) "utils:::make.packages.html(.Library, verbose=FALSE, docdir=\"$(DESTDIR)${rdocdir}\")" | \
          R_DEFAULT_PACKAGES=NULL LC_ALL=C ${R_EXE} >/dev/null
installdirs:
	@$(MKINSTALLDIRS) "$(DESTDIR)$(rhome)/library"
install-strip:
	@$(MAKE) install
	@if test -n "$(STRIP_SHARED_LIB)"; then \
	  $(STRIP_SHARED_LIB) "$(DESTDIR)$(rhome)/library"/*/libs/*${SHLIB_EXT}; \
	fi
uninstall:
	@$(ECHO) "uninstalling packages ..."
	@(cd "$(DESTDIR)$(rhome)/library"; \
	  for p in $(R_PKGS) translations; do rm -Rf $${p}; done)
	@rmdir "$(DESTDIR)$(rhome)/library" 2>/dev/null \
          || $(ECHO) "  subdir $(DESTDIR)$(rhome)/library not removed"

install-tests:
	@$(ECHO) "installing package tests ..."
	@for pkg in $(R_PKGS_BASE); do \
	  if test -d "$(srcdir)/$${pkg}/tests"; then \
	    $(MKINSTALLDIRS) "$(DESTDIR)$(rhome)/library/$${pkg}/tests" ; \
	    for f in $(srcdir)/$${pkg}/tests/*; do \
	      $(INSTALL_DATA) $${f} "$(DESTDIR)$(rhome)/library/$${pkg}/tests"; \
	    done; \
	  fi; \
	done
@USE_RECOMMENDED_PACKAGES_TRUE@	@(cd Recommended && $(MAKE) $@)

uninstall-tests:
	@$(ECHO) "uninstalling package tests"
	@for pkg in $(R_PKGS_BASE); do \
	 rm -Rf "$(DESTDIR)$(rhome)/library/$${pkg}/tests" ; \
	done
@USE_RECOMMENDED_PACKAGES_TRUE@	@(cd Recommended && $(MAKE) $@)

mostlyclean: clean
clean:
	@(for d in $(SUBDIRS); do rsd="$${d} $${rsd}"; done; \
	  for d in $${rsd}; do (cd $${d} && $(MAKE) $@); done)
	-@rm -Rf .vignettes
	-@rm -f stamp-* *.inn
distclean:
	@(for d in $(SUBDIRS); do rsd="$${d} $${rsd}"; done; \
	  for d in $${rsd}; do (cd $${d} && $(MAKE) $@); done)
	-@rm -f Makefile
maintainer-clean: distclean

TAGS info dvi check:

distdir: $(DISTFILES)
	@for f in $(DISTFILES); do \
	  test -f $(distdir)/$${f} \
	    || ln $(srcdir)/$${f} $(distdir)/$${f} 2>/dev/null \
	    || cp -p $(srcdir)/$${f} $(distdir)/$${f}; \
	done
	@for d in $(SUBDIRS); do \
	  test -d $(distdir)/$${d} \
	    || mkdir $(distdir)/$${d} \
	    || exit 1; \
	  chmod 755 $(distdir)/$${d}; \
	  (cd $${d} && $(MAKE) distdir) \
	    || exit 1; \
	done

### ----------- targets for R-core use ----------
### These are intended to be run on an already-built R, possibly after
### editing the code in a standard package.
### Targets of the same name can be run in individual package directories.
### These do not change datasets (no R code)
### R_PKGS_BASE2 is all except datasets and methods.

### They are not currently safe for a parallel make.

## methods needs to be dumped, so is omitted here.
Rsimple:
	@for pkg in $(R_PKGS_BASE2); do \
	  (cd $${pkg} && $(MAKE) Rsimple) || exit 1; \
	done

## Lazy-loaded, not compiled
Rlazy:
	@for pkg in $(R_PKGS_BASE2) methods; do \
	  (cd $${pkg} && $(MAKE) Rlazy) || exit 1; \
	done

## Lazy-loaded, compiled
Rlazycomp:
	@for pkg in $(R_PKGS_BASE2) methods; do \
	  (cd $${pkg} && $(MAKE) Rlazycomp) || exit 1; \
	done

