为树莓派编译 Swift (交叉)编译

21

Swift现在已经成为开源项目。有人尝试编译适用于树莓派的Swift吗?我开始尝试,但我的8GB SD卡似乎太小了;) 是否可以从Ubuntu进行交叉编译?


是的,这似乎是一个磁盘空间不足的错误。互联网上有些人尝试重新启动后成功解决了问题。您可以尝试编译到另一个位置并检查生成文件的大小吗? - R Menke
你说你已经编译成功了吗?我一直在尝试编译(64G卡),但是一直无法使其工作(编译24小时后出现错误)。你是怎么做到的? - kdbdallas
不,我只能在Xubuntu上编译它。在树莓派上也会出现错误(首先是因为空间不足)。 - Lupurus
Andrew Madsen已经编译了它。这里是他的博客链接:http://blog.andrewmadsen.com/post/136137396480/swift-on-raspberry-pi 由于缺乏空闲的SD卡,我还没有自己尝试过,但看起来很有前途。 - Olaf
如果问题确实是缺少磁盘空间,您可以连接外部硬盘(USB)或映射网络磁盘,并使用PREFIX将编译和存储编译的对象到新磁盘上。@Lupurus - jweyrich
显示剩余3条评论
2个回答

7
一个8GB的SD卡可以正常工作,但是需要扩展根分区。我已经使其工作,/dev/root分区上的已使用空间约为3.1GB。
以下步骤基于Andrew Madsen的博客文章,并在fdisk内部的步骤上进行了一些额外的重点介绍。

获取Ubuntu

finnie.org下载适用于Raspberry Pi 2的Ubuntu 14.04镜像并将其复制到SD卡上。启动Raspberry Pi。

更改分区

登录Raspberry Pi并更改分区大小。默认情况下,/dev/root的大小为1.7G,可用空间为1.1G。这不够用。
$ df -h

Filesystem      Size  Used Avail Use% Mounted on
/dev/root       1.7G  540M  1.1G  35% /
devtmpfs        458M  4.0K  458M   1% /dev
none            4.0K     0  4.0K   0% /sys/fs/cgroup
none             93M  228K   93M   1% /run
none            5.0M     0  5.0M   0% /run/lock
none            462M     0  462M   0% /run/shm
none            100M     0  100M   0% /run/user
/dev/mmcblk0p1   64M   20M   45M  31% /boot/firmware

运行fdisk

sudo fdisk /dev/mmcblk0

在提示符下输入p,表示“打印分区表”。有两个分区。
/dev/mmcblk0p1   *        2048      133119       65536    c  W95 FAT32 (LBA)
/dev/mmcblk0p2          133120     3670015     1768448   83  Linux

当提示时,输入d(表示删除),然后输入2。然后,通过输入np2,并在下两个提示处按回车接受默认值来重新创建分区。
再次输入p,看到第二个分区现在更大了,现在一个8GB的卡上的所有空间都被使用了。
           Device Boot      Start         End      Blocks   Id  System
/dev/mmcblk0p1   *        2048      133119       65536    c  W95 FAT32 (LBA)
/dev/mmcblk0p2          133120    15523839     7695360   83  Linux

输入w将更改写入磁盘,然后重新启动

sudo reboot

调整分区大小

重启后,运行以下命令来调整分区的文件系统大小:

sudo resize2fs /dev/mmcblk0p2

交换空间

通过执行以下操作设置交换文件:

sudo apt-get install dphys-swapfile

安装libicu-dev和clang-3.6

sudo apt-get install libicu-dev clang-3.6

使用update-alternatives为clang和clang++提供/usr/bin链接:
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

然后,添加 @iachievedit 的存储库密钥:
wget -qO- http://dev.iachieved.it/iachievedit.gpg.key | sudo apt-key add -

将适当的存储库添加到sources.list中:
echo "deb [arch=armhf] http://iachievedit-repos.s3.amazonaws.com/ trusty main" | sudo tee --append /etc/apt/sources.list

运行 apt-get update:
sudo apt-get update

安装 Swift

sudo apt-get install swift-2.2

安装完成后,您就可以编译Swift程序了!

编写Swift程序

打开您喜欢的文本编辑器,编写程序并保存(例如保存为'hello.swift'):

let device = "Raspberry Pi 2!" 
print("Hello from Swift on \(device)")

编译它

swiftc hello.swift

并运行它:

./hello

Hello from Swift on Raspberry Pi 2!

就是这样!在树莓派上运行Swift


您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - jweyrich
我已决定现在信任它 :) 在上述引用的博客中,它说:William Dillon (@hpux735) 宣布他已成功地将 Swift 编译器构建为 armv7 系统,例如 BeagleBone、Raspberry Pi 2 等。一段时间后,@iachievedit 将 William 的工作打包并通过 apt-get 提供给 Debian 和 Ubuntu。 - Olaf
3
能否提供如何真正地进行交叉编译的答案?例如在OS X上构建,在Raspberry Pi上部署。 - adib
很好的回答。你知道在Raspian上是否可以安装clang和Swift,还是只能在Ubuntu上使用? - Duncan C

6

2017年4月底,Swift Package Manager通过PR-1098获得了自定义工具链支持。

我在这里编写了详细的说明,介绍如何构建RaspberryPi工具链:macOS -> RasPi交叉编译工具链,甚至可以反过来(在RaspberryPi上构建macOS二进制文件)只是为了好玩。对于Intel-Linux到ARM-Linux,只需要进行最小限度的修改即可。SwiftPM存储库包含一个示例脚本,介绍如何在Intel-macOS到Intel-Ubuntu之间执行此操作。

您可以在此处找到有关Swift-on-ARM的2017-05-01更新:关于树莓派Zero/1/2/3的Swift 3.1.1更新

简要概述一下,以便这个答案不只是链接;-),截至2017-05-16,ARM状态如下:

  • 你可以在树莓派Ubuntu上编译Swift 3.1/3.1.1
    • 不要忘记设置交换空间,需要一些最小的补丁才能支持3.1.1。8GB磁盘可能有点小。
  • 在Raspbian上编译似乎还不能正常工作(已知版本为3.0.2)
  • 你可以使用自定义工具链进行交叉编译Swift,这相对容易设置
    • 你需要获取SwiftPM快照(Swift 4)(但是工具链本身可以是3.1甚至3.0.2,只需进行轻微更改)
  • 你也可以通过Docker运行(和编译)Swift,例如在HypriotOS中。
  • Swift ARM有一个Slack群组:swift-arm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接