iOS和模板Haskell

与Android和Haskell模板类似,我们需要将GHCSlave(远程iserv)实例包装到iOS应用程序中。 在iOS设备上提供Template Haskell评估上下文。

从昨天开始使用适用于iOS的Haskell Cross Compiler,我们现在将构建GHCSlave iOS应用程序。

警告:由于x86_64链接器代码中的错误,Template Haskell尚不能与iOS Simulator一起使用。 链接器代码固定后,我已用斜体标记了模拟器的命令,并将删除此警告。 在此之前,模板Haskell只能在设备上/在设备上使用。

先决条件

同样,我们需要构建iserv-proxyiserv库。 如果不清楚, 请参考 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/biniserv-proxy二进制文件,并且对于两个交叉编译器都具有iserv-bin库。

为iOS构建GHCSlave

我们需要构建一个静态库并将其包装到本地iOS应用程序中。

GHCSlave android应用程序的代码可以在iOS文件夹的zw3rk / ghc-slave存储库中找到。

与我们使用lipo构建通用库的方式相同,我们还将构建通用GHCSlave库。

GHCSlave/iOS/GHCSlave文件夹中,我们使用iserv-biniserv-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支持。 (现在还是不支持模拟器)