플랫폼 분기 (paths.ts): - EXE_SUFFIX 상수로 sox/sidecar/ffmpeg 실행파일 확장자 통합 - Windows에선 .exe 자동 부착, Mac/Linux에선 빈 문자열 - 미사용 getProjectRoot 헬퍼 제거 런타임 서비스 Mac 분기: - SoundEffectService: darwin → /usr/bin/afplay, linux → aplay 분기 추가 (execFile로 안전하게) - ScreenContextService._getActiveWindowInfo: win32 → PowerShell + user32.dll (기존), darwin → osascript (System Events frontmost process + 윈도우 타이틀) Linux는 미지원 (null) electron-builder.yml: - mac 타겟 추가 (dmg + zip, arm64 + x64 매트릭스) - hardenedRuntime, gatekeeperAssess, entitlements 설정 - extendInfo로 NSMicrophoneUsage / NSCameraUsage / NSAppleEvents / NSSystemAdministration 권한 메시지 - dmg 레이아웃 (드래그 to /Applications) - linux AppImage placeholder - notarize: false 기본, NOTARIZE 환경변수로 활성화 build/entitlements.mac.plist: - allow-jit, allow-unsigned-executable-memory (Electron 필수) - audio-input, camera, network.client - automation.apple-events (활성 윈도우 조회용) - files.user-selected.read-write - allow-dyld-environment-variables (sox/ffmpeg 라이브러리 로드) scripts/build-sidecar.py: - IS_WINDOWS / IS_MACOS / EXE_SUFFIX 도입 - Windows에서만 --noconsole 플래그 - 빌드 결과 경로 + size 출력 플랫폼 통합 scripts/install-sox.sh (신규): - Mac/Linux용 SoX 번들 스크립트 - macOS는 otool로 dylib 의존성 식별 후 함께 복사, install_name_tool로 rpath를 @loader_path로 변경 - electron-builder의 extraResources 대상 디렉토리에 배치 resources/icons/ (신규): - README.md만 커밋, 실제 아이콘 파일은 분리 - sips/iconutil/imagemagick으로 .icns/.ico/.png 생성 가이드 .github/workflows/build-mac.yml (신규): - macos-14 runner (Apple Silicon), arm64/x64 matrix - brew sox, npm install, @electron/rebuild, install-sox.sh, build-sidecar.py, electron-builder dist - CSC/NOTARIZE 환경변수 자동 처리 - artifact 업로드 (dmg + zip, retention 7일) docs/v2/phase-V2-5-mac-guide.md (신규): - 사전 조건, 시스템 의존성, dev 실행, dist 빌드, Code signing + Notarization, CI 트리거, 트러블슈팅 검증 (Windows에서): - typecheck 통과 (Mac 분기 추가에도 회귀 없음) - build 통과 - dev 런타임 정상 Mac 검증은 사용자 본인 Mac에서 수행 (V2-5 사용자 액션).
92 lines
2.6 KiB
Bash
92 lines
2.6 KiB
Bash
#!/usr/bin/env bash
|
|
# scripts/install-sox.sh
|
|
#
|
|
# Mac/Linux에서 SoX 바이너리를 apps/desktop/resources/sox/로 복사한다.
|
|
# electron-builder의 extraResources가 이 디렉토리를 번들 대상으로 잡는다.
|
|
#
|
|
# 사용법:
|
|
# # 먼저 시스템에 SoX 설치
|
|
# brew install sox # macOS
|
|
# sudo apt install sox # Ubuntu/Debian
|
|
#
|
|
# # 그 다음 이 스크립트 실행 (apps/desktop 기준)
|
|
# ./scripts/install-sox.sh
|
|
|
|
set -euo pipefail
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
DESKTOP_DIR="$(cd "${SCRIPT_DIR}/.." && pwd)"
|
|
TARGET_DIR="${DESKTOP_DIR}/resources/sox"
|
|
|
|
OS="$(uname -s)"
|
|
case "$OS" in
|
|
Darwin*) PLATFORM="macos" ;;
|
|
Linux*) PLATFORM="linux" ;;
|
|
*)
|
|
echo "Unsupported OS: $OS — Windows는 scripts/download-sox.ps1를 사용하세요."
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
echo "=== D3RO Voice: SoX 바이너리 번들 (${PLATFORM}) ==="
|
|
|
|
# 시스템 sox/rec 경로 찾기
|
|
SOX_BIN="$(command -v sox || true)"
|
|
REC_BIN="$(command -v rec || true)"
|
|
|
|
if [ -z "$SOX_BIN" ]; then
|
|
echo "ERROR: 시스템에 sox가 설치되어 있지 않습니다."
|
|
if [ "$PLATFORM" = "macos" ]; then
|
|
echo " macOS: brew install sox"
|
|
else
|
|
echo " Linux: sudo apt install sox 또는 sudo yum install sox"
|
|
fi
|
|
exit 1
|
|
fi
|
|
|
|
echo "sox: $SOX_BIN"
|
|
if [ -n "$REC_BIN" ]; then
|
|
echo "rec: $REC_BIN"
|
|
fi
|
|
|
|
# 타겟 디렉토리 준비
|
|
mkdir -p "${TARGET_DIR}"
|
|
echo "target: ${TARGET_DIR}"
|
|
|
|
# 바이너리 복사
|
|
cp "$SOX_BIN" "${TARGET_DIR}/sox"
|
|
chmod +x "${TARGET_DIR}/sox"
|
|
echo "복사: sox → ${TARGET_DIR}/sox"
|
|
|
|
if [ -n "$REC_BIN" ]; then
|
|
cp "$REC_BIN" "${TARGET_DIR}/rec"
|
|
chmod +x "${TARGET_DIR}/rec"
|
|
echo "복사: rec → ${TARGET_DIR}/rec"
|
|
fi
|
|
|
|
# 동적 라이브러리 의존성 복사 (macOS만)
|
|
if [ "$PLATFORM" = "macos" ]; then
|
|
echo "동적 라이브러리 의존성 복사 중..."
|
|
|
|
# otool로 의존성 확인 후 SoX와 함께 묶음
|
|
LIBS=$(otool -L "$SOX_BIN" | awk 'NR>1 && $1 !~ /^\/System\// && $1 !~ /^\/usr\/lib\// {print $1}')
|
|
|
|
for lib in $LIBS; do
|
|
if [ -f "$lib" ]; then
|
|
lib_name="$(basename "$lib")"
|
|
cp "$lib" "${TARGET_DIR}/${lib_name}"
|
|
chmod +w "${TARGET_DIR}/${lib_name}"
|
|
echo " lib: ${lib_name}"
|
|
|
|
# rpath를 @loader_path로 변경 (앱 번들 내부에서도 동작하도록)
|
|
install_name_tool -change "$lib" "@loader_path/${lib_name}" "${TARGET_DIR}/sox" 2>/dev/null || true
|
|
if [ -n "$REC_BIN" ]; then
|
|
install_name_tool -change "$lib" "@loader_path/${lib_name}" "${TARGET_DIR}/rec" 2>/dev/null || true
|
|
fi
|
|
fi
|
|
done
|
|
fi
|
|
|
|
echo ""
|
|
echo "완료. electron-builder가 이 디렉토리를 extraResources로 번들합니다."
|
|
ls -lh "${TARGET_DIR}/"
|