From 41578c29d636f3244203091d4a556cf791f62358 Mon Sep 17 00:00:00 2001 From: karina Date: Tue, 21 Apr 2026 00:09:30 +0400 Subject: [PATCH] build: fixed building on macOS --- Boot/CMakeLists.txt | 9 +++++++-- CMakeLists.txt | 4 +++- Runtime/CMakeLists.txt | 11 +++++++++++ Runtime/debug/src/main.c | 1 + Runtime/libterm/CMakeLists.txt | 12 ++++++++++-- Runtime/rust/CMakeLists.txt | 11 ++++++++--- System/CMakeLists.txt | 18 +++++++++++++++++- 7 files changed, 57 insertions(+), 9 deletions(-) diff --git a/Boot/CMakeLists.txt b/Boot/CMakeLists.txt index 41fb98f..e8fe282 100644 --- a/Boot/CMakeLists.txt +++ b/Boot/CMakeLists.txt @@ -1,5 +1,9 @@ project(termOS_Bootloader LANGUAGES C ASM) +if(APPLE) + set(CMAKE_C_LINK_FLAGS "") +endif() + set(UEFI_COMPILE_OPTIONS -std=c23 -target x86_64-unknown-windows-msvc @@ -20,14 +24,15 @@ set(POSIX_UEFI_SOURCES src/uefi/unistd.c ) -add_library(posix_uefi_lib STATIC ${POSIX_UEFI_SOURCES}) +add_library(posix_uefi_lib OBJECT ${POSIX_UEFI_SOURCES}) target_compile_options(posix_uefi_lib PRIVATE ${UEFI_COMPILE_OPTIONS}) target_include_directories(posix_uefi_lib PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/src/uefi) add_executable(BOOTX64 src/main.c) target_compile_options(BOOTX64 PRIVATE ${UEFI_COMPILE_OPTIONS}) +target_sources(BOOTX64 PRIVATE $) -target_link_libraries(BOOTX64 PRIVATE posix_uefi_lib) +target_include_directories(BOOTX64 PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src/uefi) target_link_options(BOOTX64 PRIVATE -fuse-ld=lld diff --git a/CMakeLists.txt b/CMakeLists.txt index 55f0f40..510b23b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -64,7 +64,9 @@ if(QEMU_EXE) add_custom_target(run COMMAND ${QEMU_EXE} #-enable-kvm - -bios ${OVMF_PATH} + $<$:-machine> $<$:q35> + $<$:-drive> $<$:if=pflash,format=raw,readonly=on,file=${OVMF_PATH}> + $<$>:-bios> $<$>:${OVMF_PATH}> -drive file=${IMG_FILE},format=raw -vga std -net none diff --git a/Runtime/CMakeLists.txt b/Runtime/CMakeLists.txt index 7c85af2..fef9eb5 100644 --- a/Runtime/CMakeLists.txt +++ b/Runtime/CMakeLists.txt @@ -7,6 +7,17 @@ set(CMAKE_C_EXTENSIONS OFF) message(STATUS "Building termOS's userspace") +set(TERMOS_OBJCOPY objcopy) +if(APPLE) + find_program(TERMOS_LD_LLD NAMES ld.lld HINTS /usr/local/bin /opt/homebrew/bin REQUIRED) + find_program(TERMOS_OBJCOPY NAMES llvm-objcopy objcopy HINTS /usr/local/opt/llvm/bin /opt/homebrew/opt/llvm/bin REQUIRED) + set(CMAKE_C_LINK_FLAGS "") + set(CMAKE_ASM_NASM_COMPILE_OBJECT + " -MD -MT -f elf64 -o ") + set(CMAKE_C_LINK_EXECUTABLE + "${TERMOS_LD_LLD} -o ") +endif() + add_subdirectory(libterm) add_subdirectory(init) add_subdirectory(rust) diff --git a/Runtime/debug/src/main.c b/Runtime/debug/src/main.c index 0dff34e..8868a42 100644 --- a/Runtime/debug/src/main.c +++ b/Runtime/debug/src/main.c @@ -2,4 +2,5 @@ int main() { ConsolePrint("Test test test \n Meow meow meow \n"); + return 0; } \ No newline at end of file diff --git a/Runtime/libterm/CMakeLists.txt b/Runtime/libterm/CMakeLists.txt index fa84390..ab9c00b 100644 --- a/Runtime/libterm/CMakeLists.txt +++ b/Runtime/libterm/CMakeLists.txt @@ -19,7 +19,13 @@ set(USER_C_FLAGS -O2 ) -set(CMAKE_ASM_NASM_FLAGS "-f elf64") +if(APPLE) + list(APPEND USER_C_FLAGS --target=x86_64-none-elf) +endif() + +set(USER_C_FLAGS "${USER_C_FLAGS}" PARENT_SCOPE) + +set(CMAKE_ASM_NASM_OBJECT_FORMAT elf64) set(LIBTERM_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/OSServices.asm @@ -31,12 +37,14 @@ set(LIBTERM_SOURCES ) add_library(term STATIC ${LIBTERM_SOURCES}) +set_target_properties(term PROPERTIES NASM_OBJ_FORMAT elf64) target_compile_options(term PRIVATE $<$:${USER_C_FLAGS}>) target_include_directories(term PUBLIC inc) add_library(RuntimeEntryObject OBJECT src/RuntimeEntry.asm) +set_target_properties(RuntimeEntryObject PROPERTIES NASM_OBJ_FORMAT elf64) target_compile_options(RuntimeEntryObject PRIVATE $<$:${USER_C_FLAGS}>) function(add_termos_executable NAME SOURCES) @@ -47,7 +55,7 @@ function(add_termos_executable NAME SOURCES) target_compile_options(${NAME} PRIVATE $<$:${USER_C_FLAGS}> -fno-stack-protector) # fixme: what the fuck. ugly this works user_c_flags apparently not target_link_libraries(${NAME} PRIVATE term) - + target_link_options(${NAME} PRIVATE -T ${libterm_SOURCE_DIR}/linker.ld -nostdlib diff --git a/Runtime/rust/CMakeLists.txt b/Runtime/rust/CMakeLists.txt index 59747e8..6470054 100644 --- a/Runtime/rust/CMakeLists.txt +++ b/Runtime/rust/CMakeLists.txt @@ -3,7 +3,8 @@ project(rustApps NONE) function(add_rust_app NAME) set(RUST_TARGET "x86_64-termos") - set(RUST_ELF_FILE "${CMAKE_CURRENT_SOURCE_DIR}/target/${RUST_TARGET}/release/${NAME}") + set(RUST_TARGET_DIR "${CMAKE_CURRENT_SOURCE_DIR}/target") + set(RUST_ELF_FILE "${RUST_TARGET_DIR}/${RUST_TARGET}/release/${NAME}") set(STARTUP_VOLUME_DIR "${CMAKE_BINARY_DIR}/StartupVolume/System/CoreServices") set(FINAL_HOT_PATH "${STARTUP_VOLUME_DIR}/${NAME}") @@ -13,9 +14,13 @@ function(add_rust_app NAME) file(MAKE_DIRECTORY "${STARTUP_VOLUME_DIR}") add_custom_target(${NAME} ALL - COMMAND cargo build --package ${NAME} --release --target ${RUST_TARGET} + COMMAND ${CMAKE_COMMAND} -E env + "CARGO_TARGET_DIR=${RUST_TARGET_DIR}" + cargo build --package ${NAME} --release --target ${RUST_TARGET} - COMMAND objcopy --strip-all ${RUST_ELF_FILE} ${STRIPPED_ELF} + COMMAND ${CMAKE_COMMAND} -E env + "PATH=/usr/local/opt/llvm/bin:/opt/homebrew/opt/llvm/bin:$ENV{PATH}" + llvm-objcopy --strip-all ${RUST_ELF_FILE} ${STRIPPED_ELF} COMMAND ${CMAKE_COMMAND} -E chdir ${ELF2HOT_DIR} cargo run --release --quiet -- ${STRIPPED_ELF} ${FINAL_HOT_PATH} diff --git a/System/CMakeLists.txt b/System/CMakeLists.txt index b3d896a..475d011 100644 --- a/System/CMakeLists.txt +++ b/System/CMakeLists.txt @@ -11,6 +11,17 @@ endif() message(STATUS "Dewar kernel: Building for architecture '${ARCH}'") +set(TERMOS_OBJCOPY objcopy) +if(APPLE) + find_program(TERMOS_LD_LLD NAMES ld.lld HINTS /usr/local/bin /opt/homebrew/bin REQUIRED) + find_program(TERMOS_OBJCOPY NAMES llvm-objcopy objcopy HINTS /usr/local/opt/llvm/bin /opt/homebrew/opt/llvm/bin REQUIRED) + set(CMAKE_C_LINK_FLAGS "") + set(CMAKE_ASM_NASM_COMPILE_OBJECT + " -MD -MT -f elf64 -o ") + set(CMAKE_C_LINK_EXECUTABLE + "${TERMOS_LD_LLD} -o ") +endif() + file(GLOB_RECURSE KERNEL_SOURCES CMAKE_CONFIGURE_DEPENDS "src/kmain.c" @@ -30,6 +41,7 @@ file(GLOB_RECURSE KERNEL_SOURCES CMAKE_CONFIGURE_DEPENDS ) add_executable(kernel ${KERNEL_SOURCES}) +set_target_properties(kernel PROPERTIES NASM_OBJ_FORMAT elf64) target_include_directories(kernel PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/../common" @@ -40,6 +52,7 @@ target_include_directories(kernel PRIVATE target_compile_options(kernel PRIVATE $<$: + $<$:--target=x86_64-none-elf> -ffreestanding -mno-red-zone -fno-stack-protector @@ -49,6 +62,7 @@ target_compile_options(kernel PRIVATE -g -mno-sse -mno-sse2 -msoft-float > + $<$,$>:--target=x86_64-none-elf> ) target_link_options(kernel PRIVATE @@ -65,6 +79,8 @@ set_target_properties(kernel PROPERTIES ) add_custom_command(TARGET kernel POST_BUILD - COMMAND objcopy -O binary $ $/kernel.bin + COMMAND ${CMAKE_COMMAND} -E env + "PATH=/usr/local/opt/llvm/bin:/opt/homebrew/opt/llvm/bin:$ENV{PATH}" + llvm-objcopy -O binary $ $/kernel.bin COMMENT "Generating raw binary kernel.bin..." ) \ No newline at end of file