Add Clang compiler support alongside GCC

Co-authored-by: johndoe6345789 <224850594+johndoe6345789@users.noreply.github.com>
This commit is contained in:
copilot-swe-agent[bot]
2025-12-28 21:59:29 +00:00
parent a0683c0722
commit a9d2cba0c5
4 changed files with 70 additions and 11 deletions

View File

@@ -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)

View File

@@ -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

View File

@@ -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})

View File

@@ -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(