内容简介:作者:iAchieved.it,译者:
作者:iAchieved.it, 原文链接 ,原文日期:2016-06-30
译者: rsenjoyer ;校对: numbbbbb , 智多芯 ;定稿: Forelax
我最近在开源的 Swift Foundation 中遇到了 NSThread
实现的问题。如果不是尝试在树莓派 3 上运行代码,我也许就发现不了这个问题:
import Foundation import Glibc var counter = 0 while true { sleep(2) counter = counter + 1 let t = Thread(){ print("STARTED:\(counter)") sleep(1) print("EXIT:\(counter)") } print("START:\(counter)") t.start() }
我所期望的是每 2 秒都会创建并销毁一个线程。不幸的是在大约启动 230 个线程之后,系统资源已经耗尽,不再有新的线程被创建。解决的方式正如 SR-1908 所提到的,初始化具有系统范围的分离状态的线程
public init(_ main: (Void) -> Void) { _main = main let _ = withUnsafeMutablePointer(&_attr) { attr in pthread_attr_init(attr) pthread_attr_setscope(attr,Int32(PTHREAD_SCOPE_SYSTEM)) pthread_attr_setdetachstate(attr,Int32(PTHREAD_CREATE_DETACHED)) } }
Philippe Hausler 在 SR-1908 中提出了解决方案。正巧我有个树莓派 3 可以实现和测试该方案。
针对 Foundation 的构建
如果你阅读了 开源库 Foundation 的 新手入门文档 ,你就会知道,它建议在构建 Foundation 之前,首先需要构建 Swift,clang 和 llvm。如果可以在一个有大量的 CPU 和快速磁盘的服务器上工作,我丝毫不介意按照文档一步步构建。然而树莓派 3 与其他老式的设备一样,性能提升有点慢。我也可以考虑交叉编译 Swift,但我还没有足够时间来解决交叉编译带来的问题(如果你曾经使用过交叉编译环境,你一定知道它需要很长时间来做相关的配置)。
我们所需要的是充分利用已有的构建环境并自行编译 Foundation。事实证明是可以做到的,不然的话,我们也不会有这篇博客了。
下面是你所需要的准备操作(无论你是在 x86 服务器上还是在像 BeagleBone 或树莓派的 ARM 的计算机上):
- 全量构建
swiftc
,通常位于build/buildbot_linux/swift-linux-armv7/bin
目录 - 全量构建
swift
,同样位于build/buildbot_linux/swift-linux-armv7/bin
目录 - 全量构建
clang
(从开源库中构建),位于build/buildbot_linux/llvm-linux-armv7/bin
目录中
我希望提供各种已经编译过的“工具链”,但是现在你必须首先构建自己的 工具 链。然后你就可以自己构建 Foundation 了。
现在,让我们来看看如何使用它来测试 Foundation 上的内容。请注意,我们克隆的是我们自己 fork 的 swift-corelibs-foundation 的分支。如果你打算给上游开源库(即 Apple 开源库)提交 PR,这一点非常的重要。
# git clone https://github.com/iachievedit/swift-corelibs-foundation # export PREBUILT_ROOT=/root/workspace/Swift-3.0-Pi3-ARM-Incremental/build/buildbot_linux/ # SWIFTC=$PREBUILT_ROOT/swift-linux-armv7/bin/swiftc \ CLANG=$PREBUILT_ROOT/llvm-linux-armv7/bin/clang \ SWIFT=$PREBUILT_ROOT/swift-linux-armv7/bin/swift \ SDKROOT=$PREBUILT_ROOT/swift-linux-armv7 \ BUILD_DIR=build ./configure Debug # /usr/bin/ninja ... [290/290] Link: build/Foundation/libFoundation.so
首先,我们将环境变量 PREBUILT_ROOT
设置到预构建 Swift 及相关工具所在的位置,还可以在下一步操作前配置 ./configure
为 Debug
模式(你也可以配置为 Release
)。我们还需要将环境变量 SWIFTC
, CLANG
, SWIFT
和 SDKROOT
配置脚本指向我们的“工具链”。最后,环境变量 BUILD_DIR
设置为所有中间件和最终输出(libFoundation.so)的放置位置。
注意:也许有时你会惊讶于评论中的某些内容。你的 PREBUILT_ROOT
是你工具链的位置。不要期望在 /root/workspace/Swift-3.0-Pi3-ARM-Incremental
上找到你系统上的任何内容!
最后,执行 /usr/bin/ninja
来运行我们的构建。一旦构建结束后,在 build/Foundation/
目录中会有一个 libFoundation.so
共享库。
要使用已安装的 Swift 来测试它,只需将 libFoundation.so
复制到 $YOUR_SWIFT_ROOT/usr/lib/swift/linux/ libFoundation.so
。
运行测试用例
你可以通过向 ./configure
添加 -DXCTEST_BUILD_DIR
参数来运行 Foundation 测试套件。
# export PREBUILT_ROOT=/root/workspace/Swift-3.0-Pi3-ARM-Incremental/build/buildbot_linux/ # SWIFTC=$PREBUILT_ROOT/swift-linux-armv7/bin/swiftc \ CLANG=$PREBUILT_ROOT/llvm-linux-armv7/bin/clang \ SWIFT=$PREBUILT_ROOT/swift-linux-armv7/bin/swift \ SDKROOT=$PREBUILT_ROOT/swift-linux-armv7 \ BUILD_DIR=build ./configure Debug \ -DXCTEST_BUILD_DIR=$PREBUILT_ROOT/xctest-linux-armv7 # /usr/bin/ninja test [4/4] Building Tests **** RUNNING TESTS **** execute: LD_LIBRARY_PATH= build/TestFoundation/TestFoundation **** DEBUGGING TESTS **** execute: LD_LIBRARY_PATH= lldb build/TestFoundation/TestFoundation
运行测试需要为 LD_LIBRARY_PATH
提供两个路径: libXCTest.so
共享库和“library under test”的路径。
如果我们按照上述步骤操作, libFoundation.so
就一定位于 ./build/Foundation
目录中。
# LD_LIBRARY_PATH=./build/Foundation:$PREBUILT_ROOT/xctest-linux-armv7 ./build/TestFoundation/TestFoundation ... Test Suite 'All tests' passed at 03:16:45.315 Executed 483 tests, with 0 failures (0 unexpected) in 37.621 (37.621) seconds
结束语
需要强调的是使用这种技术,你需要一个“构建工具链”,它包含 Swift,clang 和 llvm。此外,您的工具链最后一次构建到您尝试自行构建 Foundation 的时间间隔越长,Foundation 所依赖的语言特性在构建工具链时不存在的风险就越高。但如果您决定开始使用 Foundation,请首先构建完整的 Swift 工具链并保存构建目录以使用上述技术。
祝你好运!
本文由 SwiftGG 翻译组翻译,已经获得作者翻译授权,最新文章请访问http://swift.gg。
以上所述就是小编给大家介绍的《编译开源 Swift Foundation 库》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- Swift 编译慢?请看这里,全套开源
- 谈谈 JSP 的预编译加速及如何参与开源
- 为鸿蒙开路!华为:方舟编译器8月正式开源
- 如何在Ubuntu中编译VLC-Android开源项目
- Fastly 开源 Lucet:WebAssembly 的编译器和运行时
- SBCL 1.5.5 发布,开源 Common Lisp 编译器
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Types and Programming Languages
Benjamin C. Pierce / The MIT Press / 2002-2-1 / USD 95.00
A type system is a syntactic method for automatically checking the absence of certain erroneous behaviors by classifying program phrases according to the kinds of values they compute. The study of typ......一起来看看 《Types and Programming Languages》 这本书的介绍吧!