# pg_isok A query centered monitoring tool for PostgreSQL
# Copyright (C) 2025 The Meme Factory, Inc., http://www.karlpinc.com/
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero 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 Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see .
#
# Karl O. Pinc
#
## ##################################################################
## Using this Makefile
##
## This Makefile is primarily intended to be used by the developers of
## PG_Isok. Users of PG_Isok are expected to download a PGXN.org
## "distribution", and work from that. But users without permissions
## to create extensions should read on, or, even better, read the
## documentation.
##
## If you have downloaded a PGXN.org "distribution", see the
## installation instructions in the doc directory. The "quick
## start" is:
##
## When you have the necessary permissions to install PostgreSQL
## extensions, it is easiest to install and use the pgxn_client. To,
## instead, use the Makefile directly:
##
## make install
## echo "CREATE EXTENSION pg_isok SCHEMA isok;" | psql ...
##
## When you are in the cloud, or otherwise can't use CREATE EXTENSION,
## you must generate the extension's SQL and execute that yourself:
##
## # Produce an error if the m4 macro processor is not installed
## m4 --help > /dev/null
## # Generate the SQL, to install in the "isok" schema, which must exist
## make TARGET_SCHEMA=isok sql/pg_isok_cloud--VERSION.sql
## # Execute the generated SQL
## psql ... < sql/pg_isok_cloud--VERSION.sql
# Variables
# Generated files needed for extension packaging
PKG_TARGETS := pg_isok.control META.json
EXTENSION := pg_isok
EXTVERSION := $(shell cat VERSION)
# The name of the top-level directory in the distribution archive
# (Also used to name the distribution zip file.)
DIST_DIR := $(EXTENSION)-$(EXTVERSION)
MAKE_FILES := make_files
# Global dependencies. Rebuild everything when any of these change.
# (This is a somewhat annoying practice, because to make it work
# we must update the timestamps of everything that depends on these
# files. Otherwise, altering a makefile will always rebuild the
# targets depending on the makefile. Still, it helps avoid problems
# when developing.)
MAKEDEPENDS := Makefile $(wildcard $(MAKE_FILES)/*.mk)
# Start with the "all" target, so that it is the default.
# The various included files add to this.
all:
# PGXS
# This must come first, so that the initial variable values are those
# of PGXS.
include $(MAKE_FILES)/pgxs.mk
# Turn on inline documentation
include $(MAKE_FILES)/help.mk
# Make the docs
include $(MAKE_FILES)/docs.mk
# Make the SQL
include $(MAKE_FILES)/db.mk
# Make the files needed for extension packaging
$(PKG_TARGETS): % : %.m4 $(MAKEDEPENDS)
m4 -D isok_version=${EXTVERSION} $< > $@
##
## ##################################################################
# This is here because help is displayed in include file order,
# starting with this file. And having it appear here is more useful
## Deployment targets
##
# These are done by PGXS.
## install
## Invoke the PGXS installation process to auto-discover the
## location where extension files go on your system and put the
## necessary files where they belong. (Do not first run `make`
## without a target! The "distribution" available from PGXN.org
## already has everything built. If you do run `make`, or `make
## all`, you will then need to install GNU m4.)
## installcheck
## Invoke the regression tests. Requires the DISABLE_ROLE and
## DISABLE_SEARCH_PATH variables (see below) to test when
## features are disabled. Running tests requires significant
## PostgreSQL permissions. See the installation instructions.
# We _could_ use the cache of disabled features instead of
# requiring the use of variables, but we don't.
## uninstall
## Remove the installed files
##
## ##################################################################
## Development
##
## Variables:
## DISABLE_ROLE Disable the ability to SET ROLE from
## ISOK_QUERIES.Role values. Set to any value to
## disable SET ROLE. (`make DISABLE_ROLE=Y all`)
## DISABLE_SEARCH_PATH
## Disable the ability to SET search_path... from
## ISOK_QUERIES.Search_Path values. Set to any value
## to disable SET search_path....
## (`make DISABLE_SEARCH_PATH=Y all`)
##
## Targets:
# These targets are added to in the included make files.
## help
## Show this text
## all
## Build everything
# This is added to in various places
all: $(PKG_TARGETS)
## clean
## Delete those files that are generated, but not included
## in the distribution
## maintainer-clean
## Delete all generated files
# Clean up generated packaging files.
.PHONY: maintainer-clean_isok
maintainer-clean_isok:
rm -rf $(PKG_TARGETS)
maintainer-clean: maintainer-clean_isok
##
## ##################################################################
## Distribution
##
## Variables:
## TARGET_DIR The directory in which to build and store the
## PGXN distribution file. This cannot be within
## the directory which contains this Makefile.
##
## Targets:
## dist
## Create a file suitable for uploading to PGXN.org.
## Uses the TARGET_DIR variable as the directory in which to
## build and store the distribution file.
# It would be nice if we could use `git archive`, but there's all sorts
# of built files we want to include in the distribution.
.PHONY: dist
dist:
[ -n "$(TARGET_DIR)" ] \
|| { printf 'The TARGET_DIR variable must be set\n' >&2 ; \
exit 1 ; }
[ ! -e "$(TARGET_DIR)/$(DIST_DIR)" ] \
|| { printf '$(TARGET_DIR)/$(DIST_DIR): already exists\n' >&2 ; \
exit 1 ; }
[ ! -e "$(TARGET_DIR)/$(DIST_DIR).zip" ] \
|| { printf '$(TARGET_DIR)/$(DIST_DIR).zip: already exists\n' >&2 ; \
exit 1 ; }
export GIT_DIR=$$(pwd) ; \
cd "$(TARGET_DIR)" ; \
git clone "$${GIT_DIR}" "$(DIST_DIR)" ; \
cd "$(DIST_DIR)" ; \
make all ; \
make clean ; \
rm -rf .git ; \
cd .. ; \
zip -r "$(DIST_DIR).zip" "$(DIST_DIR)" ; \
rm -rf "$(DIST_DIR)"