# Platform Builds - Cross-Platform Considerations


# Your Packages Are Platform-Agnostic ✅

All your mojo-\* packages contain **pure Mojo source code** with no platform-specific dependencies. They will build and run on: - ✅ **Linux** (x86_64, ARM64) - ✅ **macOS** (Intel, Apple Silicon) - ✅ **Windows** (via WSL - Mojo's current Windows support)


# Local Validation vs CI Builds


## What You're Running Locally

When you run `./scripts/validate-recipe.sh`, it performs: - **Schema validation** - Checks recipe.yaml structure - **Dependency resolution** - Verifies channels and requirements - **Render-only mode** - Doesn't actually compile/build

**Platform:** Runs on your Mac (ARM64)\
**Scope:** Validates recipe correctness, not platform compatibility


## What modular-community CI Runs

The modular-community workflow (`.github/workflows/build-pr.yml`) builds on: - `ubuntu-latest` (Linux x86_64) - `macos-latest` (macOS ARM64) - `magic_arm64_8core` (Custom ARM64 runner)

**Platform:** All three\
**Scope:** Full compilation and testing on each platform


# Why Your Packages Are Cross-Platform


## 1. Pure Mojo Source

Your packages ship **source code**, not binaries:

``` yaml
build:
  script:
    - mkdir -p $PREFIX/lib/mojo/toml
    - cp -r src/toml/* $PREFIX/lib/mojo/toml/  # Just copying .mojo files
```

No compilation happens during installation - just file copying.


## 2. No Platform-Specific Code

None of your packages use: - ❌ C/C++ extensions - ❌ Platform-specific syscalls - ❌ Architecture-dependent libraries - ❌ Binary dependencies

They're pure Mojo parsing/formatting libraries.


## 3. Mojo Compiler Handles Platforms

The `mojo-compiler` dependency is platform-aware:

``` yaml
requirements:
  run:
    - ${{ pin_compatible('mojo-compiler') }}
```

When users install your package, conda fetches the appropriate `mojo-compiler` for their platform automatically.


# noarch Packages

Some of your packages (like mojo-dotenv) are marked as `noarch`:

``` yaml
build:
  noarch: generic
```

**Meaning:** - Built once, works everywhere - No recompilation needed per platform - Faster installation - Smaller storage footprint

**When to use `noarch`:** - ✅ Pure source files only (no compilation) - ✅ No platform-specific paths/tools - ✅ No test executables

**Your packages that could use `noarch`:** - mojo-toml ✅ (pure source) - mojo-yaml ✅ (pure source) - mojo-asciichart ✅ (pure source) - mojo-dotenv ✅ (already marked noarch) - mojo-ini ⚠️ (builds .mojopkg, platform-specific)


# Adding noarch to Your Recipes

To make packages truly platform-independent, add to your recipes:

``` yaml
build:
  number: 0
  noarch: generic  # <-- Add this
  script:
    - mkdir -p $PREFIX/lib/mojo/package
    - cp -r src/package/* $PREFIX/lib/mojo/package/
```

**Benefits:** - Single build works everywhere - Faster package creation - Less storage on conda servers

**Trade-off:** - Can't do platform-specific logic in build scripts - Can't compile binaries - (Not an issue for your pure-source packages)


# Testing Locally on Other Platforms


## Test on Linux (via Docker)

``` bash
docker run -it --rm -v $(pwd):/workspace condaforge/miniforge3:latest bash
cd /workspace
./scripts/validate-recipe.sh packaging/recipe.yaml
```


## Test on Linux (via GitHub Actions)

The `.github/workflows/validate-recipe.yml` runs on `ubuntu-latest`, so pushing to GitHub tests Linux automatically.


## Windows Testing

Mojo on Windows requires WSL2. For now, rely on: 1. Local macOS validation (schema/syntax) 2. CI Linux builds (prove cross-platform works) 3. User testing on Windows once published


# Recommendation

For your next recipe updates, consider adding `noarch: generic` to: - ✅ mojo-toml - ✅ mojo-yaml\
- ✅ mojo-asciichart

Keep mojo-ini without `noarch` since it builds a `.mojopkg` file.

This will make builds faster and more efficient while maintaining full cross-platform compatibility.


# Summary

| Aspect               | Status                | Notes                      |
|----------------------|-----------------------|----------------------------|
| **Your code**        | ✅ Platform-agnostic  | Pure Mojo source           |
| **Local validation** | ✅ Works on your Mac  | Schema + dependency checks |
| **CI builds**        | ✅ Multi-platform     | Linux, macOS, ARM64        |
| **User installs**    | ✅ Any platform       | Mojo compiler handles it   |
| **Recommendation**   | Add `noarch: generic` | Faster, more efficient     |

Your packages will work on any platform that supports Mojo! 🎉
