cmake_minimum_required(VERSION 3.28) lw_project(lcrash DESCRIPTION "Lindows BSOD" TARGET LINDOWS ) enable_language(ASM) lw_add_executable(lcrashkern SOURCES main.c util.c lnxboot.c acpi/acpi.c efi/efi.c efi/guid.c efi/memmap.c gdb/gdb.c ) add_executable(lcrashkernld IMPORTED) set_property(TARGET lcrashkernld PROPERTY IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/lcrash.ld) set_property(TARGET lcrashkern PROPERTY LINK_DEPENDS $ $ ) set_property(TARGET lcrashkern PROPERTY LINK_OPTIONS -nostdlib -Wl,-T,${CMAKE_CURRENT_SOURCE_DIR}/lcrash.ld ) target_compile_options(lcrashkern PRIVATE -ggdb -fpic -pie -Wall -Werror -fanalyzer) target_link_options(lcrashkern PRIVATE -fpic -pie) target_include_directories(lcrashkern PRIVATE ${CMAKE_BINARY_DIR} ${CMAKE_SOURCE_DIR}) add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/lcrashkern.gz DEPENDS lcrashkern COMMAND gzip -fk $ > ${CMAKE_CURRENT_BINARY_DIR}/lcrashkern.gz ) add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/lcrashkern_locs.h DEPENDS lcrashkern ${CMAKE_CURRENT_BINARY_DIR}/lcrashkern.gz COMMAND nm ${CMAKE_CURRENT_BINARY_DIR}/lcrashkern | sed -E '"s/([0-9a-f]*) . (.*)/#define KK_\\2 0x\\1/g"' > lcrashkern_locs.h COMMAND echo -n "'#'define _KKCLEN " >> lcrashkern_locs.h COMMAND du -b lcrashkern.gz | cut -f 1 >> lcrashkern_locs.h ) # UnityOS cckernel stuffed into the bzImage lw_add_executable(cckernel SOURCES setup/compressed/cckernel.S setup/compressed/entry64.S setup/compressed/mem.S setup/compressed/main.c setup/compressed/gzip.c setup/compressed/elf.c ) add_executable(cckernelld IMPORTED) set_property(TARGET cckernelld PROPERTY IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/setup/compressed/compressed.ld) set_property(TARGET cckernel PROPERTY LINK_OPTIONS -nostdlib -Wl,-T,${CMAKE_CURRENT_SOURCE_DIR}/setup/compressed/compressed.ld) target_compile_options(cckernel PRIVATE -ggdb -mno-sse -mno-avx -Wall -Werror -fanalyzer) # disable generating SIMD code since we haven't configured it at this stage of the boot thing set_property(SOURCE setup/compressed/cckernel.S PROPERTY OBJECT_DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/lcrashkern.gz ) set_property(TARGET cckernel PROPERTY LINK_DEPENDS $ ) set(COMPRESSED_KERNEL_PATH ${CMAKE_CURRENT_BINARY_DIR}/lcrashkern.gz) configure_file(setup/compressed/cckernel.S.in setup/compressed/cckernel.S) target_include_directories(cckernel PRIVATE ${CMAKE_BINARY_DIR} ${CMAKE_SOURCE_DIR}) # This is the actual bzImage used by linux/grub lw_add_executable(lcrash SOURCES setup/header.S lcrashkern_locs.h ) target_include_directories(lcrash PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) add_executable(lcrashld IMPORTED) set_property(TARGET lcrashld PROPERTY IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/setup/setup.ld) set_property(TARGET lcrash PROPERTY LINK_DEPENDS $ $ $ ) set_property(TARGET lcrash PROPERTY LINK_OPTIONS -nostdlib -Wl,-T,${CMAKE_CURRENT_SOURCE_DIR}/setup/setup.ld) add_custom_command(TARGET lcrash POST_BUILD DEPENDS cckernel COMMAND bash -c "truncate \"$\" -s \"$((0x$(nm \"$\" | grep \" _end$\" | cut -d\" \" -f 1)))\"" COMMAND dd "if=$" "of=$" conv=notrunc oflag=append VERBATIM )