build-all-platforms.sh raw
1 #!/bin/bash
2
3 # Multi-platform build script for ORLY relay
4 # Builds binaries for Linux, macOS, Windows, and Android
5 # NOTE: All builds use CGO_ENABLED=0 since p8k library uses purego (not CGO)
6 # The library dynamically loads libsecp256k1 at runtime via purego
7
8 set -e
9
10 SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
11 REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
12 cd "$REPO_ROOT"
13
14 # Colors for output
15 RED='\033[0;31m'
16 GREEN='\033[0;32m'
17 YELLOW='\033[1;33m'
18 BLUE='\033[0;34m'
19 NC='\033[0m' # No Color
20
21 # Configuration
22 VERSION=$(cat pkg/version/version)
23 OUTPUT_DIR="$REPO_ROOT/build"
24 NOSTR_REPO_BASE_URL="https://git.nostrdev.com/mleku/nostr/raw/branch/main/crypto/p8k"
25
26 echo -e "${BLUE}========================================${NC}"
27 echo -e "${BLUE}ORLY Multi-Platform Build Script${NC}"
28 echo -e "${BLUE}========================================${NC}"
29 echo -e "Version: ${GREEN}${VERSION}${NC}"
30 echo -e "Output directory: ${OUTPUT_DIR}"
31 echo -e "${BLUE}Build mode: Pure Go with purego${NC}"
32 echo ""
33
34 # Create output directory
35 mkdir -p "$OUTPUT_DIR"
36
37 # Function to build for a specific platform
38 build_platform() {
39 local goos=$1
40 local goarch=$2
41 local platform_name=$3
42 local binary_ext=$4
43
44 echo -e "${YELLOW}Building for ${platform_name} (pure Go + purego)...${NC}"
45
46 local output_name="orly-${VERSION}-${platform_name}${binary_ext}"
47 local output_path="${OUTPUT_DIR}/${output_name}"
48
49 # Build with CGO_ENABLED=0 (pure Go with purego)
50 if CGO_ENABLED=0 GOOS=$goos GOARCH=$goarch \
51 go build -ldflags "-s -w -X main.version=${VERSION}" \
52 -o "${output_path}" . 2>&1; then
53
54 echo -e "${GREEN}✓ Built: ${output_name}${NC}"
55
56 # Download appropriate runtime library from nostr repository
57 case "$goos" in
58 linux)
59 if wget -q "${NOSTR_REPO_BASE_URL}/libsecp256k1.so" -O "${OUTPUT_DIR}/libsecp256k1-${platform_name}.so"; then
60 chmod +x "${OUTPUT_DIR}/libsecp256k1-${platform_name}.so"
61 echo -e "${GREEN} ✓ Downloaded libsecp256k1.so (runtime optional)${NC}"
62 else
63 echo -e "${YELLOW} ⚠ Failed to download libsecp256k1.so (runtime optional)${NC}"
64 fi
65 ;;
66 darwin)
67 if wget -q "${NOSTR_REPO_BASE_URL}/libsecp256k1.dylib" -O "${OUTPUT_DIR}/libsecp256k1-${platform_name}.dylib"; then
68 chmod +x "${OUTPUT_DIR}/libsecp256k1-${platform_name}.dylib"
69 echo -e "${GREEN} ✓ Downloaded libsecp256k1.dylib (runtime optional)${NC}"
70 else
71 echo -e "${YELLOW} ⚠ Failed to download libsecp256k1.dylib (runtime optional)${NC}"
72 fi
73 ;;
74 windows)
75 if wget -q "${NOSTR_REPO_BASE_URL}/libsecp256k1.dll" -O "${OUTPUT_DIR}/libsecp256k1-${platform_name}.dll"; then
76 chmod +x "${OUTPUT_DIR}/libsecp256k1-${platform_name}.dll"
77 echo -e "${GREEN} ✓ Downloaded libsecp256k1.dll (runtime optional)${NC}"
78 else
79 echo -e "${YELLOW} ⚠ Failed to download libsecp256k1.dll (runtime optional)${NC}"
80 fi
81 ;;
82 android)
83 if wget -q "${NOSTR_REPO_BASE_URL}/libsecp256k1.so" -O "${OUTPUT_DIR}/libsecp256k1-${platform_name}.so"; then
84 chmod +x "${OUTPUT_DIR}/libsecp256k1-${platform_name}.so"
85 echo -e "${GREEN} ✓ Downloaded libsecp256k1.so (runtime optional)${NC}"
86 else
87 echo -e "${YELLOW} ⚠ Failed to download libsecp256k1.so (runtime optional)${NC}"
88 fi
89 ;;
90 esac
91
92 # Create SHA256 checksum
93 (cd "$OUTPUT_DIR" && sha256sum "$output_name" >> "SHA256SUMS-${VERSION}.txt")
94
95 return 0
96 else
97 echo -e "${RED}✗ Failed to build for ${platform_name}${NC}"
98 return 1
99 fi
100 }
101
102 # Clean old builds
103 echo -e "${BLUE}Cleaning old builds...${NC}"
104 rm -f "${OUTPUT_DIR}/orly-"* "${OUTPUT_DIR}/libsecp256k1-"* "${OUTPUT_DIR}/SHA256SUMS-"*
105 echo ""
106
107 echo -e "${BLUE}Note: Pure Go builds work on all platforms${NC}"
108 echo -e "${BLUE} libsecp256k1 is loaded at runtime if available (faster)${NC}"
109 echo -e "${BLUE} Falls back to pure Go p256k1 if library not found${NC}"
110 echo ""
111
112 # Build for each platform
113 echo -e "${BLUE}Starting builds...${NC}"
114 echo ""
115
116 # Linux AMD64
117 build_platform "linux" "amd64" "linux-amd64" "" || true
118
119 # Linux ARM64
120 build_platform "linux" "arm64" "linux-arm64" "" || true
121
122 # macOS AMD64 (Intel)
123 build_platform "darwin" "amd64" "darwin-amd64" "" || true
124
125 # macOS ARM64 (Apple Silicon)
126 build_platform "darwin" "arm64" "darwin-arm64" "" || true
127
128 # Windows AMD64
129 build_platform "windows" "amd64" "windows-amd64" ".exe" || true
130
131 # Android builds
132 echo -e "${BLUE}Building for Android...${NC}"
133
134 # Android ARM64
135 build_platform "android" "arm64" "android-arm64" "" || true
136
137 # Android AMD64
138 build_platform "android" "amd64" "android-amd64" "" || true
139
140 echo ""
141 echo -e "${BLUE}========================================${NC}"
142 echo -e "${GREEN}Build Summary${NC}"
143 echo -e "${BLUE}========================================${NC}"
144 echo ""
145
146 # List all built binaries
147 if ls "${OUTPUT_DIR}"/orly-* 1> /dev/null 2>&1; then
148 echo -e "${GREEN}Built binaries:${NC}"
149 ls -lh "${OUTPUT_DIR}"/orly-* | awk '{print " " $9 " (" $5 ")"}'
150 echo ""
151
152 if [ -f "${OUTPUT_DIR}/SHA256SUMS-${VERSION}.txt" ]; then
153 echo -e "${GREEN}Checksums:${NC}"
154 cat "${OUTPUT_DIR}/SHA256SUMS-${VERSION}.txt" | sed 's/^/ /'
155 echo ""
156 fi
157
158 echo -e "${GREEN}Libraries:${NC}"
159 ls -lh "${OUTPUT_DIR}"/libsecp256k1-* 2>/dev/null | awk '{print " " $9 " (" $5 ")"}' || echo " No libraries copied"
160 echo ""
161 else
162 echo -e "${RED}No binaries were built successfully${NC}"
163 exit 1
164 fi
165
166 echo -e "${BLUE}========================================${NC}"
167 echo -e "${GREEN}Build completed!${NC}"
168 echo -e "${BLUE}========================================${NC}"
169 echo ""
170 echo "Output directory: ${OUTPUT_DIR}"
171 echo ""
172 echo "To test a binary:"
173 echo " Linux: ./${OUTPUT_DIR}/orly-${VERSION}-linux-amd64"
174 echo " macOS: ./${OUTPUT_DIR}/orly-${VERSION}-darwin-arm64"
175 echo " Windows: ./${OUTPUT_DIR}/orly-${VERSION}-windows-amd64.exe"
176 echo ""
177
178