浏览代码

AK+Meta: Add SwiftAK module to add helpers to construct swift Strings

This allows constructing Foundation.Data and Swift.String without
unnecessary copies from AK.StringView and AK.String respectively.
Andrew Kaster 11 月之前
父节点
当前提交
c1c7e5ff3e
共有 4 个文件被更改,包括 35 次插入0 次删除
  1. 25 0
      AK/AK+Swift.swift
  2. 4 0
      AK/CMakeLists.txt
  3. 2 0
      Meta/CMake/Swift/GenerateSwiftHeader.cmake
  4. 4 0
      Meta/CMake/lagom_install_options.cmake

+ 25 - 0
AK/AK+Swift.swift

@@ -0,0 +1,25 @@
+/*
+ * Copyright (c) 2024, Andrew Kaster <akaster@serenityos.org>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+import AK
+import Foundation
+
+public extension Foundation.Data {
+    init(_ string: AK.StringView) {
+        let bytes = string.bytes()
+        self.init(bytesNoCopy: UnsafeMutableRawPointer(mutating: bytes.data()), count: bytes.size(), deallocator: .none)
+    }
+}
+
+public extension Swift.String {
+    init?(_ string: AK.String) {
+        self.init(data: Foundation.Data(string.__bytes_as_string_viewUnsafe()), encoding: .utf8)
+    }
+
+    init?(_ string: AK.StringView) {
+        self.init(data: Foundation.Data(string), encoding: .utf8)
+    }
+}

+ 4 - 0
AK/CMakeLists.txt

@@ -68,4 +68,8 @@ if (ENABLE_SWIFT)
         "${CMAKE_CURRENT_BINARY_DIR}/Backtrace.h"
         "${CMAKE_CURRENT_BINARY_DIR}/Backtrace.h"
         "${CMAKE_CURRENT_BINARY_DIR}/Debug.h"
         "${CMAKE_CURRENT_BINARY_DIR}/Debug.h"
     )
     )
+
+    target_compile_features(AK PUBLIC cxx_std_23)
+    set_target_properties(AK PROPERTIES Swift_MODULE_NAME SwiftAK)
+    target_sources(AK PRIVATE AK+Swift.swift)
 endif()
 endif()

+ 2 - 0
Meta/CMake/Swift/GenerateSwiftHeader.cmake

@@ -36,10 +36,12 @@ function(_swift_generate_cxx_header target header)
 
 
   if(APPLE)
   if(APPLE)
     set(SDK_FLAGS "-sdk" "${CMAKE_OSX_SYSROOT}")
     set(SDK_FLAGS "-sdk" "${CMAKE_OSX_SYSROOT}")
+    list(APPEND SDK_FLAGS "-target" "${CMAKE_Swift_COMPILER_TARGET}")
   elseif(WIN32)
   elseif(WIN32)
     set(SDK_FLAGS "-sdk" "$ENV{SDKROOT}")
     set(SDK_FLAGS "-sdk" "$ENV{SDKROOT}")
   elseif(DEFINED ${CMAKE_SYSROOT})
   elseif(DEFINED ${CMAKE_SYSROOT})
     set(SDK_FLAGS "-sdk" "${CMAKE_SYSROOT}")
     set(SDK_FLAGS "-sdk" "${CMAKE_SYSROOT}")
+    list(APPEND SDK_FLAGS "-target" "${CMAKE_Swift_COMPILER_TARGET}")
   endif()
   endif()
 
 
   cmake_path(APPEND CMAKE_CURRENT_BINARY_DIR include
   cmake_path(APPEND CMAKE_CURRENT_BINARY_DIR include

+ 4 - 0
Meta/CMake/lagom_install_options.cmake

@@ -15,6 +15,10 @@ set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${IN_BUILD_PREFIX}${CMAK
 set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${IN_BUILD_PREFIX}${CMAKE_INSTALL_LIBDIR}")
 set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${IN_BUILD_PREFIX}${CMAKE_INSTALL_LIBDIR}")
 set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${IN_BUILD_PREFIX}${CMAKE_INSTALL_LIBDIR}")
 set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${IN_BUILD_PREFIX}${CMAKE_INSTALL_LIBDIR}")
 
 
+# FIXME: Stop setting this when we have a good way to retrieve the directory that has the swift module
+#        file for use by the swift frontend's header generator
+set(CMAKE_Swift_MODULE_DIRECTORY  "${CMAKE_BINARY_DIR}/${IN_BUILD_PREFIX}swift")
+
 set(CMAKE_SKIP_BUILD_RPATH FALSE)
 set(CMAKE_SKIP_BUILD_RPATH FALSE)
 set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
 set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
 # See slide 100 of the following ppt :^)
 # See slide 100 of the following ppt :^)