if (ENABLE_EXTRA_KERNEL_DEBUG_SYMBOLS) add_compile_options(-Og) add_compile_options(-ggdb3) else() add_compile_options(-Os) endif() if ("${SERENITY_ARCH}" STREQUAL "i686") set(KERNEL_ARCH i386) elseif("${SERENITY_ARCH}" STREQUAL "x86_64") set(KERNEL_ARCH x86_64) endif() set(KERNEL_HEAP_SOURCES Heap/SlabAllocator.cpp Heap/kmalloc.cpp ) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS_STATIC}") set(KERNEL_SOURCES ACPI/DynamicParser.cpp ACPI/Initialize.cpp ACPI/MultiProcessorParser.cpp ACPI/Parser.cpp AddressSanitizer.cpp Arch/PC/BIOS.cpp Arch/x86/SmapDisabler.h Bus/PCI/Access.cpp Bus/PCI/Device.cpp Bus/PCI/DeviceController.cpp Bus/PCI/IOAccess.cpp Bus/PCI/MMIOAccess.cpp Bus/PCI/Initializer.cpp Bus/PCI/WindowedMMIOAccess.cpp Bus/USB/UHCIController.cpp Bus/USB/USBDevice.cpp Bus/USB/USBPipe.cpp Bus/USB/USBTransfer.cpp CMOS.cpp CommandLine.cpp ConsoleDevice.cpp CoreDump.cpp Devices/AsyncDeviceRequest.cpp Devices/BlockDevice.cpp Devices/CharacterDevice.cpp Devices/Device.cpp Devices/FullDevice.cpp Devices/MemoryDevice.cpp Devices/NullDevice.cpp Devices/PCISerialDevice.cpp Devices/PCSpeaker.cpp Devices/RandomDevice.cpp Devices/SB16.cpp Devices/SerialDevice.cpp Devices/VMWareBackdoor.cpp Devices/ZeroDevice.cpp Devices/HID/I8042Controller.cpp Devices/HID/HIDManagement.cpp Devices/HID/KeyboardDevice.cpp Devices/HID/MouseDevice.cpp Devices/HID/PS2KeyboardDevice.cpp Devices/HID/PS2MouseDevice.cpp Devices/HID/VMWareMouseDevice.cpp GlobalProcessExposed.cpp Graphics/Bochs/GraphicsAdapter.cpp Graphics/Console/GenericFramebufferConsole.cpp Graphics/Console/ContiguousFramebufferConsole.cpp Graphics/Console/TextModeConsole.cpp Graphics/Console/VGAConsole.cpp Graphics/FramebufferDevice.cpp Graphics/GraphicsManagement.cpp Graphics/Intel/NativeGraphicsAdapter.cpp Graphics/VirtIOGPU/VirtIOFrameBufferDevice.cpp Graphics/VirtIOGPU/VirtIOGPUConsole.cpp Graphics/VirtIOGPU/VirtIOGPU.cpp Graphics/VirtIOGPU/VirtIOGraphicsAdapter.cpp Graphics/VGACompatibleAdapter.cpp Storage/Partition/DiskPartition.cpp Storage/Partition/DiskPartitionMetadata.cpp Storage/Partition/EBRPartitionTable.cpp Storage/Partition/GUIDPartitionTable.cpp Storage/Partition/MBRPartitionTable.cpp Storage/Partition/PartitionTable.cpp Storage/StorageDevice.cpp Storage/AHCIController.cpp Storage/AHCIPort.cpp Storage/AHCIPortHandler.cpp Storage/SATADiskDevice.cpp Storage/BMIDEChannel.cpp Storage/IDEController.cpp Storage/IDEChannel.cpp Storage/PATADiskDevice.cpp Storage/RamdiskController.cpp Storage/RamdiskDevice.cpp Storage/StorageManagement.cpp DoubleBuffer.cpp FileSystem/AnonymousFile.cpp FileSystem/BlockBasedFileSystem.cpp FileSystem/Custody.cpp FileSystem/DevFS.cpp FileSystem/DevPtsFS.cpp FileSystem/Ext2FileSystem.cpp FileSystem/FIFO.cpp FileSystem/File.cpp FileSystem/FileBackedFileSystem.cpp FileSystem/FileDescription.cpp FileSystem/FileSystem.cpp FileSystem/Inode.cpp FileSystem/InodeFile.cpp FileSystem/InodeWatcher.cpp FileSystem/Mount.cpp FileSystem/Plan9FileSystem.cpp FileSystem/ProcFS.cpp FileSystem/SysFS.cpp FileSystem/SysFSComponent.cpp FileSystem/TmpFS.cpp FileSystem/VirtualFileSystem.cpp FutexQueue.cpp Interrupts/APIC.cpp Interrupts/GenericInterruptHandler.cpp Interrupts/IOAPIC.cpp Interrupts/IRQHandler.cpp Interrupts/InterruptManagement.cpp Interrupts/PIC.cpp Interrupts/SharedIRQHandler.cpp Interrupts/SpuriousInterruptHandler.cpp Interrupts/UnhandledInterruptHandler.cpp KBufferBuilder.cpp KLexicalPath.cpp KString.cpp KSyms.cpp Lock.cpp Net/E1000ENetworkAdapter.cpp Net/E1000NetworkAdapter.cpp Net/IPv4Socket.cpp Net/LocalSocket.cpp Net/LoopbackAdapter.cpp Net/NE2000NetworkAdapter.cpp Net/NetworkAdapter.cpp Net/NetworkingManagement.cpp Net/NetworkTask.cpp Net/RTL8139NetworkAdapter.cpp Net/RTL8168NetworkAdapter.cpp Net/Routing.cpp Net/Socket.cpp Net/TCPSocket.cpp Net/UDPSocket.cpp Panic.cpp PerformanceEventBuffer.cpp Process.cpp ProcessExposed.cpp ProcessSpecificExposed.cpp ProcessGroup.cpp RTC.cpp Random.cpp Scheduler.cpp StdLib.cpp Syscall.cpp Syscalls/anon_create.cpp Syscalls/access.cpp Syscalls/alarm.cpp Syscalls/beep.cpp Syscalls/chdir.cpp Syscalls/chmod.cpp Syscalls/chown.cpp Syscalls/chroot.cpp Syscalls/clock.cpp Syscalls/debug.cpp Syscalls/disown.cpp Syscalls/dup2.cpp Syscalls/emuctl.cpp Syscalls/execve.cpp Syscalls/exit.cpp Syscalls/fcntl.cpp Syscalls/fork.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/ioctl.cpp Syscalls/keymap.cpp Syscalls/kill.cpp Syscalls/link.cpp Syscalls/lseek.cpp Syscalls/mkdir.cpp Syscalls/mknod.cpp Syscalls/mmap.cpp Syscalls/module.cpp Syscalls/mount.cpp Syscalls/open.cpp Syscalls/perf_event.cpp Syscalls/pipe.cpp Syscalls/pledge.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/rmdir.cpp Syscalls/sched.cpp Syscalls/select.cpp Syscalls/sendfd.cpp Syscalls/setpgid.cpp Syscalls/setuid.cpp Syscalls/shutdown.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/ttyname.cpp Syscalls/umask.cpp Syscalls/uname.cpp Syscalls/unlink.cpp Syscalls/unveil.cpp Syscalls/utime.cpp Syscalls/waitid.cpp Syscalls/inode_watcher.cpp Syscalls/write.cpp TTY/ConsoleManagement.cpp TTY/MasterPTY.cpp TTY/PTYMultiplexer.cpp TTY/SlavePTY.cpp TTY/TTY.cpp TTY/VirtualConsole.cpp Tasks/FinalizerTask.cpp Tasks/SyncTask.cpp Thread.cpp ThreadBlockers.cpp ThreadTracer.cpp Time/APICTimer.cpp Time/HPET.cpp Time/HPETComparator.cpp Time/PIT.cpp Time/RTC.cpp Time/TimeManagement.cpp TimerQueue.cpp UBSanitizer.cpp UserOrKernelBuffer.cpp VirtIO/VirtIO.cpp VirtIO/VirtIOConsole.cpp VirtIO/VirtIOConsolePort.cpp VirtIO/VirtIOQueue.cpp VirtIO/VirtIORNG.cpp VM/AnonymousVMObject.cpp VM/ContiguousVMObject.cpp VM/InodeVMObject.cpp VM/MemoryManager.cpp VM/PageDirectory.cpp VM/PhysicalPage.cpp VM/PhysicalRegion.cpp VM/PhysicalZone.cpp VM/PrivateInodeVMObject.cpp VM/ProcessPagingScope.cpp VM/PurgeablePageRanges.cpp VM/Range.cpp VM/RangeAllocator.cpp VM/Region.cpp VM/RingBuffer.cpp VM/ScatterGatherList.cpp VM/SharedInodeVMObject.cpp VM/Space.cpp VM/VMObject.cpp WaitQueue.cpp WorkQueue.cpp init.cpp kprintf.cpp ) set(KERNEL_SOURCES ${KERNEL_SOURCES} ${CMAKE_CURRENT_SOURCE_DIR}/Arch/x86/${KERNEL_ARCH}/ASM_wrapper.cpp ${CMAKE_CURRENT_SOURCE_DIR}/Arch/x86/${KERNEL_ARCH}/Boot/ap_setup.S ${CMAKE_CURRENT_SOURCE_DIR}/Arch/x86/${KERNEL_ARCH}/InterruptEntry.cpp ${CMAKE_CURRENT_SOURCE_DIR}/Arch/x86/${KERNEL_ARCH}/Processor.cpp ) set(KERNEL_SOURCES ${KERNEL_SOURCES} ${CMAKE_CURRENT_SOURCE_DIR}/Arch/x86/common/ASM_wrapper.cpp ${CMAKE_CURRENT_SOURCE_DIR}/Arch/x86/common/Boot/boot.S ${CMAKE_CURRENT_SOURCE_DIR}/Arch/x86/common/Boot/multiboot.S ${CMAKE_CURRENT_SOURCE_DIR}/Arch/x86/common/CPU.cpp ${CMAKE_CURRENT_SOURCE_DIR}/Arch/x86/common/Interrupts.cpp ${CMAKE_CURRENT_SOURCE_DIR}/Arch/x86/common/Processor.cpp ${CMAKE_CURRENT_SOURCE_DIR}/Arch/x86/common/ProcessorInfo.cpp ${CMAKE_CURRENT_SOURCE_DIR}/Arch/x86/common/SafeMem.cpp ${CMAKE_CURRENT_SOURCE_DIR}/Arch/x86/common/TrapFrame.cpp ) set(AK_SOURCES ../AK/FlyString.cpp ../AK/GenericLexer.cpp ../AK/Hex.cpp ../AK/String.cpp ../AK/StringBuilder.cpp ../AK/StringImpl.cpp ../AK/StringUtils.cpp ../AK/StringView.cpp ../AK/Time.cpp ../AK/Format.cpp ../AK/UUID.cpp ) set(ELF_SOURCES ../Userland/Libraries/LibELF/Image.cpp ../Userland/Libraries/LibELF/Validation.cpp ) generate_state_machine(../Userland/Libraries/LibVT/StateMachine.txt ../Userland/Libraries/LibVT/EscapeSequenceStateMachine.h) set(VT_SOURCES ../Userland/Libraries/LibVT/Terminal.cpp ../Userland/Libraries/LibVT/Line.cpp ../Userland/Libraries/LibVT/EscapeSequenceParser.cpp ) set(KEYBOARD_SOURCES ../Userland/Libraries/LibKeyboard/CharacterMap.cpp ) set(CRYPTO_SOURCES ../Userland/Libraries/LibCrypto/Cipher/AES.cpp ../Userland/Libraries/LibCrypto/Hash/SHA2.cpp ) set(SOURCES ${KERNEL_SOURCES} ${AK_SOURCES} ${ELF_SOURCES} ${VT_SOURCES} ${KEYBOARD_SOURCES} ${CRYPTO_SOURCES} ) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unknown-warning-option -Wvla -Wnull-dereference") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-rtti -ffreestanding -fbuiltin") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mno-80387 -mno-mmx -mno-sse -mno-sse2") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-asynchronous-unwind-tables") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fstack-protector-strong") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-exceptions") if (NOT ${CMAKE_HOST_SYSTEM_NAME} MATCHES SerenityOS) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -nostdlib -nostdinc -nostdinc++") endif() if ("${SERENITY_ARCH}" STREQUAL "x86_64") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mcmodel=large -fno-pic -mno-red-zone") else() set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pie -fPIE") endif() # Kernel Undefined Behavior Sanitizer (KUBSAN) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=undefined") # Kernel Address Sanitize (KASAN) implementation is still a work in progress, this option # is not currently meant to be used, besides when developing Kernel ASAN support. # if (ENABLE_KERNEL_ADDRESS_SANITIZER) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=kernel-address") endif() add_compile_definitions(KERNEL) # HACK: This is a workaround for CLion to grok the kernel sources. # It's needed because CLion doesn't understand the way we switch compilers mid-build. add_compile_definitions(__serenity__) add_link_options(LINKER:-T ${CMAKE_CURRENT_SOURCE_DIR}/linker.ld -nostdlib) add_library(kernel_heap STATIC ${KERNEL_HEAP_SOURCES}) if (${CMAKE_HOST_SYSTEM_NAME} MATCHES SerenityOS) include_directories(/usr/local/include/c++/${GCC_VERSION}/) else() if (NOT EXISTS ${TOOLCHAIN_ROOT}/${SERENITY_ARCH}-pc-serenity/include/c++/${GCC_VERSION}/) message(FATAL_ERROR "Toolchain version ${GCC_VERSION} appears to be missing! Please run: Meta/serenity.sh rebuild-toolchain") endif() include_directories(${TOOLCHAIN_ROOT}/${SERENITY_ARCH}-pc-serenity/include/c++/${GCC_VERSION}/) include_directories(${TOOLCHAIN_ROOT}/${SERENITY_ARCH}-pc-serenity/include/c++/${GCC_VERSION}/${SERENITY_ARCH}-pc-serenity/) link_directories(${TOOLCHAIN_ROOT}/${SERENITY_ARCH}-pc-serenity/lib) link_directories(${TOOLCHAIN_ROOT}/lib/gcc/${SERENITY_ARCH}-pc-serenity/${GCC_VERSION}/) endif() if ("${SERENITY_ARCH}" STREQUAL "i686") set(KERNEL_TARGET Kernel32) else() set(KERNEL_TARGET Kernel64) endif() add_executable(${KERNEL_TARGET} ${SOURCES}) add_dependencies(${KERNEL_TARGET} generate_EscapeSequenceStateMachine.h) set_target_properties(${KERNEL_TARGET} PROPERTIES LINK_DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/linker.ld) if (ENABLE_KERNEL_LTO) include(CheckIPOSupported) check_ipo_supported() set_property(TARGET ${KERNEL_TARGET} PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE) endif() target_link_libraries(${KERNEL_TARGET} kernel_heap gcc) add_dependencies(${KERNEL_TARGET} kernel_heap) add_custom_command( TARGET ${KERNEL_TARGET} POST_BUILD COMMAND ${TOOLCHAIN_PREFIX}objcopy -O elf32-i386 ${CMAKE_CURRENT_BINARY_DIR}/${KERNEL_TARGET} ${CMAKE_CURRENT_BINARY_DIR}/Kernel BYPRODUCTS ${CMAKE_CURRENT_BINARY_DIR}/Kernel ) install(FILES "${CMAKE_CURRENT_BINARY_DIR}/Kernel" DESTINATION boot) add_custom_command( TARGET ${KERNEL_TARGET} POST_BUILD COMMAND sh ${CMAKE_CURRENT_SOURCE_DIR}/mkmap.sh ) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/kernel.map DESTINATION res) serenity_install_headers(Kernel) serenity_install_sources(Kernel) add_subdirectory(Modules)