فهرست منبع

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}/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()

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

@@ -36,10 +36,12 @@ function(_swift_generate_cxx_header target header)
 
   if(APPLE)
     set(SDK_FLAGS "-sdk" "${CMAKE_OSX_SYSROOT}")
+    list(APPEND SDK_FLAGS "-target" "${CMAKE_Swift_COMPILER_TARGET}")
   elseif(WIN32)
     set(SDK_FLAGS "-sdk" "$ENV{SDKROOT}")
   elseif(DEFINED ${CMAKE_SYSROOT})
     set(SDK_FLAGS "-sdk" "${CMAKE_SYSROOT}")
+    list(APPEND SDK_FLAGS "-target" "${CMAKE_Swift_COMPILER_TARGET}")
   endif()
 
   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_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_BUILD_WITH_INSTALL_RPATH TRUE)
 # See slide 100 of the following ppt :^)