Build Pipeline

Description of the build process for WvdS FPC RAD Studio.

Overview

┌─────────────────────────────────────────────────────────────┐
│                      BUILD PIPELINE                          │
├─────────────────────────────────────────────────────────────┤
│                                                              │
│  1. PRE-BUILD                                                │
│     ├── Policy-Check (wvds-lint)                             │
│     ├── Dependency Resolution                                │
│     └── Asset Preparation                                    │
│                                                              │
│  2. COMPILE                                                  │
│     ├── pas2js / FPC invocation                              │
│     ├── Unit Resolution                                      │
│     └── Code Generation                                      │
│                                                              │
│  3. POST-BUILD                                               │
│     ├── Bundle Assets                                        │
│     ├── Generate Source Maps                                 │
│     └── Copy to dist/                                        │
│                                                              │
│  4. PACKAGE (optional)                                       │
│     ├── VSIX Creation                                        │
│     └── Version Stamping                                     │
│                                                              │
└─────────────────────────────────────────────────────────────┘

Pre-Build

Policy-Check

wvds-lint policy --path sources/

Checks:

  • P0: No duplicates in Extensions
  • P1: No .ts or handwritten .js
  • P2: Wrappers only in common/
  • P3: Self-contained Output

Dependency Resolution

Dependencies are resolved from build.cfg and package.json:

# build.cfg
[build]
compiler=pas2js
entry=extension_main.pas
 
[dependencies]
core=../../common/core
vscode=../../common/web/vscode

Compile

pas2js Compilation

pas2js \
  -Jc \                    # Compact output
  -Jirtl.js \              # RTL as external module
  -Jm \                    # Generate Source Maps
  -Tbrowser \              # Target: Browser
  -Fu../../common \        # Unit paths
  -FE./dist \              # Output directory
  pas/extension_main.pas   # Entry Point

FPC Compilation

fpc \
  -Mobjfpc \               # Object Pascal Mode
  -Sh \                    # Ansi Strings
  -O3 \                    # Optimization Level 3
  -Fu../../common \        # Unit paths
  -FE./bin \               # Output directory
  project.lpr              # Project file

Compiler Options

Option pas2js FPC Description
Debug -Jc -Jm -g -O0 Debug symbols, no optimization
Release -Jc -O3 -O3 -Xs Optimized, no symbols
Profile -Jc -Jm -g -O2 -pg Profiling instrumentation

Post-Build

Asset Bundling

Resources are copied to dist/:

dist/
├── extension_main.js      # Compiled code
├── extension_main.js.map  # Source Map
└── assets/                # Copied resources
    ├── templates/*.html
    └── images/*.png

Source Maps

Source Maps enable debugging of Pascal code:

// extension_main.js.map
{
  "version": 3,
  "sources": ["../pas/extension_main.pas"],
  "mappings": "..."
}

Package

VSIX Creation

vsce package --out binaries/dist/

Produces: wvds-vscode-{name}-{version}.vsix

Version Stamping

The version is read from package.json and embedded in the build:

const
  VERSION = {$I version.inc};  // Generated from package.json

Build Modes

Mode Usage Optimization Symbols
debug Development None Yes
release Production Maximum No
profile Performance analysis Medium Yes + Profiling

Incremental Build

The build uses caching for faster compilation:

  • binaries/cache/ contains compiled units (.ppu, .o)
  • Only changed units are recompiled
  • wvds-build clean clears the cache

Toolchain CLI

The build toolchain consists of two main tools:

pxamlc (PXAML Compiler)

Compiles PXAML files for a specific target:

pxamlc compile \
  --target <tui|desktop|web> \
  --pxaml <file.pxaml> \
  --packs ~/packs \
  --out ~/binaries/out/<app>/<target>
Option Description
--target Target platform: tui, desktop, web
--pxaml Input PXAML file
--packs Path to pack registry
--out Output directory

wvds-build

Orchestrates the entire build process:

wvds-build build <tui|desktop|web> \
  --app ~/sources/applications/<app> \
  --config ~/.wvds/wvds-build.json \
  --out ~/binaries/out
Option Description
--app Application directory
--config Configuration file
--out Output directory

Additional Commands

# Delete all build artifacts
wvds-build clean
 
# Install pack
wvds-build pack install --from <packdir> --to ~/vendor-packs --enable tui,web
 
# Uninstall pack
wvds-build pack uninstall --vendor <vendor> --pack <pack>
 
# List installed packs
wvds-build pack list

Configuration File

Path: ~/.wvds/wvds-build.json

{
  "compilers": {
    "fpc": "%LAZARUS%/fpc/3.3.1/bin/fpc.exe",
    "pas2js": "%LAZARUS%/fpc/3.3.1/bin/pas2js.exe"
  },
  "paths": {
    "packs": "~/packs",
    "common": "~/sources/common",
    "output": "~/binaries/out"
  },
  "defaults": {
    "target": "web",
    "mode": "debug"
  },
  "targets": {
    "tui": {
      "compiler": "fpc",
      "enabled": true
    },
    "desktop": {
      "compiler": "fpc",
      "enabled": true
    },
    "web": {
      "compiler": "pas2js",
      "enabled": true
    }
  }
}

VS Code Tasks

Tasks are automatically generated:

// .vscode/tasks.json (generated)
{
  "version": "2.0.0",
  "tasks": [
    {
      "label": "WVDS: Build TUI",
      "type": "shell",
      "command": "${workspaceFolder}/.wvds/bin/wvds-build",
      "args": ["build", "tui"]
    },
    {
      "label": "WVDS: Build Desktop",
      "type": "shell",
      "command": "${workspaceFolder}/.wvds/bin/wvds-build",
      "args": ["build", "desktop"]
    },
    {
      "label": "WVDS: Build Web",
      "type": "shell",
      "command": "${workspaceFolder}/.wvds/bin/wvds-build",
      "args": ["build", "web"]
    }
  ]
}
Do not edit tasks manually - they are generated by wvds-build.

CI/CD Integration

# .github/workflows/build.yml
build:
  runs-on: ubuntu-latest
  steps:
    - uses: actions/checkout@v4
    - name: Install FPC
      run: sudo apt-get install fpc
    - name: Install pas2js
      run: sudo apt-get install pas2js
    - name: Build
      run: wvds-build --mode release
    - name: Package
      run: wvds-build package

Troubleshooting

"Unit not found"

  • Check unit paths in build.cfg
  • Check case sensitivity (Linux)

"JavaScript error"

  • Use Source Map for debugging
  • Check pas2js output for warnings

"VSIX invalid"

  • Validate package.json
  • README.md must exist
  • Check icon path

See also

Zuletzt geändert: on 2026/01/29 at 10:24 PM