Skip to content

LLVM Linux Kernel

LLVM Linux Kernel #7

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
cp arch/x86/boot/bzImage iso/boot/
cp rootfs/initramfs.img iso/boot/
cat << EOF > iso/boot/grub/grub.cfg
set default=0
set timeout=5
menuentry "FOS OS" {
linux /boot/bzImage
initrd /boot/initramfs.img
}
EOF
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