64os/CMakeLists.txt
2024-04-07 23:08:07 -07:00

62 lines
2.4 KiB
CMake

cmake_minimum_required(VERSION 3.0)
# Project name
project(64os)
# Set build directory (can be customized)
set(CMAKE_BINARY_DIR build)
# Include directories
include_directories(src/intf)
# Compiler flags
set(CMAKE_C_FLAGS "-ffreestanding -I${CMAKE_CURRENT_SOURCE_DIR}/src/intf")
# Define source file lists using GLOB
set(KERNEL_SOURCE_FILES)
GLOB(KERNEL_SOURCE_FILES "*.c" RELATIVE PATH src/impl/kernel)
set(X86_64_C_SOURCE_FILES)
GLOB(X86_64_C_SOURCE_FILES "*.c" RELATIVE PATH src/impl/x86_64)
set(X86_64_ASM_SOURCE_FILES)
GLOB(X86_64_ASM_SOURCE_FILES "*.asm" RELATIVE PATH src/impl/x86_64)
# Define object file lists based on source files
source_group(SOURCE_FILES FILES ${KERNEL_SOURCE_FILES} ${X86_64_C_SOURCE_FILES} ${X86_64_ASM_SOURCE_FILES})
set(KERNEL_OBJECT_FILES)
foreach(SOURCE_FILE ${KERNEL_SOURCE_FILES})
get_filename_component(OBJECT_FILE ${SOURCE_FILE} NAME_WE)
set(KERNEL_OBJECT_FILES ${KERNEL_OBJECT_FILES} "${CMAKE_BINARY_DIR}/kernel/${OBJECT_FILE}.o")
endforeach()
set(X86_64_C_OBJECT_FILES)
foreach(SOURCE_FILE ${X86_64_C_SOURCE_FILES})
get_filename_component(OBJECT_FILE ${SOURCE_FILE} NAME_WE)
set(X86_64_C_OBJECT_FILES ${X86_64_C_OBJECT_FILES} "${CMAKE_BINARY_DIR}/x86_64/${OBJECT_FILE}.o")
endforeach()
set(X86_64_ASM_OBJECT_FILES)
foreach(SOURCE_FILE ${X86_64_ASM_SOURCE_FILES})
get_filename_component(OBJECT_FILE ${SOURCE_FILE} NAME_WE)
set(X86_64_ASM_OBJECT_FILES ${X86_64_ASM_OBJECT_FILES} "${CMAKE_BINARY_DIR}/x86_64/${OBJECT_FILE}.o")
endforeach()
# Define Executable target
add_executable(kernel "${KERNEL_OBJECT_FILES}" "${X86_64_C_OBJECT_FILES}" "${X86_64_ASM_OBJECT_FILES}")
# Linker options (assuming linker script location)
target_link_libraries(kernel PRIVATE targets/x86_64/linker.ld)
# Custom target for building x86_64 image (can be adapted for your needs)
add_custom_target(build-x86_64 ALL
COMMAND mkdir -p "${CMAKE_BINARY_DIR}/dist/x86_64"
COMMAND x86_64-elf-ld -n -o "${CMAKE_BINARY_DIR}/dist/x86_64/kernel.bin" -T targets/x86_64/linker.ld $<
COMMAND cp "${CMAKE_BINARY_DIR}/dist/x86_64/kernel.bin" targets/x86_64/iso/boot/kernel.bin
# Adapt this command for your specific toolchain
COMMAND grub-mkrescue /usr/lib/grub/i386-pc -o "${CMAKE_BINARY_DIR}/dist/x86_64/kernel.iso" targets/x86_64/iso
WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
# Make the custom target the default build target
set_target_properties(kernel PROPERTIES BUILD_TYPE CUSTOM)