Skip to content

Commit aa8ad9a

Browse files
committed
Add WASM support for Eliom apps
1 parent 30abe55 commit aa8ad9a

24 files changed

+247
-19
lines changed

dune-project

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ The client-side code is compiled to JS using Ocsigen Js_of_ocaml or to Wasm usin
2828
ppx_deriving
2929
(ppxlib (>= 0.15))
3030
(js_of_ocaml-compiler (>= 6.0))
31+
wasm_of_ocaml-compiler
3132
(js_of_ocaml (>= 6.0))
3233
(js_of_ocaml-lwt (>= 6.0))
3334
(js_of_ocaml-ocamlbuild :build)

eliom.opam

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ depends: [
2323
"ppx_deriving"
2424
"ppxlib" {>= "0.15"}
2525
"js_of_ocaml-compiler" {>= "6.0"}
26+
"wasm_of_ocaml-compiler"
2627
"js_of_ocaml" {>= "6.0"}
2728
"js_of_ocaml-lwt" {>= "6.0"}
2829
"js_of_ocaml-ocamlbuild" {build}

pkg/distillery/templates/app.exe/Makefile.app

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,15 @@ install.static: $(TEST_PREFIX)$(ELIOMSTATICDIR)/$(PROJECT_NAME).js | $(PREFIX)$(
6767
HASH=`md5sum _build/default/client/$(PROJECT_NAME).bc.js | cut -d ' ' -f 1` && \
6868
install $(addprefix -o ,$(WWWUSER)) $(JS_PREFIX)_$$HASH.js $(PREFIX)$(ELIOMSTATICDIR) && \
6969
ln -sf $(PROJECT_NAME)_$$HASH.js $(PREFIX)$(ELIOMSTATICDIR)/$(PROJECT_NAME).js
70+
ifeq ($(ENABLE_WASM),yes)
71+
HASH_WASM=`md5sum _build/default/client/$(PROJECT_NAME).bc.wasm.js | cut -d ' ' -f 1` && \
72+
install $(addprefix -o ,$(WWWUSER)) $(JS_PREFIX)_$$HASH_WASM.wasm.js $(PREFIX)$(ELIOMSTATICDIR) && \
73+
ln -sf $(PROJECT_NAME)_$$HASH_WASM.wasm.js $(PREFIX)$(ELIOMSTATICDIR)/$(PROJECT_NAME).wasm.js
74+
if [ -d _build/default/client/$(PROJECT_NAME).bc.wasm.assets ]; then \
75+
cp -rf _build/default/client/$(PROJECT_NAME).bc.wasm.assets $(PREFIX)$(ELIOMSTATICDIR)/; \
76+
[ -z $(WWWUSER) ] || chown -R $(WWWUSER) $(PREFIX)$(ELIOMSTATICDIR)/$(PROJECT_NAME).bc.wasm.assets; \
77+
fi
78+
endif
7079
[ -z $(WWWUSER) ] || chown -R $(WWWUSER) $(PREFIX)$(FILESDIR)
7180

7281
.PHONY:
@@ -91,13 +100,24 @@ config-files: | $(TEST_PREFIX)$(ELIOMSTATICDIR) $(TEST_PREFIX)$(LIBDIR)
91100
HASH=`md5sum _build/default/client/$(PROJECT_NAME).bc.js | cut -d ' ' -f 1` && \
92101
cp -f _build/default/client/$(PROJECT_NAME).bc.js $(JS_PREFIX)_$$HASH.js && \
93102
ln -sf $(PROJECT_NAME)_$$HASH.js $(JS_PREFIX).js
103+
ifeq ($(ENABLE_WASM),yes)
104+
HASH_WASM=`md5sum _build/default/client/$(PROJECT_NAME).bc.wasm.js | cut -d ' ' -f 1` && \
105+
cp -f _build/default/client/$(PROJECT_NAME).bc.wasm.js $(JS_PREFIX)_$$HASH_WASM.wasm.js && \
106+
ln -sf $(PROJECT_NAME)_$$HASH_WASM.wasm.js $(JS_PREFIX).wasm.js
107+
if [ -d _build/default/client/$(PROJECT_NAME).bc.wasm.assets ]; then \
108+
cp -rf _build/default/client/$(PROJECT_NAME).bc.wasm.assets $(TEST_PREFIX)$(ELIOMSTATICDIR)/; \
109+
fi
110+
endif
94111
cp -f _build/default/$(PROJECT_NAME).cm* $(TEST_PREFIX)$(LIBDIR)/
95112

96113
all::
97114
$(ENV_PSQL) dune build $(DUNE_OPTIONS) @install @$(PROJECT_NAME)
98115

99116
js::
100117
$(ENV_PSQL) dune build $(DUNE_OPTIONS) client/$(PROJECT_NAME).bc.js
118+
ifeq ($(ENABLE_WASM),yes)
119+
$(ENV_PSQL) dune build $(DUNE_OPTIONS) client/$(PROJECT_NAME).bc.wasm.js
120+
endif
101121

102122
byte:: js
103123
$(ENV_PSQL) dune build $(DUNE_OPTIONS) $(PROJECT_NAME)_main.bc

pkg/distillery/templates/app.exe/Makefile.options

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,5 +73,8 @@ CSS_PREFIX := $(LOCAL_STATIC_CSS)/${PROJECT_NAME}
7373
# JavaScript, ocsigenserver
7474
DEBUG := yes
7575

76+
# Enable WASM compilation (yes/no): Requires wasm_of_ocaml (enabled by default)
77+
ENABLE_WASM := yes
78+
7679
##----------------------------------------------------------------------
7780

pkg/distillery/templates/app.exe/PROJECT_NAME.eliom

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,10 @@ let%server application_name = "%%%PROJECT_NAME%%%"
55
let%client application_name = Eliom_client.get_application_name ()
66

77
let%server () =
8-
Ocsipersist_settings.set_db_file "local/var/data/%%%PROJECT_NAME%%%/%%%PROJECT_NAME%%%_db";
8+
Ocsipersist_settings.set_db_file "local/var/data/%%%PROJECT_NAME%%%/%%%PROJECT_NAME%%%_db"
9+
(* WebAssembly support with automatic browser detection is enabled by default.
10+
To disable it, uncomment the following line: *)
11+
(* ; Eliom_config.set_enable_wasm false *)
912

1013
(* Create a module for the application. See
1114
https://ocsigen.org/eliom/manual/clientserver-applications for more

pkg/distillery/templates/app.exe/dune

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@
8686
client
8787
(executables
8888
(names %%%PROJECT_NAME%%%)
89-
(modes js byte)
89+
(modes js byte wasm)
9090
(preprocess
9191
(pps
9292
js_of_ocaml-ppx
@@ -109,6 +109,8 @@
109109
use-js-string
110110
--no-source-map))
111111
; source maps are slow...
112+
(wasm_of_ocaml
113+
(flags :standard))
112114
(libraries eliom.client))
113115
(dynamic_include ../gen/dune.client))
114116

@@ -122,6 +124,7 @@
122124
%%%PROJECT_NAME%%%_main.exe
123125
client/%%%PROJECT_NAME%%%.bc
124126
client/%%%PROJECT_NAME%%%.bc.js
127+
client/%%%PROJECT_NAME%%%.bc.wasm.js
125128
tools/check_modules.ml)
126129
(action
127130
(run ocaml -I +unix -I +str tools/check_modules.ml %%%PROJECT_NAME%%%)))
Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
1-
(lang dune 3.14)
1+
(lang dune 3.17)
22

