Skip to content
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 56 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,62 @@ cd .. && cargo build --release

> **Rust Workspace**: All Rust projects (adguard-validation, adguard-api-rust, rules-compiler-rust) are now unified in a single workspace at the repository root. Run `cargo build` from the root to build all Rust projects together. See [RUST_WORKSPACE.md](RUST_WORKSPACE.md) for more details.

### Build All Projects

Root-level build scripts are available to build all projects or specific language ecosystems:

```bash
# Build all projects (debug mode - default)
./build.sh

# Build all projects in release mode
./build.sh --release

# Build specific language ecosystems
./build.sh --rust # Build all Rust projects
./build.sh --dotnet # Build all .NET projects
./build.sh --typescript # Build all TypeScript/Deno projects
./build.sh --python # Build Python projects

# Combine options
./build.sh --rust --dotnet --release # Build Rust and .NET in release mode
```

**PowerShell (Windows/Cross-platform)**:

```powershell
# Build all projects (debug mode - default)
.\build.ps1

# Build all projects in release mode
.\build.ps1 -Profile release

# Build specific language ecosystems
.\build.ps1 -Rust # Build all Rust projects
.\build.ps1 -DotNet # Build all .NET projects
.\build.ps1 -TypeScript # Build all TypeScript/Deno projects
.\build.ps1 -Python # Build Python projects

# Combine options
.\build.ps1 -Rust -DotNet -Profile release
```

**Available Options**:
- `--all` / `-All`: Build all projects (default if no specific project selected)
- `--rust` / `-Rust`: Build Rust workspace (validation library, API clients, compilers)
- `--dotnet` / `-DotNet`: Build .NET solutions (API client, rules compiler)
- `--typescript` / `-TypeScript`: Build TypeScript/Deno projects (requires Deno)
- `--python` / `-Python`: Build Python projects (requires Python 3.9+)
- `--debug`: Use debug profile (default)
- `--release` / `-Profile release`: Use release/optimized profile

The build scripts automatically:
- Check for required tools (Rust, .NET, Deno, Python)
- Restore dependencies
- Build projects with appropriate configuration
- Report build status with colored output
- Exit with appropriate status codes for CI integration

### Compile Filter Rules (Any Language)

