|
| 1 | +# Licensed to the Apache Software Foundation (ASF) under one |
| 2 | +# or more contributor license agreements. See the NOTICE file |
| 3 | +# distributed with this work for additional information |
| 4 | +# regarding copyright ownership. The ASF licenses this file |
| 5 | +# to you under the Apache License, Version 2.0 (the |
| 6 | +# "License"); you may not use this file except in compliance |
| 7 | +# with the License. You may obtain a copy of the License at |
| 8 | +# |
| 9 | +# http://www.apache.org/licenses/LICENSE-2.0 |
| 10 | +# |
| 11 | +# Unless required by applicable law or agreed to in writing, |
| 12 | +# software distributed under the License is distributed on an |
| 13 | +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| 14 | +# KIND, either express or implied. See the License for the |
| 15 | +# specific language governing permissions and limitations |
| 16 | +# under the License. |
| 17 | +# |
| 18 | +# Makefile for Apache Cloudberry MCP Server |
| 19 | +# |
| 20 | +# This Makefile integrates the Python-based MCP server into the |
| 21 | +# Cloudberry build system. It uses uv (preferred) or pip for |
| 22 | +# dependency management and installation. |
| 23 | +# |
| 24 | + |
| 25 | +# Get build configuration from top-level Makefile |
| 26 | +subdir = mcp-server |
| 27 | +top_builddir = .. |
| 28 | +include $(top_builddir)/src/Makefile.global |
| 29 | + |
| 30 | +# Installation directories |
| 31 | +# Note: Use $(prefix) directly to avoid automatic /postgresql suffix added by $(datadir) |
| 32 | +MCP_SERVER_BIN_DIR = $(prefix)/bin |
| 33 | + |
| 34 | +# Python and package manager |
| 35 | +# Note: fastmcp requires Python 3.10+ |
| 36 | +PYTHON3 ?= python3.11 |
| 37 | +UV ?= uv |
| 38 | +PIP3 ?= pip3.11 |
| 39 | + |
| 40 | +# Determine which package manager to use |
| 41 | +USE_UV := $(shell command -v $(UV) 2> /dev/null) |
| 42 | + |
| 43 | +# Build directory |
| 44 | +BUILD_DIR = dist |
| 45 | +VENV_DIR = .venv |
| 46 | + |
| 47 | +.PHONY: all build install installdirs uninstall clean distclean |
| 48 | + |
| 49 | +all: build |
| 50 | + |
| 51 | +# Build the MCP server package |
| 52 | +build: |
| 53 | + @echo "Building Apache Cloudberry MCP Server..." |
| 54 | +ifdef USE_UV |
| 55 | + @echo "Using uv for build..." |
| 56 | + $(UV) build |
| 57 | +else |
| 58 | + @echo "Using pip for build..." |
| 59 | + $(PYTHON3) -m pip install --upgrade build |
| 60 | + $(PYTHON3) -m build |
| 61 | +endif |
| 62 | + @echo "MCP Server build complete." |
| 63 | + |
| 64 | +# Install the MCP server |
| 65 | +install: build installdirs |
| 66 | + @echo "Installing Apache Cloudberry MCP Server..." |
| 67 | +ifdef USE_UV |
| 68 | + @echo "Installing with uv..." |
| 69 | + $(UV) pip install --system --prefix=$(DESTDIR)$(prefix) $(BUILD_DIR)/*.whl |
| 70 | +else |
| 71 | + @echo "Installing with pip..." |
| 72 | + $(PIP3) install --target=$(DESTDIR)$(prefix)/lib/python$$($(PYTHON3) -c "import sys; print('%d.%d' % (sys.version_info.major, sys.version_info.minor))")/site-packages $(BUILD_DIR)/*.whl |
| 73 | +endif |
| 74 | + @# Create a wrapper script for easier invocation |
| 75 | + @echo '#!/bin/sh' > '$(DESTDIR)$(MCP_SERVER_BIN_DIR)/cloudberry-mcp-server' |
| 76 | + @echo '# Wrapper script for Apache Cloudberry MCP Server' >> '$(DESTDIR)$(MCP_SERVER_BIN_DIR)/cloudberry-mcp-server' |
| 77 | + @echo '' >> '$(DESTDIR)$(MCP_SERVER_BIN_DIR)/cloudberry-mcp-server' |
| 78 | + @echo '# Detect Python version and set PYTHONPATH' >> '$(DESTDIR)$(MCP_SERVER_BIN_DIR)/cloudberry-mcp-server' |
| 79 | + @echo 'PYTHON_VERSION=$$($(PYTHON3) -c "import sys; print(\"python%d.%d\" % (sys.version_info.major, sys.version_info.minor))")' >> '$(DESTDIR)$(MCP_SERVER_BIN_DIR)/cloudberry-mcp-server' |
| 80 | + @echo 'GPHOME="$$(cd "$$(dirname "$$0")/.." && pwd)"' >> '$(DESTDIR)$(MCP_SERVER_BIN_DIR)/cloudberry-mcp-server' |
| 81 | + @echo 'export PYTHONPATH="$$GPHOME/lib/$$PYTHON_VERSION/site-packages:$$PYTHONPATH"' >> '$(DESTDIR)$(MCP_SERVER_BIN_DIR)/cloudberry-mcp-server' |
| 82 | + @echo '' >> '$(DESTDIR)$(MCP_SERVER_BIN_DIR)/cloudberry-mcp-server' |
| 83 | + @echo 'exec $(PYTHON3) -m cbmcp.server "$$@"' >> '$(DESTDIR)$(MCP_SERVER_BIN_DIR)/cloudberry-mcp-server' |
| 84 | + @chmod +x '$(DESTDIR)$(MCP_SERVER_BIN_DIR)/cloudberry-mcp-server' |
| 85 | + @echo "MCP Server installation complete." |
| 86 | + @echo "Installed to: $(DESTDIR)$(prefix)" |
| 87 | + @echo "You can run it with: cloudberry-mcp-server" |
| 88 | + |
| 89 | +# Create installation directories |
| 90 | +installdirs: |
| 91 | + $(MKDIR_P) '$(DESTDIR)$(MCP_SERVER_BIN_DIR)' |
| 92 | + |
| 93 | +# Uninstall the MCP server |
| 94 | +uninstall: |
| 95 | + @echo "Uninstalling Apache Cloudberry MCP Server..." |
| 96 | + rm -f '$(DESTDIR)$(MCP_SERVER_BIN_DIR)/cloudberry-mcp-server' |
| 97 | +ifdef USE_UV |
| 98 | + -$(UV) pip uninstall --system cloudberry-mcp-server 2>/dev/null || true |
| 99 | +else |
| 100 | + -$(PIP3) uninstall -y cloudberry-mcp-server 2>/dev/null || true |
| 101 | +endif |
| 102 | + @echo "MCP Server uninstalled." |
| 103 | + |
| 104 | +# Clean build artifacts |
| 105 | +clean: |
| 106 | + @echo "Cleaning MCP Server build artifacts..." |
| 107 | + rm -rf $(BUILD_DIR) |
| 108 | + rm -rf $(VENV_DIR) |
| 109 | + rm -rf build |
| 110 | + rm -rf *.egg-info |
| 111 | + rm -rf src/*.egg-info |
| 112 | + find . -type d -name __pycache__ -exec rm -rf {} + 2>/dev/null || true |
| 113 | + find . -type f -name '*.pyc' -delete 2>/dev/null || true |
| 114 | + find . -type f -name '*.pyo' -delete 2>/dev/null || true |
| 115 | + @echo "MCP Server cleaned." |
| 116 | + |
| 117 | +# Distclean - remove all generated files |
| 118 | +distclean: clean |
| 119 | + @echo "Deep cleaning MCP Server..." |
| 120 | + rm -rf .pytest_cache |
| 121 | + rm -rf .coverage |
| 122 | + rm -rf htmlcov |
| 123 | + @echo "MCP Server distclean complete." |
| 124 | + |
| 125 | +# Help target |
| 126 | +help: |
| 127 | + @echo "Apache Cloudberry MCP Server Makefile" |
| 128 | + @echo "" |
| 129 | + @echo "Available targets:" |
| 130 | + @echo " all - Build the MCP server (default)" |
| 131 | + @echo " build - Build the MCP server package" |
| 132 | + @echo " install - Install the MCP server" |
| 133 | + @echo " uninstall - Uninstall the MCP server" |
| 134 | + @echo " clean - Remove build artifacts" |
| 135 | + @echo " distclean - Remove all generated files" |
| 136 | + @echo " help - Show this help message" |
| 137 | + @echo "" |
| 138 | + @echo "Configuration:" |
| 139 | + @echo " PYTHON3 = $(PYTHON3)" |
| 140 | +ifdef USE_UV |
| 141 | + @echo " UV = $(UV) (using uv)" |
| 142 | +else |
| 143 | + @echo " PIP3 = $(PIP3) (using pip)" |
| 144 | +endif |
| 145 | + @echo " Install to = $(prefix)" |
0 commit comments