-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMakefile
More file actions
100 lines (83 loc) · 3.39 KB
/
Copy pathMakefile
File metadata and controls
100 lines (83 loc) · 3.39 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
APP_NAME := ShadowSpace
BUILD_DIR := build
APP_BUNDLE := $(BUILD_DIR)/$(APP_NAME).app
RELEASE_BIN := .build/release/$(APP_NAME)
# 簽章身分:預設 ad-hoc(本機測試)。發佈時覆寫為 Developer ID Application。
# make release SIGN_IDENTITY="Developer ID Application: 你的名字 (TEAMID)"
SIGN_IDENTITY ?= -
NOTARY_PROFILE ?= ShadowSpaceNotary
VERSION = $(shell /usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" Resources/Info.plist)
.PHONY: all setup build app sign run dev test engine dmg notarize release appstore-project appstore-preflight clean
all: app
## 一鍵完成:下載引擎 + 編譯 + 打包
setup: engine app
@echo ""
@echo "✅ 完成!執行 make run 啟動 ShadowSpace"
## 下載 sing-box 核心到 vendor/(App 內也可自動下載,但發佈版建議內嵌)
engine:
./scripts/fetch-singbox.sh
build:
swift build -c release
## 組裝 .app 並簽署(預設 ad-hoc;簽章邏輯在 scripts/sign.sh)
app: build
rm -rf $(APP_BUNDLE)
mkdir -p $(APP_BUNDLE)/Contents/MacOS $(APP_BUNDLE)/Contents/Resources
cp $(RELEASE_BIN) $(APP_BUNDLE)/Contents/MacOS/$(APP_NAME)
cp Resources/Info.plist $(APP_BUNDLE)/Contents/Info.plist
@if [ -f Resources/AppIcon.icns ]; then \
cp Resources/AppIcon.icns $(APP_BUNDLE)/Contents/Resources/AppIcon.icns; \
echo "已套用 App 圖示"; \
fi
@if [ -d Localizations ]; then \
cp -R Localizations/*.lproj $(APP_BUNDLE)/Contents/Resources/ 2>/dev/null; \
echo "已內嵌在地化(en / zh-Hant)"; \
fi
@if [ -f vendor/sing-box ]; then \
mkdir -p $(APP_BUNDLE)/Contents/Resources/bin; \
cp vendor/sing-box $(APP_BUNDLE)/Contents/Resources/bin/sing-box; \
echo "已內嵌 sing-box 引擎"; \
else \
echo "(未內嵌引擎:App 會在首次連線自動下載。發佈版請先 make engine)"; \
fi
@SIGN_IDENTITY='$(SIGN_IDENTITY)' ./scripts/sign.sh $(APP_BUNDLE)
## 重新簽署既有 bundle(改了憑證時用)
sign:
@SIGN_IDENTITY='$(SIGN_IDENTITY)' ./scripts/sign.sh $(APP_BUNDLE)
run: app
open $(APP_BUNDLE)
## 開發模式(不打包,部分功能如登入啟動不可用)
dev:
swift run
test:
swift test
## 打包 DMG(帶 SIGN_IDENTITY 時一併簽署)
dmg:
@SIGN_IDENTITY='$(SIGN_IDENTITY)' ./scripts/make-dmg.sh $(APP_BUNDLE)
## 公證 .app(需先存好 notarytool 憑證 profile)
notarize:
./scripts/notarize.sh $(APP_BUNDLE)
## 完整發佈:簽章 → 公證 App → DMG → 公證 DMG(需 Developer ID 憑證)
release:
@if [ '$(SIGN_IDENTITY)' = '-' ]; then \
echo "❌ 請指定 Developer ID 憑證:"; \
echo ' make release SIGN_IDENTITY="Developer ID Application: 你的名字 (TEAMID)"'; \
exit 1; \
fi
@if [ ! -f vendor/sing-box ]; then \
echo "❌ 發佈版需內嵌引擎,請先執行:make engine"; \
exit 1; \
fi
$(MAKE) app SIGN_IDENTITY='$(SIGN_IDENTITY)'
NOTARY_PROFILE='$(NOTARY_PROFILE)' ./scripts/notarize.sh $(APP_BUNDLE)
$(MAKE) dmg SIGN_IDENTITY='$(SIGN_IDENTITY)'
NOTARY_PROFILE='$(NOTARY_PROFILE)' ./scripts/notarize.sh $(BUILD_DIR)/$(APP_NAME)-$(VERSION).dmg
@echo ""
@echo "🎉 發佈完成:$(BUILD_DIR)/$(APP_NAME)-$(VERSION).dmg"
## 產生 Mac App Store 專用 Xcode 工程(App + Network Extension)
appstore-project:
ruby scripts/generate-appstore-xcodeproj.rb
## Mac App Store preflight:產生工程、檢查 plist、做不簽章 Release build
appstore-preflight:
./scripts/appstore-preflight.sh
clean:
rm -rf .build $(BUILD_DIR)