# Copyright (C) 2010-2012 Free Software Foundation, Inc.

# Makefile for building a staged copy of the data-directory.
# This file is part of GDB.

# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

srcdir = @srcdir@
SYSCALLS_SRCDIR = $(srcdir)/../syscalls
PYTHON_SRCDIR = $(srcdir)/../python/lib
VPATH = $(srcdir):$(SYSCALLS_SRCDIR):$(PYTHON_SRCDIR)

top_srcdir = @top_srcdir@
top_builddir = @top_builddir@

prefix = @prefix@
exec_prefix = @exec_prefix@

datarootdir = @datarootdir@
datadir = @datadir@

SHELL = @SHELL@

LN_S = @LN_S@

INSTALL = @INSTALL@
INSTALL_DATA = @INSTALL_DATA@
INSTALL_DIR = $(SHELL) $(srcdir)/../../mkinstalldirs

GDB_DATADIR = @GDB_DATADIR@

SYSCALLS_DIR = syscalls
SYSCALLS_INSTALL_DIR = $(DESTDIR)$(GDB_DATADIR)/$(SYSCALLS_DIR)
SYSCALLS_FILES = \
	gdb-syscalls.dtd \
	ppc-linux.xml ppc64-linux.xml \
	i386-linux.xml amd64-linux.xml \
	sparc-linux.xml sparc64-linux.xml \
	mips-o32-linux.xml mips-n32-linux.xml mips-n64-linux.xml

PYTHON_DIR = python
PYTHON_INSTALL_DIR = $(DESTDIR)$(GDB_DATADIR)/$(PYTHON_DIR)
PYTHON_FILES = \
	gdb/__init__.py \
	gdb/types.py \
	gdb/printing.py \
	gdb/prompt.py \
	gdb/command/__init__.py \
	gdb/command/pretty_printers.py \
	gdb/command/prompt.py \
	gdb/command/explore.py

FLAGS_TO_PASS = \
	"prefix=$(prefix)" \
	"exec_prefix=$(exec_prefix)" \
	"infodir=$(infodir)" \
	"datarootdir=$(datarootdir)" \
	"docdir=$(docdir)" \
	"htmldir=$(htmldir)" \
	"pdfdir=$(pdfdir)" \
	"libdir=$(libdir)" \
	"mandir=$(mandir)" \
	"datadir=$(datadir)" \
	"includedir=$(includedir)" \
	"against=$(against)" \
	"DESTDIR=$(DESTDIR)" \
	"AR=$(AR)" \
	"AR_FLAGS=$(AR_FLAGS)" \
	"CC=$(CC)" \
	"CFLAGS=$(CFLAGS)" \
	"CXX=$(CXX)" \
	"CXXFLAGS=$(CXXFLAGS)" \
	"DLLTOOL=$(DLLTOOL)" \
	"LDFLAGS=$(LDFLAGS)" \
	"RANLIB=$(RANLIB)" \
	"MAKEINFO=$(MAKEINFO)" \
	"MAKEHTML=$(MAKEHTML)" \
	"MAKEHTMLFLAGS=$(MAKEHTMLFLAGS)" \
	"INSTALL=$(INSTALL)" \
	"INSTALL_PROGRAM=$(INSTALL_PROGRAM)" \
	"INSTALL_DATA=$(INSTALL_DATA)" \
	"RUNTEST=$(RUNTEST)" \
	"RUNTESTFLAGS=$(RUNTESTFLAGS)"

.PHONY: all
all: stamp-syscalls stamp-python

# For portability's sake, we need to handle systems that don't have
# symbolic links.
stamp-syscalls: Makefile $(SYSCALLS_FILES)
	rm -rf ./$(SYSCALLS_DIR)
	mkdir ./$(SYSCALLS_DIR)
	files='$(SYSCALLS_FILES)' ; \
	for file in $$files ; do \
	  f=$(SYSCALLS_SRCDIR)/$$file ; \
	  if test -f $$f ; then \
	    $(INSTALL_DATA) $$f ./$(SYSCALLS_DIR) ; \
	  fi ; \
	done
	touch $@

.PHONY: clean-syscalls
clean-syscalls:
	rm -rf $(SYSCALLS_DIR)
	rm -f stamp-syscalls

