## automake - create Makefile.in from Makefile.am
## Copyright (C) 1999-2013 Free Software Foundation, Inc.

## 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 2, 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/>.

if %?INSTALL%
include inst-vars.am
endif %?INSTALL%

?FIRST?am__py_compile = PYTHON=$(PYTHON) $(SHELL) $(py_compile)

## ------------ ##
## Installing.  ##
## ------------ ##

if %?INSTALL%
am__installdirs += "$(DESTDIR)$(%NDIR%dir)"
?EXEC?.PHONY install-exec-am: install-%DIR%PYTHON
?!EXEC?.PHONY install-data-am: install-%DIR%PYTHON
install-%DIR%PYTHON: $(%DIR%_PYTHON)
	@$(NORMAL_INSTALL)
if %?BASE%
	@list='$(%DIR%_PYTHON)'; dlist=; list2=; test -n "$(%NDIR%dir)" || list=; \
	if test -n "$$list"; then \
	  echo " $(MKDIR_P) '$(DESTDIR)$(%NDIR%dir)'"; \
	  $(MKDIR_P) "$(DESTDIR)$(%NDIR%dir)" || exit 1; \
	fi; \
	for p in $$list; do \
## A file can be in the source directory or the build directory.
	  if test -f "$$p"; then b=; else b="$(srcdir)/"; fi; \
	  if test -f $$b$$p; then \
## Compute basename of source file.  Unless this is a nobase_ target, we
## want to install 'python/foo.py' as '$(DESTDIR)$(%NDIR%dir)/foo.py',
## not '$(DESTDIR)$(%NDIR%dir)/python/foo.py'.
	    $(am__strip_dir) \
	    dlist="$$dlist $$f"; \
	    list2="$$list2 $$b$$p"; \
	  else :; fi; \
	done; \
	for file in $$list2; do echo $$file; done | $(am__base_list) | \
	while read files; do \
## Don't perform translation, since script name is important.
	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(%NDIR%dir)'"; \
	  $(INSTALL_DATA) $$files "$(DESTDIR)$(%NDIR%dir)" || exit $$?; \
	done || exit $$?; \
## Byte-compile must be done at install time, since file times are
## encoded in the actual files.
	if test -n "$$dlist"; then \
	  $(am__py_compile) --destdir "$(DESTDIR)" \
	                    --basedir "$(%NDIR%dir)" $$dlist; \
	else :; fi
else !%?BASE%
	@list='$(%DIR%_PYTHON)'; test -n "$(%NDIR%dir)" || list=; \
	if test -n "$$list"; then \
	  echo " $(MKDIR_P) '$(DESTDIR)$(%NDIR%dir)'"; \
	  $(MKDIR_P) "$(DESTDIR)$(%NDIR%dir)" || exit 1; \
	fi; \
	$(am__nobase_list) | { while read dir files; do \
	  xfiles=; for p in $$files; do \
## A file can be in the source directory or the build directory.
	    if test -f "$$p"; then b=; else b="$(srcdir)/"; fi; \
	    if test -f "$$b$$p"; then xfiles="$$xfiles $$b$$p"; dlist="$$dlist $$p"; \
	    else :; fi; done; \
	  test -z "$$xfiles" || { \
	    test "x$$dir" = x. || { \
	      echo "$(MKDIR_P) '$(DESTDIR)$(%NDIR%dir)/$$dir'"; \
	      $(MKDIR_P) "$(DESTDIR)$(%NDIR%dir)/$$dir"; }; \
## Don't perform translation, since script name is important.
	    echo " $(INSTALL_DATA) $$xfiles '$(DESTDIR)$(%NDIR%dir)/$$dir'"; \
	    $(INSTALL_DATA) $$xfiles "$(DESTDIR)$(%NDIR%dir)/$$dir" || exit $$?; }; \
	done; \
## Byte-compile must be done at install time, since file times are
## encoded in the actual files.
	if test -n "$$dlist"; then \
	  $(am__py_compile) --destdir "$(DESTDIR)" \
	                    --basedir "$(%NDIR%dir)" $$dlist; \
	else :; fi; }
endif !%?BASE%
endif %?INSTALL%


## -------------- ##
## Uninstalling.  ##
## -------------- ##

if %?INSTALL%

?FIRST?am__pep3147_tweak = \
?FIRST?  sed -e 's|\.py$$||' -e 's|[^/]*$$|__pycache__/&.*.py|'

.PHONY uninstall-am: uninstall-%DIR%PYTHON
uninstall-%DIR%PYTHON:
	@$(NORMAL_UNINSTALL)
	@list='$(%DIR%_PYTHON)'; test -n "$(%NDIR%dir)" || list=; \
?BASE?	py_files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
?!BASE?	$(am__nobase_strip_setup); py_files=`$(am__nobase_strip)`; \
	test -n "$$py_files" || exit 0; \
	dir='$(DESTDIR)$(%NDIR%dir)'; \
## Also remove the .pyc and .pyo byte compiled versions.
## This is somewhat tricky, because for newer pythons we have to take
## PEP-3147 into account.
	pyc_files=`echo "$$py_files" | sed 's|$$|c|'`; \
	pyo_files=`echo "$$py_files" | sed 's|$$|o|'`; \
	py_files_pep3147=`echo "$$py_files" | $(am__pep3147_tweak)`; \
	echo "$$py_files_pep3147";\
	pyc_files_pep3147=`echo "$$py_files_pep3147" | sed 's|$$|c|'`; \
	pyo_files_pep3147=`echo "$$py_files_pep3147" | sed 's|$$|o|'`; \
	st=0; \
	for files in \
	  "$$py_files" \
	  "$$pyc_files" \
	  "$$pyo_files" \
## Installation of '.py' files is not influenced by PEP-3147, so it
## is correct *not* to have $pyfiles_pep3147 here.
	  "$$pyc_files_pep3147" \
	  "$$pyo_files_pep3147" \
	; do \
	  $(am__uninstall_files_from_dir) || st=$$?; \
	done; \
	exit $$st
endif %?INSTALL%


## ---------- ##
## Cleaning.  ##
## ---------- ##

## There is nothing to clean here since files are
## byte-compiled when (and where) they are installed.

## -------------- ##
## Distributing.  ##
## -------------- ##

if %?DIST%
DIST_COMMON += %DISTVAR%
endif %?DIST%
