Newer
Older
minerva / Meta / gn / secondary / Kernel / BUILD.gn
@minerva minerva on 13 Jul 27 KB Initial commit
import("//Meta/gn/build/minerva_target.gni")
import("//Meta/gn/build/sysroot.gni")
import("//Meta/gn/build/write_cmake_config.gni")

assert(current_os == "minerva")

declare_args() {
  # Turn off optimizations and up debug symbols for the kernel only
  enable_extra_kernel_debug_symbols = true

  # Enable UBSAN for kernel objects. Detects undefined behavior and traps.
  enable_kernel_undefined_sanitizer = true
  enable_kernel_undefined_sanitizer_always_deadly = true
}

group("Kernel") {
  deps = [ ":install_kernel" ]
}

write_cmake_config("kernel_debug_gen") {
  input = "Debug.h.in"
  output = "$target_gen_dir/Debug.h"
  deps = [ "//AK:ak_debug_gen" ]
  values = [
    "AC97_DEBUG=",
    "AHCI_DEBUG=",
    "ACPI_DEBUG=",
    "APIC_DEBUG=",
    "APIC_SMP_DEBUG=",
    "ARP_DEBUG=",
    "ATA_DEBUG=",
    "BBFS_DEBUG=",
    "BXVGA_DEBUG=",
    "COMMIT_DEBUG=",
    "CONTEXT_SWITCH_DEBUG=",
    "DUMP_REGIONS_ON_CRASH=",
    "E1000_DEBUG=",
    "ETHERNET_DEBUG=",
    "EXEC_DEBUG=",
    "EXT2_BLOCKLIST_DEBUG=",
    "EXT2_DEBUG=",
    "EXT2_VERY_DEBUG=",
    "FAT_DEBUG=",
    "FORK_DEBUG=",
    "FUTEX_DEBUG=",
    "FUTEXQUEUE_DEBUG=",
    "HID_DEBUG=",
    "HPET_COMPARATOR_DEBUG=",
    "HPET_DEBUG=",
    "ICMP_DEBUG=",
    "INTEL_GRAPHICS_DEBUG=",
    "INTEL_HDA_DEBUG=",
    "INTERRUPT_DEBUG=",
    "IO_DEBUG=",
    "IOAPIC_DEBUG=",
    "ISO9660_DEBUG=",
    "ISO9660_VERY_DEBUG=",
    "IPV4_DEBUG=",
    "IPV4_SOCKET_DEBUG=",
    "IRQ_DEBUG=",
    "KEYBOARD_DEBUG=",
    "KMALLOC_DEBUG=",
    "KMALLOC_VERIFY_NO_SPINLOCK_HELD=",
    "LOCAL_SOCKET_DEBUG=",
    "LOCK_DEBUG=",
    "LOCK_IN_CRITICAL_DEBUG=",
    "LOCK_RANK_ENFORCEMENT=",
    "LOCK_RESTORE_DEBUG=",
    "LOCK_SHARED_UPGRADE_DEBUG=",
    "LOCK_TRACE_DEBUG=",
    "LOOPBACK_DEBUG=",
    "MASTERPTY_DEBUG=",
    "MOUSE_DEBUG=",
    "MEMORY_DEVICE_DEBUG=",
    "MULTIPROCESSOR_DEBUG=",
    "NETWORK_TASK_DEBUG=",
    "NVME_DEBUG=",
    "OFFD_DEBUG=",
    "PAGE_FAULT_DEBUG=",
    "PATA_DEBUG=",
    "PCI_DEBUG=",
    "POLL_SELECT_DEBUG=",
    "PROCESS_DEBUG=",
    "PROCFS_DEBUG=",
    "PS2MOUSE_DEBUG=",
    "PTMX_DEBUG=",
    "ROUTING_DEBUG=",
    "RTL8168_DEBUG=",
    "SCHEDULER_DEBUG=",
    "SCHEDULER_RUNNABLE_DEBUG=",
    "SIGNAL_DEBUG=",
    "SLAVEPTY_DEBUG=",
    "SMP_DEBUG=",
    "SOCKET_DEBUG=",
    "STORAGE_DEVICE_DEBUG=",
    "SYSFS_DEBUG=",
    "TCP_DEBUG=",
    "TCP_SOCKET_DEBUG=",
    "THREAD_DEBUG=",
    "TTY_DEBUG=",
    "UDP_DEBUG=",
    "UHCI_DEBUG=",
    "UHCI_VERBOSE_DEBUG=",
    "USB_DEBUG=",
    "VFS_DEBUG=",
    "VMWARE_BACKDOOR_DEBUG=",
    "VIRTIO_DEBUG=",
    "VIRTUAL_CONSOLE_DEBUG=",
    "WAITBLOCK_DEBUG=",
    "WAITQUEUE_DEBUG=",
    "XHCI_DEBUG=",
    "USB_MASS_STORAGE_DEBUG=",
  ]
}

