Repository navigation
Expand file tree
/
Copy pathMakefile
More file actions
115 lines (101 loc) · 4.96 KB
/
Copy pathMakefile
File metadata and controls
115 lines (101 loc) · 4.96 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
# ---------------------------------------------------------------------------
# Top-level Makefile — thin PGXS-compatible wrapper around the CMake build.
#
# CMakeLists.txt remains the source of truth. This file exists so that the
# standard PGXS workflow works out of the box:
#
# make # configure + build (Release)
# sudo make install # install to $(pg_config --pkglibdir)/share
# make installcheck # run regression suite against the installed extension
# make clean
# make uninstall
#
# In particular it lets PGXN's client install the extension via
#
# pgxn install pg_orca
#
# which internally runs `make USE_PGXS=1` + `make USE_PGXS=1 install`. We
# accept (and ignore) USE_PGXS=1 — we don't actually pull in pgxs.mk, since
# pgxs's single-target $(MODULES) model doesn't fit a 4-library C++ project
# with xerces-c linkage. CMake handles all of that.
#
# Variables you may override on the command line:
#
# PG_CONFIG=/path/to/pg_config (default: first pg_config on PATH)
# BUILD_TYPE=Release|Debug|... (default: Release)
# BUILD_DIR=build (default: build)
# JOBS=N (default: $(nproc))
# GENERATOR="Ninja"|"Unix Makefiles" (default: Ninja if available)
# DESTDIR=/tmp/stage passed through to cmake --install
# ---------------------------------------------------------------------------
PG_CONFIG ?= pg_config
BUILD_TYPE ?= Release
BUILD_DIR ?= build
JOBS ?= $(shell nproc 2>/dev/null || sysctl -n hw.ncpu 2>/dev/null || echo 4)
# Prefer Ninja; fall back to Unix Makefiles if it's not installed.
GENERATOR ?= $(shell command -v ninja >/dev/null 2>&1 && echo Ninja || echo "Unix Makefiles")
CMAKE ?= cmake
CMAKE_ARGS ?=
CONFIGURE_STAMP = $(BUILD_DIR)/CMakeCache.txt
.PHONY: all configure build install installcheck clean distclean uninstall help
all: build
# --- configure ------------------------------------------------------------
$(CONFIGURE_STAMP):
@echo ">>> configuring CMake (BUILD_TYPE=$(BUILD_TYPE), generator='$(GENERATOR)')"
$(CMAKE) -S . -B $(BUILD_DIR) -G "$(GENERATOR)" \
-DCMAKE_BUILD_TYPE=$(BUILD_TYPE) \
-DPG_CONFIG=$(PG_CONFIG) \
$(CMAKE_ARGS)
configure: $(CONFIGURE_STAMP)
# --- build ----------------------------------------------------------------
build: configure
$(CMAKE) --build $(BUILD_DIR) -j $(JOBS)
# --- install --------------------------------------------------------------
# DESTDIR is the GNU-make convention for staged installs and is honored by
# cmake --install via the env var (package builders like rpm/deb rely on it).
# Empty DESTDIR is safe — cmake treats it as "install to absolute paths".
install: build
DESTDIR=$(DESTDIR) $(CMAKE) --install $(BUILD_DIR)
# --- regression check -----------------------------------------------------
# Runs the pg_orca-specific regression schedule against an installed
# extension. PG_CONFIG must point to the same instance the extension is
# installed in; PG_REGRESS_SQL must point to the PG source tree's
# src/test/regress (the schedules reference files there).
installcheck:
@if [ -z "$$PG_REGRESS_SQL" ]; then \
echo "PG_REGRESS_SQL must be set to PostgreSQL's src/test/regress directory" >&2; \
echo " e.g.: export PG_REGRESS_SQL=/path/to/postgresql/src/test/regress" >&2; \
exit 1; \
fi
PG_CONFIG=$(PG_CONFIG) test/test.sh --orca-tests
# --- clean ----------------------------------------------------------------
clean:
@if [ -d $(BUILD_DIR) ]; then $(CMAKE) --build $(BUILD_DIR) --target clean; fi
distclean:
rm -rf $(BUILD_DIR)
# --- uninstall ------------------------------------------------------------
# CMake does not generate an uninstall target by default, but it records every
# installed path in $(BUILD_DIR)/install_manifest.txt — remove those.
uninstall:
@if [ ! -f $(BUILD_DIR)/install_manifest.txt ]; then \
echo "No $(BUILD_DIR)/install_manifest.txt — nothing to uninstall." >&2; \
exit 1; \
fi
xargs rm -fv < $(BUILD_DIR)/install_manifest.txt
# --- help -----------------------------------------------------------------
help:
@echo "Targets:"
@echo " make configure + build (Release)"
@echo " make install install to PG's pkglibdir / sharedir"
@echo " make installcheck run ORCA regression tests (needs PG_REGRESS_SQL)"
@echo " make clean clean build artifacts"
@echo " make distclean remove the entire build directory"
@echo " make uninstall remove installed files (uses install_manifest.txt)"
@echo ""
@echo "Variables (override on cmdline, e.g. make PG_CONFIG=/usr/pgsql-18/bin/pg_config):"
@echo " PG_CONFIG path to pg_config [$(PG_CONFIG)]"
@echo " BUILD_TYPE CMake build type [$(BUILD_TYPE)]"
@echo " BUILD_DIR out-of-tree build directory [$(BUILD_DIR)]"
@echo " JOBS parallel build jobs [$(JOBS)]"
@echo " GENERATOR CMake generator [$(GENERATOR)]"
@echo " CMAKE_ARGS extra args passed to cmake [$(CMAKE_ARGS)]"