diff --git a/.github/actions/setup-env/action.yml b/.github/actions/setup-env/action.yml index fa08868559..528d7c70bb 100644 --- a/.github/actions/setup-env/action.yml +++ b/.github/actions/setup-env/action.yml @@ -1,5 +1,5 @@ -name: 'Setup environment' -description: 'Common GH action to setup job environment' +name: "Setup environment" +description: "Common GH action to setup job environment" runs: using: "composite" @@ -8,7 +8,7 @@ runs: uses: RDXWorks-actions/toolchain@master with: # IMPORTANT: - # To update the Rust version, you must update it in five total places (including the toolchain below): + # To update the Rust version, you must update it in the below places (including the toolchain below) in this repo: # => [README.md - part 1] Update "Install Rust - we recommend to use Rust X.XX.X" # => [README.md - part 2] Update "rustup default X.XX.X" # => [action.yml - part 1] Update "toolchain: X.XX.X" below @@ -17,14 +17,23 @@ runs: # different version is used. # => [Dockerfile] Update "FROM rust:X.XX.X-slim-bookworm AS base-image" in the deterministic builder # => [radix-clis/assets/template/rust-toolchain.toml_template] Update the rust version + # => [scrypto-install-scripts/*] Update the all version in each scripts "# Versions to install" section. Keep the current version number format: + # => [scrypto-install-scripts/install-scrypto-debian.sh] "LLVM_VERSION=XX", "RUST_VERSION=X.XX.X", "RADIX_CLI_VERSION=X.X.X" + # => [scrypto-install-scripts/install-scrypto-macos.sh] "LLVM_VERSION=XX", "RUST_VERSION=X.XX.X", "RADIX_CLI_VERSION=X.X.X" + # => [scrypto-install-scripts/install-scrypto-windows.ps1] "$llvmVersion = 'XX.X.X'", "$rustVersion = 'X.XX.X'", "$radixCliVersion = 'X.X.X'" # => [https://docs.radixdlt.com/docs/getting-rust-scrypto] Update the recommended rust version on docs + # Additionally, Rust version should be updated in below repos on respective branches: + # - babylon-node - .github/actions/setup-env/action.yml + # - fuzzer - .github/actions/setup-env/action.yml toolchain: 1.81.0 default: true target: wasm32-unknown-unknown components: rustfmt - name: Install nextest - uses: RDXWorks-actions/install-action@nextest + uses: RDXWorks-actions/install-action@main + with: + tool: nextest@0.9.85 - name: Set LIBCLANG_PATH # See https://github.com/rust-lang/rust-bindgen/issues/1797 if: runner.os == 'Windows' @@ -38,7 +47,7 @@ runs: if: runner.os == 'Linux' uses: RDXWorks-actions/actions-setup-cmake@master with: - cmake-version: '3.27.9' + cmake-version: "3.27.9" - name: Install libclang-dev if: runner.os == 'Linux' run: sudo apt-get -y update && sudo apt-get install clang libclang-dev -y -f diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5180dcc76a..55ee3c4b40 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -22,6 +22,9 @@ on: env: CARGO_TERM_COLOR: always SCRYPTO_CARGO_LOCKED: 1 + # Produce a warning and exit with code 0 if no tests to run + # (nextest returns error by default since version 0.9.85) + NEXTEST_NO_TESTS: warn concurrency: group: ci-${{ github.ref }} diff --git a/scrypto-install-scripts/install-scrypto-debian.sh b/scrypto-install-scripts/install-scrypto-debian.sh new file mode 100644 index 0000000000..2e739eec76 --- /dev/null +++ b/scrypto-install-scripts/install-scrypto-debian.sh @@ -0,0 +1,214 @@ +#!/bin/bash + +# Exit on error +set -e + +# Versions to install +LLVM_VERSION=18 +RUST_VERSION=1.81.0 +RADIX_CLI_VERSION=1.3.0 + +# Colors for output +RED='\033[0;31m' +GREEN='\033[0;32m' +BLUE='\033[0;34m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +# Function to log messages with colors +log() { + local level=$1 + shift + case $level in + "INFO") echo -e "${BLUE}[INFO]${NC} $*" ;; + "SUCCESS") echo -e "${GREEN}[SUCCESS]${NC} $*" ;; + "ERROR") echo -e "${RED}[ERROR]${NC} $*" ;; + "WARN") echo -e "${YELLOW}[WARN]${NC} $*" ;; + esac +} + +# Function to check if command exists +command_exists() { + command -v "$1" >/dev/null 2>&1 +} + +# Function to check system dependencies +check_dependencies() { + log "INFO" "Checking system dependencies..." + + # Check if we're on a Debian-based system + if ! command_exists apt-get; then + log "ERROR" "This script requires apt-get (Debian/Ubuntu). For other distributions, please modify the script accordingly." + exit 1 + fi + + # Check if sudo is available + if ! command_exists sudo; then + log "ERROR" "This script requires sudo privileges." + exit 1 + fi +} + +# Function to install build essentials +install_build_essentials() { + log "INFO" "Installing build essentials..." + + # Update package list + sudo apt-get update + + # Install build essentials + sudo apt-get install -y build-essential + + if [ $? -eq 0 ]; then + log "SUCCESS" "Build essentials installed successfully" + else + log "ERROR" "Failed to install build essentials" + exit 1 + fi +} + +# Function to install LLVM +install_llvm() { + log "INFO" "Installing LLVM..." + + # Download and install LLVM + wget https://apt.llvm.org/llvm.sh + chmod +x llvm.sh + sudo ./llvm.sh $LLVM_VERSION + rm llvm.sh + + if [ $? -eq 0 ]; then + log "SUCCESS" "LLVM installed successfully" + else + log "ERROR" "Failed to install LLVM" + exit 1 + fi +} + +# Function to install Rust +install_rust() { + log "INFO" "Installing Rust..." + + # Download and install Rust with specific toolchain + curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- --default-toolchain=$RUST_VERSION -y + + if [ $? -eq 0 ]; then + log "SUCCESS" "Rust installed successfully" + else + log "ERROR" "Failed to install Rust" + exit 1 + fi +} + +# Function to setup Cargo environment +setup_cargo() { + log "INFO" "Setting up Cargo environment..." + + # Source cargo environment + source "$HOME/.cargo/env" + + if command_exists cargo; then + log "SUCCESS" "Cargo environment setup successfully" + else + log "ERROR" "Failed to setup Cargo environment" + exit 1 + fi +} + +# Function to add WebAssembly target +add_wasm_target() { + log "INFO" "Adding WebAssembly target..." + + rustup target add wasm32-unknown-unknown + + if [ $? -eq 0 ]; then + log "SUCCESS" "WebAssembly target added successfully" + else + log "ERROR" "Failed to add WebAssembly target" + exit 1 + fi +} + +# Function to install Radix tools +install_radix_tools() { + log "INFO" "Installing Radix Engine Simulator and CLI tools..." + + cargo install --force radix-clis@$RADIX_CLI_VERSION + + if [ $? -eq 0 ]; then + log "SUCCESS" "Radix tools installed successfully" + else + log "ERROR" "Failed to install Radix tools" + exit 1 + fi +} + +# Function to add Clang to shell configuration +add_clang_to_shell_config() { + # Determine the user's shell + SHELL_NAME=$(basename "$SHELL") + + # Determine the shell configuration file based on the default shell + case "$SHELL_NAME" in + bash) SHELL_CONFIG="$HOME/.bashrc" ;; + zsh) SHELL_CONFIG="$HOME/.zshrc" ;; + ksh) SHELL_CONFIG="$HOME/.kshrc" ;; + fish) SHELL_CONFIG="$HOME/.config/fish/config.fish" ;; + *) + log "ERROR" "Unsupported shell. Please add 'export CC=clang-${LLVM_VERSION}' to your shell configuration manually." + exit 1 + ;; + esac + + # The line to add + EXPORT_LINE="export CC=clang-${LLVM_VERSION}" + + # Check if the line already exists to prevent duplicates + if grep -Fxq "$EXPORT_LINE" "$SHELL_CONFIG" + then + log "INFO" "The CC variable is already set in $SHELL_CONFIG" + else + # Backup the shell configuration file + cp "$SHELL_CONFIG" "${SHELL_CONFIG}.backup" + + # Append the export line to the shell configuration file + echo "$EXPORT_LINE" >> "$SHELL_CONFIG" + log "INFO" "Added '$EXPORT_LINE' to $SHELL_CONFIG" + fi +} + +# Main installation process +main() { + log "INFO" "Starting installation process..." + + # Check system dependencies + check_dependencies + + # Install components + install_build_essentials + install_llvm + install_rust + setup_cargo + add_wasm_target + install_radix_tools + add_clang_to_shell_config + + # Final success message + log "SUCCESS" "Installation completed successfully!" + source $HOME/.cargo/env + + # Verify installations + log "INFO" "Verifying installations..." + echo -e "\nVersions installed:" + echo -e "LLVM: $(llvm-config-${LLVM_VERSION} --version)" + echo -e "Clang: $(clang-${LLVM_VERSION} --version | head -n 1)" + echo -e "Rust: $(rustc --version)" + echo -e "Cargo: $(cargo --version)" + echo -e "Radix CLI: $(scrypto --version)\n" + + log "INFO" "Please restart your terminal or run:" + echo "source $SHELL_CONFIG" +} + +# Run main function +main diff --git a/scrypto-install-scripts/install-scrypto-macos.sh b/scrypto-install-scripts/install-scrypto-macos.sh new file mode 100755 index 0000000000..0ed66f6f90 --- /dev/null +++ b/scrypto-install-scripts/install-scrypto-macos.sh @@ -0,0 +1,78 @@ +#!/bin/bash + +# Print commands and exit on errors +set -ex + +# Versions to install +LLVM_VERSION=18 +RUST_VERSION=1.81.0 +RADIX_CLI_VERSION=1.3.0 + +# Colors for output +RED='\033[0;31m' +GREEN='\033[0;32m' +BLUE='\033[0;34m' +NC='\033[0m' # No Color + +echo -e "${BLUE}Starting installation process...${NC}" + +# Function to check if a command was successful +check_status() { + if [ $? -eq 0 ]; then + echo -e "${GREEN}✓ $1 successful${NC}" + else + echo -e "${RED}✗ $1 failed${NC}" + exit 1 + fi +} + +# Install Xcode Command Line Tools +echo -e "\n${BLUE}Installing Xcode Command Line Tools...${NC}" +xcode-select --install 2>/dev/null || true +check_status "Xcode Command Line Tools installation" + +# Install cmake and LLVM +echo -e "\n${BLUE}Installing cmake and LLVM...${NC}" +brew install cmake llvm@$LLVM_VERSION +check_status "cmake and LLVM installation" + +# Detect shell and configure appropriate rc file +SHELL_CONFIG="" +if [[ "$SHELL" == */bin/zsh ]]; then + SHELL_CONFIG="$HOME/.zshrc" +elif [[ "$SHELL" == */bin/bash ]]; then + SHELL_CONFIG="$HOME/.profile" +else + echo -e "${RED}Unsupported shell: $SHELL${NC}" + exit 1 +fi + +# Add LLVM to PATH +echo -e "\n${BLUE}Configuring LLVM in $SHELL_CONFIG...${NC}" +if ! grep -q "$(brew --prefix llvm@${LLVM_VERSION})/bin" "$SHELL_CONFIG"; then + echo 'PATH="$(brew --prefix llvm@'$LLVM_VERSION')/bin:$PATH"' >> "$SHELL_CONFIG" +fi +check_status "LLVM path configuration" + +# Install Rust +echo -e "\n${BLUE}Installing Rust...${NC}" +curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- --default-toolchain=$RUST_VERSION -y +check_status "Rust installation" + +# Source cargo environment +echo -e "\n${BLUE}Enabling cargo in current shell...${NC}" +source "$HOME/.cargo/env" +check_status "Cargo environment setup" + +# Add WebAssembly target +echo -e "\n${BLUE}Adding WebAssembly target...${NC}" +rustup target add wasm32-unknown-unknown +check_status "WebAssembly target installation" + +# Install Radix Engine Simulator and CLI tools +echo -e "\n${BLUE}Installing Radix Engine Simulator and CLI tools...${NC}" +cargo install --force radix-clis@$RADIX_CLI_VERSION +check_status "Radix tools installation" + +echo -e "\n${GREEN}Installation complete! Please restart your terminal or run:${NC}" +echo -e "source $SHELL_CONFIG" diff --git a/scrypto-install-scripts/install-scrypto-windows.ps1 b/scrypto-install-scripts/install-scrypto-windows.ps1 new file mode 100644 index 0000000000..79ed9b4efb --- /dev/null +++ b/scrypto-install-scripts/install-scrypto-windows.ps1 @@ -0,0 +1,145 @@ +# Requires PowerShell running as Administrator +#Requires -RunAsAdministrator + +# Versions to install +$llvmVersion = '18.1.8' +$rustVersion = '1.81.0' +$radixCliVersion = '1.3.0' + +# Script configuration +$ErrorActionPreference = 'Stop' +$ProgressPreference = 'Continue' + +# Colors for output +function Write-ColorOutput($ForegroundColor) { + $fc = $host.UI.RawUI.ForegroundColor + $host.UI.RawUI.ForegroundColor = $ForegroundColor + if ($args) { + Write-Output $args + } + $host.UI.RawUI.ForegroundColor = $fc +} + +function Refresh-EnvironmentVariables { + # Refresh the PATH variable + $env:Path = [System.Environment]::GetEnvironmentVariable("Path", "Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path", "User") +} + +function Install-IfNotPresent { + param ( + [string]$Name, + [string]$Command, + [scriptblock]$InstallScript + ) + + Write-ColorOutput Yellow "Checking for $Name..." + if (!(Get-Command $Command -ErrorAction SilentlyContinue)) { + Write-ColorOutput Cyan "Installing $Name..." + & $InstallScript + if ($LASTEXITCODE -ne 0) { + Write-ColorOutput Red "Failed to install $Name" + exit 1 + } + Write-ColorOutput Green "$Name installed successfully" + Refresh-EnvironmentVariables + } else { + Write-ColorOutput Green "$Name is already installed" + } +} + +# Check if running as admin +if (-NOT ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) { + Write-ColorOutput Red "Please run this script as Administrator" + exit 1 +} + +# 1. Install Git if not present +Install-IfNotPresent "Git" "git" { + # Using winget for Git installation + winget install --id Git.Git -e --source winget + Refresh-EnvironmentVariables + # Enable long paths + git config --system core.longpaths true +} + +# 2. Install Visual Studio Build Tools +$vsInstallerPath = "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe" +$Name = "Visual Studio Build Tools 2022" +Write-ColorOutput Yellow "Checking for $Name..." +if (!(Test-Path $vsInstallerPath)) { + Write-ColorOutput Cyan "Downloading $Name..." + $vsUrl = "https://aka.ms/vs/17/release/vs_buildtools.exe" + $vsInstaller = "$env:TEMP\vs_buildtools.exe" + Start-BitsTransfer -Source $vsUrl -Destination $vsInstaller + + Write-ColorOutput Cyan "Installing $Name with C++ support - This may take a long time..." + Start-Process -Wait -FilePath $vsInstaller -ArgumentList @( + "--passive", + "--wait", + "--norestart", + "--nocache", + "--installPath", "${env:ProgramFiles(x86)}\Microsoft Visual Studio\2022\BuildTools", + "--add", "Microsoft.VisualStudio.Workload.VCTools" + "--includeRecommended" + ) + + Remove-Item $vsInstaller + Refresh-EnvironmentVariables +} else { + Write-ColorOutput Green "Visual Studio Build Tools are already installed" +} + +# 3. Install LLVM +Install-IfNotPresent "LLVM" "clang" { + Write-ColorOutput Cyan "Downloading LLVM..." + + $llvmUrl = "https://github.com/llvm/llvm-project/releases/download/llvmorg-$llvmVersion/LLVM-$llvmVersion-win64.exe" + $llvmInstaller = "$env:TEMP\LLVM-$llvmVersion-win64.exe" + Start-BitsTransfer -Source $llvmUrl -Destination $llvmInstaller + + Write-ColorOutput Cyan "Installing LLVM - This may take a long time too..." + Start-Process -Wait -FilePath $llvmInstaller -ArgumentList "/S", "/D=C:\Program Files\LLVM" + Remove-Item $llvmInstaller + + # Add LLVM bin directory to the system PATH + $llvmBinPath = "C:\Program Files\LLVM\bin" + [Environment]::SetEnvironmentVariable("Path", $env:Path + ";$llvmBinPath", [EnvironmentVariableTarget]::Machine) + $env:Path += ";$llvmBinPath" +} + +# 4. Install Rust +Install-IfNotPresent "Rust" "rustc" { + Write-ColorOutput Cyan "Downloading and installing Rust..." + $rustupInit = "$env:TEMP\rustup-init.exe" + Start-BitsTransfer -Source "https://win.rustup.rs" -Destination $rustupInit + Start-Process -Wait -FilePath $rustupInit -ArgumentList "-y", "--default-toolchain", $rustVersion + Remove-Item $rustupInit +} + +# 5. Set Rust default version +Write-ColorOutput Cyan "Setting Rust default version to $rustVersion..." +rustup default $rustVersion + +# 6. Add WebAssembly target +Write-ColorOutput Cyan "Adding WebAssembly target..." +rustup target add wasm32-unknown-unknown + +# 7. Install Radix Engine Simulator and CLI tools +Write-ColorOutput Cyan "Installing Radix Engine Simulator and CLI tools..." +cargo install --force radix-clis@$radixCliVersion +Refresh-EnvironmentVariables + +# Final success message +Write-ColorOutput Green "`nInstallation complete! Please restart your terminal to ensure all changes take effect." +Write-ColorOutput Yellow "`nVerifying instillations..." +Write-ColorOutput White "Versions installed:" +Write-ColorOutput White "git" +git --version +Write-ColorOutput White "`nclang" +clang --version +Write-ColorOutput White "`nrustc" +rustc --version +Write-ColorOutput White "`ncargo" +cargo --version +Write-ColorOutput White "`nscrypto" +scrypto --version \ No newline at end of file