From a9d2cba0c5fdb8b257c2b4405806666978785cc2 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 28 Dec 2025 21:59:29 +0000 Subject: [PATCH] Add Clang compiler support alongside GCC Co-authored-by: johndoe6345789 <224850594+johndoe6345789@users.noreply.github.com> --- CMakeLists.txt | 11 +++++++++++ README.md | 18 ++++++++++++++++++ bootloader/CMakeLists.txt | 21 +++++++++++++++------ kernel/CMakeLists.txt | 31 ++++++++++++++++++++++++++----- 4 files changed, 70 insertions(+), 11 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 0888c4a..563a655 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -18,6 +18,17 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON) # Export compile commands for IDE support set(CMAKE_EXPORT_COMPILE_COMMANDS ON) +# Compiler detection and configuration +if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") + message(STATUS "Using Clang compiler") + set(USING_CLANG TRUE) +elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") + message(STATUS "Using GCC compiler") + set(USING_GCC TRUE) +else() + message(WARNING "Unsupported compiler: ${CMAKE_CXX_COMPILER_ID}") +endif() + # Default to Release build if not specified if(NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE Release CACHE STRING "Build type" FORCE) diff --git a/README.md b/README.md index 95d45af..3868ef9 100644 --- a/README.md +++ b/README.md @@ -87,6 +87,24 @@ ninja ninja qemu ``` +### Building with Clang + +MetalOS supports both GCC and Clang compilers. To build with Clang: + +```bash +mkdir build && cd build +CC=clang CXX=clang++ cmake .. +cmake --build . +``` + +Or with Ninja: + +```bash +mkdir build && cd build +CC=clang CXX=clang++ cmake -G Ninja .. +ninja +``` + ### Conan (With Package Management) ```bash diff --git a/bootloader/CMakeLists.txt b/bootloader/CMakeLists.txt index 627aa12..fb73049 100644 --- a/bootloader/CMakeLists.txt +++ b/bootloader/CMakeLists.txt @@ -30,12 +30,21 @@ set(UEFI_CFLAGS ) # Linker flags for UEFI -set(UEFI_LDFLAGS - -shared - -Bsymbolic - -nostdlib - -znocombreloc -) +if(CMAKE_C_COMPILER_ID MATCHES "Clang") + set(UEFI_LDFLAGS + -shared + -Bsymbolic + -nostdlib + -Wl,-z,nocombreloc + ) +else() + set(UEFI_LDFLAGS + -shared + -Bsymbolic + -nostdlib + -znocombreloc + ) +endif() # Create object library add_library(bootloader_obj OBJECT ${BOOTLOADER_SOURCES}) diff --git a/kernel/CMakeLists.txt b/kernel/CMakeLists.txt index cef35e1..618cdd8 100644 --- a/kernel/CMakeLists.txt +++ b/kernel/CMakeLists.txt @@ -55,6 +55,16 @@ set(KERNEL_CXXFLAGS -O2 ) +# Add Clang-specific flags +if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") + list(APPEND KERNEL_CXXFLAGS + -target x86_64-unknown-none-elf + -fno-builtin + -fno-pie + ) + message(STATUS "Added Clang-specific flags for kernel") +endif() + # Create object library add_library(kernel_obj OBJECT ${KERNEL_SOURCES}) target_include_directories(kernel_obj PRIVATE include) @@ -67,11 +77,22 @@ set_target_properties(kernel_elf PROPERTIES LINKER_LANGUAGE CXX POSITION_INDEPENDENT_CODE OFF ) -target_link_options(kernel_elf PRIVATE - -nostdlib - -no-pie - -T ${CMAKE_CURRENT_SOURCE_DIR}/linker.ld -) + +# Set linker options based on compiler +if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") + target_link_options(kernel_elf PRIVATE + -nostdlib + -Wl,--no-pie + -T ${CMAKE_CURRENT_SOURCE_DIR}/linker.ld + -target x86_64-unknown-none-elf + ) +else() + target_link_options(kernel_elf PRIVATE + -nostdlib + -no-pie + -T ${CMAKE_CURRENT_SOURCE_DIR}/linker.ld + ) +endif() # Custom command to create flat binary add_custom_command(