-
Notifications
You must be signed in to change notification settings - Fork 40
Expand file tree
/
Copy pathMakefile
More file actions
243 lines (213 loc) · 9.81 KB
/
Makefile
File metadata and controls
243 lines (213 loc) · 9.81 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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
# OceanBase Diagnostic Tool - Development Makefile
# Converted from dev_helper.sh
SHELL := /bin/bash
PROJECT_PATH := $(shell pwd)
WORK_DIR := $(shell pwd)
OBDIAG_HOME ?= $(HOME)/.obdiag
RELEASE ?= $(shell date +%Y%m%d%H%M)
OBDIAG_VERSION ?= 5.0.0
# URLs for obstack downloads
OBUTILS_AARCH64_URL := https://obbusiness-private.oss-cn-shanghai.aliyuncs.com/download-center/opensource/observer/v4.3.5_CE/oceanbase-ce-utils-4.3.5.0-100000202024123117.el7.aarch64.rpm
OBUTILS_X64_URL := https://obbusiness-private.oss-cn-shanghai.aliyuncs.com/download-center/opensource/observer/v4.3.5_CE/oceanbase-ce-utils-4.3.5.0-100000202024123117.el7.x86_64.rpm
# Python version requirements
PYTHON_MIN_MAJOR := 3
PYTHON_MIN_MINOR := 11
.PHONY: all help pack clean init format download_obstack clean_rpm check_python install_requirements copy_files backup_obdiag build_update_package pack_ubuntu clean_deb
# Default target
all: help
# Show help information
help:
@echo "Usage: make <target>"
@echo ""
@echo "Targets:"
@echo " pack - Build RPM package"
@echo " pack_ubuntu - Build Ubuntu/Debian package (.deb)"
@echo " build_update_package - Build plugins update package (data.tar + version.yaml)"
@echo " clean - Clean result files (gather/analyze packs)"
@echo " clean_rpm - Clean old RPM build data"
@echo " clean_deb - Clean old Debian build data"
@echo " init - Initialize development environment"
@echo " format - Format code with black"
@echo " download_obstack - Download obstack tools"
@echo " check_python - Check Python version (>= 3.11)"
@echo " help - Show this help message"
# Build RPM package
# Note: requires rpm-build package, install with: sudo yum install rpm-build -y
pack: clean_rpm download_obstack
@echo "Building RPM package (version: $(OBDIAG_VERSION))..."
@command -v rpmbuild >/dev/null 2>&1 || (echo "Error: rpmbuild not found. Please install: sudo yum install rpm-build -y" && exit 1)
@export RELEASE=$(RELEASE) && \
export OBDIAG_VERSION=$(OBDIAG_VERSION) && \
rpmbuild -bb ./rpm/oceanbase-diagnostic-tool.spec && \
rpm_path=$$(find ~/rpmbuild -name "oceanbase-diagnostic-tool-*$(RELEASE)*.rpm") && \
echo "rpm_path: $${rpm_path}" && \
cp -rf $${rpm_path} ./ && \
echo "rpm cp to: $$(pwd)/$$(basename $${rpm_path})"
@echo "Build RPM package success"
# Build Ubuntu/Debian package
# Note: requires dpkg-dev package, install with: sudo apt install dpkg-dev -y
# Alternatively use: ./ubuntu/build_ubuntu.sh
pack_ubuntu: clean_deb download_obstack
@echo "Building Ubuntu/Debian package (version: $(OBDIAG_VERSION))..."
@command -v dpkg-deb >/dev/null 2>&1 || (echo "Error: dpkg-deb not found. Please install: sudo apt install dpkg-dev -y" && exit 1)
@chmod +x $(PROJECT_PATH)/ubuntu/build_ubuntu.sh
@$(PROJECT_PATH)/ubuntu/build_ubuntu.sh $(OBDIAG_VERSION) $(RELEASE)
# Clean old Debian build data
clean_deb:
@echo "Cleaning old Debian build data..."
@rm -rf ./build_deb ./debian/oceanbase-diagnostic-tool
@rm -rf ./debian/*.debhelper ./debian/*.substvars ./debian/files
@rm -rf ./debian/debhelper-build-stamp
@rm -f ../*.deb ../*.changes ../*.buildinfo ./*.deb
@rm -rf ./dist ./build ./src/obdiag.py
@echo "Clean old Debian build data success"
# Build plugins update package
build_update_package:
@echo "Building plugins update package..."
@cd plugins && tar -cvf data.tar *
@sha=$$(cd plugins && sha256sum data.tar | awk '{print $$1}') && \
echo "obdiag_version: \"$(OBDIAG_VERSION)\"" > version.yaml && \
echo "remote_tar_sha: \"$$sha\"" >> version.yaml
@mv plugins/data.tar ./
@echo ""
@echo "Build completed:"
@echo " - data.tar (plugins archive)"
@echo " - version.yaml (version and SHA256)"
@cat version.yaml
# Download obstack tools
download_obstack:
@echo "Checking obstack..."
@test "$(CURDIR)" != "/" || (echo "Error: do not run make from / (rm -rf ./usr would delete the system /usr)." && exit 1)
@mkdir -p ./dependencies/bin
@if [ -f ./dependencies/bin/obstack_aarch64 ]; then \
echo "obstack_aarch64 exists, skip download"; \
else \
echo "Downloading aarch64 obstack..."; \
wget --quiet $(OBUTILS_AARCH64_URL) -O ./obutils.rpm && \
rpm2cpio obutils.rpm | cpio -idv && \
cp -f ./usr/bin/obstack ./dependencies/bin/obstack_aarch64 && \
rm -rf ./usr ./obutils.rpm; \
fi
@if [ -f ./dependencies/bin/obstack_x86_64 ]; then \
echo "obstack_x86_64 exists, skip download"; \
else \
echo "Downloading x64 obstack..."; \
wget --quiet $(OBUTILS_X64_URL) -O ./obutils.rpm && \
rpm2cpio obutils.rpm | cpio -idv && \
cp -f ./usr/bin/obstack ./dependencies/bin/obstack_x86_64 && \
rm -rf ./usr ./obutils.rpm; \
fi
# Clean old RPM build data
clean_rpm:
@echo "Cleaning old RPM data..."
@rm -rf ./rpmbuild ./build ./dist ./src/obdiag.py ./BUILDROOT ./get-pip.py ./obdiag.spec
@echo "Clean old RPM data success"
# Clean result files
clean:
@echo "Cleaning result files..."
@rm -rf ./obdiag_gather_pack_* ./obdiag_analyze_pack_* ./obdiag_analyze_flt_result* ./obdiag_check_report
@echo "Clean result files success"
# Check Python version
check_python:
@echo "Checking Python version..."
@python3 -c "import sys; exit(0 if sys.version_info >= ($(PYTHON_MIN_MAJOR), $(PYTHON_MIN_MINOR)) else 1)" || \
(echo "Error: Python version must be >= $(PYTHON_MIN_MAJOR).$(PYTHON_MIN_MINOR)" && exit 1)
@echo "Python version check passed"
# Install requirements (from pyproject.toml)
install_requirements:
@echo "Installing dependencies from pyproject.toml..."
@pip3 install -e "$(PROJECT_PATH)"
# Backup obdiag folders
backup_obdiag:
@echo "Backing up obdiag folders..."
@mkdir -p $(OBDIAG_HOME)/dev_backup
@datestamp=$$(date +%Y%m%d_%H%M%S) && \
tar -czf $(OBDIAG_HOME)/dev_backup/obdiag_backup_$${datestamp}.tar.gz \
-C $(OBDIAG_HOME) check display gather rca 2>/dev/null || \
echo "No folders found to back up or backup failed"
# Copy plugin files to OBDIAG_HOME
copy_files:
@echo "Copying files to $(OBDIAG_HOME)..."
@mkdir -p $(OBDIAG_HOME)/check $(OBDIAG_HOME)/gather $(OBDIAG_HOME)/display
@cp -rf $(WORK_DIR)/plugins/* $(OBDIAG_HOME)/
@if [ -d "$(WORK_DIR)/example" ]; then \
cp -rf $(WORK_DIR)/example $(OBDIAG_HOME)/; \
fi
@echo "Files copied successfully"
# Remove existing obdiag folders
remove_folders:
@echo "Removing existing folders..."
@for folder in check display gather rca; do \
if [ -d "$(OBDIAG_HOME)/$$folder" ]; then \
echo "Removing $(OBDIAG_HOME)/$$folder"; \
rm -rf "$(OBDIAG_HOME)/$$folder"; \
fi; \
done
# Initialize development environment
init: check_python backup_obdiag remove_folders copy_files install_requirements download_obstack
@echo "Setting up environment..."
@export PYTHONPATH=$$PYTHONPATH:$(PROJECT_PATH)
@source $(WORK_DIR)/rpm/init_obdiag_cmd.sh 2>/dev/null || true
@echo ""
@echo "=============================================="
@echo "Initialization completed successfully!"
@echo ""
@echo "Please run the following commands manually:"
@echo " export PYTHONPATH=\$$PYTHONPATH:$(PROJECT_PATH)"
@echo " alias obdiag='python3 $(PROJECT_PATH)/src/main.py'"
@echo ""
@echo "Or add them to your ~/.bashrc:"
@echo " echo 'export PYTHONPATH=\$$PYTHONPATH:$(PROJECT_PATH)' >> ~/.bashrc"
@echo " echo \"alias obdiag='python3 $(PROJECT_PATH)/src/main.py'\" >> ~/.bashrc"
@echo " source ~/.bashrc"
@echo "=============================================="
# Format code with black
format:
@echo "Formatting code with black..."
@command -v black >/dev/null 2>&1 || pip3 install --user black
@black -S -l 256 .
@echo "Code formatting completed"
# Additional useful targets
# Run obdiag directly (for development)
run:
@PYTHONPATH=$(PROJECT_PATH):$$PYTHONPATH python3 $(PROJECT_PATH)/src/main.py $(ARGS)
# Run tests (placeholder)
test:
@echo "Running tests..."
@PYTHONPATH=$(PROJECT_PATH):$$PYTHONPATH python3 -m pytest test/ -v 2>/dev/null || echo "No tests found or pytest not installed"
# Show current configuration
info:
@echo "Project Configuration:"
@echo " PROJECT_PATH: $(PROJECT_PATH)"
@echo " WORK_DIR: $(WORK_DIR)"
@echo " OBDIAG_HOME: $(OBDIAG_HOME)"
@echo " OBDIAG_VERSION: $(OBDIAG_VERSION)"
@echo " RELEASE: $(RELEASE)"
@echo " Python: $$(python3 --version 2>&1)"
# ==================== macOS Targets ====================
.PHONY: pack_macos install_macos uninstall_macos
# Install obdiag locally on macOS (Homebrew-style)
install_macos:
@echo "Installing obdiag on macOS..."
@chmod +x $(PROJECT_PATH)/macos/test_local_install.sh
@$(PROJECT_PATH)/macos/test_local_install.sh install
# Uninstall obdiag from macOS
uninstall_macos:
@echo "Uninstalling obdiag from macOS..."
@chmod +x $(PROJECT_PATH)/macos/uninstall.sh
@$(PROJECT_PATH)/macos/uninstall.sh
# Build macOS package (requires Python 3.11+)
pack_macos:
@echo "Building macOS package (version: $(OBDIAG_VERSION))..."
@command -v pyinstaller >/dev/null 2>&1 || pip3 install pyinstaller
@mkdir -p $(PROJECT_PATH)/dist_macos
@cp -f src/main.py src/obdiag.py
@sed -i '' "s/<B_TIME>/$$(date)/" ./src/common/version.py 2>/dev/null || sed -i "s/<B_TIME>/$$(date)/" ./src/common/version.py
@sed -i '' "s/<VERSION>/$(OBDIAG_VERSION)/" ./src/common/version.py 2>/dev/null || sed -i "s/<VERSION>/$(OBDIAG_VERSION)/" ./src/common/version.py
@pyinstaller --hidden-import=decimal --hidden-import=pyzipper --copy-metadata genai_prices --copy-metadata pydantic-ai-slim --copy-metadata pydantic-ai-skills --copy-metadata pydantic --copy-metadata pydantic-core --copy-metadata pydantic-graph --copy-metadata pydantic-settings --copy-metadata openai -p $(PROJECT_PATH)/src -F src/obdiag.py --distpath $(PROJECT_PATH)/dist_macos
@rm -f src/obdiag.py
@echo "macOS binary built: $(PROJECT_PATH)/dist_macos/obdiag"
@echo ""
@echo "To create a distributable package:"
@echo " 1. Copy dist_macos/obdiag, plugins/, conf/, example/ to a directory"
@echo " 2. Create a DMG or ZIP file for distribution"