Skip to content

Commit 32043d0

Browse files
committed
Add a basic.reason template
1 parent e895a80 commit 32043d0

File tree

6 files changed

+445
-0
lines changed

6 files changed

+445
-0
lines changed
Lines changed: 240 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,240 @@
1+
2+
##----------------------------------------------------------------------
3+
## DISCLAIMER
4+
##
5+
## This file contains the rules to make an Eliom project. The project is
6+
## configured through the variables in the file Makefile.options.
7+
##----------------------------------------------------------------------
8+
9+
include Makefile.options
10+
11+
##----------------------------------------------------------------------
12+
## Internals
13+
14+
## Required binaries
15+
ELIOMC := eliomc -reason -ppx
16+
ELIOMOPT := eliomopt -reason -ppx
17+
JS_OF_ELIOM := js_of_eliom -reason -ppx
18+
ELIOMDEP := eliomdep
19+
OCSIGENSERVER := ocsigenserver
20+
OCSIGENSERVER.OPT := ocsigenserver.opt
21+
22+
## Where to put intermediate object files.
23+
## - ELIOM_{SERVER,CLIENT}_DIR must be distinct
24+
## - ELIOM_CLIENT_DIR must not be the local dir.
25+
## - ELIOM_SERVER_DIR could be ".", but you need to
26+
## remove it from the "clean" rules...
27+
export ELIOM_SERVER_DIR := _server
28+
export ELIOM_CLIENT_DIR := _client
29+
export ELIOM_TYPE_DIR := _server
30+
DEPSDIR := _deps
31+
32+
ifeq ($(DEBUG),yes)
33+
GENERATE_DEBUG ?= -g
34+
RUN_DEBUG ?= "-v"
35+
DEBUG_JS ?= -jsopt -pretty -jsopt -noinline -jsopt -debuginfo
36+
endif
37+
38+
##----------------------------------------------------------------------
39+
## General
40+
41+
.PHONY: all byte opt
42+
all: byte opt
43+
byte opt:: $(TEST_PREFIX)$(ELIOMSTATICDIR)/${PROJECT_NAME}.js
44+
byte opt:: $(TEST_PREFIX)$(ETCDIR)/$(PROJECT_NAME).conf
45+
byte opt:: $(TEST_PREFIX)$(ETCDIR)/$(PROJECT_NAME)-test.conf
46+
byte:: $(TEST_PREFIX)$(LIBDIR)/${PROJECT_NAME}.cma
47+
opt:: $(TEST_PREFIX)$(LIBDIR)/${PROJECT_NAME}.cmxs
48+
49+
DIST_DIRS = $(ETCDIR) $(DATADIR) $(LIBDIR) $(LOGDIR) $(STATICDIR) $(ELIOMSTATICDIR) $(shell dirname $(CMDPIPE))
50+
51+
##----------------------------------------------------------------------
52+
## Testing
53+
54+
DIST_FILES = $(ELIOMSTATICDIR)/$(PROJECT_NAME).js $(LIBDIR)/$(PROJECT_NAME).cma
55+
56+
.PHONY: test.byte test.opt
57+
test.byte: $(addprefix $(TEST_PREFIX),$(ETCDIR)/$(PROJECT_NAME)-test.conf $(DIST_DIRS) $(DIST_FILES))
58+
$(OCSIGENSERVER) $(RUN_DEBUG) -c $<
59+
test.opt: $(addprefix $(TEST_PREFIX),$(ETCDIR)/$(PROJECT_NAME)-test.conf $(DIST_DIRS) $(patsubst %.cma,%.cmxs, $(DIST_FILES)))
60+
$(OCSIGENSERVER.OPT) $(RUN_DEBUG) -c $<
61+
62+
$(addprefix $(TEST_PREFIX), $(DIST_DIRS)):
63+
mkdir -p $@
64+
65+
##----------------------------------------------------------------------
66+
## Installing & Running
67+
68+
.PHONY: install install.byte install.byte install.opt install.static install.etc install.lib install.lib.byte install.lib.opt run.byte run.opt
69+
install: install.byte install.opt
70+
install.byte: install.lib.byte install.etc install.static | $(addprefix $(PREFIX),$(DATADIR) $(LOGDIR) $(shell dirname $(CMDPIPE)))
71+
install.opt: install.lib.opt install.etc install.static | $(addprefix $(PREFIX),$(DATADIR) $(LOGDIR) $(shell dirname $(CMDPIPE)))
72+
install.lib: install.lib.byte install.lib.opt
73+
install.lib.byte: $(TEST_PREFIX)$(LIBDIR)/$(PROJECT_NAME).cma | $(PREFIX)$(LIBDIR)
74+
install $< $(PREFIX)$(LIBDIR)
75+
install.lib.opt: $(TEST_PREFIX)$(LIBDIR)/$(PROJECT_NAME).cmxs | $(PREFIX)$(LIBDIR)
76+
install $< $(PREFIX)$(LIBDIR)
77+
install.static: $(TEST_PREFIX)$(ELIOMSTATICDIR)/$(PROJECT_NAME).js | $(PREFIX)$(STATICDIR) $(PREFIX)$(ELIOMSTATICDIR)
78+
cp -r $(LOCAL_STATIC)/* $(PREFIX)$(STATICDIR)
79+
[ -z $(WWWUSER) ] || chown -R $(WWWUSER) $(PREFIX)$(STATICDIR)
80+
install $(addprefix -o ,$(WWWUSER)) $< $(PREFIX)$(ELIOMSTATICDIR)
81+
install.etc: $(TEST_PREFIX)$(ETCDIR)/$(PROJECT_NAME).conf | $(PREFIX)$(ETCDIR)
82+
install $< $(PREFIX)$(ETCDIR)/$(PROJECT_NAME).conf
83+
84+
.PHONY:
85+
print-install-files:
86+
@echo $(PREFIX)$(LIBDIR)
87+
@echo $(PREFIX)$(STATICDIR)
88+
@echo $(PREFIX)$(ELIOMSTATICDIR)
89+
@echo $(PREFIX)$(ETCDIR)
90+
91+
$(addprefix $(PREFIX),$(ETCDIR) $(LIBDIR)):
92+
install -d $@
93+
$(addprefix $(PREFIX),$(DATADIR) $(LOGDIR) $(STATICDIR) $(ELIOMSTATICDIR) $(shell dirname $(CMDPIPE))):
94+
install $(addprefix -o ,$(WWWUSER)) -d $@
95+
96+
run.byte:
97+
$(OCSIGENSERVER) $(RUN_DEBUG) -c ${PREFIX}${ETCDIR}/${PROJECT_NAME}.conf
98+
run.opt:
99+
$(OCSIGENSERVER.OPT) $(RUN_DEBUG) -c ${PREFIX}${ETCDIR}/${PROJECT_NAME}.conf
100+
101+
##----------------------------------------------------------------------
102+
## Aux
103+
104+
# Use `eliomdep -sort' only in OCaml>4
105+
ifeq ($(shell ocamlc -version|cut -c1),4)
106+
eliomdep=$(shell $(ELIOMDEP) $(1) -reason -ppx -sort $(2) $(filter %.eliom %.ml,$(3))))
107+
else
108+
eliomdep=$(3)
109+
endif
110+
objs=$(patsubst %.ml,$(1)/%.$(2),$(patsubst %.eliom,$(1)/%.$(2),$(filter %.eliom %.ml,$(3))))
111+
depsort=$(call objs,$(1),$(2),$(call eliomdep,$(3),$(4),$(5)))
112+
113+
##----------------------------------------------------------------------
114+
## Config files
115+
116+
FINDLIB_PACKAGES=$(patsubst %,\<extension\ findlib-package=\"%\"\ /\>,$(SERVER_PACKAGES))
117+
EDIT_WARNING=DON\'T EDIT THIS FILE! It is generated from $(PROJECT_NAME).conf.in, edit that one, or the variables in Makefile.options
118+
SED_ARGS := -e "/^ *%%%/d"
119+
SED_ARGS += -e "s|%%PROJECT_NAME%%|$(PROJECT_NAME)|g"
120+
SED_ARGS += -e "s|%%DATABASE_NAME%%|$(DATABASE_NAME)|g"
121+
SED_ARGS += -e "s|%%DATABASE_USER%%|$(DATABASE_USER)|g"
122+
SED_ARGS += -e "s|%%CMDPIPE%%|%%PREFIX%%$(CMDPIPE)|g"
123+
SED_ARGS += -e "s|%%LOGDIR%%|%%PREFIX%%$(LOGDIR)|g"
124+
SED_ARGS += -e "s|%%DATADIR%%|%%PREFIX%%$(DATADIR)|g"
125+
SED_ARGS += -e "s|%%PERSISTENT_DATA_BACKEND%%|$(PERSISTENT_DATA_BACKEND)|g"
126+
SED_ARGS += -e "s|%%LIBDIR%%|%%PREFIX%%$(LIBDIR)|g"
127+
SED_ARGS += -e "s|%%WARNING%%|$(EDIT_WARNING)|g"
128+
SED_ARGS += -e "s|%%PACKAGES%%|$(FINDLIB_PACKAGES)|g"
129+
SED_ARGS += -e "s|%%ELIOMSTATICDIR%%|%%PREFIX%%$(ELIOMSTATICDIR)|g"
130+
ifeq ($(DEBUG),yes)
131+
SED_ARGS += -e "s|%%DEBUGMODE%%|\<debugmode /\>|g"
132+
else
133+
SED_ARGS += -e "s|%%DEBUGMODE%%||g"
134+
endif
135+
136+
LOCAL_SED_ARGS := -e "s|%%PORT%%|$(TEST_PORT)|g"
137+
LOCAL_SED_ARGS += -e "s|%%STATICDIR%%|$(LOCAL_STATIC)|g"
138+
LOCAL_SED_ARGS += -e "s|%%USERGROUP%%||g"
139+
GLOBAL_SED_ARGS := -e "s|%%PORT%%|$(PORT)|g"
140+
GLOBAL_SED_ARGS += -e "s|%%STATICDIR%%|%%PREFIX%%$(STATICDIR)|g"
141+
ifeq ($(WWWUSER)$(WWWGROUP),)
142+
GLOBAL_SED_ARGS += -e "s|%%USERGROUP%%||g"
143+
else
144+
GLOBAL_SED_ARGS += -e "s|%%USERGROUP%%|<user>$(WWWUSER)</user><group>$(WWWGROUP)</group>|g"
145+
endif
146+
147+
$(TEST_PREFIX)${ETCDIR}/${PROJECT_NAME}.conf: ${PROJECT_NAME}.conf.in Makefile.options | $(TEST_PREFIX)$(ETCDIR)
148+
sed $(SED_ARGS) $(GLOBAL_SED_ARGS) $< | sed -e "s|%%PREFIX%%|$(PREFIX)|g" > $@
149+
$(TEST_PREFIX)${ETCDIR}/${PROJECT_NAME}-test.conf: ${PROJECT_NAME}.conf.in Makefile.options | $(TEST_PREFIX)$(ETCDIR)
150+
sed $(SED_ARGS) $(LOCAL_SED_ARGS) $< | sed -e "s|%%PREFIX%%|$(TEST_PREFIX)|g" > $@
151+
152+
##----------------------------------------------------------------------
153+
## Server side compilation
154+
155+
SERVER_INC := ${addprefix -package ,${SERVER_PACKAGES}}
156+
157+
${ELIOM_TYPE_DIR}/%.type_mli: %.eliom
158+
${ELIOMC} -infer ${SERVER_INC} $<
159+
160+
$(TEST_PREFIX)$(LIBDIR)/$(PROJECT_NAME).cma: $(call objs,$(ELIOM_SERVER_DIR),cmo,$(SERVER_FILES)) | $(TEST_PREFIX)$(LIBDIR)
161+
${ELIOMC} -a -o $@ $(GENERATE_DEBUG) \
162+
$(call depsort,$(ELIOM_SERVER_DIR),cmo,-server,$(SERVER_INC),$(SERVER_FILES))
163+
164+
$(TEST_PREFIX)$(LIBDIR)/$(PROJECT_NAME).cmxa: $(call objs,$(ELIOM_SERVER_DIR),cmx,$(SERVER_FILES)) | $(TEST_PREFIX)$(LIBDIR)
165+
${ELIOMOPT} -a -o $@ $(GENERATE_DEBUG) \
166+
$(call depsort,$(ELIOM_SERVER_DIR),cmx,-server,$(SERVER_INC),$(SERVER_FILES))
167+
168+
%.cmxs: %.cmxa
169+
$(ELIOMOPT) -shared -linkall -o $@ $(GENERATE_DEBUG) $<
170+
171+
${ELIOM_SERVER_DIR}/%.cmi: %.mli
172+
${ELIOMC} -c ${SERVER_INC} $(GENERATE_DEBUG) $<
173+
174+
${ELIOM_SERVER_DIR}/%.cmi: %.eliomi
175+
${ELIOMC} -c ${SERVER_INC} $(GENERATE_DEBUG) $<
176+
177+
${ELIOM_SERVER_DIR}/%.cmo: %.ml
178+
${ELIOMC} -c ${SERVER_INC} $(GENERATE_DEBUG) $<
179+
${ELIOM_SERVER_DIR}/%.cmo: %.eliom
180+
${ELIOMC} -c ${SERVER_INC} $(GENERATE_DEBUG) $<
181+
182+
${ELIOM_SERVER_DIR}/%.cmx: %.ml
183+
${ELIOMOPT} -c ${SERVER_INC} $(GENERATE_DEBUG) $<
184+
${ELIOM_SERVER_DIR}/%.cmx: %.eliom
185+
${ELIOMOPT} -c ${SERVER_INC} $(GENERATE_DEBUG) $<
186+
187+
188+
##----------------------------------------------------------------------
189+
## Client side compilation
190+
191+
CLIENT_LIBS := ${addprefix -package ,${CLIENT_PACKAGES}}
192+
CLIENT_INC := ${addprefix -package ,${CLIENT_PACKAGES}}
193+
194+
CLIENT_OBJS := $(filter %.eliom %.ml, $(CLIENT_FILES))
195+
CLIENT_OBJS := $(patsubst %.eliom,${ELIOM_CLIENT_DIR}/%.cmo, ${CLIENT_OBJS})
196+
CLIENT_OBJS := $(patsubst %.ml,${ELIOM_CLIENT_DIR}/%.cmo, ${CLIENT_OBJS})
197+
198+
$(TEST_PREFIX)$(ELIOMSTATICDIR)/$(PROJECT_NAME).js: $(call objs,$(ELIOM_CLIENT_DIR),cmo,$(CLIENT_FILES)) | $(TEST_PREFIX)$(ELIOMSTATICDIR)
199+
${JS_OF_ELIOM} -o $@ $(GENERATE_DEBUG) $(CLIENT_INC) $(DEBUG_JS) \
200+
$(call depsort,$(ELIOM_CLIENT_DIR),cmo,-client,$(CLIENT_INC),$(CLIENT_FILES))
201+
202+
${ELIOM_CLIENT_DIR}/%.cmi: %.mli
203+
${JS_OF_ELIOM} -c ${CLIENT_INC} $(GENERATE_DEBUG) $<
204+
205+
${ELIOM_CLIENT_DIR}/%.cmo: %.eliom
206+
${JS_OF_ELIOM} -c ${CLIENT_INC} $(GENERATE_DEBUG) $<
207+
${ELIOM_CLIENT_DIR}/%.cmo: %.ml
208+
${JS_OF_ELIOM} -c ${CLIENT_INC} $(GENERATE_DEBUG) $<
209+
210+
${ELIOM_CLIENT_DIR}/%.cmi: %.eliomi
211+
${JS_OF_ELIOM} -c ${CLIENT_INC} $(GENERATE_DEBUG) $<
212+
213+
##----------------------------------------------------------------------
214+
## Dependencies
215+
216+
include .depend
217+
218+
.depend: $(patsubst %,$(DEPSDIR)/%.server,$(SERVER_FILES)) $(patsubst %,$(DEPSDIR)/%.client,$(CLIENT_FILES))
219+
cat $^ > $@
220+
221+
$(DEPSDIR)/%.server: % | $(DEPSDIR)
222+
$(ELIOMDEP) -server -reason -ppx $(SERVER_INC) $< > $@
223+
224+
$(DEPSDIR)/%.client: % | $(DEPSDIR)
225+
$(ELIOMDEP) -client -reason -ppx $(CLIENT_INC) $< > $@
226+
227+
$(DEPSDIR):
228+
mkdir $@
229+
230+
##----------------------------------------------------------------------
231+
## Clean up
232+
233+
clean:
234+
-rm -f *.cm[ioax] *.cmxa *.cmxs *.o *.a *.annot
235+
-rm -f *.type_mli
236+
-rm -f ${PROJECT_NAME}.js
237+
-rm -rf ${ELIOM_CLIENT_DIR} ${ELIOM_SERVER_DIR}
238+
239+
distclean: clean
240+
-rm -rf $(TEST_PREFIX) $(DEPSDIR) .depend
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
2+
#----------------------------------------------------------------------
3+
# SETTINGS FOR THE ELIOM PROJECT %%%PROJECT_NAME%%%
4+
#----------------------------------------------------------------------
5+
6+
PROJECT_NAME := %%%PROJECT_NAME%%%
7+
8+
# Source files for the server
9+
SERVER_FILES := $(wildcard *.eliomi *.eliom)
10+
# Source files for the client
11+
CLIENT_FILES := $(wildcard *.eliomi *.eliom)
12+
13+
# OCamlfind packages for the server
14+
SERVER_PACKAGES := lwt.ppx js_of_ocaml.deriving.ppx
15+
# OCamlfind packages for the client
16+
CLIENT_PACKAGES := lwt.ppx js_of_ocaml.ppx js_of_ocaml.deriving.ppx
17+
18+
# Directory with files to be statically served
19+
LOCAL_STATIC = static
20+
21+
# The backend for persistent data. Can be dbm or sqlite.
22+
# Make sure you have the following packages installed
23+
# - *dbm* if you use dbm --> opam install dbm.
24+
# - *sqlite3* if you use sqlite --> opam install sqlite3.
25+
PERSISTENT_DATA_BACKEND = %%%PROJECT_DB%%%
26+
27+
# Debug application (yes/no): Debugging info in compilation,
28+
# JavaScript, ocsigenserver
29+
DEBUG := no
30+
31+
# User to run server with (make run.*)
32+
WWWUSER := www-data
33+
WWWGROUP := www-data
34+
35+
# Port for running the server (make run.*)
36+
PORT := 80
37+
38+
# Port for testing (make test.*)
39+
TEST_PORT := 8080
40+
41+
# Root of installation (must end with /)
42+
PREFIX := /usr/local/
43+
44+
# Local folder for make test.* (must end with /)
45+
# Do not add files manually in this directory.
46+
# It is just here to test your installation before installing in /
47+
TEST_PREFIX := local/
48+
49+
# The installation tree (relative to $(PREFIX) when
50+
# installing/running or $(TEST_PREFIX) when testing).
51+
# Configuration file $(PROJECT_NAME).conf
52+
ETCDIR := etc/${PROJECT_NAME}
53+
# Project's library $(PROJECT_NAME).cma (cmxs)
54+
LIBDIR := lib/${PROJECT_NAME}
55+
# Command pipe, eg. $ echo reload > $(INSTALL_PREFIX)$(CMDPIPE)
56+
CMDPIPE := var/run/${PROJECT_NAME}-cmd
57+
# Ocsigenserver's logging files
58+
LOGDIR := var/log/${PROJECT_NAME}
59+
# Ocsigenserver's persistent data files
60+
DATADIR := var/data/${PROJECT_NAME}
61+
# Copy of $(LOCAL_STATIC)
62+
STATICDIR := var/www/${PROJECT_NAME}/static
63+
# Project's JavaScript file
64+
ELIOMSTATICDIR := var/www/${PROJECT_NAME}/eliom
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
%%% This is the template for your configuration file. The %%VALUES%% below are
2+
%%% taken from the Makefile to generate the actual configuration files.
3+
%%% This comment will disappear.
4+
<!-- %%WARNING%% -->
5+
<ocsigen>
6+
<server>
7+
<port>%%PORT%%</port>
8+
%%% Only set for running, not for testing
9+
%%USERGROUP%%
10+
<logdir>%%LOGDIR%%</logdir>
11+
<datadir>%%DATADIR%%</datadir>
12+
<charset>utf-8</charset>
13+
%%% Only set when debugging
14+
%%DEBUGMODE%%
15+
<commandpipe>%%CMDPIPE%%</commandpipe>
16+
<extension findlib-package="ocsigenserver.ext.staticmod"/>
17+
<extension findlib-package="ocsigenserver.ext.ocsipersist-%%PERSISTENT_DATA_BACKEND%%"/>
18+
<extension findlib-package="eliom.server"/>
19+
%%% This will include the packages defined as SERVER_PACKAGES in your Makefile:
20+
%%PACKAGES%%
21+
<host hostfilter="*">
22+
<static dir="%%STATICDIR%%" />
23+
<static dir="%%ELIOMSTATICDIR%%" />
24+
<eliommodule module="%%LIBDIR%%/%%PROJECT_NAME%%.cma" />
25+
<eliom/>
26+
</host>
27+
</server>
28+
</ocsigen>
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
[%%shared
2+
open Eliom_lib;
3+
open Eliom_content;
4+
open Html.D
5+
];
6+
7+
let module %%%MODULE_NAME%%%_app = Eliom_registration.App {
8+
let application_name = "%%%PROJECT_NAME%%%";
9+
let global_data_path = None;
10+
};
11+
12+
let main_service =
13+
Eliom_service.create
14+
path::(Eliom_service.Path [])
15+
meth::(Eliom_service.Get Eliom_parameter.unit)
16+
();
17+
18+
let () =
19+
%%%MODULE_NAME%%%_app.register
20+
service::main_service
21+
(
22+
fun () () => Lwt.return (
23+
Eliom_tools.F.html
24+
title::"%%%PROJECT_NAME%%%"
25+
css::[["css", "%%%PROJECT_NAME%%%.css"]]
26+
Html.F.(body [h1 [pcdata "Welcome from Eliom's distillery!"]])
27+
)
28+
);

0 commit comments

Comments
 (0)