#
# ${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) 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)/$@

## 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,
## so we remake it before dumping the DESCRIPTION files.
R:
	@$(MKINSTALLDIRS) $(top_builddir)/library
	@for pkg in profile $(R_PKGS_BASE); do \
	  (cd $${pkg} && $(MAKE)) || 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
	@$(INSTALL_DATA) $(top_srcdir)/doc/html/R.css \
	  $(top_builddir)/library

## 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
# 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

## only 'grid' has any vignettes
vignettes:
	@for pkg in $(R_PKGS_BASE); do \
	  if test -d "$(srcdir)/$${pkg}/inst/doc"; then \
	    $(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_EXE) > /dev/null; \
	   fi; \
	done

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) "tools:::unix.packages.html(.Library, 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_LIBS)"; then \
	  $(STRIP_LIBS) "$(DESTDIR)$(rhome)/library"/*/libs/*${SHLIB_EXT}; \
	fi
uninstall:
	@$(ECHO) "uninstalling packages ..."
	@(cd "$(DESTDIR)$(rhome)/library"; \
	  for p in $(R_PKGS); do rm -rf $${p}; done)
	@rm -f "$(DESTDIR)$(rhome)/library/R.css"
	@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
