e1b74cd156
CMake will auto generate compile-commands.json file to help LSP find symbols. this file is gitignored and will be regenerated each build nothing else was changed, should work on any system, but please test
102 lines
3.9 KiB
CMake
102 lines
3.9 KiB
CMake
cmake_minimum_required(VERSION 3.10)
|
|
project(ksOSKernel LANGUAGES ASM C)
|
|
|
|
# --- Locate Swift toolchain with Embedded Swift stdlib ---
|
|
# Priority: cmake var > env var > auto-detect
|
|
if(NOT SWIFT_TOOLCHAIN AND DEFINED ENV{SWIFT_TOOLCHAIN})
|
|
set(SWIFT_TOOLCHAIN "$ENV{SWIFT_TOOLCHAIN}")
|
|
endif()
|
|
|
|
if(SWIFT_TOOLCHAIN)
|
|
set(SWIFTC "${SWIFT_TOOLCHAIN}/usr/bin/swiftc")
|
|
set(SWIFT_RESOURCE_DIR "${SWIFT_TOOLCHAIN}/usr/lib/swift")
|
|
elseif(CMAKE_HOST_SYSTEM_NAME STREQUAL "Darwin")
|
|
# Scan for a swift.org toolchain that ships the embedded stdlib.
|
|
# APPLE is false here (target is Generic), so we check the HOST OS.
|
|
file(GLOB _tc_candidates
|
|
"$ENV{HOME}/Library/Developer/Toolchains/*.xctoolchain"
|
|
"/Library/Developer/Toolchains/*.xctoolchain"
|
|
)
|
|
foreach(_tc ${_tc_candidates})
|
|
if(EXISTS "${_tc}/usr/lib/swift/embedded")
|
|
set(SWIFTC "${_tc}/usr/bin/swiftc")
|
|
set(SWIFT_RESOURCE_DIR "${_tc}/usr/lib/swift")
|
|
break()
|
|
endif()
|
|
endforeach()
|
|
else()
|
|
# Linux: find swiftc in PATH, derive resource dir from its location
|
|
find_program(_SWIFTC_EXE swiftc)
|
|
if(_SWIFTC_EXE)
|
|
get_filename_component(_SWIFTC_BIN "${_SWIFTC_EXE}" DIRECTORY)
|
|
get_filename_component(_SWIFTC_USR "${_SWIFTC_BIN}" DIRECTORY)
|
|
if(EXISTS "${_SWIFTC_USR}/lib/swift/embedded")
|
|
set(SWIFTC "${_SWIFTC_EXE}")
|
|
set(SWIFT_RESOURCE_DIR "${_SWIFTC_USR}/lib/swift")
|
|
endif()
|
|
endif()
|
|
endif()
|
|
|
|
if(NOT SWIFTC OR NOT EXISTS "${SWIFT_RESOURCE_DIR}/embedded")
|
|
message(FATAL_ERROR
|
|
"Swift toolchain with Embedded Swift not found.\n"
|
|
"Install a swift.org toolchain and pass -DSWIFT_TOOLCHAIN=<root> "
|
|
"or set the SWIFT_TOOLCHAIN env var.")
|
|
endif()
|
|
|
|
message(STATUS "Swift: ${SWIFTC}")
|
|
message(STATUS "Swift resource dir: ${SWIFT_RESOURCE_DIR}")
|
|
|
|
# --- Build ---
|
|
add_compile_options(-ffreestanding -nostdlib -O0 -g)
|
|
|
|
set(LINKER_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/linker.ld)
|
|
add_link_options(
|
|
-fuse-ld=lld
|
|
-nostdlib
|
|
-static
|
|
-Wl,-T,${LINKER_SCRIPT}
|
|
)
|
|
|
|
set(SWIFT_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/Source/kernel.swift)
|
|
set(SWIFT_OBJ ${CMAKE_CURRENT_BINARY_DIR}/kernel_swift.o)
|
|
|
|
add_custom_command(
|
|
OUTPUT ${SWIFT_OBJ}
|
|
COMMAND ${SWIFTC}
|
|
-target aarch64-none-none-elf
|
|
-enable-experimental-feature Embedded
|
|
-parse-as-library
|
|
-wmo
|
|
-O
|
|
-Xcc -fno-stack-protector
|
|
-Xcc -I${CMAKE_CURRENT_SOURCE_DIR}/../Common
|
|
-import-bridging-header ${CMAKE_CURRENT_SOURCE_DIR}/Source/BridgingHeader.h
|
|
-resource-dir ${SWIFT_RESOURCE_DIR}
|
|
-c ${SWIFT_SOURCES}
|
|
-o ${SWIFT_OBJ}
|
|
COMMAND ${LLVM_OBJCOPY} --remove-section=.swift_modhash ${SWIFT_OBJ}
|
|
DEPENDS ${SWIFT_SOURCES}
|
|
COMMENT "Compiling Swift kernel"
|
|
)
|
|
|
|
set_source_files_properties(${SWIFT_OBJ} PROPERTIES
|
|
EXTERNAL_OBJECT TRUE
|
|
GENERATED TRUE
|
|
)
|
|
|
|
add_executable(kernel.elf Source/entry.S Source/stubs.c ${SWIFT_OBJ})
|
|
|
|
add_custom_command(TARGET kernel.elf POST_BUILD
|
|
COMMAND ${LLVM_OBJCOPY} -O binary kernel.elf kernel.bin
|
|
COMMENT "kernel.elf -> kernel.bin"
|
|
)
|
|
|
|
# --- SourceKit-LSP: generate compile_commands.json for Swift ---
|
|
set(_COMMON_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../Common")
|
|
set(_BRIDGING_HEADER "${CMAKE_CURRENT_SOURCE_DIR}/Source/BridgingHeader.h")
|
|
|
|
file(GENERATE OUTPUT "${CMAKE_CURRENT_SOURCE_DIR}/compile_commands.json"
|
|
CONTENT "[\n {\n \"file\": \"${SWIFT_SOURCES}\",\n \"directory\": \"${CMAKE_CURRENT_BINARY_DIR}\",\n \"arguments\": [\n \"${SWIFTC}\",\n \"-target\", \"aarch64-none-none-elf\",\n \"-enable-experimental-feature\", \"Embedded\",\n \"-parse-as-library\",\n \"-wmo\",\n \"-O\",\n \"-Xcc\", \"-fno-stack-protector\",\n \"-Xcc\", \"-I${_COMMON_DIR}\",\n \"-import-bridging-header\", \"${_BRIDGING_HEADER}\",\n \"-resource-dir\", \"${SWIFT_RESOURCE_DIR}\",\n \"${SWIFT_SOURCES}\"\n ]\n }\n]\n"
|
|
)
|