iOS和模板Haskell
与Android和Haskell模板类似,我们需要将GHCSlave(远程iserv)实例包装到iOS应用程序中。 在iOS设备上提供Template Haskell评估上下文。
从昨天开始使用适用于iOS的Haskell Cross Compiler,我们现在将构建GHCSlave iOS应用程序。
警告:由于x86_64链接器代码中的错误,Template Haskell尚不能与iOS Simulator一起使用。 链接器代码固定后,我已用斜体标记了模拟器的命令,并将删除此警告。 在此之前,模板Haskell只能在设备上/在设备上使用。
先决条件
同样,我们需要构建iserv-proxy
和iserv
库。 如果不清楚, 请参考 Raspberry Pi的 说明。
签出自定义ghc分支后:
git clone-递归git://git.haskell.org/ghc.git
光盘ghc
git remote add zw3rk https://github.com/zw3rk/ghc.git
git fetch zw3rk
git checkout -b zw3rk / my-ghc
git reset --hard zw3rk/my-ghc
git子模块更新--init --recursive
我们需要使用我们的常规编译器来构建iserv-proxy
:
ghc / iserv $ cabal install -flibrary -fproxy
以及带有交叉编译器的iserv
库:
ghc / iserv $ aarch64-apple-ios-cabal安装-flibrary
ghc / iserv $ x86_64-apple-ios-cabal安装-flibrary
这样,我们现在应该在~/.cabal/bin
有iserv-proxy
二进制文件,并且对于两个交叉编译器都具有iserv-bin
库。
为iOS构建GHCSlave
我们需要构建一个静态库并将其包装到本地iOS应用程序中。
GHCSlave android应用程序的代码可以在iOS
文件夹的zw3rk / ghc-slave存储库中找到。
与我们使用lipo
构建通用库的方式相同,我们还将构建通用GHCSlave库。
在GHCSlave/iOS/GHCSlave
文件夹中,我们使用iserv-bin
和iserv-bin
中的链接为iOS设备和模拟器构建了静态库。
aarch64-apple-ios-ghc -odir arm64 -hidir arm64 \
-staticlib-线程化\
-lffi -L /路径/到/ libffi / aarch64-apple-ios / lib \
-o hs-libs / arm64 / libhs.a-程序包iserv-bin \
hs / LineBuff.hs
x86_64-apple-ios-ghc -odr x86_64 -hidir x86_64 \
-staticlib-线程化\
-lffi -L /路径/到/ libffi / x86_64-apple-ios / lib \
-o hs-libs / x86_64 / libhs.a-程序包iserv-bin \
hs / LineBuff.hs
lipo -create -output hs-libs / libhs.a \
hs-libs / arm64 / libhs.a hs-libs / x86_64 / libhs.a
注意:我们需要 startSlave
作为 startSlave
函数调用 forkIO
以在单独的线程中启动启动。
在设备上构建和运行应用程序应显示:
编译一些模板Haskell
正如我们在为Android编译Template Haskell时所做的那样,我们将使用gitrev
包将git修订版本嵌入标签中。
可以在zw3rk / hs-ios-hello-templatehaskell中找到此示例应用程序的源代码。
首先,我们需要安装补丁的gitrev
软件包
git clone https://github.com/mobilehaskell/file-embed.git
(嵌入CD文件&& armv7-linux-androideabi-cabal安装)
(嵌入CD文件&& aarch64-linux-android-cabal安装)
与昨天的zw3rk / hs-ios-helloworld示例类似,我们将使用以下Lib.hs
构建一个库
模块库在哪里
导入Development.GitRev(gitHash)
导入Foreign.C(CString,newCString)
国外出口ccall“ gitrev” cgitrev :: IO CString
-| 将$ gitHash转换为ac字符串。
cgitrev = newCString $ gitHash
将其编译为通用库
aarch64-apple-ios-ghc -odir arm64 -hidir arm64 \
-staticlib \
-L /路径/到/ libffi / aarch64-apple-ios / lib -lffi \
-o hs-libs / arm64 / libhs.a -package gitrev \
hs / Lib.hs \
-外部解释器\
-pgmi $ HOME / .cabal / bin / iserv-proxy -opti10.0.1.23 -opti5000
x86_64-apple-ios-ghc -odr x86_64 -hidir x86_64 \
-staticlib \
-L /路径/到/ libffi / x86_64-apple-ios / lib -lffi \
-o hs-libs / x86_64 / libhs.a -package gitrev \
hs / Lib.hs \
-外部解释器\
-pgmi $ HOME / .cabal / bin / iserv-proxy -opti10.0.1.24 -opti5000
lipo -create -output hs-libs / libhs.a \
hs-libs / arm64 / libhs.a hs-libs / x86_64 / libhs.a
并像昨天一样在Xcode中进行链接,将为我们提供一个按预期显示git hash的应用程序。
现在,我们有了可运行的Haskell编译器,并具有iOS的Template Haskell支持。 (现在还是不支持模拟器)