LLVM Linux Kernel #9
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: LLVM FOS Kernel | |
on: | |
push: | |
branches: | |
- main | |
pull_request: | |
branches: | |
- main | |
workflow_dispatch: | |
jobs: | |
build: | |
name: Build Kernel | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout code | |
uses: actions/checkout@v2 | |
- name: Set up dependencies | |
run: | | |
sudo apt-get update | |
sudo apt-get install -y clang llvm lld build-essential libncurses-dev bison flex libssl-dev libelf-dev cpio genisoimage grub-pc-bin xorriso curl | |
- name: Build Kernel with LLVM | |
run: | | |
export CC=clang | |
export LD=ld.lld | |
export AR=llvm-ar | |
export NM=llvm-nm | |
export OBJCOPY=llvm-objcopy | |
export OBJDUMP=llvm-objdump | |
export STRIP=llvm-strip | |
make defconfig | |
make -j$(nproc) CC=clang LD=ld.lld | |
- name: Archive the Kernel Artifact | |
run: | | |
tar -czvf kernel-build.tar.gz arch/x86/boot/bzImage | |
- name: Build Root Filesystem | |
run: | | |
mkdir -p rootfs/{bin,sbin,etc,proc,sys,usr/{bin,sbin}} | |
sudo apt-get install -y busybox-static | |
cp /bin/busybox rootfs/bin/ | |
# Install Neofetch dependencies | |
sudo apt-get install -y neofetch | |
# Copy Neofetch to rootfs | |
cp /usr/bin/neofetch rootfs/usr/bin/ | |
# Modify the init script to run neofetch on boot | |
cat << 'EOF' > rootfs/init | |
#!/bin/sh | |
mount -t proc none /proc | |
mount -t sysfs none /sys | |
echo "Welcome to FOS!" | |
neofetch | |
/bin/sh | |
EOF | |
chmod +x rootfs/init | |
# Create symlinks for busybox commands | |
for cmd in $(rootfs/bin/busybox --list); do | |
[ ! -e rootfs/bin/$cmd ] && ln -s /bin/busybox rootfs/bin/$cmd | |
done | |
cd rootfs | |
find . | cpio -H newc -ov --owner root:root | gzip > ../initramfs.img | |
- name: Archive the RootFS Artifact | |
run: | | |
tar -czvf rootfs-build.tar.gz initramfs.img | |
- name: Create Bootable ISO | |
run: | | |
mkdir -p iso/boot/grub | |
# Copy kernel and initramfs | |
cp arch/x86/boot/bzImage iso/boot/ | |
cp initramfs.img iso/boot/ | |
# Install GRUB files if they are not installed already | |
sudo apt-get install -y grub-pc-bin | |
# Copy GRUB stage2_eltorito and other necessary files | |
cp /usr/lib/grub/i386-pc/stage2_eltorito iso/boot/grub/ | |
cp /usr/lib/grub/i386-pc/*_stage2.iso iso/boot/grub/ | |
# Create GRUB configuration file | |
cat << EOF > iso/boot/grub/grub.cfg | |
set default=0 | |
set timeout=5 | |
menuentry "FOS OS" { | |
linux /boot/bzImage | |
initrd /boot/initramfs.img | |
} | |
EOF | |
# Create the ISO image | |
genisoimage -U -r -J -V "FOS_OS" -b boot/grub/stage2_eltorito -no-emul-boot -boot-load-size 4 -boot-info-table -o fos_os.iso iso | |
- name: Archive the ISO Artifact | |
run: | | |
tar -czvf fos-os-build.tar.gz fos_os.iso | |
- name: Upload Kernel Artifact | |
uses: actions/upload-artifact@v3 | |
with: | |
name: kernel-build | |
path: kernel-build.tar.gz | |
- name: Upload RootFS Artifact | |
uses: actions/upload-artifact@v3 | |
with: | |
name: rootfs-build | |
path: rootfs-build.tar.gz | |
- name: Upload ISO Artifact | |
uses: actions/upload-artifact@v3 | |
with: | |
name: iso-build | |
path: fos-os-build.tar.gz | |
release: | |
name: Release FOS Kernel, RootFS, and ISO | |
needs: build | |
runs-on: ubuntu-latest | |
steps: | |
- name: Download Kernel Artifact | |
uses: actions/download-artifact@v3 | |
with: | |
name: kernel-build | |
- name: Download RootFS Artifact | |
uses: actions/download-artifact@v3 | |
with: | |
name: rootfs-build | |
- name: Download ISO Artifact | |
uses: actions/download-artifact@v3 | |
with: | |
name: iso-build | |
- name: Create GitHub Release | |
id: create_release | |
uses: actions/create-release@v1 | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
with: | |
tag_name: fos${{ github.run_number }} | |
release_name: FOS Build v${{ github.run_number }} | |
draft: false | |
prerelease: false | |
- name: Upload Kernel to Release | |
uses: actions/upload-release-asset@v1 | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
with: | |
upload_url: ${{ steps.create_release.outputs.upload_url }} | |
asset_path: kernel-build.tar.gz | |
asset_name: kernel-build.tar.gz | |
asset_content_type: application/gzip | |
- name: Upload RootFS to Release | |
uses: actions/upload-release-asset@v1 | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
with: | |
upload_url: ${{ steps.create_release.outputs.upload_url }} | |
asset_path: rootfs-build.tar.gz | |
asset_name: rootfs-build.tar.gz | |
asset_content_type: application/gzip | |
- name: Upload ISO to Release | |
uses: actions/upload-release-asset@v1 | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
with: | |
upload_url: ${{ steps.create_release.outputs.upload_url }} | |
asset_path: fos-os-build.tar.gz | |
asset_name: fos-os-build.tar.gz | |
asset_content_type: application/gzip |