## automake - create Makefile.in from Makefile.am
## Copyright (C) 1999-2026 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 <https://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.  ##
## -------------- ##

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

if %?INSTALL%

.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.
	pyc_files=`echo "$$py_files" | sed 's|$$|c|'`; \
	pyo_files=`echo "$$py_files" | sed 's|$$|o|'`; \
	st=0; \
	for files in "$$py_files" "$$pyc_files" "$$pyo_files"; do \
	  $(am__uninstall_files_from_dir) || st=$$?; \
	done; \
## This is somewhat tricky, because for newer pythons we have to take PEP-3147
## into account.  Avoid exceeding the command-line length limit.
	dir='$(DESTDIR)$(%NDIR%dir)'; \
	files=`echo "$$py_files" | $(am__pep3147_tweak)`; \
	$(am__uninstall_files_from_dir) || st=$$?; \
	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%