```bash
Expand Down
295 changes: 295 additions & 0 deletions build.ps1
Original file line number Diff line number Diff line change
@@ -0,0 +1,295 @@
#!/usr/bin/env pwsh
<#
.SYNOPSIS
Root-level build script for ad-blocking repository

.DESCRIPTION
Builds all projects or specific ones with debug/release profiles.
Default profile is debug.

.PARAMETER All
Build all projects (default if no specific project selected)

.PARAMETER Rust
Build Rust projects

.PARAMETER DotNet
Build .NET projects

.PARAMETER TypeScript
Build TypeScript/Deno projects

.PARAMETER Python
Build Python projects

.PARAMETER Profile
Build profile: 'debug' (default) or 'release'

.EXAMPLE
.\build.ps1
Build all projects in debug mode

.EXAMPLE
.\build.ps1 -Rust
Build only Rust projects in debug mode

.EXAMPLE
.\build.ps1 -DotNet -Profile release
Build only .NET projects in release mode

.EXAMPLE
.\build.ps1 -All -Profile release
Build all projects in release mode
#>

[CmdletBinding()]
param(
[Parameter(HelpMessage = "Build all projects")]
[switch]$All,

[Parameter(HelpMessage = "Build Rust projects")]
[switch]$Rust,

[Parameter(HelpMessage = "Build .NET projects")]
[switch]$DotNet,

[Parameter(HelpMessage = "Build TypeScript/Deno projects")]
[switch]$TypeScript,

[Parameter(HelpMessage = "Build Python projects")]
[switch]$Python,

[Parameter(HelpMessage = "Build profile: 'debug' (default) or 'release'")]
[ValidateSet('debug', 'release')]
[string]$Profile = 'debug'
)

$ErrorActionPreference = 'Stop'
$ScriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
Set-Location $ScriptDir

# Use the profile parameter
$BuildProfile = $Profile

# If no specific project selected, build all
if (-not $All -and -not $Rust -and -not $DotNet -and -not $TypeScript -and -not $Python) {
$All = $true
}

# If --all is specified, enable all projects
if ($All) {
$Rust = $true
$DotNet = $true
$TypeScript = $true
$Python = $true
}

Write-Host "╔═══════════════════════════════════════════════════════════╗" -ForegroundColor Cyan
Write-Host "║ Ad-Blocking Repository Build Script ║" -ForegroundColor Cyan
Write-Host "╚═══════════════════════════════════════════════════════════╝" -ForegroundColor Cyan
Write-Host ""
Write-Host "Build Profile: $BuildProfile" -ForegroundColor Blue
Write-Host ""

$BuildFailed = $false

# Function to build Rust projects
function Build-RustProjects {
Write-Host "Building Rust projects..." -ForegroundColor Blue

# Build the entire workspace
Write-Host "→ Building Rust workspace..."
try {
if ($BuildProfile -eq "release") {
cargo build --release --workspace
} else {
cargo build --workspace
}
Write-Host "✓ Rust workspace built successfully" -ForegroundColor Green
}
catch {
Write-Host "✗ Rust workspace build failed" -ForegroundColor Red
$script:BuildFailed = $true
}

Write-Host ""
}

# Function to build .NET projects
function Build-DotNetProjects {
Write-Host "Building .NET projects..." -ForegroundColor Blue

$configuration = if ($BuildProfile -eq "release") { "Release" } else { "Debug" }

# Build AdGuard API Client
Write-Host "→ Building AdGuard API Client (.NET)..."
try {
Push-Location src/adguard-api-dotnet
try {
dotnet restore AdGuard.ApiClient.slnx
dotnet build AdGuard.ApiClient.slnx --no-restore --configuration $configuration
Write-Host "✓ AdGuard API Client built successfully" -ForegroundColor Green
}
finally {
Pop-Location
}
}
catch {
Write-Host "✗ AdGuard API Client build failed" -ForegroundColor Red
$script:BuildFailed = $true
}

# Build Rules Compiler .NET
Write-Host "→ Building Rules Compiler (.NET)..."
try {
Push-Location src/rules-compiler-dotnet
try {
dotnet restore RulesCompiler.slnx
dotnet build RulesCompiler.slnx --no-restore --configuration $configuration
Write-Host "✓ Rules Compiler (.NET) built successfully" -ForegroundColor Green
}
finally {
Pop-Location
}
}
catch {
Write-Host "✗ Rules Compiler (.NET) build failed" -ForegroundColor Red
$script:BuildFailed = $true
}

Write-Host ""
}

# Function to build TypeScript/Deno projects
function Build-TypeScriptProjects {
Write-Host "Building TypeScript/Deno projects..." -ForegroundColor Blue

# Check if Deno is installed
if (-not (Get-Command deno -ErrorAction SilentlyContinue)) {
Write-Host "✗ Deno is not installed. Please install Deno to build TypeScript projects." -ForegroundColor Red
$script:BuildFailed = $true
return
}

# Build Rules Compiler TypeScript
Write-Host "→ Building Rules Compiler (TypeScript)..."
try {
Push-Location src/rules-compiler-typescript
try {
deno task generate:types
deno task check
Write-Host "✓ Rules Compiler (TypeScript) built successfully" -ForegroundColor Green
}
finally {
Pop-Location
}
}
catch {
Write-Host "✗ Rules Compiler (TypeScript) build failed" -ForegroundColor Red
$script:BuildFailed = $true
}

# Build AdGuard API TypeScript
Write-Host "→ Building AdGuard API Client (TypeScript)..."
try {
Push-Location src/adguard-api-typescript
try {
deno task generate:types
deno task check
Write-Host "✓ AdGuard API Client (TypeScript) built successfully" -ForegroundColor Green
}
finally {
Pop-Location
}
}
catch {
Write-Host "✗ AdGuard API Client (TypeScript) build failed" -ForegroundColor Red
$script:BuildFailed = $true
}

# Build Linear tool
Write-Host "→ Building Linear Import Tool (TypeScript)..."
try {
Push-Location src/linear
try {
deno task generate:types
deno task check
Write-Host "✓ Linear Import Tool built successfully" -ForegroundColor Green
}
finally {
Pop-Location
}
}
catch {
Write-Host "✗ Linear Import Tool build failed" -ForegroundColor Red
$script:BuildFailed = $true
}

Write-Host ""
}

# Function to build Python projects
function Build-PythonProjects {
Write-Host "Building Python projects..." -ForegroundColor Blue

# Check if Python is installed
if (-not (Get-Command python -ErrorAction SilentlyContinue) -and -not (Get-Command python3 -ErrorAction SilentlyContinue)) {
Write-Host "✗ Python 3 is not installed. Please install Python 3 to build Python projects." -ForegroundColor Red
$script:BuildFailed = $true
return
}

$pythonCmd = if (Get-Command python3 -ErrorAction SilentlyContinue) { "python3" } else { "python" }

# Build Rules Compiler Python
Write-Host "→ Building Rules Compiler (Python)..."
try {
Push-Location src/rules-compiler-python
try {
& $pythonCmd -m pip install --quiet -e ".[dev]"
& $pythonCmd -m mypy rules_compiler/
Write-Host "✓ Rules Compiler (Python) built successfully" -ForegroundColor Green
}
finally {
Pop-Location
}
}
catch {
Write-Host "✗ Rules Compiler (Python) build failed" -ForegroundColor Red
$script:BuildFailed = $true
}

Write-Host ""
}

# Build projects based on flags
if ($Rust) {
Build-RustProjects
}

if ($DotNet) {
Build-DotNetProjects
}

if ($TypeScript) {
Build-TypeScriptProjects
}

if ($Python) {
Build-PythonProjects
}

# Summary
Write-Host "╔═══════════════════════════════════════════════════════════╗" -ForegroundColor Cyan
Write-Host "║ Build Summary ║" -ForegroundColor Cyan
Write-Host "╚═══════════════════════════════════════════════════════════╝" -ForegroundColor Cyan
Write-Host ""

if ($BuildFailed) {
Write-Host "✗ Some builds failed. Please check the output above." -ForegroundColor Red
exit 1
}
else {
Write-Host "✓ All builds completed successfully!" -ForegroundColor Green
exit 0
}
Loading
Loading