1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
|
-- WARNING: iserv-proxy.cabal is automatically generated from iserv-proxy.cabal.in by
-- ../../configure. Make sure you are editing iserv-proxy.cabal.in, not
-- iserv-proxy.cabal.
Name: iserv-proxy
Version: @ProjectVersion@
Copyright: XXX
License: BSD3
-- XXX License-File: LICENSE
Author: XXX
Maintainer: XXX
Synopsis: iserv allows GHC to delegate Tempalte Haskell computations
Description:
GHC can be provided with a path to the iserv binary with
@-pgmi=/path/to/iserv-bin@, and will in combination with
@-fexternal-interpreter@, compile Template Haskell though the
@iserv-bin@ delegate. This is very similar to how ghcjs has been
compiling Template Haskell, by spawning a separate delegate (so
called runner on the javascript vm) and evaluating the splices
there.
.
iserv can also be used in combination with cross compilation. For
this, the @iserv-proxy@ needs to be built on the host, targeting the
host (as it is running on the host). @cabal install -flibrary
-fproxy@ will yield the proxy.
.
Using the cabal for the target @arch-platform-target-cabal install
-flibrary@ will build the required library that contains the ffi
@startSlave@ function, which needs to be invoked on the target
(e.g. in an iOS application) to start the remote iserv slave.
.
calling the GHC cross compiler with @-fexternal-interpreter
-pgmi=$HOME/.cabal/bin/iserv-proxy -opti\<ip address\> -opti\<port\>@
will cause it to compile Template Haskell via the remote at \<ip address\>.
.
Thus to get cross compilation with Template Haskell follow the
following receipt:
.
* compile the iserv library for your target
.
> iserv $ arch-platform-target-cabal install -flibrary
.
* setup an application for your target that calls the
* startSlave function. This could be either haskell or your
* targets ffi capable language, if needed.
.
> void startSlave(false /* verbose */, 5000 /* port */,
> "/path/to/storagelocation/on/target");
.
* build the iserv-proxy
.
> iserv $ cabal install -flibrary -fproxy
* Start your iserv-slave app on your target running on say @10.0.0.1:5000@
* compiler your sources with -fexternal-interpreter and the proxy
.
> project $ arch-platform-target-ghc ModuleContainingTH.hs \
> -fexternal-interpreter \
> -pgmi=$HOME/.cabal/bin/iserv-proxy \
> -opti10.0.0.1 -opti5000
.
Should something not work as expected, provide @-opti-v@ for verbose
logging of the @iserv-proxy@.
Category: Development
build-type: Simple
cabal-version: >=1.10
Executable iserv-proxy
Default-Language: Haskell2010
Main-Is: Main.hs
Hs-Source-Dirs: src
Build-Depends: array >= 0.5 && < 0.6,
base >= 4 && < 5,
binary >= 0.7 && < 0.9,
bytestring >= 0.10 && < 0.11,
containers >= 0.5 && < 0.8,
deepseq >= 1.4 && < 1.5,
directory >= 1.3 && < 1.4,
network >= 2.6,
filepath >= 1.4 && < 1.5,
ghci == @ProjectVersionMunged@,
libiserv == @ProjectVersionMunged@
|