config("Kernel_config") {
  configs = [ "//AK:ak_headers" ]
  include_dirs = [ "//Userland/Libraries" ]

  cflags_cc = []
  ldflags = []

  defines = [
    "KERNEL",
    "ENABLE_COMPILETIME_FORMAT_CHECK",
    "SANITIZE_PTRS",
  ]

  if (enable_extra_kernel_debug_symbols) {
    cflags_cc += [
      "-Og",
      "-ggdb3",
    ]
  } else {
    cflags_cc += [ "-O2" ]
  }

  if (enable_kernel_undefined_sanitizer) {
    cflags_cc += [ "-fsanitize=undefined" ]
    ldflags = [ "-fsanitize=undefined" ]
    if (enable_kernel_undefined_sanitizer_always_deadly) {
      cflags_cc += [ "-fno-sanitize-recover=undefined" ]
    }
  }

  cflags_cc += [
    "-fsigned-char",
    "-Wno-unknown-warning-option",
    "-fno-rtti",
    "-ffreestanding",
    "-fbuiltin",
    "-fno-asynchronous-unwind-tables",
    "-fstack-protector-strong",
    "-fno-exceptions",
    "-fno-delete-null-pointer-checks",
    "-fno-semantic-interposition",
    "-fsized-deallocation",
    "-Wvla",
    "-nostdlib",
  ]
  ldflags += [
    "-Wl,-z,notext",
    "-nostdlib",
  ]

  # Toolchain-specific flags
  if (minerva_toolchain == "GNU") {
    cflags_cc += [
      "-fzero-call-used-regs=used-gpr",
      "-fstack-clash-protection",
      "-Wno-address-of-packed-member",
      "-Wno-dangling-reference",
    ]
    lib_dirs = [
      "$toolchain_root/$minerva_arch-pc-minerva/lib",
      "$toolchain_root/lib/gcc/$minerva_arch-pc-minerva/$minerva_compiler_version",
    ]
    ldflags += [ "-Wl,-z,pack-relative-relocs" ]
    libs = [ "gcc" ]
  } else {
    assert(minerva_toolchain == "Clang", "")
    cflags_cc += [
      "-Wno-address-of-packed-member",
      "-faligned-allocation",
      "-Wno-unused-const-variable",
    ]
    ldflags += [
      "-Wl,--build-id=none",
      "-Wl,--pack-dyn-relocs=relr",
    ]

    # FIXME: Why doesn't the cmake need this path anymore?
    lib_dirs = [ "$toolchain_root/lib/clang/$minerva_compiler_version/lib/$minerva_arch-pc-minerva/" ]
    libs = [ "clang_rt.builtins" ]
  }

  # Architecture-specific flags
  if (current_cpu == "aarch64") {
    cflags_cc += [
      "-mno-outline-atomics",
      "-Wno-nonnull",  # FIXME: Remove once MemoryManager.cpp doesn't need it
      "-mgeneral-regs-only",
      "-fno-threadsafe-statics",

      # Unaligned memory access will cause a trap, so to make sure the compiler doesn't generate
      # those unaligned accesses, these flags are added.
      "-mstrict-align",
      "-Wno-cast-align",
    ]
    libs = [ "atomic" ]
  } else if (current_cpu == "x86_64") {
    cflags_cc += [
      "-mno-80387",
      "-mno-mmx",
      "-mno-sse",
      "-mno-sse2",

      # Auto initialize trivial types on the stack, we use "pattern" as
      # it's the only option portable across compilers going forward.
      #
      # This is designed to help avoid uninitialized variables bugs and
      # information disclosures coming from the kernel stack.
      #
      # FIXME: It appears to conflict with something during the boot of the
      # aarch64 kernel, we should investigate and remove this special case.
      "-ftrivial-auto-var-init=pattern",

      "-mcmodel=large",
      "-mno-red-zone",
    ]
    if (minerva_toolchain == "GNU") {
      cflags_cc += [
        "-faligned-new=8",
        "-mpreferred-stack-boundary=3",
      ]
    } else {
      assert(minerva_toolchain == "Clang", "")
      cflags_cc += [
        "-fnew-alignment=8",
        "-mstack-alignment=8",
      ]
    }
  }

  # FIXME: KCOV flags
  # FIXME: Source based code coverage flags
  # FIXME: KASAN/KUBSAN flags
  # FIXME: IPO flags
}

source_set("kernel_heap") {
  configs += [ ":Kernel_config" ]
  sources = [ "Heap/kmalloc.cpp" ]
  deps = [
    ":kernel_debug_gen",
    "//Userland/Libraries/LibC:install_libc_headers",
  ]
}

source_set("aarch64_no_mmu") {
  deps = [
    ":kernel_debug_gen",
    "//Userland/Libraries/LibC:install_libc_headers",
  ]

  configs += [ ":Kernel_config" ]
  sources = [
    "Arch/aarch64/Exceptions.cpp",
    "Arch/aarch64/MMU.cpp",
    "Arch/aarch64/RPi/MMIO.cpp",
    "Arch/aarch64/pre_init.cpp",
  ]

  # NOTE: These files cannot use a stack protector and sanitizers, as these will cause accesses to global variables to be inserted
  #       by the compiler. The CPU cannot access global variables without the MMU as the kernel is linked for a virtual address in high memory.
  cflags_cc = [
    "-fno-stack-protector",
    "-fno-sanitize=all",
  ]
}

