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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
|
Name: iserv-bin
Version: 0.0
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
Flag library
Description: Build iserv library
Default: False
Flag proxy
Description: Build iserv-proxy
Default: False
Library
If flag(library)
Buildable: True
Else
Buildable: False
Default-Language: Haskell2010
Hs-Source-Dirs: src
Exposed-Modules: Lib
, Remote.Message
, Remote.Slave
, GHCi.Utils
Build-Depends: base >= 4 && < 5,
binary >= 0.7 && < 0.9,
bytestring >= 0.10 && < 0.11,
containers >= 0.5 && < 0.6,
deepseq >= 1.4 && < 1.5,
cryptonite >= 0.22,
ghci == 8.1,
network >= 2.6 && < 2.7,
directory >= 1.3 && < 1.4,
filepath >= 1.4 && < 1.5
if os(windows)
Cpp-Options: -DWINDOWS
else
Build-Depends: unix >= 2.7 && < 2.8
Executable iserv
Default-Language: Haskell2010
ghc-options: -no-hs-main
Main-Is: Main.hs
C-Sources: cbits/iservmain.c
Hs-Source-Dirs: src
include-dirs: .
If flag(library)
Other-Modules: GHCi.Utils
Else
Other-Modules: GHCi.Utils
, Lib
Build-Depends: array >= 0.5 && < 0.6,
base >= 4 && < 5,
binary >= 0.7 && < 0.9,
bytestring >= 0.10 && < 0.11,
containers >= 0.5 && < 0.6,
deepseq >= 1.4 && < 1.5,
ghci == 8.3
if os(windows)
Cpp-Options: -DWINDOWS
else
Build-Depends: unix >= 2.7 && < 2.8
Executable iserv-proxy
If flag(proxy)
Buildable: True
Else
Buildable: False
Default-Language: Haskell2010
Main-Is: Remote.hs
Hs-Source-Dirs: proxy-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.6,
deepseq >= 1.4 && < 1.5,
ghci == 8.1,
network >= 2.6,
iserv-bin
|