diff --git a/.github/workflows/create_dmg.yml b/.github/workflows/create_dmg.yml
new file mode 100644
index 000000000..b47247fc2
--- /dev/null
+++ b/.github/workflows/create_dmg.yml
@@ -0,0 +1,62 @@
+name: Create macOS DMG
+on:
+ workflow_dispatch:
+
+jobs:
+ build:
+ name: Build ${{ matrix.arch }}
+ runs-on: macos-latest
+ strategy:
+ matrix:
+ # This creates two parallel jobs
+ arch: [arm64, amd64]
+
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v6
+ with:
+ ref: main
+
+ # 1. 安装指定版本的 Go (可选,但推荐)
+ - name: Setup Go
+ uses: actions/setup-go@v6
+ with:
+ go-version-file: go.mod
+
+ # 2. 安装 pnpm
+ - name: Install pnpm
+ run: brew install pnpm
+
+ # 3. 运行你的 Makefile 编译二进制文件
+ - name: Build with Make
+ run: make build ARCH=${{ matrix.arch }} && make build-macos-app ARCH=${{ matrix.arch }}
+
+ # 4. 签名
+ - name: Ad-hoc Sign
+ run: codesign --force --deep --sign - "build/PicoClaw Launcher.app"
+
+ # 5. 安装打包工具
+ - name: Install create-dmg
+ run: brew install create-dmg
+
+ # 6. 执行打包命令
+ - name: Create DMG
+ run: |
+ mkdir -p dist
+ create-dmg \
+ --volname "PicoClaw Installer" \
+ --window-pos 200 120 \
+ --window-size 800 400 \
+ --icon-size 100 \
+ --icon "PicoClaw Launcher.app" 200 190 \
+ --hide-extension "PicoClaw Launcher.app" \
+ --app-drop-link 600 185 \
+ "dist/picoclaw-${{ matrix.arch }}.dmg" \
+ "build/PicoClaw Launcher.app"
+
+ # 6. 上传文件到 GitHub Artifacts (供你下载)
+ - name: Upload DMG
+ uses: actions/upload-artifact@v4
+ with:
+ name: macos-dmg-${{ matrix.arch }}
+ path: dist/*.dmg
\ No newline at end of file
diff --git a/Makefile b/Makefile
index 992182775..21d8bdeac 100644
--- a/Makefile
+++ b/Makefile
@@ -93,13 +93,13 @@ ifeq ($(UNAME_S),Linux)
endif
else ifeq ($(UNAME_S),Darwin)
PLATFORM=darwin
- WEB_GO=CGO_ENABLED=1 go
+ WEB_GO=CGO_LDFLAGS="-mmacosx-version-min=10.11" CGO_CFLAGS="-mmacosx-version-min=10.11" CGO_ENABLED=1 go
ifeq ($(UNAME_M),x86_64)
- ARCH=amd64
+ ARCH?=amd64
else ifeq ($(UNAME_M),arm64)
- ARCH=arm64
+ ARCH?=arm64
else
- ARCH=$(UNAME_M)
+ ARCH?=$(UNAME_M)
endif
else
PLATFORM=$(UNAME_S)
@@ -122,7 +122,7 @@ generate:
build: generate
@echo "Building $(BINARY_NAME) for $(PLATFORM)/$(ARCH)..."
@mkdir -p $(BUILD_DIR)
- @$(GO) build $(GOFLAGS) -ldflags "$(LDFLAGS)" -o $(BINARY_PATH) ./$(CMD_DIR)
+ @GOARCH=${ARCH} $(GO) build $(GOFLAGS) -ldflags "$(LDFLAGS)" -o $(BINARY_PATH) ./$(CMD_DIR)
@echo "Build complete: $(BINARY_PATH)"
@ln -sf $(BINARY_NAME)-$(PLATFORM)-$(ARCH) $(BUILD_DIR)/$(BINARY_NAME)
@@ -130,7 +130,7 @@ build: generate
build-launcher:
@echo "Building picoclaw-launcher for $(PLATFORM)/$(ARCH)..."
@mkdir -p $(BUILD_DIR)
- @$(MAKE) -C web build \
+ @GOARCH=${ARCH} $(MAKE) -C web build \
OUTPUT="$(CURDIR)/$(BUILD_DIR)/picoclaw-launcher-$(PLATFORM)-$(ARCH)" \
WEB_GO='$(WEB_GO)' \
GO_BUILD_TAGS='$(GO_BUILD_TAGS)' \
@@ -324,14 +324,13 @@ docker-clean:
## build-macos-app: Build PicoClaw macOS .app bundle (no terminal window)
-build-macos-app:
+build-macos-app:build-launcher
@echo "Building macOS .app bundle..."
@if [ "$(UNAME_S)" != "Darwin" ]; then \
echo "Error: This target is only available on macOS"; \
exit 1; \
fi
- @cd web && $(MAKE) build && cd ..
- @./scripts/build-macos-app.sh $(BINARY_NAME)-$(PLATFORM)-$(ARCH)
+ @./scripts/build-macos-app.sh $(PLATFORM)-$(ARCH)
@echo "macOS .app bundle created: $(BUILD_DIR)/PicoClaw.app"
## help: Show this help message
diff --git a/scripts/build-macos-app.sh b/scripts/build-macos-app.sh
index 76cc72938..df2100aec 100755
--- a/scripts/build-macos-app.sh
+++ b/scripts/build-macos-app.sh
@@ -10,6 +10,8 @@ if [ -z "$EXECUTABLE" ]; then
exit 1
fi
+LAUNCHER_EXECUTABLE="picoclaw-launcher-${EXECUTABLE}"
+EXECUTABLE="picoclaw-${EXECUTABLE}"
echo "executable: $EXECUTABLE"
APP_NAME="PicoClaw Launcher"
@@ -33,17 +35,17 @@ mkdir -p "$APP_RESOURCES"
# Copy executable
echo "Copying executable..."
-if [ -f "./web/build/${APP_EXECUTABLE}" ]; then
- cp "./web/build/${APP_EXECUTABLE}" "${APP_MACOS}/"
+if [ -f "./build/${LAUNCHER_EXECUTABLE}" ]; then
+ cp "./build/${LAUNCHER_EXECUTABLE}" "${APP_MACOS}/${APP_EXECUTABLE}"
else
- echo "Error: ./web/build/${APP_EXECUTABLE} not found. Please build the web backend first."
- echo "Run: make build in web dir"
+ echo "Error: ./build/${LAUNCHER_EXECUTABLE} not found. Please build the web backend first."
+ echo "Run: make build-launcher"
exit 1
fi
-if [ -f "./build/picoclaw" ]; then
- cp "./build/picoclaw" "${APP_MACOS}/"
+if [ -f "./build/${EXECUTABLE}" ]; then
+ cp "./build/${EXECUTABLE}" "${APP_MACOS}/picoclaw"
else
- echo "Error: ./build/picoclaw not found. Please build the main file first."
+ echo "Error: ./build/${EXECUTABLE} not found. Please build the main file first."
echo "Run: make build"
exit 1
fi
@@ -76,10 +78,10 @@ cat > "${APP_CONTENTS}/Info.plist" << 'EOF'
NSSupportsAutomaticGraphicsSwitching
- LSRequiresCarbon
-
LSUIElement
- 1
+
+ LSMinimumSystemVersion
+ 10.11
EOF