source_set("mini_stdlib_sources") {
  deps = [
    ":kernel_debug_gen",
    "//Userland/Libraries/LibC:install_libc_headers",
  ]

  configs += [ ":Kernel_config" ]
  sources = [ "Library/MiniStdLib.cpp" ]

  if (minerva_toolchain == "GNU") {
    # Prevent naively implemented string functions (like strlen) from being "optimized" into a call to themselves.
    cflags_cc = [
      "-fno-tree-loop-distribution",
      "-fno-tree-loop-distribute-patterns",
    ]
  }
}

source_set("arch_sources") {
  deps = [
    ":kernel_debug_gen",
    "//Userland/Libraries/LibC:install_libc_headers",
    "//Userland/Libraries/LibVT:generate_vt_state_machine(//Meta/gn/build/toolchain:minerva)",
  ]

  configs += [ ":Kernel_config" ]
  if (current_cpu == "x86_64") {
    sources = [
      "Arch/Processor.cpp",
      "Arch/x86_64/ASM_wrapper.cpp",
      "Arch/x86_64/Boot/ap_setup.S",
      "Arch/x86_64/CMOS.cpp",
      "Arch/x86_64/CPU.cpp",
      "Arch/x86_64/CPUID.cpp",
      "Arch/x86_64/CurrentTime.cpp",
      "Arch/x86_64/DebugOutput.cpp",
      "Arch/x86_64/Delay.cpp",
      "Arch/x86_64/Firmware/ACPI/StaticParsing.cpp",
      "Arch/x86_64/Firmware/PCBIOS/Mapper.cpp",
      "Arch/x86_64/Firmware/PCBIOS/SysFSComponent.cpp",
      "Arch/x86_64/Firmware/PCBIOS/SysFSDirectory.cpp",
      "Arch/x86_64/Hypervisor/BochsDisplayConnector.cpp",
      "Arch/x86_64/Hypervisor/VMWareBackdoor.cpp",
      "Arch/x86_64/I8042Reboot.cpp",
      "Arch/x86_64/ISABus/I8042Controller.cpp",
      "Arch/x86_64/ISABus/Input/VMWareMouseDevice.cpp",
      "Arch/x86_64/ISABus/SerialDevice.cpp",
      "Arch/x86_64/InterruptEntry.cpp",
      "Arch/x86_64/InterruptManagement.cpp",
      "Arch/x86_64/Interrupts.cpp",
      "Arch/x86_64/Interrupts/APIC.cpp",
      "Arch/x86_64/Interrupts/IOAPIC.cpp",
      "Arch/x86_64/Interrupts/PIC.cpp",
      "Arch/x86_64/PCI/Controller/PIIX4HostBridge.cpp",
      "Arch/x86_64/PCI/Initializer.cpp",
      "Arch/x86_64/PCI/MSI.cpp",
      "Arch/x86_64/PCSpeaker.cpp",
      "Arch/x86_64/PageDirectory.cpp",
      "Arch/x86_64/PowerState.cpp",
      "Arch/x86_64/Processor.cpp",
      "Arch/x86_64/ProcessorInfo.cpp",
      "Arch/x86_64/RTC.cpp",
      "Arch/x86_64/SafeMem.cpp",
      "Arch/x86_64/Shutdown.cpp",
      "Arch/x86_64/SmapDisabler.cpp",
      "Arch/x86_64/SyscallEntry.cpp",
      "Arch/x86_64/Time/APICTimer.cpp",
      "Arch/x86_64/Time/HPET.cpp",
      "Arch/x86_64/Time/HPETComparator.cpp",
      "Arch/x86_64/Time/PIT.cpp",
      "Arch/x86_64/Time/RTC.cpp",
      "Arch/x86_64/TrapFrame.cpp",

      # TODO: Share these with the aarch64 build
      "Interrupts/SpuriousInterruptHandler.cpp",
      "kprintf.cpp",
    ]
  } else {
    assert(current_cpu == "aarch64", "")
    deps = [ ":aarch64_no_mmu" ]
    sources = [
      "Arch/Processor.cpp",
      "Arch/aarch64/CPUID.cpp",
      "Arch/aarch64/CurrentTime.cpp",
      "Arch/aarch64/Dummy.cpp",
      "Arch/aarch64/Firmware/ACPI/StaticParsing.cpp",
      "Arch/aarch64/InterruptManagement.cpp",
      "Arch/aarch64/Interrupts.cpp",
      "Arch/aarch64/MainIdRegister.cpp",
      "Arch/aarch64/PageDirectory.cpp",
      "Arch/aarch64/Panic.cpp",
      "Arch/aarch64/PowerState.cpp",
      "Arch/aarch64/Processor.cpp",
      "Arch/aarch64/RPi/DebugOutput.cpp",
      "Arch/aarch64/RPi/Framebuffer.cpp",
      "Arch/aarch64/RPi/GPIO.cpp",
      "Arch/aarch64/RPi/InterruptController.cpp",
      "Arch/aarch64/RPi/Mailbox.cpp",
      "Arch/aarch64/RPi/MiniUART.cpp",
      "Arch/aarch64/RPi/SDHostController.cpp",
      "Arch/aarch64/RPi/Timer.cpp",
      "Arch/aarch64/RPi/UART.cpp",
      "Arch/aarch64/RPi/Watchdog.cpp",
      "Arch/aarch64/SafeMem.cpp",
      "Arch/aarch64/SmapDisabler.cpp",
      "Arch/aarch64/TrapFrame.cpp",
      "Arch/aarch64/boot.S",
      "Arch/aarch64/vector_table.S",
    ]
  }
}

