#
# ${R_HOME}/doc/Makefile

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

top_builddir = ..
subdir = doc

include $(top_builddir)/Makeconf

distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
INSTFILES = AUTHORS COPYING COPYRIGHTS CRAN_mirrors.csv BioC_mirrors.csv \
	KEYWORDS KEYWORDS.db THANKS NEWS.0 NEWS.1 NEWS.2
DISTFILES = Makefile.in Makefile.win $(INSTFILES) R.aux Rscript.1 \
  NEWS.Rd NEWS.2.Rd
INSTFILES2 = NEWS.rds NEWS NEWS.pdf
NON_SVN_INSTFILES = FAQ RESOURCES NEWS NEWS.pdf
## generated later.
SUBDIRS = html manual

HELP2MAN = perl $(top_srcdir)/tools/help2man.pl

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

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

## FIXME:  NEWS.rds is needed by news() and hence in principle part of 'R', but
##  it can only be built by R_EXE which at this point does not exist (if built from scratch)
R: Makefile svnonly
	@for d in $(SUBDIRS); do \
	  (cd $${d} && $(MAKE) $@) || exit 1; \
	done
	@if test "$(BUILDDIR_IS_SRCDIR)" = no ; then \
	  $(MAKE) rdocdir=$(top_builddir)/doc install-sources; \
	fi

docs: R.1 NEWS.rds NEWS html/NEWS.html NEWS.pdf
	@(cd manual && $(MAKE) $@)

R.1:
	@$(HELP2MAN) --include=$(srcdir)/R.aux --no-info --output=R.1 \
	  --name="a language for data analysis and graphics" \
	  $(top_builddir)/bin/R

NEWS.rds: $(srcdir)/NEWS.Rd
	@$(ECHO) "options(warn=1);saveRDS(tools:::prepare_Rd(tools::parse_Rd(\"$(srcdir)/NEWS.Rd\", \
	  macros = \"../share/Rd/macros/system.Rd\"), stages = 'install', warningCalls = FALSE), \
	  'NEWS.rds')" | $(R_EXE)

NEWS: NEWS.rds
	@$(ECHO) "creating doc/NEWS"
	@$(ECHO) 'options(warn=1);tools:::Rd2txt_NEWS_in_Rd("NEWS.rds", "NEWS")' |  $(R_EXE)

html/NEWS.html: NEWS.rds
	@$(ECHO) 'options(warn=1);tools:::Rd2HTML_NEWS_in_Rd("NEWS.rds", "html/NEWS.html")' |  $(R_EXE)

PDFLATEX = @PDFLATEX@
## needs pdflatex (and more)
## Need LC_COLLATE to work around the misuse of [A-z] in texi2dvi 1.135
## (as reported by MM)
NEWS.pdf: NEWS.rds
	@if test -z "$(PDFLATEX)"; then \
	  $(ECHO) "'pdflatex' is needed to make NEWS.pdf but is missing on your system."; \
	else \
	 $(ECHO) "creating doc/NEWS.pdf"; \
	 $(ECHO) 'options(warn=1);tools:::Rd2pdf_NEWS_in_Rd("NEWS.rds", "NEWS.pdf")' |  LC_COLLATE=C $(R_EXE); \
	fi

## NEWS.2.html ships as doc/html/NEWS.2.html in the sources.
docs2: NEWS.2.rds NEWS.2.html NEWS.2.pdf

NEWS.2.rds: $(srcdir)/NEWS.2.Rd
	@$(ECHO) "options(warn=1);saveRDS(tools:::prepare_Rd(tools::parse_Rd(\"$(srcdir)/NEWS.2.Rd\", \
	  macros = \"../share/Rd/macros/system.Rd\"), stages = 'install', warningCalls = FALSE), \
	  'NEWS.2.rds')" | $(R_EXE)

## NB: this is only the top part of NEWS.2 in the sources.
NEWS.2: NEWS.2.rds
	@$(ECHO) "creating NEWS.2"
	@$(ECHO) 'options(warn=1);tools:::Rd2txt_NEWS_in_Rd("NEWS.2.rds", "NEWS.2")' |  $(R_EXE)

NEWS.2.html: NEWS.2.rds
	@$(ECHO) "creating NEWS.2.html"
	@$(ECHO) 'options(warn=1);tools:::Rd2HTML_NEWS_in_Rd("NEWS.2.rds", "NEWS.2.html")' |  $(R_EXE)