33
(dialect
44
(name "eliom-server")
5-
(implementation (extension "eliom"))
6-
(interface (extension "eliomi")))
5+
(implementation
6+
(extension "eliom"))
7+
(interface
8+
(extension "eliomi")))
79

810
(wrapped_executables false)
911

10-
(formatting (enabled_for ocaml "eliom-server"))
12+
(formatting
13+
(enabled_for ocaml "eliom-server"))

pkg/distillery/templates/app.lib/Makefile.app

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,15 @@ install.static: $(TEST_PREFIX)$(ELIOMSTATICDIR)/$(PROJECT_NAME).js | $(PREFIX)$(
7474
HASH=`md5sum _build/default/client/$(PROJECT_NAME).bc.js | cut -d ' ' -f 1` && \
7575
install $(addprefix -o ,$(WWWUSER)) $(JS_PREFIX)_$$HASH.js $(PREFIX)$(ELIOMSTATICDIR) && \
7676
ln -sf $(PROJECT_NAME)_$$HASH.js $(PREFIX)$(ELIOMSTATICDIR)/$(PROJECT_NAME).js
77+
ifeq ($(ENABLE_WASM),yes)
78+
HASH_WASM=`md5sum _build/default/client/$(PROJECT_NAME).bc.wasm.js | cut -d ' ' -f 1` && \
79+
install $(addprefix -o ,$(WWWUSER)) $(JS_PREFIX)_$$HASH_WASM.wasm.js $(PREFIX)$(ELIOMSTATICDIR) && \
80+
ln -sf $(PROJECT_NAME)_$$HASH_WASM.wasm.js $(PREFIX)$(ELIOMSTATICDIR)/$(PROJECT_NAME).wasm.js
81+
if [ -d _build/default/client/$(PROJECT_NAME).bc.wasm.assets ]; then \
82+
cp -rf _build/default/client/$(PROJECT_NAME).bc.wasm.assets $(PREFIX)$(ELIOMSTATICDIR)/; \
83+
[ -z $(WWWUSER) ] || chown -R $(WWWUSER) $(PREFIX)$(ELIOMSTATICDIR)/$(PROJECT_NAME).bc.wasm.assets; \
84+
fi
85+
endif
7786
[ -z $(WWWUSER) ] || chown -R $(WWWUSER) $(PREFIX)$(FILESDIR)
7887
install.etc: $(TEST_PREFIX)$(ETCDIR)/$(PROJECT_NAME).conf | $(PREFIX)$(ETCDIR)
7988
install $< $(PREFIX)$(ETCDIR)/$(PROJECT_NAME).conf
@@ -122,6 +131,11 @@ SED_ARGS += -e "s|%%FILESDIR%%|%%PREFIX%%$(FILESDIR)|g"
122131
SED_ARGS += -e "s|%%ELIOMSTATICDIR%%|%%PREFIX%%$(ELIOMSTATICDIR)|g"
123132
SED_ARGS += -e "s|%%APPNAME%%|$(shell basename `readlink $(JS_PREFIX).js` .js)|g"
124133
SED_ARGS += -e "s|%%CSSNAME%%|$(shell readlink $(CSS_PREFIX).css)|g"
134+
ifeq ($(ENABLE_WASM),yes)
135+
SED_ARGS += -e "s|%%WASMATTR%%|wasm=\"$(shell basename `readlink $(JS_PREFIX).wasm.js` .wasm.js).wasm.js\"|g"
136+
else
137+
SED_ARGS += -e "s|%%WASMATTR%%||g"
138+
endif
125139
ifeq ($(DEBUG),yes)
126140
SED_ARGS += -e "s|%%DEBUGMODE%%|\<debugmode /\>|g"
127141
else
@@ -156,6 +170,14 @@ config-files: | $(TEST_PREFIX)$(ELIOMSTATICDIR) $(TEST_PREFIX)$(LIBDIR)
156170
HASH=`md5sum _build/default/client/$(PROJECT_NAME).bc.js | cut -d ' ' -f 1` && \
157171
cp -f _build/default/client/$(PROJECT_NAME).bc.js $(JS_PREFIX)_$$HASH.js && \
158172
ln -sf $(PROJECT_NAME)_$$HASH.js $(JS_PREFIX).js
173+
ifeq ($(ENABLE_WASM),yes)
174+
HASH_WASM=`md5sum _build/default/client/$(PROJECT_NAME).bc.wasm.js | cut -d ' ' -f 1` && \
175+
cp -f _build/default/client/$(PROJECT_NAME).bc.wasm.js $(JS_PREFIX)_$$HASH_WASM.wasm.js && \
176+
ln -sf $(PROJECT_NAME)_$$HASH_WASM.wasm.js $(JS_PREFIX).wasm.js
177+
if [ -d _build/default/client/$(PROJECT_NAME).bc.wasm.assets ]; then \
178+
cp -rf _build/default/client/$(PROJECT_NAME).bc.wasm.assets $(TEST_PREFIX)$(ELIOMSTATICDIR)/; \
179+
fi
180+
endif
159181
cp -f _build/default/$(PROJECT_NAME).cm* $(TEST_PREFIX)$(LIBDIR)/
160182
$(MAKE) $(CONFIG_FILES) $(TEST_CONFIG_FILES) PROJECT_NAME=$(PROJECT_NAME)
161183

@@ -164,6 +186,9 @@ all::
164186

165187
js::
166188
$(ENV_PSQL) dune build $(DUNE_OPTIONS) client/$(PROJECT_NAME).bc.js
189+
ifeq ($(ENABLE_WASM),yes)
190+
$(ENV_PSQL) dune build $(DUNE_OPTIONS) client/$(PROJECT_NAME).bc.wasm.js
191+
endif
167192

168193
byte::
169194
$(ENV_PSQL) dune build $(DUNE_OPTIONS) @$(PROJECT_NAME)

pkg/distillery/templates/app.lib/Makefile.options

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,5 +73,8 @@ CSS_PREFIX := $(LOCAL_STATIC_CSS)/${PROJECT_NAME}
7373
# JavaScript, ocsigenserver
7474
DEBUG := yes
7575

76+
# Enable WASM compilation (yes/no): Requires wasm_of_ocaml (enabled by default)
77+
ENABLE_WASM := yes
78+
7679
##----------------------------------------------------------------------
7780

pkg/distillery/templates/app.lib/PROJECT_NAME.conf.in

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@
4141
<extension findlib-package="eliom.server">
4242
<!-- Ask Eliom to ignore UTM parameters and others: -->
4343
<ignoredgetparams regexp="utm_[a-z]*|[a-z]*clid|li_fat_id"/>
44+
<!-- Enable WebAssembly support with automatic browser detection: -->
45+
<wasm enabled="true"/>
4446
<!-- Uncomment if you are using https only and want secure cookies:
4547
<securecookies value="true" />
4648
-->
@@ -51,7 +53,7 @@
5153
<static dir="%%FILESDIR%%" />
5254
%%ELIOM_MODULES%%
5355
<eliommodule module="%%LIBDIR%%/%%PROJECT_NAME%%.cma">
54-
<app name="%%APPNAME%%" css="%%CSSNAME%%" />
56+
<app name="%%APPNAME%%" css="%%CSSNAME%%" %%WASMATTR%% />
5557
<avatars dir="%%FILESDIR%%/avatars" />
5658
<os-db
5759
host="%%DB_HOST%%"

0 commit comments

Comments
 (0)