From a6eaa161be165d7c1d33ea73c04f6fb6f3a617fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=2EVouillon?= Date: Mon, 26 Oct 2020 15:17:57 +0100 Subject: [PATCH] Dunify Building with Ocamlbuild still works and is used to build the documentation. --- .merlin | 14 -- Makefile | 30 +-- build/build.ml | 25 ++- dune-project | 40 ++++ opam => eliom.opam | 30 ++- pkg/distillery/dune | 3 + .../{ => templates}/basic.ppx/.ocp-indent | 0 .../{ => templates}/basic.ppx/Makefile | 0 .../basic.ppx/Makefile.options | 0 .../basic.ppx/PROJECT_NAME.conf.in | 0 .../basic.ppx/PROJECT_NAME.eliom | 0 .../{ => templates}/basic.ppx/README | 0 .../basic.ppx/static!css!PROJECT_NAME.css | 0 src/lib/client/dune | 30 +++ src/lib/client/dune.client | 92 +++++++++ src/lib/eliom_extension_template.server.ml | 35 ---- src/lib/eliom_registration_sigs.shared.mli | 2 + src/lib/eliom_service.client.ml | 6 + src/lib/eliom_service.client.mli | 6 + src/lib/server/dune | 36 ++++ src/lib/server/dune.server | 184 ++++++++++++++++++ src/lib/server/monitor/dune | 15 ++ src/ocamlbuild/.merlin | 4 - src/ocamlbuild/dune | 10 + src/ocamlbuild/ocamlbuild_eliom.ml | 6 +- src/ppx/.merlin | 4 - src/ppx/dune | 62 ++++++ src/ppx/ppx_eliom_client.ml | 4 +- src/ppx/ppx_eliom_client_ex.ml | 2 +- src/ppx/ppx_eliom_server_ex.ml | 2 +- src/ppx/ppx_eliom_types_ex.ml | 2 +- src/ppx/ppx_eliom_utils.ml | 16 +- src/tools/distillery.ml | 5 +- src/tools/dune | 14 ++ src/tools/gen_dune.ml | 73 +++++++ src/tools/utils.ml | 5 +- 36 files changed, 650 insertions(+), 107 deletions(-) delete mode 100644 .merlin create mode 100644 dune-project rename opam => eliom.opam (77%) create mode 100644 pkg/distillery/dune rename pkg/distillery/{ => templates}/basic.ppx/.ocp-indent (100%) rename pkg/distillery/{ => templates}/basic.ppx/Makefile (100%) rename pkg/distillery/{ => templates}/basic.ppx/Makefile.options (100%) rename pkg/distillery/{ => templates}/basic.ppx/PROJECT_NAME.conf.in (100%) rename pkg/distillery/{ => templates}/basic.ppx/PROJECT_NAME.eliom (100%) rename pkg/distillery/{ => templates}/basic.ppx/README (100%) rename pkg/distillery/{ => templates}/basic.ppx/static!css!PROJECT_NAME.css (100%) create mode 100644 src/lib/client/dune create mode 100644 src/lib/client/dune.client delete mode 100644 src/lib/eliom_extension_template.server.ml create mode 100644 src/lib/server/dune create mode 100644 src/lib/server/dune.server create mode 100644 src/lib/server/monitor/dune delete mode 100644 src/ocamlbuild/.merlin create mode 100644 src/ocamlbuild/dune delete mode 100644 src/ppx/.merlin create mode 100644 src/ppx/dune create mode 100644 src/tools/dune create mode 100644 src/tools/gen_dune.ml diff --git a/.merlin b/.merlin deleted file mode 100644 index 223ac321df..0000000000 --- a/.merlin +++ /dev/null @@ -1,14 +0,0 @@ -B _build/src/* - -S src/* - -PKG js_of_ocaml -PKG lwt -PKG calendar -PKG ocsipersist -PKG ocsigenserver -PKG react -PKG reactiveData -PKG ipaddr - -FLG -w +A-4-6-7-9-27-32-33-34-37-40-42-44-48 diff --git a/Makefile b/Makefile index 7ce4863b82..068fc1222f 100644 --- a/Makefile +++ b/Makefile @@ -1,21 +1,11 @@ ### Building BEST=$(if $(shell command -v ocamlopt 2> /dev/null),native,byte) BUILDER=_build/build/build.$(BEST) -BUILD=ocaml pkg/build.ml -.PHONY: all byte native builder -all: $(BEST) +.PHONY: all +all: + dune build -byte: $(BUILDER) - # strange, see https://sympa.inria.fr/sympa/arc/ocsigen/2016-01/msg00016.html - $(BUILDER) src/lib/server/eliommod_sessiongroups.cmi - $(BUILD) manpage=false native=false native-dynlink=false -native: $(BUILDER) - $(BUILD) manpage=false native=true native-dynlink=true - -$(BUILDER): $(wildcard build/*.ml) - ocamlbuild -no-plugin -I src/ocamlbuild -no-links -use-ocamlfind build/build.$(BEST) 1> /dev/null -builder: $(BUILDER) ### Doc .PHONY: doc wikidoc doc man alldoc DOCS_DIR=src/lib/client src/lib/server src/ocamlbuild src/ppx @@ -42,16 +32,16 @@ doccp: alldoc cp -Rf _build/src/ppx/api.wikidocdir/*.wiki $(API_DIR)/ppx/ cp -Rf doc/index.wiki $(API_DIR)/ +$(BUILDER): $(wildcard build/*.ml) + ocamlbuild -no-plugin -I src/ocamlbuild -no-links -use-ocamlfind build/build.$(BEST) 1> /dev/null +builder: $(BUILDER) ### Cleaning ### -.PHONY: clean clean.local distclean -clean: clean.local - ocamlbuild -quiet -no-plugin -clean - -clean.local: - -rm -f eliom-*.tar.gz +.PHONY: clean distclean +clean: + dune clean -distclean: clean clean.local +distclean: clean -find ./ -name "*\#*" | xargs rm -f ### Installation #### diff --git a/build/build.ml b/build/build.ml index 5f6b27f80f..3a3d84688c 100644 --- a/build/build.ml +++ b/build/build.ml @@ -49,15 +49,30 @@ let _ = (* the dep with ocamldep make sure the extension syntax is compiled before *) flag ["ocaml"; "compile"; "pkg_" ^ name] - (S [A "-ppx"; P (path ^ name ^ "_ex." ^ best)]); - flag_and_dep + (S + [ A "-ppx" + ; Quote (S [P (path ^ name ^ "_ex." ^ best); A "-as-ppx"]) ]); + flag ["ocaml"; "ocamldep"; "pkg_" ^ name] - (S [A "-ppx"; P (path ^ name ^ "_ex." ^ best)]); + (S + [ A "-ppx" + ; Quote (S [P (path ^ name ^ "_ex." ^ best); A "-as-ppx"]) ]); + dep + ["ocaml"; "ocamldep"; "pkg_" ^ name] + [path ^ name ^ "_ex." ^ best]; flag_and_dep ["ocaml"; "infer_interface"; "pkg_" ^ name] - (S [A "-ppx"; P (path ^ name ^ "_ex." ^ best)]); + (S + [ A "-ppx" + ; Quote (S [P (path ^ name ^ "_ex." ^ best); A "-as-ppx"]) ]); + dep + ["ocaml"; "infer_interface"; "pkg_" ^ name] + [path ^ name ^ "_ex." ^ best]; flag_and_dep ["doc"; "pkg_" ^ name] - (S [A "-ppx"; P (path ^ name ^ "_ex." ^ best)]) + (S + [ A "-ppx" + ; Quote (S [P (path ^ name ^ "_ex." ^ best); A "-as-ppx"]) ]); + dep ["doc"; "pkg_" ^ name] [path ^ name ^ "_ex." ^ best] in add_syntax "ppx_eliom_utils" "src/ppx/"; add_syntax "ppx_eliom_types" "src/ppx/"; diff --git a/dune-project b/dune-project new file mode 100644 index 0000000000..ab98f46238 --- /dev/null +++ b/dune-project @@ -0,0 +1,40 @@ +(lang dune 3.6) + +(maintainers dev@ocsigen.org) +(authors dev@ocsigen.org) +(license "LGPL-2.1-only WITH OCaml-LGPL-linking-exception") + +(package (name eliom) + (synopsis "Client/server Web framework") + (description "Eliom is a framework for implementing client/server Web applications. +It introduces new concepts to simplify the implementation of common behaviors, and uses advanced static typing features of OCaml to check many properties of the Web application at compile-time. +Eliom allows implementing the whole application as a single program that includes both the client and the server code. +We use a syntax extension to distinguish between the two sides. +The client-side code is compiled to JS using Ocsigen Js_of_ocaml. +") + (homepage http://ocsigen.org/eliom/) + (source (github ocsigen/eliom)) + (depends + (ocaml (>= 4.08.0)) + ocamlfind + ppx_deriving + (ppxlib (>= 0.15.0)) + (js_of_ocaml-compiler (>= 3.6.0)) + (js_of_ocaml (>= 3.6.0)) + (js_of_ocaml-lwt (>= 3.6.0)) + (js_of_ocaml-ocamlbuild :build) + (js_of_ocaml-ppx (>= 3.6.0)) + (js_of_ocaml-ppx_deriving_json (>= 3.6.0)) + (js_of_ocaml-tyxml (>= 3.6.0)) + lwt_log + (lwt_ppx (>= 1.2.3)) + (tyxml (and (>= 4.4.0) (< 5.0.0))) + (ocsigenserver (and (>= 5.1.0) (< 6.0.0))) + (ipaddr (>= 2.1)) + (reactiveData (>= 0.2.1)) + base-bytes + (ocsipersist (and (>= 1.0) (< 2.0))) + ppx_optcomp)) + +(generate_opam_files) + diff --git a/opam b/eliom.opam similarity index 77% rename from opam rename to eliom.opam index 7cdaaa6673..05695292a1 100644 --- a/opam +++ b/eliom.opam @@ -1,8 +1,5 @@ +# This file is generated by dune, edit dune-project instead opam-version: "2.0" -name: "eliom" -version: "10.1.0" -maintainer: "dev@ocsigen.org" -authors: "dev@ocsigen.org" synopsis: "Client/server Web framework" description: """ Eliom is a framework for implementing client/server Web applications. @@ -11,12 +8,13 @@ Eliom allows implementing the whole application as a single program that include We use a syntax extension to distinguish between the two sides. The client-side code is compiled to JS using Ocsigen Js_of_ocaml. """ -homepage: "http://ocsigen.org/eliom/" -bug-reports: "https://github.com/ocsigen/eliom/issues/" +maintainer: ["dev@ocsigen.org"] +authors: ["dev@ocsigen.org"] license: "LGPL-2.1-only WITH OCaml-LGPL-linking-exception" -dev-repo: "git+https://github.com/ocsigen/eliom.git" -build: [make] +homepage: "http://ocsigen.org/eliom/" +bug-reports: "https://github.com/ocsigen/eliom/issues" depends: [ + "dune" {>= "3.6"} "ocaml" {>= "4.08.0"} "ocamlfind" "ppx_deriving" @@ -37,4 +35,20 @@ depends: [ "base-bytes" "ocsipersist" {>= "1.0" & < "2.0"} "ppx_optcomp" + "odoc" {with-doc} ] +build: [ + ["dune" "subst"] {dev} + [ + "dune" + "build" + "-p" + name + "-j" + jobs + "@install" + "@runtest" {with-test} + "@doc" {with-doc} + ] +] +dev-repo: "git+https://github.com/ocsigen/eliom.git" diff --git a/pkg/distillery/dune b/pkg/distillery/dune new file mode 100644 index 0000000000..ef617d2519 --- /dev/null +++ b/pkg/distillery/dune @@ -0,0 +1,3 @@ +(install + (section lib) + (files (glob_files templates/basic.ppx/*))) diff --git a/pkg/distillery/basic.ppx/.ocp-indent b/pkg/distillery/templates/basic.ppx/.ocp-indent similarity index 100% rename from pkg/distillery/basic.ppx/.ocp-indent rename to pkg/distillery/templates/basic.ppx/.ocp-indent diff --git a/pkg/distillery/basic.ppx/Makefile b/pkg/distillery/templates/basic.ppx/Makefile similarity index 100% rename from pkg/distillery/basic.ppx/Makefile rename to pkg/distillery/templates/basic.ppx/Makefile diff --git a/pkg/distillery/basic.ppx/Makefile.options b/pkg/distillery/templates/basic.ppx/Makefile.options similarity index 100% rename from pkg/distillery/basic.ppx/Makefile.options rename to pkg/distillery/templates/basic.ppx/Makefile.options diff --git a/pkg/distillery/basic.ppx/PROJECT_NAME.conf.in b/pkg/distillery/templates/basic.ppx/PROJECT_NAME.conf.in similarity index 100% rename from pkg/distillery/basic.ppx/PROJECT_NAME.conf.in rename to pkg/distillery/templates/basic.ppx/PROJECT_NAME.conf.in diff --git a/pkg/distillery/basic.ppx/PROJECT_NAME.eliom b/pkg/distillery/templates/basic.ppx/PROJECT_NAME.eliom similarity index 100% rename from pkg/distillery/basic.ppx/PROJECT_NAME.eliom rename to pkg/distillery/templates/basic.ppx/PROJECT_NAME.eliom diff --git a/pkg/distillery/basic.ppx/README b/pkg/distillery/templates/basic.ppx/README similarity index 100% rename from pkg/distillery/basic.ppx/README rename to pkg/distillery/templates/basic.ppx/README diff --git a/pkg/distillery/basic.ppx/static!css!PROJECT_NAME.css b/pkg/distillery/templates/basic.ppx/static!css!PROJECT_NAME.css similarity index 100% rename from pkg/distillery/basic.ppx/static!css!PROJECT_NAME.css rename to pkg/distillery/templates/basic.ppx/static!css!PROJECT_NAME.css diff --git a/src/lib/client/dune b/src/lib/client/dune new file mode 100644 index 0000000000..513d1d10ab --- /dev/null +++ b/src/lib/client/dune @@ -0,0 +1,30 @@ +(library + (name eliom_client) + (public_name eliom.client) + (synopsis "Eliom: client-side") + (wrapped false) + (modules_without_implementation eliom_content_sigs eliom_form_sigs + eliom_parameter_sigs eliom_registration_sigs eliom_service_sigs + eliom_shared_sigs eliom_wrap) + (preprocess (pps lwt_ppx js_of_ocaml-ppx js_of_ocaml-ppx_deriving_json)) + (libraries ocsigenserver.cookies ocsigenserver.polytables js_of_ocaml + js_of_ocaml-tyxml js_of_ocaml-lwt js_of_ocaml-lwt.logger + lwt_react ocsigenserver.baselib.base cohttp tyxml + reactiveData) + (foreign_stubs (language c) (names eliom_stubs)) + (js_of_ocaml (javascript_files eliom_client.js))) + +(include dune.client) + +(rule + (target dune.client) + (mode promote) + (deps (glob_files ../*) (universe)) + (action + (with-stdout-to + %{target} + (run ocaml ../../tools/gen_dune.ml --client ..)))) + +(env + (_ + (flags (:standard -w -9 -warn-error -6-16-22-27-32-37-39-67-69)))) diff --git a/src/lib/client/dune.client b/src/lib/client/dune.client new file mode 100644 index 0000000000..8d5075d66f --- /dev/null +++ b/src/lib/client/dune.client @@ -0,0 +1,92 @@ +(rule (copy# ../eliom_bus.client.ml eliom_bus.ml)) +(rule (copy# ../eliom_bus.client.mli eliom_bus.mli)) +(rule (copy# ../eliom_client.client.ml eliom_client.ml)) +(rule (copy# ../eliom_client.client.mli eliom_client.mli)) +(rule (copy# ../eliom_client_base.shared.ml eliom_client_base.ml)) +(rule (copy# ../eliom_client_core.client.ml eliom_client_core.ml)) +(rule (target eliom_client_main.ml) (deps ../eliom_client_main.eliom ../server/eliom_client_main.type_mli) + (action + (with-stdout-to %{target} + (chdir .. (run ppx_eliom_client -type server/eliom_client_main.type_mli --as-pp --impl eliom_client_main.eliom))))) +(rule (copy# ../eliom_client_value.client.ml eliom_client_value.ml)) +(rule (copy# ../eliom_client_value.client.mli eliom_client_value.mli)) +(rule (copy# ../eliom_comet.client.ml eliom_comet.ml)) +(rule (copy# ../eliom_comet.client.mli eliom_comet.mli)) +(rule (copy# ../eliom_comet_base.shared.ml eliom_comet_base.ml)) +(rule (copy# ../eliom_comet_base.shared.mli eliom_comet_base.mli)) +(rule (copy# ../eliom_common.client.ml eliom_common.ml)) +(rule (copy# ../eliom_common_base.shared.ml eliom_common_base.ml)) +(rule (copy# ../eliom_config.client.ml eliom_config.ml)) +(rule (copy# ../eliom_config.client.mli eliom_config.mli)) +(rule (copy# ../eliom_content.client.mli eliom_content.mli)) +(rule (target eliom_content.ml) (deps ../eliom_content.eliom ../server/eliom_content.type_mli) + (action + (with-stdout-to %{target} + (chdir .. (run ppx_eliom_client -type server/eliom_content.type_mli --as-pp --impl eliom_content.eliom))))) +(rule (copy# ../eliom_content_.client.ml eliom_content_.ml)) +(rule (copy# ../eliom_content_core.client.ml eliom_content_core.ml)) +(rule (copy# ../eliom_content_core.client.mli eliom_content_core.mli)) +(rule (copy# ../eliom_content_sigs.shared.mli eliom_content_sigs.mli)) +(rule (copy# ../eliom_cookies_base.shared.ml eliom_cookies_base.ml)) +(rule (target eliom_cscache.ml) (deps ../eliom_cscache.eliom ../server/eliom_cscache.type_mli) + (action + (with-stdout-to %{target} + (chdir .. (run ppx_eliom_client -type server/eliom_cscache.type_mli --as-pp --impl eliom_cscache.eliom))))) +(rule (target eliom_form.ml) (deps ../eliom_form.eliom ../server/eliom_form.type_mli) + (action + (with-stdout-to %{target} + (chdir .. (run ppx_eliom_client -type server/eliom_form.type_mli --as-pp --impl eliom_form.eliom))))) +(rule (copy# ../eliom_form_sigs.shared.mli eliom_form_sigs.mli)) +(rule (copy# ../eliom_lazy.client.ml eliom_lazy.ml)) +(rule (copy# ../eliom_lazy.client.mli eliom_lazy.mli)) +(rule (copy# ../eliom_lib.client.ml eliom_lib.ml)) +(rule (copy# ../eliom_lib.client.mli eliom_lib.mli)) +(rule (copy# ../eliom_lib_base.shared.ml eliom_lib_base.ml)) +(rule (copy# ../eliom_lib_base.shared.mli eliom_lib_base.mli)) +(rule (copy# ../eliom_parameter.client.ml eliom_parameter.ml)) +(rule (copy# ../eliom_parameter.client.mli eliom_parameter.mli)) +(rule (copy# ../eliom_parameter_base.shared.ml eliom_parameter_base.ml)) +(rule (copy# ../eliom_parameter_sigs.shared.mli eliom_parameter_sigs.mli)) +(rule (copy# ../eliom_process.client.ml eliom_process.ml)) +(rule (copy# ../eliom_react.client.ml eliom_react.ml)) +(rule (copy# ../eliom_react.client.mli eliom_react.mli)) +(rule (copy# ../eliom_registration.client.ml eliom_registration.ml)) +(rule (copy# ../eliom_registration.client.mli eliom_registration.mli)) +(rule (copy# ../eliom_registration_sigs.shared.mli eliom_registration_sigs.mli)) +(rule (copy# ../eliom_request.client.ml eliom_request.ml)) +(rule (copy# ../eliom_request.client.mli eliom_request.mli)) +(rule (copy# ../eliom_request_info.client.ml eliom_request_info.ml)) +(rule (copy# ../eliom_request_info.client.mli eliom_request_info.mli)) +(rule (copy# ../eliom_route.client.ml eliom_route.ml)) +(rule (copy# ../eliom_route_base.shared.ml eliom_route_base.ml)) +(rule (copy# ../eliom_runtime.shared.ml eliom_runtime.ml)) +(rule (copy# ../eliom_runtime.shared.mli eliom_runtime.mli)) +(rule (copy# ../eliom_service.client.ml eliom_service.ml)) +(rule (copy# ../eliom_service.client.mli eliom_service.mli)) +(rule (target eliom_service_base.ml) (deps ../eliom_service_base.eliom ../server/eliom_service_base.type_mli) + (action + (with-stdout-to %{target} + (chdir .. (run ppx_eliom_client -type server/eliom_service_base.type_mli --as-pp --impl eliom_service_base.eliom))))) +(rule (copy# ../eliom_service_sigs.shared.mli eliom_service_sigs.mli)) +(rule (copy# ../eliom_shared.client.mli eliom_shared.mli)) +(rule (target eliom_shared.ml) (deps ../eliom_shared.eliom ../server/eliom_shared.type_mli) + (action + (with-stdout-to %{target} + (chdir .. (run ppx_eliom_client -type server/eliom_shared.type_mli --as-pp --impl eliom_shared.eliom))))) +(rule (target eliom_shared_content.ml) (deps ../eliom_shared_content.eliom ../server/eliom_shared_content.type_mli) + (action + (with-stdout-to %{target} + (chdir .. (run ppx_eliom_client -type server/eliom_shared_content.type_mli --as-pp --impl eliom_shared_content.eliom))))) +(rule (copy# ../eliom_shared_sigs.shared.mli eliom_shared_sigs.mli)) +(rule (target eliom_tools.ml) (deps ../eliom_tools.eliom ../server/eliom_tools.type_mli) + (action + (with-stdout-to %{target} + (chdir .. (run ppx_eliom_client -type server/eliom_tools.type_mli --as-pp --impl eliom_tools.eliom))))) +(rule (copy# ../eliom_types.client.ml eliom_types.ml)) +(rule (copy# ../eliom_types_base.shared.ml eliom_types_base.ml)) +(rule (copy# ../eliom_types_base.shared.mli eliom_types_base.mli)) +(rule (copy# ../eliom_unwrap.client.ml eliom_unwrap.ml)) +(rule (copy# ../eliom_unwrap.client.mli eliom_unwrap.mli)) +(rule (copy# ../eliom_uri.shared.ml eliom_uri.ml)) +(rule (copy# ../eliom_uri.shared.mli eliom_uri.mli)) +(rule (copy# ../eliom_wrap.client.mli eliom_wrap.mli)) diff --git a/src/lib/eliom_extension_template.server.ml b/src/lib/eliom_extension_template.server.ml deleted file mode 100644 index 4cb41f05ab..0000000000 --- a/src/lib/eliom_extension_template.server.ml +++ /dev/null @@ -1,35 +0,0 @@ -(* Ocsigen - * http://www.ocsigen.org - * Module extensiontemplate.ml - * Copyright (C) 2007 Vincent Balat - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, with linking exception; - * either version 2.1 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *) -(*****************************************************************************) -(*****************************************************************************) -(* This is an example of extension for Ocsigen *) -(* Take this as a template for writing your own Eliom based - extensions to the Web server *) -(*****************************************************************************) -(*****************************************************************************) - -let _ = - Eliom_extension.register_eliom_extension (fun sp -> - Lwt.return - (Ocsigen_extensions.Ext_found - (fun () -> - let content = "Eliom Extension template page" in - Ocsigen_senders.Text_content.result_of_content - (content, "text/plain")))) diff --git a/src/lib/eliom_registration_sigs.shared.mli b/src/lib/eliom_registration_sigs.shared.mli index e3cdf186d1..cd7b90c991 100644 --- a/src/lib/eliom_registration_sigs.shared.mli +++ b/src/lib/eliom_registration_sigs.shared.mli @@ -17,6 +17,8 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *) +open! Eliom_service + module type PARAM = sig type page type options diff --git a/src/lib/eliom_service.client.ml b/src/lib/eliom_service.client.ml index bd333f42c0..a5f9812f17 100644 --- a/src/lib/eliom_service.client.ml +++ b/src/lib/eliom_service.client.ml @@ -64,3 +64,9 @@ let register_delayed_get_or_na_coservice ~sp:_ _ = let register_delayed_post_coservice ~sp:_ _ _getname = failwith "CSRF coservice not implemented client side for now" + +module Cohttp = struct + module Header = struct + type t + end +end diff --git a/src/lib/eliom_service.client.mli b/src/lib/eliom_service.client.mli index c9f93f3221..97b36c0e72 100644 --- a/src/lib/eliom_service.client.mli +++ b/src/lib/eliom_service.client.mli @@ -46,3 +46,9 @@ val pre_applied_parameters val reload_fun : ('a, _, _, _, _, _, _, _, _, _, _) t -> ('a -> unit -> result Lwt.t) Eliom_client_value.t option + +module Cohttp : sig + module Header : sig + type t + end +end diff --git a/src/lib/server/dune b/src/lib/server/dune new file mode 100644 index 0000000000..14d214c130 --- /dev/null +++ b/src/lib/server/dune @@ -0,0 +1,36 @@ +(library + (name eliom_server) + (public_name eliom.server) + (synopsis "Eliom: server-side") + (wrapped false) + (modules_without_implementation eliom_content_sigs eliom_form_sigs + eliom_parameter_sigs eliom_registration_sigs eliom_service_sigs + eliom_shared_sigs) + (preprocess (pps lwt_ppx js_of_ocaml-ppx_deriving_json)) + (flags (:standard (:include type_includes))) + (libraries lwt_react ocsigenserver ocsipersist tyxml)) + +(include dune.server) + +(rule + (target dune.server) + (mode promote) + (deps (glob_files ../*) (universe)) + (action + (with-stdout-to + %{target} + (run ocaml ../../tools/gen_dune.ml --server ..)))) + +(rule (target includes) + (action + (with-stdout-to %{target} + (system "ocamlfind query -r -i-format lwt_react,ocsigenserver,ocsigenserver.ext,js_of_ocaml,tyxml | tr ' ' '\n'")))) + +(rule (target type_includes) + (action + (with-stdout-to %{target} + (system "echo -n '('; ocamlfind query -i-format js_of_ocaml; echo -n ')'")))) + +(env + (_ + (flags (:standard -w -9 -warn-error -6-9-16-27-39-67-69)))) diff --git a/src/lib/server/dune.server b/src/lib/server/dune.server new file mode 100644 index 0000000000..f9a081b13c --- /dev/null +++ b/src/lib/server/dune.server @@ -0,0 +1,184 @@ +(rule (copy# ../eliom_bus.server.ml eliom_bus.ml)) +(rule (copy# ../eliom_bus.server.mli eliom_bus.mli)) +(rule (copy# ../eliom_client.server.ml eliom_client.ml)) +(rule (copy# ../eliom_client.server.mli eliom_client.mli)) +(rule (copy# ../eliom_client_base.shared.ml eliom_client_base.ml)) +(rule (target eliom_client_main.ml) (deps ../eliom_client_main.eliom) + (action + (with-stdout-to %{target} + (chdir .. (run ppx_eliom_server --as-pp --impl %{deps}))))) +(rule (target eliom_client_main.type_mli) (deps ../eliom_client_main.eliom) + (action + (progn + (ignore-stdout (echo %{cmo:eliom_client_main})) + (with-stdout-to %{target} + (pipe-stdout + (chdir .. (run ocamlfind ocamlc -package lwt_ppx %{read-lines:includes} -I server/.eliom_server.objs/byte -i -ppx "%{bin:ppx_eliom_types} --as-ppx" -impl %{deps})) + (run sed -e "s$/[1-9][0-9]*$$g" -e "s/_\\[\\([<>]\\)/[\\1/g" -e "s/'\\(_[a-z0-9_]*\\)/'eliom_inferred_type_\\1/g")))))) +(rule (copy# ../eliom_client_value.server.ml eliom_client_value.ml)) +(rule (copy# ../eliom_client_value.server.mli eliom_client_value.mli)) +(rule (copy# ../eliom_comet.server.ml eliom_comet.ml)) +(rule (copy# ../eliom_comet.server.mli eliom_comet.mli)) +(rule (copy# ../eliom_comet_base.shared.ml eliom_comet_base.ml)) +(rule (copy# ../eliom_comet_base.shared.mli eliom_comet_base.mli)) +(rule (copy# ../eliom_common.server.ml eliom_common.ml)) +(rule (copy# ../eliom_common.server.mli eliom_common.mli)) +(rule (copy# ../eliom_common_base.shared.ml eliom_common_base.ml)) +(rule (copy# ../eliom_config.server.ml eliom_config.ml)) +(rule (copy# ../eliom_config.server.mli eliom_config.mli)) +(rule (target eliom_content.ml) (deps ../eliom_content.eliom) + (action + (with-stdout-to %{target} + (chdir .. (run ppx_eliom_server --as-pp --impl %{deps}))))) +(rule (target eliom_content.type_mli) (deps ../eliom_content.eliom) + (action + (progn + (ignore-stdout (echo %{cmo:eliom_content})) + (with-stdout-to %{target} + (pipe-stdout + (chdir .. (run ocamlfind ocamlc -package lwt_ppx %{read-lines:includes} -I server/.eliom_server.objs/byte -i -ppx "%{bin:ppx_eliom_types} --as-ppx" -impl %{deps})) + (run sed -e "s$/[1-9][0-9]*$$g" -e "s/_\\[\\([<>]\\)/[\\1/g" -e "s/'\\(_[a-z0-9_]*\\)/'eliom_inferred_type_\\1/g")))))) +(rule (copy# ../eliom_content.server.mli eliom_content.mli)) +(rule (copy# ../eliom_content_.server.ml eliom_content_.ml)) +(rule (copy# ../eliom_content_core.server.ml eliom_content_core.ml)) +(rule (copy# ../eliom_content_core.server.mli eliom_content_core.mli)) +(rule (copy# ../eliom_content_sigs.shared.mli eliom_content_sigs.mli)) +(rule (copy# ../eliom_cookies_base.shared.ml eliom_cookies_base.ml)) +(rule (target eliom_cscache.ml) (deps ../eliom_cscache.eliom) + (action + (with-stdout-to %{target} + (chdir .. (run ppx_eliom_server --as-pp --impl %{deps}))))) +(rule (target eliom_cscache.type_mli) (deps ../eliom_cscache.eliom) + (action + (progn + (ignore-stdout (echo %{cmo:eliom_cscache})) + (with-stdout-to %{target} + (pipe-stdout + (chdir .. (run ocamlfind ocamlc -package lwt_ppx %{read-lines:includes} -I server/.eliom_server.objs/byte -i -ppx "%{bin:ppx_eliom_types} --as-ppx" -impl %{deps})) + (run sed -e "s$/[1-9][0-9]*$$g" -e "s/_\\[\\([<>]\\)/[\\1/g" -e "s/'\\(_[a-z0-9_]*\\)/'eliom_inferred_type_\\1/g")))))) +(rule (target eliom_cscache.mli) (deps ../eliom_cscache.eliomi) + (action + (with-stdout-to %{target} + (chdir .. (run ppx_eliom_server --as-pp --intf %{deps}))))) +(rule (copy# ../eliom_error_pages.server.ml eliom_error_pages.ml)) +(rule (copy# ../eliom_extension.server.ml eliom_extension.ml)) +(rule (copy# ../eliom_extension.server.mli eliom_extension.mli)) +(rule (target eliom_form.ml) (deps ../eliom_form.eliom) + (action + (with-stdout-to %{target} + (chdir .. (run ppx_eliom_server --as-pp --impl %{deps}))))) +(rule (target eliom_form.type_mli) (deps ../eliom_form.eliom) + (action + (progn + (ignore-stdout (echo %{cmo:eliom_form})) + (with-stdout-to %{target} + (pipe-stdout + (chdir .. (run ocamlfind ocamlc -package lwt_ppx %{read-lines:includes} -I server/.eliom_server.objs/byte -i -ppx "%{bin:ppx_eliom_types} --as-ppx" -impl %{deps})) + (run sed -e "s$/[1-9][0-9]*$$g" -e "s/_\\[\\([<>]\\)/[\\1/g" -e "s/'\\(_[a-z0-9_]*\\)/'eliom_inferred_type_\\1/g")))))) +(rule (target eliom_form.mli) (deps ../eliom_form.eliomi) + (action + (with-stdout-to %{target} + (chdir .. (run ppx_eliom_server --as-pp --intf %{deps}))))) +(rule (copy# ../eliom_form_sigs.shared.mli eliom_form_sigs.mli)) +(rule (copy# ../eliom_lazy.server.ml eliom_lazy.ml)) +(rule (copy# ../eliom_lazy.server.mli eliom_lazy.mli)) +(rule (copy# ../eliom_lib.server.ml eliom_lib.ml)) +(rule (copy# ../eliom_lib.server.mli eliom_lib.mli)) +(rule (copy# ../eliom_lib_base.shared.ml eliom_lib_base.ml)) +(rule (copy# ../eliom_lib_base.shared.mli eliom_lib_base.mli)) +(rule (copy# ../eliom_mkreg.server.ml eliom_mkreg.ml)) +(rule (copy# ../eliom_mkreg.server.mli eliom_mkreg.mli)) +(rule (copy# ../eliom_notif.server.ml eliom_notif.ml)) +(rule (copy# ../eliom_notif.server.mli eliom_notif.mli)) +(rule (copy# ../eliom_parameter.server.ml eliom_parameter.ml)) +(rule (copy# ../eliom_parameter.server.mli eliom_parameter.mli)) +(rule (copy# ../eliom_parameter_base.shared.ml eliom_parameter_base.ml)) +(rule (copy# ../eliom_parameter_sigs.shared.mli eliom_parameter_sigs.mli)) +(rule (copy# ../eliom_process.server.ml eliom_process.ml)) +(rule (copy# ../eliom_react.server.ml eliom_react.ml)) +(rule (copy# ../eliom_react.server.mli eliom_react.mli)) +(rule (copy# ../eliom_reference.server.ml eliom_reference.ml)) +(rule (copy# ../eliom_reference.server.mli eliom_reference.mli)) +(rule (copy# ../eliom_registration.server.ml eliom_registration.ml)) +(rule (copy# ../eliom_registration.server.mli eliom_registration.mli)) +(rule (copy# ../eliom_registration_sigs.shared.mli eliom_registration_sigs.mli)) +(rule (copy# ../eliom_request_info.server.ml eliom_request_info.ml)) +(rule (copy# ../eliom_request_info.server.mli eliom_request_info.mli)) +(rule (copy# ../eliom_route.server.ml eliom_route.ml)) +(rule (copy# ../eliom_route.server.mli eliom_route.mli)) +(rule (copy# ../eliom_route_base.shared.ml eliom_route_base.ml)) +(rule (copy# ../eliom_runtime.shared.ml eliom_runtime.ml)) +(rule (copy# ../eliom_runtime.shared.mli eliom_runtime.mli)) +(rule (copy# ../eliom_service.server.ml eliom_service.ml)) +(rule (copy# ../eliom_service.server.mli eliom_service.mli)) +(rule (target eliom_service_base.ml) (deps ../eliom_service_base.eliom) + (action + (with-stdout-to %{target} + (chdir .. (run ppx_eliom_server --as-pp --impl %{deps}))))) +(rule (target eliom_service_base.type_mli) (deps ../eliom_service_base.eliom) + (action + (progn + (ignore-stdout (echo %{cmo:eliom_service_base})) + (with-stdout-to %{target} + (pipe-stdout + (chdir .. (run ocamlfind ocamlc -package lwt_ppx %{read-lines:includes} -I server/.eliom_server.objs/byte -i -ppx "%{bin:ppx_eliom_types} --as-ppx" -impl %{deps})) + (run sed -e "s$/[1-9][0-9]*$$g" -e "s/_\\[\\([<>]\\)/[\\1/g" -e "s/'\\(_[a-z0-9_]*\\)/'eliom_inferred_type_\\1/g")))))) +(rule (copy# ../eliom_service_sigs.shared.mli eliom_service_sigs.mli)) +(rule (target eliom_shared.ml) (deps ../eliom_shared.eliom) + (action + (with-stdout-to %{target} + (chdir .. (run ppx_eliom_server --as-pp --impl %{deps}))))) +(rule (target eliom_shared.type_mli) (deps ../eliom_shared.eliom) + (action + (progn + (ignore-stdout (echo %{cmo:eliom_shared})) + (with-stdout-to %{target} + (pipe-stdout + (chdir .. (run ocamlfind ocamlc -package lwt_ppx %{read-lines:includes} -I server/.eliom_server.objs/byte -i -ppx "%{bin:ppx_eliom_types} --as-ppx" -impl %{deps})) + (run sed -e "s$/[1-9][0-9]*$$g" -e "s/_\\[\\([<>]\\)/[\\1/g" -e "s/'\\(_[a-z0-9_]*\\)/'eliom_inferred_type_\\1/g")))))) +(rule (copy# ../eliom_shared.server.mli eliom_shared.mli)) +(rule (target eliom_shared_content.ml) (deps ../eliom_shared_content.eliom) + (action + (with-stdout-to %{target} + (chdir .. (run ppx_eliom_server --as-pp --impl %{deps}))))) +(rule (target eliom_shared_content.type_mli) (deps ../eliom_shared_content.eliom) + (action + (progn + (ignore-stdout (echo %{cmo:eliom_shared_content})) + (with-stdout-to %{target} + (pipe-stdout + (chdir .. (run ocamlfind ocamlc -package lwt_ppx %{read-lines:includes} -I server/.eliom_server.objs/byte -i -ppx "%{bin:ppx_eliom_types} --as-ppx" -impl %{deps})) + (run sed -e "s$/[1-9][0-9]*$$g" -e "s/_\\[\\([<>]\\)/[\\1/g" -e "s/'\\(_[a-z0-9_]*\\)/'eliom_inferred_type_\\1/g")))))) +(rule (target eliom_shared_content.mli) (deps ../eliom_shared_content.eliomi) + (action + (with-stdout-to %{target} + (chdir .. (run ppx_eliom_server --as-pp --intf %{deps}))))) +(rule (copy# ../eliom_shared_sigs.shared.mli eliom_shared_sigs.mli)) +(rule (copy# ../eliom_state.server.ml eliom_state.ml)) +(rule (copy# ../eliom_state.server.mli eliom_state.mli)) +(rule (copy# ../eliom_syntax.server.ml eliom_syntax.ml)) +(rule (copy# ../eliom_syntax.server.mli eliom_syntax.mli)) +(rule (target eliom_tools.ml) (deps ../eliom_tools.eliom) + (action + (with-stdout-to %{target} + (chdir .. (run ppx_eliom_server --as-pp --impl %{deps}))))) +(rule (target eliom_tools.type_mli) (deps ../eliom_tools.eliom) + (action + (progn + (ignore-stdout (echo %{cmo:eliom_tools})) + (with-stdout-to %{target} + (pipe-stdout + (chdir .. (run ocamlfind ocamlc -package lwt_ppx %{read-lines:includes} -I server/.eliom_server.objs/byte -i -ppx "%{bin:ppx_eliom_types} --as-ppx" -impl %{deps})) + (run sed -e "s$/[1-9][0-9]*$$g" -e "s/_\\[\\([<>]\\)/[\\1/g" -e "s/'\\(_[a-z0-9_]*\\)/'eliom_inferred_type_\\1/g")))))) +(rule (target eliom_tools.mli) (deps ../eliom_tools.eliomi) + (action + (with-stdout-to %{target} + (chdir .. (run ppx_eliom_server --as-pp --intf %{deps}))))) +(rule (copy# ../eliom_types.server.ml eliom_types.ml)) +(rule (copy# ../eliom_types.server.mli eliom_types.mli)) +(rule (copy# ../eliom_types_base.shared.ml eliom_types_base.ml)) +(rule (copy# ../eliom_types_base.shared.mli eliom_types_base.mli)) +(rule (copy# ../eliom_uri.shared.ml eliom_uri.ml)) +(rule (copy# ../eliom_uri.shared.mli eliom_uri.mli)) +(rule (copy# ../eliom_wrap.server.ml eliom_wrap.ml)) +(rule (copy# ../eliom_wrap.server.mli eliom_wrap.mli)) diff --git a/src/lib/server/monitor/dune b/src/lib/server/monitor/dune new file mode 100644 index 0000000000..04c9f4e815 --- /dev/null +++ b/src/lib/server/monitor/dune @@ -0,0 +1,15 @@ +(library + (name monitor) + (public_name eliom.server.monitor) + (wrapped false) + (modules eliom_monitor) + (preprocess (pps lwt_ppx)) + (libraries eliom.server)) + +(library + (name monitor_start) + (public_name eliom.server.monitor.start) + (wrapped false) + (modules eliom_monitor_main) + (preprocess (pps lwt_ppx)) + (libraries monitor eliom.server)) diff --git a/src/ocamlbuild/.merlin b/src/ocamlbuild/.merlin deleted file mode 100644 index 9c6ace5190..0000000000 --- a/src/ocamlbuild/.merlin +++ /dev/null @@ -1,4 +0,0 @@ -S . -B _build -PKG ocamlbuild -PKG js_of_ocaml-ocamlbuild diff --git a/src/ocamlbuild/dune b/src/ocamlbuild/dune new file mode 100644 index 0000000000..feea7380ca --- /dev/null +++ b/src/ocamlbuild/dune @@ -0,0 +1,10 @@ +(library + (name ocamlbuild_eliom) + (public_name eliom.ocamlbuild) + (synopsis "Eliom ocamlbuild plugin (js_of_ocaml part included)") + (wrapped false) + (libraries js_of_ocaml-ocamlbuild)) + +(env + (_ + (flags (:standard -warn-error -67)))) diff --git a/src/ocamlbuild/ocamlbuild_eliom.ml b/src/ocamlbuild/ocamlbuild_eliom.ml index 217f16baae..9842174965 100644 --- a/src/ocamlbuild/ocamlbuild_eliom.ml +++ b/src/ocamlbuild/ocamlbuild_eliom.ml @@ -98,8 +98,10 @@ module MakeIntern (I : INTERNALS) (Eliom : ELIOM) = struct , S [A "-ppxopt"; A (pkg ^ ",-notype")] ) | Some f -> let ppx = f eliom_syntax in - ( S [A "-ppx"; Quote (S [P ppx; A "-type"; P type_inferred])] - , S [A "-ppx"; Quote (S [P ppx; A "-notype"])] ) + ( S + [ A "-ppx" + ; Quote (S [P ppx; A "-as-ppx"; A "-type"; P type_inferred]) ] + , S [A "-ppx"; Quote (S [P ppx; A "-as-ppx"; A "-notype"])] ) else ( S [A "-ppopt"; A "-type"; A "-ppopt"; P type_inferred] , S [A "-ppopt"; A "-notype"] ) diff --git a/src/ppx/.merlin b/src/ppx/.merlin deleted file mode 100644 index 87f9650206..0000000000 --- a/src/ppx/.merlin +++ /dev/null @@ -1,4 +0,0 @@ -PKG compiler-libs.common -PKG ppxlib ppxlib.metaquot compiler-libs.bytecomp - -REC diff --git a/src/ppx/dune b/src/ppx/dune new file mode 100644 index 0000000000..3643566acf --- /dev/null +++ b/src/ppx/dune @@ -0,0 +1,62 @@ +(library + (name ppx_server) + (public_name eliom.ppx.server) + (synopsis "Ppx syntax extension: server side") + (wrapped false) + (kind ppx_rewriter) + (modules ppx_eliom_server) + (preprocess (pps ppxlib.metaquot)) + (libraries ppx_utils)) + +(library + (name ppx_client) + (public_name eliom.ppx.client) + (synopsis "Ppx syntax extension: client side") + (wrapped false) + (kind ppx_rewriter) + (modules ppx_eliom_client) + (preprocess (pps ppxlib.metaquot)) + (libraries ppx_utils)) + +(library + (name ppx_type) + (wrapped false) + (public_name eliom.ppx.type) + (synopsis "Ppx syntax extension: type inference") + (kind ppx_rewriter) + (modules ppx_eliom_type) + (preprocess (pps ppxlib.metaquot)) + (libraries ppx_utils)) + +(library + (name ppx_utils) + (public_name eliom.ppx.utils) + (wrapped false) + (modules ppx_eliom_utils) + (preprocess (pps ppxlib.metaquot ppx_optcomp)) + (libraries ppxlib)) + +(executable + (name ppx_eliom_server_ex) + (public_name ppx_eliom_server) + (libraries ppx_server) + (preprocess (pps ppxlib.metaquot)) + (modules ppx_eliom_server_ex)) + +(executable + (name ppx_eliom_client_ex) + (public_name ppx_eliom_client) + (libraries ppx_client) + (preprocess (pps ppxlib.metaquot)) + (modules ppx_eliom_client_ex)) + +(executable + (name ppx_eliom_types_ex) + (public_name ppx_eliom_types) + (libraries ppx_type) + (preprocess (pps ppxlib.metaquot)) + (modules ppx_eliom_types_ex)) + +(env + (_ + (flags (:standard -w -9 -warn-error -3-6)))) diff --git a/src/ppx/ppx_eliom_client.ml b/src/ppx/ppx_eliom_client.ml index 9d4d6ffa33..34a329145c 100644 --- a/src/ppx/ppx_eliom_client.ml +++ b/src/ppx/ppx_eliom_client.ml @@ -16,7 +16,7 @@ module Pass = struct (object inherit Ppxlib.Ast_traverse.map as super - method expression e = + method! expression e = match e.pexp_desc with | Pexp_ident {txt} when Mli.is_escaped_ident @@ Longident.last_exn txt -> @@ -206,7 +206,7 @@ module Pass = struct (object inherit Ppxlib.Ast_traverse.map as super - method core_type typ = + method! core_type typ = match typ with | {ptyp_desc = Ptyp_var _; ptyp_loc = loc} -> let attr = diff --git a/src/ppx/ppx_eliom_client_ex.ml b/src/ppx/ppx_eliom_client_ex.ml index 9c5589afb4..ce61a94ef5 100644 --- a/src/ppx/ppx_eliom_client_ex.ml +++ b/src/ppx/ppx_eliom_client_ex.ml @@ -1,3 +1,3 @@ open Ppx_eliom_client [@@warning "-33"] -let () = Ppxlib.Driver.run_as_ppx_rewriter () +let () = Ppxlib.Driver.standalone () diff --git a/src/ppx/ppx_eliom_server_ex.ml b/src/ppx/ppx_eliom_server_ex.ml index f7fe3ae3a7..057f866d35 100644 --- a/src/ppx/ppx_eliom_server_ex.ml +++ b/src/ppx/ppx_eliom_server_ex.ml @@ -1,3 +1,3 @@ open Ppx_eliom_server [@@warning "-33"] -let () = Ppxlib.Driver.run_as_ppx_rewriter () +let () = Ppxlib.Driver.standalone () diff --git a/src/ppx/ppx_eliom_types_ex.ml b/src/ppx/ppx_eliom_types_ex.ml index 22d9a26b6b..d5c3ed56af 100644 --- a/src/ppx/ppx_eliom_types_ex.ml +++ b/src/ppx/ppx_eliom_types_ex.ml @@ -1,3 +1,3 @@ open Ppx_eliom_type [@@warning "-33"] -let () = Ppxlib.Driver.run_as_ppx_rewriter () +let () = Ppxlib.Driver.standalone () diff --git a/src/ppx/ppx_eliom_utils.ml b/src/ppx/ppx_eliom_utils.ml index f44839500a..55fdca4939 100644 --- a/src/ppx/ppx_eliom_utils.ml +++ b/src/ppx/ppx_eliom_utils.ml @@ -190,7 +190,7 @@ module Mli = struct (object inherit Ppxlib.Ast_traverse.map as super - method core_type ty = + method! core_type ty = match ty.ptyp_desc with (* | Ptyp_constr (_, Ast.TyAny _, ty) *) (* | Ptyp_constr (_, ty, Ast.TyAny _) -> ty *) @@ -644,7 +644,7 @@ module Shared = struct (object inherit Ppxlib.Ast_traverse.map as super - method expression expr = + method! expression expr = match expr with | [%expr [%client [%e? _]]] -> expr | [%expr [%client.unsafe [%e? _]]] -> expr @@ -658,7 +658,7 @@ module Shared = struct (object (self) inherit Ppxlib.Ast_traverse.map as super - method expression expr = + method! expression expr = match expr with | [%expr [%client [%e? fragment_expr]]] | [%expr [%client.unsafe [%e? fragment_expr]]] -> @@ -689,7 +689,7 @@ module Make (Pass : Pass) = struct object (self) inherit Ppxlib.Ast_traverse.map as super - method expression expr = + method! expression expr = let loc = expr.pexp_loc in let attr = expr.pexp_attributes in match expr, !context with @@ -780,14 +780,14 @@ module Make (Pass : Pass) = struct "The syntax ~%% ... can not be nested.") | _ -> super#expression expr - method structure_item str = + method! structure_item str = let loc = str.pstr_loc in match str.pstr_desc with | Pstr_extension (({txt = "server" | "shared" | "client"}, _), _) -> Location.raise_errorf ~loc "Sections are only allowed at toplevel." | _ -> super#structure_item str - method signature_item sig_ = + method! signature_item sig_ = let loc = sig_.psig_loc in match sig_.psig_desc with | Psig_extension (({txt = "server" | "shared" | "client"}, _), _) -> @@ -889,7 +889,7 @@ module Make (Pass : Pass) = struct let c = ref `Server in object inherit Ppxlib.Ast_traverse.map - method structure s = toplevel_structure c s - method signature s = toplevel_signature c s + method! structure s = toplevel_structure c s + method! signature s = toplevel_signature c s end end diff --git a/src/tools/distillery.ml b/src/tools/distillery.ml index 34808aaca7..0120aeb797 100644 --- a/src/tools/distillery.ml +++ b/src/tools/distillery.ml @@ -8,7 +8,10 @@ let eliomignore_filename = ".eliomignore" (* File containing files which must be copied without modifications *) let eliomverbatim_filename = ".eliomverbatim" -let eliom_template_dir = Findlib.package_directory "eliom.templates" + +let eliom_template_dir = + Filename.concat (Findlib.package_directory "eliom") "templates" + let distillery_basic = "basic.ppx", eliom_template_dir let template_path (tname, tpath) = tpath ^ "/" ^ tname diff --git a/src/tools/dune b/src/tools/dune new file mode 100644 index 0000000000..010927abdb --- /dev/null +++ b/src/tools/dune @@ -0,0 +1,14 @@ +(executables + (names eliomc eliomdep eliomdoc eliompp distillery gen_dune) + (public_names eliomc eliomdep eliomdoc eliompp eliom-distillery -) + (libraries str unix findlib)) + +(ocamllex eliompp_lexer) + +(install + (section bin) + (files (eliomc.exe as eliomopt) (eliomc.exe as eliomcp) + (eliomc.exe as js_of_eliom))) +(env + (_ + (flags (:standard -w -9 -warn-error -27-32)))) diff --git a/src/tools/gen_dune.ml b/src/tools/gen_dune.ml new file mode 100644 index 0000000000..90c345b722 --- /dev/null +++ b/src/tools/gen_dune.ml @@ -0,0 +1,73 @@ +let handle_file_client nm = + let copy_file extension = + Printf.printf "(rule (copy# ../%s %s))\n" nm + (Filename.chop_suffix nm extension ^ Filename.extension nm) + in + if Filename.check_suffix nm ".client.ml" + then copy_file ".client.ml" + else if Filename.check_suffix nm ".shared.ml" + then copy_file ".shared.ml" + else if Filename.check_suffix nm ".client.mli" + then copy_file ".client.mli" + else if Filename.check_suffix nm ".shared.mli" + then copy_file ".shared.mli" + else if Filename.check_suffix nm ".eliom" + then + let nm = Filename.chop_suffix nm ".eliom" in + Printf.printf + "(rule (target %s.ml) (deps ../%s.eliom ../server/%s.type_mli)\n\ (action\n\ (with-stdout-to %%{target}\n\ (chdir .. (run ppx_eliom_client -type server/%s.type_mli --as-pp --impl %s.eliom)))))\n" + nm nm nm nm nm + +(* +let handle_file_server nm = + if Filename.check_suffix nm ".eliom" then + let nm = Filename.chop_suffix nm ".eliom" in + Printf.printf + "(rule (target %s.type_mli) (deps %s.eliom)\n\ + \ (action\n\ + \ (progn\n\ + \ (ignore-stdout (echo %%{cmo:%s}))\n\ + \ (with-stdout-to %%{target}\n\ + \ (pipe-stdout\n\ + \ (run ocamlc %%{read-lines:includes} -I .pervasives.objs/byte -I .bs.eobjs/byte -i -ppx \"%%{exe:ppx/eliom_ppx_type.exe} -as-ppx --prefix Bs_ --suffix _i18n --default-module Bs_i18n\" %s -impl %%{deps})\n\ + \ (run sed -e \"s$/[1-9][0-9]*$$g\" -e \"s/_\\\\[\\\\([<>]\\\\)/[\\\\1/g\" -e \"s/'\\\\(_[a-z0-9_]*\\\\)/'eliom_inferred_type_\\\\1/g\"))))))\n" + nm nm nm + (if nm <> "bs_pervasives" then "-open Bs_pervasives" else "") + *) +let handle_file_server nm = + let copy_file extension = + Printf.printf "(rule (copy# ../%s %s))\n" nm + (Filename.chop_suffix nm extension ^ Filename.extension nm) + in + if Filename.check_suffix nm ".server.ml" + then copy_file ".server.ml" + else if Filename.check_suffix nm ".shared.ml" + then copy_file ".shared.ml" + else if Filename.check_suffix nm ".server.mli" + then copy_file ".server.mli" + else if Filename.check_suffix nm ".shared.mli" + then copy_file ".shared.mli" + else if Filename.check_suffix nm ".eliom" + then ( + let nm = Filename.chop_suffix nm ".eliom" in + Printf.printf + "(rule (target %s.ml) (deps ../%s.eliom)\n\ (action\n\ (with-stdout-to %%{target}\n\ (chdir .. (run ppx_eliom_server --as-pp --impl %%{deps})))))\n" + nm nm; + Printf.printf + "(rule (target %s.type_mli) (deps ../%s.eliom)\n\ (action\n\ (progn\n\ (ignore-stdout (echo %%{cmo:%s}))\n\ (with-stdout-to %%{target}\n\ (pipe-stdout\n\ (chdir .. (run ocamlfind ocamlc -package lwt_ppx %%{read-lines:includes} -I server/.eliom_server.objs/byte -i -ppx \"%%{bin:ppx_eliom_types} --as-ppx\" -impl %%{deps}))\n\ (run sed -e \"s$/[1-9][0-9]*$$g\" -e \"s/_\\\\[\\\\([<>]\\\\)/[\\\\1/g\" -e \"s/'\\\\(_[a-z0-9_]*\\\\)/'eliom_inferred_type_\\\\1/g\"))))))\n" + nm nm nm) + else if Filename.check_suffix nm ".eliomi" + then + let nm = Filename.chop_suffix nm ".eliomi" in + Printf.printf + "(rule (target %s.mli) (deps ../%s.eliomi)\n\ (action\n\ (with-stdout-to %%{target}\n\ (chdir .. (run ppx_eliom_server --as-pp --intf %%{deps})))))\n" + nm nm + +let () = + Sys.readdir Sys.argv.(2) + |> Array.to_list |> List.sort compare + |> List.iter + (match Sys.argv.(1) with + | "--server" -> handle_file_server + | "--client" -> handle_file_client + | _ -> assert false) diff --git a/src/tools/utils.ml b/src/tools/utils.ml index 2f27be0385..25dcb4e274 100644 --- a/src/tools/utils.ml +++ b/src/tools/utils.ml @@ -260,7 +260,10 @@ let get_pp pkg = in s -let get_ppx pkg = Findlib.package_property [] pkg "ppx" +let get_ppx pkg = + let base = Findlib.package_directory pkg in + let ppx = Findlib.package_property [] pkg "ppx" in + Findlib.resolve_path ~base ~explicit:true ppx let get_thread_opt () = match !kind with `Client -> [] | `Server | `ServerOpt -> ["-thread"]