Repository navigation
Expand file tree
/
Copy pathMakefile
More file actions
181 lines (158 loc) · 8.83 KB
/
Copy pathMakefile
File metadata and controls
181 lines (158 loc) · 8.83 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
# BGE 开放平台 Makefile 工具
#
# 说明:
# - 解释器优先用 python3,回退 python;pip 始终绑定到该解释器(python -m pip),
# 避免 PATH 中 pip 与 python 来自不同环境导致装错位置。
# - 预编译 server wheel 现已统一为通用 py3-none-any(纯 Python,无需 Cython/gcc),
# 由 `make build-server-wheels` 产出到 server/wheels/。
PYTHON := $(shell command -v python3 2>/dev/null || command -v python 2>/dev/null || echo python)
PIP := $(PYTHON) -m pip
# 安装 SDK(等价 pip install .)
install:
$(PIP) install .
# 安装 shell 自动补全脚本(开发期用)。
# 注意: pip install -e . 不会安装 [options.data_files](PEP 660 可编辑安装局限),
# 因此可编辑安装不会自动启用补全;运行此目标把脚本装入用户级补全目录。
install-completion:
@BDIR="$${XDG_DATA_HOME:-$$HOME/.local/share}/bash-completion/completions"; \
ZDIR="$${ZDOTDIR:-$$HOME}/.local/share/zsh/site-functions"; \
install -Dm644 "$(CURDIR)/completions/bge.bash" "$$BDIR/bge"; \
install -Dm644 "$(CURDIR)/completions/_bge" "$$ZDIR/_bge"; \
echo "已安装 bash 补全 -> $$BDIR/bge"; \
echo "已安装 zsh 补全 -> $$ZDIR/_bge"
# 验证补全是否可注册(需先 pip install -e . 安装 bge 入口)
test-completion:
@command -v bge >/dev/null 2>&1 || { echo "错误: 未找到 bge 命令,请先执行 pip install -e ."; exit 1; }
@command -v register-python-argcomplete >/dev/null 2>&1 || { echo "错误: 未安装 argcomplete(pip install -e . 应已带入)"; exit 1; }
@bash -c 'source "$(CURDIR)/completions/bge.bash" && complete -p bge | grep -q _python_argcomplete && echo "OK: bge 自动补全已注册 -> $$(complete -p bge)"'
# 构建 wheel 与源码包(PEP 621,需 build 工具),产物输出到 dist/
build:
$(PIP) install build
rm -rf build dist
$(PYTHON) -m build
# 系统级 Linux 包(需先 make build 生成 wheel)。
# 注意:本机 fpm 1.x 不支持 `wheel` 源类型(仅支持 python/dir 等),
# 故改为:用 pip 将 wheel 解包到暂存根目录(dist/pkgroot),把 bin/ / share/
# 归位到 /usr/bin、/usr/share,再用 `fpm -s dir` 按绝对路径打包。Python 库统一
# 装入 /usr/lib/python3/dist-packages(Debian/Ubuntu 约定;Fedora/RHEL 若需可把该
# 前缀改为 .../site-packages)。fpm 为 RubyGem,安装:gem install fpm
# (部分发行版也可 apt install fpm / dnf install fpm)。构建 rpm 还需 rpmbuild。
PKG_NAME := bge-python-sdk
VERSION := $(shell $(PYTHON) -c "import bgesdk.version as _v; print(_v.__version__)" 2>/dev/null || echo 0.0.0)
PKGROOT := dist/pkgroot
build-deb: build
@command -v fpm >/dev/null 2>&1 || { \
echo "错误: 未安装 fpm,请先安装: gem install fpm(或 apt install fpm / dnf install fpm)"; exit 1; }
@rm -rf $(PKGROOT)
@mkdir -p $(PKGROOT)/usr/bin $(PKGROOT)/usr/share $(PKGROOT)/usr/lib/python3/dist-packages
@$(PIP) install --no-deps --target $(PKGROOT)/usr/lib/python3/dist-packages dist/*.whl >/dev/null
@if [ -d $(PKGROOT)/usr/lib/python3/dist-packages/bin ]; then \
mv $(PKGROOT)/usr/lib/python3/dist-packages/bin/* $(PKGROOT)/usr/bin/ && \
rmdir $(PKGROOT)/usr/lib/python3/dist-packages/bin; fi
@if [ -d $(PKGROOT)/usr/lib/python3/dist-packages/share ]; then \
mv $(PKGROOT)/usr/lib/python3/dist-packages/share/* $(PKGROOT)/usr/share/ && \
rmdir $(PKGROOT)/usr/lib/python3/dist-packages/share; fi
@fpm -s dir -t deb -n $(PKG_NAME) -v $(VERSION) -a all -p dist/ \
--license MIT --exclude '*/tests/*' -C $(PKGROOT) .
@rm -rf $(PKGROOT)
build-rpm: build
@command -v fpm >/dev/null 2>&1 || { \
echo "错误: 未安装 fpm,请先安装: gem install fpm(或 apt install fpm / dnf install fpm)"; exit 1; }
@command -v rpmbuild >/dev/null 2>&1 || { \
echo "错误: 构建 rpm 需要 rpmbuild,请先安装: apt install rpm / dnf install rpm-build"; exit 1; }
@rm -rf $(PKGROOT)
@mkdir -p $(PKGROOT)/usr/bin $(PKGROOT)/usr/share $(PKGROOT)/usr/lib/python3/dist-packages
@$(PIP) install --no-deps --target $(PKGROOT)/usr/lib/python3/dist-packages dist/*.whl >/dev/null
@if [ -d $(PKGROOT)/usr/lib/python3/dist-packages/bin ]; then \
mv $(PKGROOT)/usr/lib/python3/dist-packages/bin/* $(PKGROOT)/usr/bin/ && \
rmdir $(PKGROOT)/usr/lib/python3/dist-packages/bin; fi
@if [ -d $(PKGROOT)/usr/lib/python3/dist-packages/share ]; then \
mv $(PKGROOT)/usr/lib/python3/dist-packages/share/* $(PKGROOT)/usr/share/ && \
rmdir $(PKGROOT)/usr/lib/python3/dist-packages/share; fi
@fpm -s dir -t rpm -n $(PKG_NAME) -v $(VERSION) -a noarch -p dist/ \
--license MIT --exclude '*/tests/*' -C $(PKGROOT) .
@rm -rf $(PKGROOT)
# 预编译 bge-model-server 通用 wheel(纯 Python,py3-none-any)
# 由 server/build_wheels.sh 用任一 >=3.6 解释器构建,覆盖所有 runtime。
build-server-wheels:
bash bgesdk/management/model_runtime/server/build_wheels.sh
# 集成测试(需线上凭证,通过 --run-integration 运行)
test:
$(PIP) install -e ".[test]"
set -a; . ./.env.dev; set +a; \
pytest -s --run-integration --cov-config=./.coveragerc --cov-report html --cov-report xml --cov=./
test-pro:
$(PIP) install -e ".[test]"
set -a; . ./.env.pro; set +a; \
pytest -s --run-integration --cov-config=./.coveragerc --cov-report html --cov-report xml --cov=./
# 仅运行离线单元测试(不触发任何网络请求,无需凭证)
# 安装步骤设为非致命:优先 editable 安装(含 test extra),失败则退回仅安装
# 纯 Python 测试依赖;若依赖已在环境中则直接运行,避免网络受限时整体失败。
test-offline:
-$(PIP) install -e ".[test]" >/dev/null 2>&1 || $(PIP) install 'requests-mock>=1.9.0' 'pytest>=7.0' 'pytest-cov>=4.0' >/dev/null 2>&1 || true
$(PYTHON) -m pytest -s --cov-config=./.coveragerc --cov-report term-missing --cov=bgesdk
upload-test:
$(PIP) install twine
twine upload --repository-url https://test.pypi.org/legacy/ dist/*
upload:
$(PIP) install twine
twine upload dist/*
changelog:
npm run changelog
# 版本号由人工指定:make bump VERSION=2.5.0
# bump2version 按 .bumpversion.cfg 改 version.py + package.json 并提交、打 tag;
# 此处再生成 CHANGELOG 并提交(bump2version 提交时 CHANGELOG 尚未更新)。
bump:
@test -n "$(VERSION)" || (echo "用法: make bump VERSION=x.y.z" && exit 1)
$(PIP) install bump2version
bump2version --new-version $(VERSION) patch
npm run changelog
git add CHANGELOG.md
git commit -m "docs: update CHANGELOG for $$(git describe --tags --abbrev=0)"
# 类型检查与 lint(ruff + mypy)
lint:
$(PIP) install ruff mypy types-requests
ruff check bgesdk
mypy bgesdk
# 统一格式化(isort 按 pyproject.toml 配置 + black + ruff 自动修复)。
# 注意:isort 不得加 --profile black(其会重置 sections,破坏"自有模块优先"导入顺序,
# 详见 pyproject.toml [tool.isort] 注释)。
format:
$(PIP) install black isort ruff
isort bgesdk
black bgesdk
ruff check --fix bgesdk
# 仅类型检查
typecheck:
$(PIP) install mypy types-requests
mypy bgesdk
# 清理构建与缓存产物(保留 server/wheels 预编译 wheel)
clean:
rm -rf build dist *.egg-info .pytest_cache .mypy_cache .ruff_cache htmlcov coverage.xml .coverage
find bgesdk tests -type d -name __pycache__ -prune -exec rm -rf {} + 2>/dev/null || true
rm -rf bgesdk/management/model_runtime/server/build
rm -rf bgesdk/management/model_runtime/server/*.egg-info
rm -rf bgesdk/management/model_runtime/server/bge_model_server.egg-info
rm -rf .bge/tmp/*
# 彻底清理:clean 基础上再删除预编译 server wheels(下次需重新 build-server-wheels)
clean-all: clean
rm -f bgesdk/management/model_runtime/server/wheels/*.whl
# 查看可用命令
help:
@echo "可用命令(make <目标>):"
@echo " install 安装 SDK(pip install .)"
@echo " install-completion 安装 bash/zsh 自动补全脚本"
@echo " build 构建 wheel + sdist 到 dist/"
@echo " build-deb 构建 Debian/Ubuntu 包 (.deb) 到 dist/(需 fpm)"
@echo " build-rpm 构建 RHEL/CentOS/Fedora 包 (.rpm) 到 dist/(需 fpm)"
@echo " build-server-wheels 构建通用 bge-model-server wheel 到 server/wheels/"
@echo " test / test-pro 运行集成测试(需 .env.dev / .env.pro 凭证)"
@echo " test-offline 运行离线单元测试(无需凭证)"
@echo " lint / typecheck 静态检查 / 类型检查(ruff + mypy)"
@echo " format 格式化(isort + black + ruff 自动修复)"
@echo " bump VERSION=x.y.z 升级版本号并提交、打 tag"
@echo " clean 清理构建与缓存产物"
@echo " clean-all clean + 删除预编译 server wheels"
.PHONY: help install install-completion test-completion build build-deb \
build-rpm build-server-wheels test test-pro test-offline upload \
upload-test changelog bump lint format typecheck clean clean-all