Selaa lähdekoodia

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 kuukautta sitten
vanhempi
commit
c1c7e5ff3e

+ 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 :^)