source_set("lib_sources") {
  deps = [
    ":kernel_debug_gen",
    "//Userland/Libraries/LibC:install_libc_headers",
    "//Userland/Libraries/LibVT:generate_vt_state_machine(//Meta/gn/build/toolchain:minerva)",
  ]

  configs += [ ":Kernel_config" ]
  sources = [
    "//AK/DOSPackedTime.cpp",
    "//AK/Error.cpp",
    "//AK/Format.cpp",
    "//AK/GenericLexer.cpp",
    "//AK/Hex.cpp",
    "//AK/MemoryStream.cpp",
    "//AK/Stream.cpp",
    "//AK/StringBuilder.cpp",
    "//AK/StringUtils.cpp",
    "//AK/StringView.cpp",
    "//AK/Time.cpp",
    "//AK/UUID.cpp",
    "//Userland/Libraries/LibCrypto/Cipher/AES.cpp",
    "//Userland/Libraries/LibCrypto/Hash/SHA2.cpp",
    "//Userland/Libraries/LibEDID/DMT.cpp",
    "//Userland/Libraries/LibEDID/EDID.cpp",
    "//Userland/Libraries/LibEDID/VIC.cpp",
    "//Userland/Libraries/LibELF/Image.cpp",
    "//Userland/Libraries/LibELF/Validation.cpp",
    "//Userland/Libraries/LibPartition/DiskPartitionMetadata.cpp",
    "//Userland/Libraries/LibPartition/EBRPartitionTable.cpp",
    "//Userland/Libraries/LibPartition/GUIDPartitionTable.cpp",
    "//Userland/Libraries/LibPartition/MBRPartitionTable.cpp",
    "//Userland/Libraries/LibPartition/PartitionTable.cpp",
    "//Userland/Libraries/LibPartition/PartitionableDevice.cpp",
    "//Userland/Libraries/LibVT/EscapeSequenceParser.cpp",
    "//Userland/Libraries/LibVT/Line.cpp",
    "//Userland/Libraries/LibVT/Terminal.cpp",
  ]
}

action("generate_version_header") {
  script = "//Meta/gn/secondary/Kernel/generate_version_header.py"
  outputs = [ "$target_gen_dir/Version.h" ]
  args = [ rebase_path(outputs[0], root_build_dir) ]
}

if (current_cpu == "x86_64") {
  action("preprocess_linker_script") {
    script = "//Meta/gn/build/invoke_process_with_args.py"
    inputs = [ "Arch/x86_64/linker.ld" ]
    outputs = [ "$target_gen_dir/linker.ld" ]
    args = [
      "$minerva_cxx",
      "-E",
      "-P",
      "-x",
      "c",
      rebase_path(inputs[0], root_build_dir),
      "-o",
      rebase_path(outputs[0], root_build_dir),
    ]
  }
}

