aaa1af8e19
Added bridging header for swift
106 lines
4.1 KiB
CMake
106 lines
4.1 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
|
|
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")
|
|
elseif(EXISTS "${_SWIFTC_USR}/lib/swift/lib/swift/embedded")
|
|
set(SWIFTC "${_SWIFTC_EXE}")
|
|
set(SWIFT_RESOURCE_DIR "${_SWIFTC_USR}/lib/swift/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"
|
|
)
|