當前,有許多人正在努力將 swift 3.0 引入到基於 arm 的系統中。通過本文你將了解如何在執行 ubuntu 16 (xenial xerus) 的樹莓派 2 或樹莓派 3 上構建並使用 swift 3.0。不過,我們暫時還沒有對它在 raspbian 系統上的可用性進行測試 (看起來並不可以)。
也許你還不知道支援樹莓派的 xenial 是存在的。不過沒關係,因為我以前也是!首先你可以通讀 ubuntu wiki 來了解它的核心內容,然後在樹莓派上部署它。建議使用至少 8g 的 sd 卡。
我們的團隊致力於在 arm 裝置上使用 swift,最近大家正在一台樹莓派 3 上通過 jenkins 來構建樹莓派專用的二進位制檔案。看,下圖就是構建裝置!
swift 3.0 構建裝置
如果你好奇這一切是如何進行的,可以檢視 jenkins 構建專案。坦率地說,我十分驚訝,因為它只花了 6 個小時就完成了 swift 的編譯。
shell
cd $home
wget
mkdir swift-3.0
cd swift-3.0 && tar -xzf ../swift-3.0.tgz
export path=$home/swift-3.0/usr/bin:$path
注意:把 swift 3.0 放在$home
並不是強制性的,我通常使用的路徑是:/opt/swift/swift-3.0
。
一切就緒,讓我們馬上來體驗一下吧!
建立乙個名為helloworld.swift
的檔案:
print("hello, world!")
然後你可以使用swift helloworld.swift
語句來執行該檔案,就像執行指令碼一樣:
shell
# swift helloworld.swift
hello, world!
shell
# swiftc helloworld.swift
# ./helloworld
hello world!
shell
sudo apt-get update
sudo apt-get install -y libicu-dev
sudo apt-get install -y clang-3.6
sudo update-alternatives --install /usr/bin/clang clang /usr/bin/clang-3.6 100
sudo update-alternatives --install /usr/bin/clang++ clang++ /usr/bin/clang++-3.6 100
接下來讓我們再來看一些有趣的小花絮吧:
swiftcat.swift:
import glibc
guard process.arguments.count == 2 else
let filename = process.arguments[1]
let bufsize = 1024
var pp = popen("cat " + filename, "r")
var buf = [cchar](repeating:0, count:bufsize)
while fgets(&buf, int32(bufsize), pp) != nil
exit(0)
編譯 (swiftc swiftcat.swift
) 並執行 (swiftcat
)!
escapetext.c:
c
#include #include #include int escapetext(const char* text, char** output)
} return rc;
}
escapetext.h:
c
int escapetext(const char* text, char** output);
import glibc
guard process.arguments.count == 2 else
let string = process.arguments[1]
var buffer:unsafemutablepointer? = nil
let rc = escapetext(string, &buffer)
guard rc > 0 else
if let escaped = buffer
exit(0)
shell
# clang -c escapetext.c
# swiftc -c escapeswift.swift -import-objc-header escapetext.h
# swiftc escapeswift.o escapetext.o -o escapeswift -lcurl
然後執行:
shell
# ./escapeswift "foo > bar"
escaped text: foo%20%3e%20bar
除非你很享受寫 makefile 和構建指令碼 (相信我,的確有人是這樣的),不然你可以在這裡使用 swift package manager 來協助管理軟體的包依賴。對於 swift 3.0 引入的 swiftpm,後面我們會寫更多與其相關的內容,說起來,swiftpm 提供了乙個能夠在 armv 7 裝置上工作的版本,這實在是一件令人很振奮的事情。不妨試一試下面的**:
shell
# mkdir finalcountdown && cd finalcountdown
# swift package init --type executable
creating executable package: finalcountdown
creating package.swift
creating .gitignore
creating sources/
creating sources/main.swift
creating tests/
然後再將sources/main.swift
的內容替換為下面的**:
import foundation
import glibc
let thread = nsthread()
print("\nexiting thread")
print("done")
exit(0)
}thread.start()
select(0, nil, nil, nil, nil)
現在,執行swift build
來構建你的 finalcountdown 應用:
shell
# swift build
compile swift module 'finalcountdown' (1 sources)
linking .build/debug/finalcountdown
# .build/debug/finalcountdown
entering thread
10...9...8...7...6...5...4...3...2...1...
exiting thread
done
如果你對在 x86 與 armv 7 系統上執行 swift 3.0 編寫的應用還是一知半解的話,可以看一看 moreswift 專案的 swift-3.0 分支。
當前的構建並非是針對 swift 3.0 預覽版進行的。如果需要驗證與 swift 二進位制檔案相關聯的 git 雜湊值,輸入swift --version
即可:
shell
# swift --version
swift version 3.0-dev (llvm eb140647a6, clang a9f2183da4, swift bb43874ba1)
很多人都一直在努力將 swift 引入到 linux arm 裝置中。下面這份名單只提到了他們中很少的幾個人。推薦你去訪問他們的部落格;這些部落格蘊藏著很多寶貴的資訊和學習經驗。 swift3 0 問號和嘆號的理解
表示這個可選變數存在,可以使用,如果用 訪問不存在的可選變數會導致一些錯誤 表示這個變數可能不存在,如果不存在,所在語句後面的內容都不會執行 是乙個強制拆包,告訴編譯器我絕對肯定 能夠執行,如 strvalue hashvalue 如果不能執行則報錯。是表示乙個不確定,strvalue?hashva...
2 樹莓派音效卡設定和alsactl命令的使用
開啟音效卡調音介面 在終端輸入 其中f1鍵可以檢視幫助。接下來要講的是alsactl 命令,它可以管理音效卡的引數配置 預設引數檔案儲存在 var lib alsa asound.state檔案裡,我們可以把這個檔案的內容拷貝出來作為待恢復檔案。在終端輸入 alsactl h 檢視全部引數 儲存配置...
和前作相比,樹莓派3B 的功耗怎樣?
如果你在執行乙個電池供電的 pi,你知道它能執行多久嗎?我們這裡做一些簡單的測試,以便於你制定電力預算。實驗方式 乙個 hdmi 螢幕和乙個 usb 鍵盤 滑鼠轉換器連線,乙個5.2v的供電 電流限制 3 安培 線路,通過電表校準的20安培分流器,由uusb電源輸入pi。了解侷限性 了解任何裝置測試...