mirror of https://github.com/bol-van/zapret/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
284 lines
6.8 KiB
284 lines
6.8 KiB
#!/bin/sh
|
|
|
|
# Enhanced script to detect MacOS architecture and create appropriate symbolic links
|
|
# This script helps with cross-compilation and universal binary support
|
|
|
|
EXEDIR="$(dirname "$0")"
|
|
EXEDIR="$(cd "$EXEDIR"; pwd)"
|
|
BINS=binaries
|
|
BINDIR="$EXEDIR/$BINS"
|
|
|
|
# Function to detect MacOS architecture
|
|
detect_macos_arch()
|
|
{
|
|
local arch
|
|
case "$(uname -m)" in
|
|
x86_64)
|
|
arch="x86_64"
|
|
;;
|
|
arm64)
|
|
arch="arm64"
|
|
;;
|
|
*)
|
|
arch="unknown"
|
|
;;
|
|
esac
|
|
echo "$arch"
|
|
}
|
|
|
|
# Function to get MacOS version
|
|
detect_macos_version()
|
|
{
|
|
local version
|
|
if command -v sw_vers >/dev/null 2>&1; then
|
|
version=$(sw_vers -productVersion 2>/dev/null | cut -d. -f1,2)
|
|
else
|
|
version="10.8"
|
|
fi
|
|
echo "$version"
|
|
}
|
|
|
|
# Function to get MacOS target string
|
|
get_macos_target()
|
|
{
|
|
local arch=$(detect_macos_arch)
|
|
local version=$(detect_macos_version)
|
|
case "$arch" in
|
|
x86_64)
|
|
echo "x86_64-apple-macos$version"
|
|
;;
|
|
arm64)
|
|
echo "arm64-apple-macos$version"
|
|
;;
|
|
*)
|
|
echo "unknown"
|
|
;;
|
|
esac
|
|
}
|
|
|
|
# Function to check if universal binary is available
|
|
check_universal_binary()
|
|
{
|
|
local exe="$1"
|
|
if [ -f "$exe" ] && [ -x "$exe" ]; then
|
|
# Check if it's a universal binary
|
|
if file "$exe" | grep -q "universal binary"; then
|
|
echo "yes"
|
|
else
|
|
echo "no"
|
|
fi
|
|
else
|
|
echo "no"
|
|
fi
|
|
}
|
|
|
|
# Function to create architecture-specific links
|
|
create_arch_links()
|
|
{
|
|
local arch=$(detect_macos_arch)
|
|
local target=$(get_macos_target)
|
|
local version=$(detect_macos_version)
|
|
|
|
echo "Detected MacOS architecture: $arch"
|
|
echo "MacOS version: $version"
|
|
echo "Target string: $target"
|
|
|
|
# Set environment variable for Makefiles
|
|
export MACOS_TARGET="$target"
|
|
export MACOS_VERSION="$version"
|
|
|
|
# Create symbolic links for architecture-specific binaries
|
|
if [ -d "$BINDIR/mac64" ]; then
|
|
echo "Found mac64 binaries directory"
|
|
if [ "$arch" = "arm64" ] && [ -d "$BINDIR/mac64-arm64" ]; then
|
|
echo "Creating links for ARM64 architecture"
|
|
ln -sf "$BINDIR/mac64-arm64" "$BINDIR/current"
|
|
else
|
|
echo "Creating links for x86_64 architecture"
|
|
ln -sf "$BINDIR/mac64" "$BINDIR/current"
|
|
fi
|
|
fi
|
|
}
|
|
|
|
# Function to build for current architecture
|
|
build_current_arch()
|
|
{
|
|
local target=$(get_macos_target)
|
|
local version=$(detect_macos_version)
|
|
echo "Building for current architecture with target: $target"
|
|
echo "MacOS version: $version"
|
|
export MACOS_TARGET="$target"
|
|
export MACOS_VERSION="$version"
|
|
make mac
|
|
}
|
|
|
|
# Function to build universal binary
|
|
build_universal()
|
|
{
|
|
local version=$(detect_macos_version)
|
|
echo "Building universal binary for MacOS (x86_64 + arm64)"
|
|
echo "MacOS version: $version"
|
|
export MACOS_VERSION="$version"
|
|
make mac-universal
|
|
}
|
|
|
|
# Function to build for specific MacOS version
|
|
build_specific_version()
|
|
{
|
|
local version="$1"
|
|
if [ -z "$version" ]; then
|
|
echo "Error: Please specify a MacOS version (e.g., 11.0, 12.0, 13.0)"
|
|
exit 1
|
|
fi
|
|
|
|
local target=$(get_macos_target)
|
|
echo "Building for MacOS $version with target: $target"
|
|
export MACOS_TARGET="$target"
|
|
export MACOS_VERSION="$version"
|
|
make "mac-$version"
|
|
}
|
|
|
|
# Function to show system information
|
|
show_system_info()
|
|
{
|
|
echo "MacOS System Information"
|
|
echo "======================="
|
|
echo "System: $(uname)"
|
|
echo "Architecture: $(detect_macos_arch)"
|
|
echo "MacOS Version: $(detect_macos_version)"
|
|
echo "Target: $(get_macos_target)"
|
|
echo "Compiler: $(which cc 2>/dev/null || which clang 2>/dev/null || echo "Not found")"
|
|
echo "Make: $(which make 2>/dev/null || echo "Not found")"
|
|
echo "Lipo: $(which lipo 2>/dev/null || echo "Not found")"
|
|
echo ""
|
|
|
|
# Check for required tools
|
|
echo "Required Tools Check:"
|
|
echo "===================="
|
|
local missing_tools=""
|
|
|
|
if ! command -v make >/dev/null 2>&1; then
|
|
missing_tools="$missing_tools make"
|
|
fi
|
|
|
|
if ! command -v cc >/dev/null 2>&1 && ! command -v clang >/dev/null 2>&1; then
|
|
missing_tools="$missing_tools compiler(cc/clang)"
|
|
fi
|
|
|
|
if ! command -v lipo >/dev/null 2>&1; then
|
|
missing_tools="$missing_tools lipo"
|
|
fi
|
|
|
|
if [ -n "$missing_tools" ]; then
|
|
echo "❌ Missing tools: $missing_tools"
|
|
echo " Install Xcode Command Line Tools: xcode-select --install"
|
|
else
|
|
echo "✅ All required tools are available"
|
|
fi
|
|
}
|
|
|
|
# Function to check build readiness
|
|
check_build_readiness()
|
|
{
|
|
echo "Build Readiness Check"
|
|
echo "===================="
|
|
|
|
# Check if we're on MacOS
|
|
if [ "$(uname)" != "Darwin" ]; then
|
|
echo "❌ This script is designed for MacOS only"
|
|
echo " Current system: $(uname)"
|
|
return 1
|
|
fi
|
|
|
|
# Check for required tools
|
|
local ready=true
|
|
|
|
if ! command -v make >/dev/null 2>&1; then
|
|
echo "❌ 'make' command not available"
|
|
ready=false
|
|
fi
|
|
|
|
if ! command -v cc >/dev/null 2>&1 && ! command -v clang >/dev/null 2>&1; then
|
|
echo "❌ No C compiler found (cc or clang)"
|
|
ready=false
|
|
fi
|
|
|
|
if ! command -v lipo >/dev/null 2>&1; then
|
|
echo "❌ 'lipo' tool not available"
|
|
ready=false
|
|
fi
|
|
|
|
if [ "$ready" = "true" ]; then
|
|
echo "✅ System is ready for building"
|
|
return 0
|
|
else
|
|
echo "❌ System is not ready for building"
|
|
echo " Install Xcode Command Line Tools: xcode-select --install"
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
# Function to show help
|
|
show_help()
|
|
{
|
|
echo "Usage: $0 [OPTION]"
|
|
echo ""
|
|
echo "Options:"
|
|
echo " detect Detect MacOS architecture and show info"
|
|
echo " info Show detailed system information"
|
|
echo " check Check if system is ready for building"
|
|
echo " links Create architecture-specific symbolic links"
|
|
echo " build Build for current architecture"
|
|
echo " universal Build universal binary (x86_64 + arm64)"
|
|
echo " version V Build for specific MacOS version (e.g., 11.0, 12.0)"
|
|
echo " help Show this help message"
|
|
echo ""
|
|
echo "Environment variables:"
|
|
echo " MACOS_TARGET Override target string (e.g., x86_64-apple-macos10.8)"
|
|
echo " MACOS_VERSION Override MacOS version (e.g., 11.0, 12.0)"
|
|
echo ""
|
|
echo "Examples:"
|
|
echo " $0 detect # Detect architecture"
|
|
echo " $0 build # Build for current architecture"
|
|
echo " $0 universal # Build universal binary"
|
|
echo " $0 version 12.0 # Build for MacOS 12.0"
|
|
echo " MACOS_TARGET=x86_64-apple-macos11.0 $0 build # Override target"
|
|
}
|
|
|
|
# Main script logic
|
|
case "${1:-detect}" in
|
|
detect)
|
|
echo "MacOS Architecture Detection"
|
|
echo "=========================="
|
|
echo "Architecture: $(detect_macos_arch)"
|
|
echo "Version: $(detect_macos_version)"
|
|
echo "Target: $(get_macos_target)"
|
|
echo "Universal binary available: $(check_universal_binary "$BINDIR/mac64/tpws" 2>/dev/null || echo 'unknown')"
|
|
;;
|
|
info)
|
|
show_system_info
|
|
;;
|
|
check)
|
|
check_build_readiness
|
|
;;
|
|
links)
|
|
create_arch_links
|
|
;;
|
|
build)
|
|
check_build_readiness && build_current_arch
|
|
;;
|
|
universal)
|
|
check_build_readiness && build_universal
|
|
;;
|
|
version)
|
|
check_build_readiness && build_specific_version "$2"
|
|
;;
|
|
help|--help|-h)
|
|
show_help
|
|
;;
|
|
*)
|
|
echo "Unknown option: $1"
|
|
echo "Use '$0 help' for usage information"
|
|
exit 1
|
|
;;
|
|
esac
|