Skip to content

Commit 35bfd5c

Browse files
add build and run
1 parent c6dc867 commit 35bfd5c

1 file changed

Lines changed: 244 additions & 0 deletions

File tree

scripts/build-and-run.sh

Lines changed: 244 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,244 @@
1+
#!/usr/bin/env bash
2+
3+
# ====================================================================
4+
# DefyX VPN - Unified Build & Run Script
5+
# ====================================================================
6+
# Orchestrates: DXcore build.sh → copy framework → Flutter run.sh
7+
# ====================================================================
8+
9+
set -eo pipefail
10+
11+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
12+
readonly SCRIPT_DIR
13+
14+
DXCORE_DIR="$(cd "${SCRIPT_DIR}/../../DXcore-private" && pwd)"
15+
FLUTTER_DIR="$(cd "${SCRIPT_DIR}/.." && pwd)"
16+
17+
# Colors
18+
readonly RED='\033[0;31m'
19+
readonly GREEN='\033[0;32m'
20+
readonly YELLOW='\033[1;33m'
21+
readonly CYAN='\033[0;36m'
22+
readonly BOLD='\033[1m'
23+
readonly NC='\033[0m'
24+
25+
# Logging
26+
log() { echo -e "${CYAN}[build-and-run]${NC} $*"; }
27+
success() { echo -e "${GREEN}$*${NC}"; }
28+
error() { echo -e "${RED}$*${NC}" >&2; }
29+
30+
# Config
31+
CLEAN_BUILD=false
32+
SKIP_CORE_BUILD=false
33+
BUILD_ONLY=false
34+
FLUTTER_DEVICE=""
35+
PLATFORM_CHOICE=""
36+
37+
# ====================================================================
38+
# Framework Copy Functions
39+
# ====================================================================
40+
41+
copy_framework() {
42+
local platform="$1"
43+
log "📦 Copying ${platform} framework to Flutter project..."
44+
45+
case "${platform}" in
46+
ios)
47+
local src="${DXCORE_DIR}/build/ios/IosDXcore.xcframework"
48+
local dst="${FLUTTER_DIR}/ios/IosDXcore.xcframework"
49+
;;
50+
macos)
51+
local src="${DXCORE_DIR}/build/macos/MacDXcore.xcframework"
52+
local dst="${FLUTTER_DIR}/macos/MacDXcore.xcframework"
53+
;;
54+
android)
55+
local src="${DXCORE_DIR}/build/android/DXcore.aar"
56+
local dst="${FLUTTER_DIR}/android/app/libs/DXcore.aar"
57+
mkdir -p "${FLUTTER_DIR}/android/app/libs"
58+
;;
59+
esac
60+
61+
if [[ ! -e "${src}" ]]; then
62+
error "Framework not found: ${src}"
63+
return 1
64+
fi
65+
66+
rm -rf "${dst}"
67+
cp -R "${src}" "${dst}"
68+
success "Copied to: ${dst}"
69+
}
70+
71+
# ====================================================================
72+
# Main Workflow
73+
# ====================================================================
74+
75+
build_and_run() {
76+
local platform="$1"
77+
78+
# Step 1: Build DXcore framework (if not skipped)
79+
if [[ "${SKIP_CORE_BUILD}" == "false" ]]; then
80+
log "🔨 Building DXcore framework for ${platform}..."
81+
cd "${DXCORE_DIR}"
82+
83+
# Map platform to build.sh menu choice
84+
local build_choice
85+
case "${platform}" in
86+
ios) build_choice="2" ;;
87+
macos) build_choice="5" ;;
88+
android) build_choice="1" ;;
89+
esac
90+
91+
# Run build.sh non-interactively
92+
# Answer: platform choice + version choice (4 = Same Version)
93+
printf "%s\n4\n" "${build_choice}" | bash ./build.sh || {
94+
error "DXcore build failed"
95+
return 1
96+
}
97+
98+
# Step 2: Copy framework to Flutter project
99+
copy_framework "${platform}" || return 1
100+
else
101+
log "⏭️ Skipping DXcore build"
102+
fi
103+
104+
if [[ "${BUILD_ONLY}" == "true" ]]; then
105+
success "Build complete (not running Flutter app)"
106+
return 0
107+
fi
108+
109+
# Step 3: Prepare Flutter project
110+
cd "${FLUTTER_DIR}"
111+
112+
if [[ "${CLEAN_BUILD}" == "true" ]]; then
113+
log "🧹 Running flutter clean..."
114+
flutter clean
115+
fi
116+
117+
log "📦 Running flutter pub get..."
118+
flutter pub get
119+
120+
# Step 4: Run Flutter app
121+
log "🚀 Running Flutter app..."
122+
123+
local device_arg=""
124+
if [[ -n "${FLUTTER_DEVICE}" ]]; then
125+
device_arg="-d ${FLUTTER_DEVICE}"
126+
fi
127+
128+
# Use run.sh if it exists (handles Firebase injection)
129+
if [[ -f "${SCRIPT_DIR}/run.sh" ]]; then
130+
bash "${SCRIPT_DIR}/run.sh" ${device_arg}
131+
else
132+
flutter run ${device_arg}
133+
fi
134+
}
135+
136+
# ====================================================================
137+
# Menu
138+
# ====================================================================
139+
140+
show_menu() {
141+
echo ""
142+
echo "════════════════════════════════════════════════"
143+
echo -e "${BOLD}${CYAN} DefyX VPN - Build & Run${NC}"
144+
echo "════════════════════════════════════════════════"
145+
echo ""
146+
echo " 1) 📱 iOS - Build & run"
147+
echo " 2) 🖥️ macOS - Build & run"
148+
echo " 3) 🤖 Android - Build & run"
149+
echo ""
150+
echo " 4) ⚡ iOS (Flutter only) - Skip DXcore rebuild"
151+
echo " 5) ⚡ macOS (Flutter only) - Skip DXcore rebuild"
152+
echo " 6) ⚡ Android (Flutter only) - Skip DXcore rebuild"
153+
echo ""
154+
echo " 0) 🚪 Exit"
155+
echo ""
156+
echo "════════════════════════════════════════════════"
157+
echo ""
158+
}
159+
160+
process_choice() {
161+
CLEAN_BUILD=false
162+
SKIP_CORE_BUILD=false
163+
164+
case "$1" in
165+
1) PLATFORM_CHOICE="ios"; CLEAN_BUILD=true ;;
166+
2) PLATFORM_CHOICE="macos"; CLEAN_BUILD=true ;;
167+
3) PLATFORM_CHOICE="android"; CLEAN_BUILD=true ;;
168+
4) PLATFORM_CHOICE="ios"; SKIP_CORE_BUILD=true; CLEAN_BUILD=true ;;
169+
5) PLATFORM_CHOICE="macos"; SKIP_CORE_BUILD=true; CLEAN_BUILD=true ;;
170+
6) PLATFORM_CHOICE="android"; SKIP_CORE_BUILD=true; CLEAN_BUILD=true ;;
171+
0) log "Goodbye! 👋"; exit 0 ;;
172+
*) error "Invalid choice"; return 1 ;;
173+
esac
174+
return 0
175+
}
176+
177+
# ====================================================================
178+
# Main
179+
# ====================================================================
180+
181+
main() {
182+
# Validate environment
183+
[[ ! -d "${DXCORE_DIR}" ]] && { error "DXcore-private not found"; exit 1; }
184+
[[ ! -d "${FLUTTER_DIR}" ]] && { error "defyxVPN-public not found"; exit 1; }
185+
[[ ! -f "${DXCORE_DIR}/build.sh" ]] && { error "build.sh not found"; exit 1; }
186+
187+
# Command line mode
188+
if [[ $# -gt 0 ]]; then
189+
while [[ $# -gt 0 ]]; do
190+
case "$1" in
191+
ios|macos|android) PLATFORM_CHOICE="$1"; shift ;;
192+
--clean) CLEAN_BUILD=true; shift ;;
193+
--skip-core) SKIP_CORE_BUILD=true; shift ;;
194+
--build-only) BUILD_ONLY=true; shift ;;
195+
-d|--device) FLUTTER_DEVICE="$2"; shift 2 ;;
196+
--help|-h)
197+
echo "Usage: $0 [ios|macos|android] [OPTIONS]"
198+
echo ""
199+
echo "Options:"
200+
echo " --clean Clean Flutter build"
201+
echo " --skip-core Skip DXcore rebuild"
202+
echo " --build-only Build only, don't run"
203+
echo " -d DEVICE Target device"
204+
echo ""
205+
echo "Examples:"
206+
echo " $0 ios # Build and run"
207+
echo " $0 macos --clean # Clean build"
208+
echo " $0 ios --skip-core # Flutter only"
209+
echo " $0 # Interactive menu"
210+
exit 0
211+
;;
212+
*) error "Unknown option: $1"; exit 1 ;;
213+
esac
214+
done
215+
216+
[[ -z "${PLATFORM_CHOICE}" ]] && { error "Platform required"; exit 1; }
217+
build_and_run "${PLATFORM_CHOICE}"
218+
exit $?
219+
fi
220+
221+
# Interactive menu mode
222+
while true; do
223+
show_menu
224+
read -p "Enter your choice (0-9): " choice
225+
echo ""
226+
227+
if ! process_choice "${choice}"; then
228+
sleep 1
229+
continue
230+
fi
231+
232+
if build_and_run "${PLATFORM_CHOICE}"; then
233+
echo ""
234+
read -p "Build another platform? (y/N): " again
235+
[[ ! "${again}" =~ ^[Yy]$ ]] && { log "Goodbye! 👋"; exit 0; }
236+
else
237+
error "Build failed"
238+
read -p "Try again? (y/N): " retry
239+
[[ ! "${retry}" =~ ^[Yy]$ ]] && exit 1
240+
fi
241+
done
242+
}
243+
244+
main "$@"

0 commit comments

Comments
 (0)