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:
build:
script:
- mkdir -p $PREFIX/lib/mojo/toml
- cp -r src/toml/* $PREFIX/lib/mojo/toml/ # Just copying .mojo filesNo 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:
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:
build:
noarch: genericMeaning: - 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:
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)
docker run -it --rm -v $(pwd):/workspace condaforge/miniforge3:latest bash
cd /workspace
./scripts/validate-recipe.sh packaging/recipe.yamlTest 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! 🎉