瓢虫:我们不再继续采用Swift,已关闭。
Closing this as we are no longer pursuing Swift adoption

原始链接: https://github.com/LadybirdBrowser/ladybird/issues/933

CMake 对 Swift 6.0 的完整支持目前受到 Swift 编译器 (swiftc) 和 Ninja 构建系统的一些兼容性问题阻碍。具体来说,Swift + Ninja 会忽略 `CMAKE_OSX_DEPLOYMENT_TARGET`,导致版本不匹配和警告。一个临时解决方法是手动设置 Swift 编译器的目标。 另一个问题与 CMake 策略 CMP0157 相关,swiftc 无法正确处理安装名称,需要一个构建后命令来调整库 ID。对此的修复已于 2024 年 8 月 2 日合并,并将回移植到 CMake 3.29 和 3.30 版本。 最后,swiftc 无法识别在导入目标依赖项中定义的某些编译和链接选项,因此需要一个解决方法来修改这些标志在导入之后。这些问题正在积极解决,以在 CMake 中实现稳定、非实验性的 Swift 6.0 体验。

Ladybird 浏览器项目已放弃采用 Swift 编程语言的计划。该决定在他们的 GitHub 页面上公布,但未公开详细解释。 Hacker News 上的评论员认为这并不令人意外,他们指出 Swift 与苹果公司的紧密联系,并质疑它相对于成熟且内存安全的 C++ 的优势,而 C++ 是大多数主流浏览器的基础。一位用户指出 C++ 经过“实战检验”,是一个务实的選擇。 虽然承认 Swift 具有潜在的长期稳定性,但另一位评论员同意这一决定,认为 Swift 的实现将带来显著的初始挑战。该项目仍然专注于 Linux 兼容性,并在准备就绪时欢迎测试。
相关文章

原文

List of issues preventing moving forward on moving Swift 6.0 support out of an experimental state:

  • https://gitlab.kitware.com/cmake/cmake/-/issues/26174

    Details: Swift + Ninja doesn't respect CMAKE_OSX_DEPLOYMENT_TARGET. This results in a mismatched LC_BUILD_VERSION on swift and c++ object files, spamming the console with warnings.

    Workaround:

    # FIXME: https://gitlab.kitware.com/cmake/cmake/-/issues/26174
    if (APPLE)
    set(CMAKE_Swift_COMPILER_TARGET "${CMAKE_SYSTEM_PROCESSOR}-apple-macosx${CMAKE_OSX_DEPLOYMENT_TARGET}")
    endif()
  • https://gitlab.kitware.com/cmake/cmake/-/issues/26175

    Details: With CMP0157 enabled, swiftc does not set install_name directory to "@rpath" per CMAKE_INSTALL_NAME_DIR

    Workaround:

    # FIXME: https://gitlab.kitware.com/cmake/cmake/-/issues/26175
    if (APPLE)
    add_custom_command(TARGET LibGfx POST_BUILD
    COMMAND install_name_tool -id @rpath/liblagom-gfx.0.dylib "$<TARGET_FILE:LibGfx>"
    )
    endif()

    PR: https://gitlab.kitware.com/cmake/cmake/-/merge_requests/9692. Merged Aug 2, 2024 to be backported to CMake 3.29, 3.30.

  • https://gitlab.kitware.com/cmake/cmake/-/issues/26195

    Details: Imported targets from dependencies can have INTERFACE_COMPILE_OPTIONS or INTERFACE_LINK_OPTIONS that swiftc doesn't understand.

    Workaround: Swizzle the flags just after import, for every single imported library.

  • 联系我们 contact @ memedata.com