NEWS.2.pdf: NEWS.2.rds
	@if test -z "$(PDFLATEX)"; then \
	  $(ECHO) "'pdflatex' is needed to make NEWS.2.pdf but is missing on your system."; \
	else \
	 $(ECHO) "creating NEWS.2.pdf"; \
	 $(ECHO) 'options(warn=1);tools:::Rd2pdf_NEWS_in_Rd("NEWS.2.rds", "NEWS.2.pdf")' |  LC_COLLATE=C $(R_EXE); \
	fi


install: install-message installdirs install-sources install-sources2 install-man
	@for d in $(SUBDIRS); do \
	  (cd $${d} && $(MAKE) $@) || exit 1; \
	done
installdirs:
	@$(MKINSTALLDIRS) "$(DESTDIR)$(rdocdir)"
	@$(MKINSTALLDIRS) $(DESTDIR)$(mandir)/man1
install-man: installdirs R.1 Rscript.1
	@rm -f $(DESTDIR)$(mandir)/man1/R.1
	@$(INSTALL_DATA) R.1 $(DESTDIR)$(mandir)/man1
	@rm -f $(DESTDIR)$(mandir)/man1/Rscript.1
	@@$(INSTALL_DATA) ${srcdir}/Rscript.1 $(DESTDIR)$(mandir)/man1
install-message:
	@$(ECHO) "installing $(subdir) ..."
## installed from srcdir, including to builddir
install-sources:
	@$(MKINSTALLDIRS) "$(DESTDIR)$(rdocdir)"
	@for f in $(INSTFILES); do \
	  $(INSTALL_DATA) $(srcdir)/$${f} "$(DESTDIR)$(rdocdir)"; \
	done
## installed from builddir
install-sources2: installdirs
	@for f in $(NON_SVN_INSTFILES) $(INSTFILES2); do \
	  $(INSTALL_DATA) $${f} "$(DESTDIR)$(rdocdir)"; \
	done
install-strip: install

uninstall:
	@$(ECHO) "uninstalling $(subdir) ..."
	@if test -d "$(DESTDIR)$(rdocdir)" \
	  && test "`cd \"$(DESTDIR)$(rhome)\"; $(GETWD)`" \
	       != "`cd $(top_builddir); $(GETWD)`"; then \
	  for d in $(SUBDIRS); do \
	    (cd $${d} && $(MAKE) $@) || exit 1; \
	  done; \
	  for f in $(INSTFILES) $(NON_SVN_INSTFILES) $(INSTFILES2); do \
	    rm -f "$(DESTDIR)$(rdocdir)"/$${f}; \
	  done; \
	  rmdir "$(DESTDIR)$(rdocdir)" 2>/dev/null \
	    || $(ECHO) "  subdir $(DESTDIR)$(subdir) not removed"; \
	fi
	@rm -f $(DESTDIR)$(mandir)/man1/R.1 $(DESTDIR)$(mandir)/man1/Rscript.1

dvi info pdf::
	@(cd manual && $(MAKE) $@)

mostlyclean:
clean:
	@for d in $(SUBDIRS); do \
	  (cd $${d} && $(MAKE) $@); \
	done
	@if test "$(BUILDDIR_IS_SRCDIR)" = no ; then \
	  rm -f $(INSTFILES) R.1; \
	fi
	-@rm -f $(INSTFILES2) NEWS.2.rds NEWS.2.html NEWS.2.pdf
distclean: clean
	@for d in $(SUBDIRS); do \
	  (cd $${d} && $(MAKE) $@) || exit 1; \
	done
	@if test "$(BUILDDIR_IS_SRCDIR)" = no ; then \
	  rm -f $(NON_SVN_INSTFILES); \
	fi
	-@rm -f Makefile R.1
maintainer-clean: distclean


svnonly:
	@if test -f "$(srcdir)/FAQ" ; then \
	  if test "$(BUILDDIR_IS_SRCDIR)" = no ; then \
	    for f in $(NON_SVN_INSTFILES); do \
	      $(INSTALL_DATA) $(srcdir)/$${f} .; \
	    done \
	  fi \
	fi

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 f in $(NON_SVN_INSTFILES) ; do \
	  cp -p $${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