executable("Kernel_bin") {
  configs += [ ":Kernel_config" ]
  deps = [
    ":arch_sources",
    ":generate_version_header",
    ":kernel_debug_gen",
    ":kernel_heap",
    ":lib_sources",
    ":mini_stdlib_sources",
    "//Userland/Libraries/LibC:install_libc_headers",
  ]
  ldflags = [ "-static-pie" ]
  if (minerva_arch == "x86_64") {
    deps += [ ":preprocess_linker_script" ]
    ldflags +=
        [ "-Wl,-T," + rebase_path("$target_gen_dir/linker.ld", root_build_dir) ]
  } else {
    assert(minerva_arch == "aarch64")
    ldflags +=
        [ "-Wl,-T," + rebase_path("Arch/aarch64/linker.ld", root_build_dir) ]
  }
  sources = [
    "Arch/DeferredCallPool.cpp",
    "Arch/PageFault.cpp",
    "Arch/init.cpp",
    "Boot/CommandLine.cpp",
    "Bus/PCI/API.cpp",
    "Bus/PCI/Access.cpp",
    "Bus/PCI/Controller/HostController.cpp",
    "Bus/PCI/Controller/MemoryBackedHostBridge.cpp",
    "Bus/PCI/Controller/VolumeManagementDevice.cpp",
    "Bus/PCI/Device.cpp",
    "Bus/PCI/DeviceIdentifier.cpp",
    "Bus/USB/UHCI/UHCIController.cpp",
    "Bus/USB/UHCI/UHCIRootHub.cpp",
    "Bus/USB/USBConfiguration.cpp",
    "Bus/USB/USBController.cpp",
    "Bus/USB/USBDevice.cpp",
    "Bus/USB/USBHub.cpp",
    "Bus/USB/USBManagement.cpp",
    "Bus/USB/USBPipe.cpp",
    "Bus/USB/USBTransfer.cpp",
    "Bus/VirtIO/Device.cpp",
    "Bus/VirtIO/Queue.cpp",
    "Devices/AsyncDeviceRequest.cpp",
    "Devices/Audio/AC97/AC97.cpp",
    "Devices/Audio/Channel.cpp",
    "Devices/Audio/IntelHDA/Codec.cpp",
    "Devices/Audio/IntelHDA/Controller.cpp",
    "Devices/Audio/IntelHDA/Format.cpp",
    "Devices/Audio/IntelHDA/InterruptHandler.cpp",
    "Devices/Audio/IntelHDA/Stream.cpp",
    "Devices/Audio/Management.cpp",
    "Devices/BlockDevice.cpp",
    "Devices/CharacterDevice.cpp",
    "Devices/Device.cpp",
    "Devices/GPU/Bochs/GraphicsAdapter.cpp",
    "Devices/GPU/Bochs/QEMUDisplayConnector.cpp",
    "Devices/GPU/Console/BootFramebufferConsole.cpp",
    "Devices/GPU/Console/ContiguousFramebufferConsole.cpp",
    "Devices/GPU/Console/GenericFramebufferConsole.cpp",
    "Devices/GPU/DisplayConnector.cpp",
    "Devices/GPU/Generic/DisplayConnector.cpp",
    "Devices/GPU/Intel/Auxiliary/GMBusConnector.cpp",
    "Devices/GPU/Intel/DisplayConnectorGroup.cpp",
    "Devices/GPU/Intel/NativeDisplayConnector.cpp",
    "Devices/GPU/Intel/NativeGraphicsAdapter.cpp",
    "Devices/GPU/Intel/Plane/DisplayPlane.cpp",
    "Devices/GPU/Intel/Plane/G33DisplayPlane.cpp",
    "Devices/GPU/Intel/Transcoder/AnalogDisplayTranscoder.cpp",
    "Devices/GPU/Intel/Transcoder/DisplayTranscoder.cpp",
    "Devices/GPU/Intel/Transcoder/PLL.cpp",
    "Devices/GPU/Management.cpp",
    "Devices/GPU/VMWare/Console.cpp",
    "Devices/GPU/VMWare/DisplayConnector.cpp",
    "Devices/GPU/VMWare/GraphicsAdapter.cpp",
    "Devices/GPU/VirtIO/Console.cpp",
    "Devices/GPU/VirtIO/DisplayConnector.cpp",
    "Devices/GPU/VirtIO/GPU3DDevice.cpp",
    "Devices/GPU/VirtIO/GraphicsAdapter.cpp",
    "Devices/Generic/ConsoleDevice.cpp",
    "Devices/Generic/DeviceControlDevice.cpp",
    "Devices/Generic/FullDevice.cpp",
    "Devices/Generic/MemoryDevice.cpp",
    "Devices/Generic/NullDevice.cpp",
    "Devices/Generic/RandomDevice.cpp",
    "Devices/Generic/SelfTTYDevice.cpp",
    "Devices/Generic/ZeroDevice.cpp",
    "Devices/Input/KeyboardDevice.cpp",
    "Devices/Input/Management.cpp",
    "Devices/Input/MouseDevice.cpp",
    "Devices/Input/PS2/KeyboardDevice.cpp",
    "Devices/Input/PS2/MouseDevice.cpp",
    "Devices/KCOVDevice.cpp",
    "Devices/KCOVInstance.cpp",
    "Devices/Serial/VirtIO/Console.cpp",
    "Devices/Serial/VirtIO/ConsolePort.cpp",
    "Devices/SerialDevice.cpp",
    "Devices/Storage/AHCI/ATAController.cpp",
    "Devices/Storage/AHCI/ATADevice.cpp",
    "Devices/Storage/AHCI/ATADiskDevice.cpp",
    "Devices/Storage/AHCI/Controller.cpp",
    "Devices/Storage/AHCI/InterruptHandler.cpp",
    "Devices/Storage/AHCI/Port.cpp",
    "Devices/Storage/DiskPartition.cpp",
    "Devices/Storage/NVMe/NVMeController.cpp",
    "Devices/Storage/NVMe/NVMeInterruptQueue.cpp",
    "Devices/Storage/NVMe/NVMeNameSpace.cpp",
    "Devices/Storage/NVMe/NVMePollQueue.cpp",
    "Devices/Storage/NVMe/NVMeQueue.cpp",
    "Devices/Storage/SD/PCISDHostController.cpp",
    "Devices/Storage/SD/SDHostController.cpp",
    "Devices/Storage/SD/SDMemoryCard.cpp",
    "Devices/Storage/StorageController.cpp",
    "Devices/Storage/StorageDevice.cpp",
    "Devices/Storage/StorageManagement.cpp",
    "FileSystem/AnonymousFile.cpp",
    "FileSystem/BlockBasedFileSystem.cpp",
    "FileSystem/Custody.cpp",
    "FileSystem/DevPtsFS/FileSystem.cpp",
    "FileSystem/DevPtsFS/Inode.cpp",
    "FileSystem/Ext2FS/FileSystem.cpp",
    "FileSystem/Ext2FS/Inode.cpp",
    "FileSystem/FATFS/FileSystem.cpp",
    "FileSystem/FATFS/Inode.cpp",
    "FileSystem/FIFO.cpp",
    "FileSystem/File.cpp",
    "FileSystem/FileBackedFileSystem.cpp",
    "FileSystem/FileSystem.cpp",
    "FileSystem/ISO9660FS/DirectoryIterator.cpp",
    "FileSystem/ISO9660FS/FileSystem.cpp",
    "FileSystem/ISO9660FS/Inode.cpp",
    "FileSystem/Inode.cpp",
    "FileSystem/InodeFile.cpp",
    "FileSystem/InodeMetadata.cpp",
    "FileSystem/InodeWatcher.cpp",
    "FileSystem/Mount.cpp",
    "FileSystem/MountFile.cpp",
    "FileSystem/OpenFileDescription.cpp",
    "FileSystem/Plan9FS/FileSystem.cpp",
    "FileSystem/Plan9FS/Inode.cpp",
    "FileSystem/Plan9FS/Message.cpp",
    "FileSystem/ProcFS/FileSystem.cpp",
    "FileSystem/ProcFS/Inode.cpp",
    "FileSystem/ProcFS/ProcessExposed.cpp",
    "FileSystem/RAMFS/FileSystem.cpp",
    "FileSystem/RAMFS/Inode.cpp",
    "FileSystem/SysFS/Component.cpp",
    "FileSystem/SysFS/DirectoryInode.cpp",
    "FileSystem/SysFS/FileSystem.cpp",
    "FileSystem/SysFS/Inode.cpp",
    "FileSystem/SysFS/LinkInode.cpp",
    "FileSystem/SysFS/Registry.cpp",
    "FileSystem/SysFS/RootDirectory.cpp",
    "FileSystem/SysFS/Subsystems/Bus/Directory.cpp",
    "FileSystem/SysFS/Subsystems/Bus/PCI/BusDirectory.cpp",
    "FileSystem/SysFS/Subsystems/Bus/PCI/DeviceAttribute.cpp",
    "FileSystem/SysFS/Subsystems/Bus/PCI/DeviceDirectory.cpp",
    "FileSystem/SysFS/Subsystems/Bus/PCI/DeviceExpansionROM.cpp",
    "FileSystem/SysFS/Subsystems/Bus/USB/BusDirectory.cpp",
    "FileSystem/SysFS/Subsystems/Bus/USB/DeviceInformation.cpp",
    "FileSystem/SysFS/Subsystems/DeviceIdentifiers/BlockDevicesDirectory.cpp",
    "FileSystem/SysFS/Subsystems/DeviceIdentifiers/CharacterDevicesDirectory.cpp",
    "FileSystem/SysFS/Subsystems/DeviceIdentifiers/DeviceComponent.cpp",
    "FileSystem/SysFS/Subsystems/DeviceIdentifiers/Directory.cpp",
    "FileSystem/SysFS/Subsystems/DeviceIdentifiers/SymbolicLinkDeviceComponent.cpp",
    "FileSystem/SysFS/Subsystems/Devices/Directory.cpp",
    "FileSystem/SysFS/Subsystems/Devices/Graphics/Directory.cpp",
    "FileSystem/SysFS/Subsystems/Devices/Graphics/DisplayConnector/DeviceAttribute.cpp",
    "FileSystem/SysFS/Subsystems/Devices/Graphics/DisplayConnector/DeviceDirectory.cpp",
    "FileSystem/SysFS/Subsystems/Devices/Graphics/DisplayConnector/Directory.cpp",
    "FileSystem/SysFS/Subsystems/Devices/Storage/DeviceAttribute.cpp",
    "FileSystem/SysFS/Subsystems/Devices/Storage/DeviceDirectory.cpp",
    "FileSystem/SysFS/Subsystems/Devices/Storage/Directory.cpp",
    "FileSystem/SysFS/Subsystems/Firmware/Directory.cpp",
    "FileSystem/SysFS/Subsystems/Kernel/CPUInfo.cpp",
    "FileSystem/SysFS/Subsystems/Kernel/Constants/ConstantInformation.cpp",
    "FileSystem/SysFS/Subsystems/Kernel/Constants/Directory.cpp",
    "FileSystem/SysFS/Subsystems/Kernel/Directory.cpp",
    "FileSystem/SysFS/Subsystems/Kernel/DiskUsage.cpp",
    "FileSystem/SysFS/Subsystems/Kernel/GlobalInformation.cpp",
    "FileSystem/SysFS/Subsystems/Kernel/Interrupts.cpp",
    "FileSystem/SysFS/Subsystems/Kernel/Keymap.cpp",
    "FileSystem/SysFS/Subsystems/Kernel/Log.cpp",
    "FileSystem/SysFS/Subsystems/Kernel/MemoryStatus.cpp",
    "FileSystem/SysFS/Subsystems/Kernel/Network/ARP.cpp",
    "FileSystem/SysFS/Subsystems/Kernel/Network/Adapters.cpp",
    "FileSystem/SysFS/Subsystems/Kernel/Network/Directory.cpp",
    "FileSystem/SysFS/Subsystems/Kernel/Network/Local.cpp",
    "FileSystem/SysFS/Subsystems/Kernel/Network/Route.cpp",
    "FileSystem/SysFS/Subsystems/Kernel/Network/TCP.cpp",
    "FileSystem/SysFS/Subsystems/Kernel/Network/UDP.cpp",
    "FileSystem/SysFS/Subsystems/Kernel/PowerStateSwitch.cpp",
    "FileSystem/SysFS/Subsystems/Kernel/Processes.cpp",
    "FileSystem/SysFS/Subsystems/Kernel/Profile.cpp",
    "FileSystem/SysFS/Subsystems/Kernel/RequestPanic.cpp",
    "FileSystem/SysFS/Subsystems/Kernel/SystemStatistics.cpp",
    "FileSystem/SysFS/Subsystems/Kernel/Uptime.cpp",
    "FileSystem/SysFS/Subsystems/Kernel/Variables/BooleanVariable.cpp",
    "FileSystem/SysFS/Subsystems/Kernel/Variables/CapsLockRemap.cpp",
    "FileSystem/SysFS/Subsystems/Kernel/Variables/CoredumpDirectory.cpp",
    "FileSystem/SysFS/Subsystems/Kernel/Variables/Directory.cpp",
    "FileSystem/SysFS/Subsystems/Kernel/Variables/DumpKmallocStack.cpp",
    "FileSystem/SysFS/Subsystems/Kernel/Variables/StringVariable.cpp",
    "FileSystem/SysFS/Subsystems/Kernel/Variables/UBSANDeadly.cpp",
    "FileSystem/VirtualFileSystem.cpp",
    "Firmware/ACPI/Initialize.cpp",
    "Firmware/ACPI/Parser.cpp",
    "Firmware/ACPI/StaticParsing.cpp",
    "Interrupts/GenericInterruptHandler.cpp",
    "Interrupts/IRQHandler.cpp",
    "Interrupts/PCIIRQHandler.cpp",
    "Interrupts/SharedIRQHandler.cpp",
    "Interrupts/UnhandledInterruptHandler.cpp",
    "KSyms.cpp",
    "Library/DoubleBuffer.cpp",
    "Library/IOWindow.cpp",
    "Library/KBufferBuilder.cpp",
    "Library/KLexicalPath.cpp",
    "Library/KString.cpp",
    "Library/Panic.cpp",
    "Library/ScopedCritical.cpp",
    "Library/StdLib.cpp",
    "Library/UserOrKernelBuffer.cpp",
    "Locking/LockRank.cpp",
    "Locking/Mutex.cpp",
    "Memory/AddressSpace.cpp",
    "Memory/AnonymousVMObject.cpp",
    "Memory/InodeVMObject.cpp",
    "Memory/MemoryManager.cpp",
    "Memory/PhysicalPage.cpp",
    "Memory/PhysicalRegion.cpp",
    "Memory/PhysicalZone.cpp",
    "Memory/PrivateInodeVMObject.cpp",
    "Memory/Region.cpp",
    "Memory/RegionTree.cpp",
    "Memory/RingBuffer.cpp",
    "Memory/ScatterGatherList.cpp",
    "Memory/ScopedAddressSpaceSwitcher.cpp",
    "Memory/SharedFramebufferVMObject.cpp",
    "Memory/SharedInodeVMObject.cpp",
    "Memory/VMObject.cpp",
    "Memory/VirtualRange.cpp",
    "Net/IP/Socket.cpp",
    "Net/Intel/E1000ENetworkAdapter.cpp",
    "Net/Intel/E1000NetworkAdapter.cpp",
    "Net/LocalSocket.cpp",
    "Net/LoopbackAdapter.cpp",
    "Net/NetworkAdapter.cpp",
    "Net/NetworkTask.cpp",
    "Net/NetworkingManagement.cpp",
    "Net/Realtek/RTL8168NetworkAdapter.cpp",
    "Net/Routing.cpp",
    "Net/Socket.cpp",
    "Net/TCPSocket.cpp",
    "Net/UDPSocket.cpp",
    "Net/VirtIO/VirtIONetworkAdapter.cpp",
    "SanCov.cpp",
    "Security/AddressSanitizer.cpp",
    "Security/Credentials.cpp",
    "Security/Random.cpp",
    "Security/Random/VirtIO/RNG.cpp",
    "Security/UBSanitizer.cpp",
    "Syscalls/SyscallHandler.cpp",
    "Syscalls/alarm.cpp",
    "Syscalls/anon_create.cpp",
    "Syscalls/beep.cpp",
    "Syscalls/chdir.cpp",
    "Syscalls/chmod.cpp",
    "Syscalls/chown.cpp",
    "Syscalls/clock.cpp",
    "Syscalls/debug.cpp",
    "Syscalls/disown.cpp",
    "Syscalls/dup2.cpp",
    "Syscalls/execve.cpp",
    "Syscalls/exit.cpp",
    "Syscalls/faccessat.cpp",
    "Syscalls/fallocate.cpp",
    "Syscalls/fcntl.cpp",
    "Syscalls/fork.cpp",
    "Syscalls/fsync.cpp",
    "Syscalls/ftruncate.cpp",
    "Syscalls/futex.cpp",
    "Syscalls/get_dir_entries.cpp",
    "Syscalls/get_stack_bounds.cpp",
    "Syscalls/getrandom.cpp",
    "Syscalls/getuid.cpp",
    "Syscalls/hostname.cpp",
    "Syscalls/inode_watcher.cpp",
    "Syscalls/ioctl.cpp",
    "Syscalls/keymap.cpp",
    "Syscalls/kill.cpp",
    "Syscalls/link.cpp",
    "Syscalls/lseek.cpp",
    "Syscalls/mkdir.cpp",
    "Syscalls/mknod.cpp",
    "Syscalls/mmap.cpp",
    "Syscalls/mount.cpp",
    "Syscalls/open.cpp",
    "Syscalls/perf_event.cpp",
    "Syscalls/pipe.cpp",
    "Syscalls/pledge.cpp",
    "Syscalls/poll.cpp",
    "Syscalls/prctl.cpp",
    "Syscalls/process.cpp",
    "Syscalls/profiling.cpp",
    "Syscalls/ptrace.cpp",
    "Syscalls/purge.cpp",
    "Syscalls/read.cpp",
    "Syscalls/readlink.cpp",
    "Syscalls/realpath.cpp",
    "Syscalls/rename.cpp",
    "Syscalls/resource.cpp",
    "Syscalls/rmdir.cpp",
    "Syscalls/sched.cpp",
    "Syscalls/sendfd.cpp",
    "Syscalls/setpgid.cpp",
    "Syscalls/setuid.cpp",
    "Syscalls/sigaction.cpp",
    "Syscalls/socket.cpp",
    "Syscalls/stat.cpp",
    "Syscalls/statvfs.cpp",
    "Syscalls/sync.cpp",
    "Syscalls/sysconf.cpp",
    "Syscalls/thread.cpp",
    "Syscalls/times.cpp",
    "Syscalls/umask.cpp",
    "Syscalls/uname.cpp",
    "Syscalls/unlink.cpp",
    "Syscalls/unveil.cpp",
    "Syscalls/utime.cpp",
    "Syscalls/utimensat.cpp",
    "Syscalls/waitid.cpp",
    "Syscalls/write.cpp",
    "TTY/MasterPTY.cpp",
    "TTY/PTYMultiplexer.cpp",
    "TTY/SlavePTY.cpp",
    "TTY/TTY.cpp",
    "TTY/VirtualConsole.cpp",
    "Tasks/Coredump.cpp",
    "Tasks/CrashHandler.cpp",
    "Tasks/FinalizerTask.cpp",
    "Tasks/FutexQueue.cpp",
    "Tasks/PerformanceEventBuffer.cpp",
    "Tasks/PowerStateSwitchTask.cpp",
    "Tasks/Process.cpp",
    "Tasks/ProcessGroup.cpp",
    "Tasks/Scheduler.cpp",
    "Tasks/ScopedProcessList.cpp",
    "Tasks/SyncTask.cpp",
    "Tasks/Thread.cpp",
    "Tasks/ThreadBlockers.cpp",
    "Tasks/ThreadTracer.cpp",
    "Tasks/WaitQueue.cpp",
    "Tasks/WorkQueue.cpp",
    "Time/TimeManagement.cpp",
    "Time/TimerQueue.cpp",
  ]
  sources += get_target_outputs(":generate_version_header")
}