# This target is responsible for properly installing the syscalls'
# XML files in the system.
.PHONY: install-syscalls
install-syscalls:
	$(INSTALL_DIR) $(SYSCALLS_INSTALL_DIR)
	files='$(SYSCALLS_FILES)' ; \
	for file in $$files; do \
	  f=$(SYSCALLS_SRCDIR)/$$file ; \
	  if test -f $$f ; then \
	    $(INSTALL_DATA) $$f $(SYSCALLS_INSTALL_DIR) ; \
	  fi ; \
	done

.PHONY: uninstall-syscalls
uninstall-syscalls:
	files='$(SYSCALLS_FILES)' ; \
	for file in $$files ; do \
	  slashdir=`echo "/$$file" | sed 's,/[^/]*$$,,'` ; \
	  rm -f $(SYSCALLS_INSTALL_DIR)/$$file ; \
	  while test "x$$file" != "x$$slashdir" ; do \
	    rmdir 2>/dev/null "$(SYSCALLS_INSTALL_DIR)$$slashdir" ; \
	    file="$$slashdir" ; \
	    slashdir=`echo "$$file" | sed 's,/[^/]*$$,,'` ; \
	  done \
	done

stamp-python: Makefile $(PYTHON_FILES)
	rm -rf ./$(PYTHON_DIR)
	files='$(PYTHON_FILES)' ; \
	for file in $$files ; do \
	  dir=`echo "$$file" | sed 's,/[^/]*$$,,'` ; \
	  $(INSTALL_DIR) ./$(PYTHON_DIR)/$$dir ; \
	  $(INSTALL_DATA) $(PYTHON_SRCDIR)/$$file ./$(PYTHON_DIR)/$$dir ; \
	done
	touch $@

.PHONY: clean-python
clean-python:
	rm -rf $(PYTHON_DIR)
	rm -f stamp-python

.PHONY: install-python
install-python:
	files='$(PYTHON_FILES)' ; \
	for file in $$files ; do \
	  dir=`echo "$$file" | sed 's,/[^/]*$$,,'` ; \
	  $(INSTALL_DIR) $(PYTHON_INSTALL_DIR)/$$dir ; \
	  $(INSTALL_DATA) ./$(PYTHON_DIR)/$$file $(PYTHON_INSTALL_DIR)/$$dir ; \
	done

.PHONY: uninstall-python
uninstall-python:
	files='$(PYTHON_FILES)' ; \
	for file in $$files ; do \
	  slashdir=`echo "/$$file" | sed 's,/[^/]*$$,,'` ; \
	  rm -f $(PYTHON_INSTALL_DIR)/$$file ; \
	  while test "x$$file" != "x$$slashdir" ; do \
	    rmdir 2>/dev/null "$(PYTHON_INSTALL_DIR)$$slashdir" ; \
	    file="$$slashdir" ; \
	    slashdir=`echo "$$file" | sed 's,/[^/]*$$,,'` ; \
	  done \
	done

# Traditionally "install" depends on "all".  But it may be useful
# not to; for example, if the user has made some trivial change to a
# source file and doesn't care about rebuilding or just wants to save the
# time it takes for make to check that all is up to date.
# install-only is intended to address that need.
.PHONY: install
install: all
	@$(MAKE) $(FLAGS_TO_PASS) install-only

.PHONY: install-only
install-only: install-syscalls install-python

.PHONY: uninstall
uninstall: uninstall-syscalls uninstall-python

.PHONY: clean
clean: clean-syscalls clean-python

.PHONY: maintainer-clean realclean distclean
maintainer-clean realclean distclean: clean
	rm -f Makefile

.PHONY: check installcheck info dvi pdf html
.PHONY: install-info install-pdf install-html clean-info
check installcheck:
info dvi pdf html:
install-info install-pdf install-html:
clean-info:

# GNU Make has an annoying habit of putting *all* the Makefile variables
# into the environment, unless you include this target as a circumvention.
# Rumor is that this will be fixed (and this target can be removed)
# in GNU Make 4.0.
.NOEXPORT:

# GNU Make 3.63 has a different problem: it keeps tacking command line
# overrides onto the definition of $(MAKE).  This variable setting
# will remove them.
MAKEOVERRIDES=

Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
	cd $(top_builddir) && $(MAKE) data-directory/Makefile