action("postprocess_kernel") {
  script = "//Meta/gn/secondary/Kernel/post_process_kernel.py"
  deps = [ ":Kernel_bin" ]
  inputs = [ "$target_out_dir/Kernel_bin" ]
  outputs = [
    "$target_out_dir/Kernel",
    "$target_out_dir/Kernel.debug",
    "$target_out_dir/kernel.map",
  ]
  args = [
    "--nm",
    minerva_nm,
    "--objcopy",
    minerva_objcopy,
    rebase_path(inputs[0], root_build_dir),
  ]
}

group("install_kernel") {
  deps = [
    ":install_kernel_binaries",
    ":install_kernel_data",
  ]
  if (minerva_arch == "x86_64") {
    deps += [ "Prekernel:install_prekernel" ]
  }
}

copy("install_kernel_binaries") {
  deps = [ ":postprocess_kernel" ]
  sources = [
    "$target_out_dir/Kernel",
    "$target_out_dir/Kernel.debug",
  ]
  outputs = [ "$sysroot/boot/{{source_file_part}}" ]
}

copy("install_kernel_data") {
  deps = [ ":postprocess_kernel" ]
  sources = [ "$target_out_dir/kernel.map" ]
  outputs = [ "$sysroot/res/{{source_file_part}}" ]
}