diff --git a/.drom b/.drom index 135edbde..c795fbd7 100644 --- a/.drom +++ b/.drom @@ -2,7 +2,7 @@ # hash of toml configuration files # used for generation of all files -42a6a0e0c25a89f1894856d401f8f02e:. +278dd51e1b58745b985a0d2ef237e412:. # end context for . # begin context for .github/workflows/doc-deploy.yml @@ -32,7 +32,7 @@ ae6a87df5770f4f6a09196ec38906d5a:.gitignore # begin context for LICENSE.md # file LICENSE.md -c4286e88f0dca20a879274e23cf2cb8e:LICENSE.md +a6eab40337af2e76a38e4c8d30866c0b:LICENSE.md # end context for LICENSE.md # begin context for Makefile @@ -42,7 +42,7 @@ c4286e88f0dca20a879274e23cf2cb8e:LICENSE.md # begin context for README.md # file README.md -5d523350230459e853bc57803b729e29:README.md +1ff0ab35f115b004da7c51828b5d92af:README.md # end context for README.md # begin context for docs/README.txt @@ -62,7 +62,7 @@ e739f3026aa997af4026bc428f4c9ef6:docs/favicon.png # begin context for docs/index.html # file docs/index.html -b9a0f9e7e370fe84b6e7d3e90ceb9ba4:docs/index.html +ed28d2e07e40a7874cbc18bbc06f1e2d:docs/index.html # end context for docs/index.html # begin context for docs/sphinx/index.html @@ -82,17 +82,17 @@ c8281f46ba9a11d0b61bc8ef67eaa357:docs/style.css # begin context for drom.opam # file drom.opam -29806d41b658c1110972b0b1f7576022:drom.opam +d5855df69929294839ca6f0728f52c27:drom.opam # end context for drom.opam # begin context for drom.toml # file drom.toml -a1640359a014ab959a9798639997a921:drom.toml +179c8354c2b44c8de53a607146742626:drom.toml # end context for drom.toml # begin context for drom_lib.opam # file drom_lib.opam -c11460be4cb80485ad3772b5301c6941:drom_lib.opam +7b5671645f7a7334a5cb8c2b75aa1d9a:drom_lib.opam # end context for drom_lib.opam # begin context for dune @@ -102,7 +102,7 @@ c11460be4cb80485ad3772b5301c6941:drom_lib.opam # begin context for dune-project # file dune-project -a202354a3c0a360d9279fff87a67922d:dune-project +70849131d65433a9c6ba0c1ea930197b:dune-project # end context for dune-project # begin context for scripts/after.sh @@ -147,7 +147,7 @@ dc4cee7810778bedcd7b9bfa95338ac4:sphinx/conf.py # begin context for sphinx/license.rst # file sphinx/license.rst -bba8067487813e5ef74a6ecfecfc7ac9:sphinx/license.rst +6f8d8b2e533aaf4e245bb45f36589235:sphinx/license.rst # end context for sphinx/license.rst # begin context for src/drom/dune @@ -157,17 +157,17 @@ b2467739c3fd8542338ce53133b3fefd:src/drom/dune # begin context for src/drom/index.mld # file src/drom/index.mld -2818d15f527a37c2cfafe85ef89f675b:src/drom/index.mld +155ff396ec5ab6ff5deb5f290c25634e:src/drom/index.mld # end context for src/drom/index.mld # begin context for src/drom/main.ml # file src/drom/main.ml -13a81bf0db841e7d20b3ef4a846e91bc:src/drom/main.ml +46f55db0ab1ffc429e105af60218f0c8:src/drom/main.ml # end context for src/drom/main.ml # begin context for src/drom/package.toml # file src/drom/package.toml -74b32a0ebe66d431cd5a1a75e52c8093:src/drom/package.toml +0df6a7d101efd463b801a3c71f967ed2:src/drom/package.toml # end context for src/drom/package.toml # begin context for src/drom_lib/dune @@ -177,17 +177,17 @@ b2467739c3fd8542338ce53133b3fefd:src/drom/dune # begin context for src/drom_lib/index.mld # file src/drom_lib/index.mld -3e03ec5e98f99c1d5b09dd366177ad13:src/drom_lib/index.mld +410f9035731da781d0c50b063d81f834:src/drom_lib/index.mld # end context for src/drom_lib/index.mld # begin context for src/drom_lib/package.toml # file src/drom_lib/package.toml -393ea67e568f7326e7be36ee21a9aafc:src/drom_lib/package.toml +44e05f9ed47a68f1c619629becf277d5:src/drom_lib/package.toml # end context for src/drom_lib/package.toml # begin context for src/drom_lib/version.mlt # file src/drom_lib/version.mlt -e2b5cde78b7715f604ce360b478884e2:src/drom_lib/version.mlt +1e501a85255c8330e7be2911d58f03d8:src/drom_lib/version.mlt # end context for src/drom_lib/version.mlt # begin context for test/expect-tests/dune diff --git a/LICENSE.md b/LICENSE.md index 8b6b9557..fc8ece64 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,4 +1,4 @@ -Copyright (c) 2021 OCamlPro SAS & Origin Labs SAS +Copyright (c) 2020-2021 OCamlPro SAS & Origin Labs SAS This software is distributed under the terms of the GNU Lesser General Public License (LGPL) version 2.1 (included below). @@ -170,7 +170,7 @@ If you develop a new library, and you want it to be of the greatest possible use To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. one line to give the library's name and an idea of what it does. -Copyright (C) year name of author +Copyright (C) years name of author This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/README.md b/README.md index e8503f94..3f1c4a5b 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,7 @@ # drom + The drom tool is a wrapper over opam/dune in an attempt to provide a cargo-like user experience. It can be used to create full OCaml projects with sphinx and odoc documentation. It has specific knowledge of Github and diff --git a/docs/index.html b/docs/index.html index bcfe035d..26084190 100644 --- a/docs/index.html +++ b/docs/index.html @@ -10,7 +10,8 @@

drom

-

The drom tool is a wrapper over opam/dune in an attempt to provide a cargo-like +

+The drom tool is a wrapper over opam/dune in an attempt to provide a cargo-like user experience. It can be used to create full OCaml projects with sphinx and odoc documentation. It has specific knowledge of Github and will generate files for Github Actions CI and Github pages. diff --git a/drom.opam b/drom.opam index 1a52e778..dcd33ba4 100644 --- a/drom.opam +++ b/drom.opam @@ -2,11 +2,12 @@ # Do not modify, or add to the `skip` field of `drom.toml`. opam-version: "2.0" name: "drom" -version: "0.2.2" +version: "0.3.0" license: "LGPL-2.1-only with OCaml-LGPL-linking-exception" synopsis: "The drom tool is a wrapper over opam/dune in an attempt to provide a cargo-like user experience" -description: """\ +description: """ + The drom tool is a wrapper over opam/dune in an attempt to provide a cargo-like user experience. It can be used to create full OCaml projects with sphinx and odoc documentation. It has specific knowledge of Github and diff --git a/drom.toml b/drom.toml index 9fb9fcfc..55349b28 100644 --- a/drom.toml +++ b/drom.toml @@ -11,7 +11,8 @@ license = "LGPL2" min-edition = "4.07.0" name = "drom" synopsis = "The drom tool is a wrapper over opam/dune in an attempt to provide a cargo-like user experience" -version = "0.2.2" +year = 2020 +version = "0.3.0" # keys that you could also define: # odoc-target = "...odoc-target..." @@ -24,8 +25,7 @@ version = "0.2.2" # homepage = "...homepage..." [project] -description = """ -The drom tool is a wrapper over opam/dune in an attempt to provide a cargo-like +description = """\nThe drom tool is a wrapper over opam/dune in an attempt to provide a cargo-like user experience. It can be used to create full OCaml projects with sphinx and odoc documentation. It has specific knowledge of Github and will generate files for Github Actions CI and Github pages. @@ -69,18 +69,12 @@ ocaml-flags = "-w -a" # project-wide fields (depends on project skeleton) [fields] -dot-gitattributes-trailer = """ -share/drom/skeletons/projects/virtual/scripts/before*.sh text=lf -share/drom/skeletons/projects/virtual/scripts/after*.sh text=lf -""" - +# ... [[package]] dir = "src/drom" # edit 'src/drom/package.toml' for package-specific options - [[package]] dir = "src/drom_lib" # edit 'src/drom_lib/package.toml' for package-specific options - diff --git a/drom_lib.opam b/drom_lib.opam index b510c653..56b66d39 100644 --- a/drom_lib.opam +++ b/drom_lib.opam @@ -2,11 +2,12 @@ # Do not modify, or add to the `skip` field of `drom.toml`. opam-version: "2.0" name: "drom_lib" -version: "0.2.2" +version: "0.3.0" license: "LGPL-2.1-only with OCaml-LGPL-linking-exception" synopsis: "The drom tool is a wrapper over opam/dune in an attempt to provide a cargo-like user experience" -description: """\ +description: """ + The drom tool is a wrapper over opam/dune in an attempt to provide a cargo-like user experience. It can be used to create full OCaml projects with sphinx and odoc documentation. It has specific knowledge of Github and diff --git a/dune b/dune index 72be1ea7..b8b326f9 100644 --- a/dune +++ b/dune @@ -202,6 +202,28 @@ as "skeletons/packages/vue_library/templates/dune_") ( "share/drom/skeletons/packages/vue_library/templates/hello.html" as "skeletons/packages/vue_library/templates/hello.html") + ( "share/drom/skeletons/packages/wasm_binding/build_wasm.sh" + as "skeletons/packages/wasm_binding/build_wasm.sh") + ( "share/drom/skeletons/packages/wasm_binding/dune_" + as "skeletons/packages/wasm_binding/dune_") + ( "share/drom/skeletons/packages/wasm_binding/index.mld" + as "skeletons/packages/wasm_binding/index.mld") + ( "share/drom/skeletons/packages/wasm_binding/main.c" + as "skeletons/packages/wasm_binding/main.c") + ( "share/drom/skeletons/packages/wasm_binding/main.h" + as "skeletons/packages/wasm_binding/main.h") + ( "share/drom/skeletons/packages/wasm_binding/main.ml" + as "skeletons/packages/wasm_binding/main.ml") + ( "share/drom/skeletons/packages/wasm_binding/package.toml" + as "skeletons/packages/wasm_binding/package.toml") + ( "share/drom/skeletons/packages/wasm_binding/skeleton.toml" + as "skeletons/packages/wasm_binding/skeleton.toml") + ( "share/drom/skeletons/packages/wasm_binding/stubs.c" + as "skeletons/packages/wasm_binding/stubs.c") + ( "share/drom/skeletons/packages/wasm_binding/stubs.js" + as "skeletons/packages/wasm_binding/stubs.js") + ( "share/drom/skeletons/packages/wasm_binding/wasm_utils.js" + as "skeletons/packages/wasm_binding/wasm_utils.js") ( "share/drom/skeletons/projects/c_binding/drom.toml" as "skeletons/projects/c_binding/drom.toml") ( "share/drom/skeletons/projects/c_binding/skeleton.toml" @@ -332,6 +354,10 @@ as "skeletons/projects/vue/index.html") ( "share/drom/skeletons/projects/vue/skeleton.toml" as "skeletons/projects/vue/skeleton.toml") + ( "share/drom/skeletons/projects/wasm_binding/drom.toml" + as "skeletons/projects/wasm_binding/drom.toml") + ( "share/drom/skeletons/projects/wasm_binding/skeleton.toml" + as "skeletons/projects/wasm_binding/skeleton.toml") ) (section share) (package drom)) diff --git a/dune-project b/dune-project index fe51333e..f997eeb4 100644 --- a/dune-project +++ b/dune-project @@ -3,13 +3,13 @@ (name drom) (allow_approximate_merlin) (generate_opam_files false) -(version 0.2.2) +(version 0.3.0) (formatting (enabled_for ocaml reason)) (package (name drom) (synopsis "The drom tool is a wrapper over opam/dune in an attempt to provide a cargo-like user experience") - (description "The drom tool is a wrapper over opam/dune in an attempt to provide a cargo-like\nuser experience. It can be used to create full OCaml projects with\nsphinx and odoc documentation. It has specific knowledge of Github and\nwill generate files for Github Actions CI and Github pages.\n") + (description "\nThe drom tool is a wrapper over opam/dune in an attempt to provide a cargo-like\nuser experience. It can be used to create full OCaml projects with\nsphinx and odoc documentation. It has specific knowledge of Github and\nwill generate files for Github Actions CI and Github pages.\n") (depends (ocaml (>= 4.07.0)) (drom_lib (= version)) @@ -22,7 +22,7 @@ (package (name drom_lib) (synopsis "The drom tool is a wrapper over opam/dune in an attempt to provide a cargo-like user experience") - (description "The drom tool is a wrapper over opam/dune in an attempt to provide a cargo-like\nuser experience. It can be used to create full OCaml projects with\nsphinx and odoc documentation. It has specific knowledge of Github and\nwill generate files for Github Actions CI and Github pages.\n") + (description "\nThe drom tool is a wrapper over opam/dune in an attempt to provide a cargo-like\nuser experience. It can be used to create full OCaml projects with\nsphinx and odoc documentation. It has specific knowledge of Github and\nwill generate files for Github Actions CI and Github pages.\n") (depends (ocaml (>= 4.07.0)) (toml (and (>= 6.0.0) (< 7.0.0))) diff --git a/share/drom/licenses/GPL3.toml b/share/drom/licenses/GPL3.toml index 3cedb70e..73c078de 100644 --- a/share/drom/licenses/GPL3.toml +++ b/share/drom/licenses/GPL3.toml @@ -642,7 +642,7 @@ state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. - Copyright (C) + Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -662,7 +662,7 @@ Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: - Copyright (C) + Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. diff --git a/share/drom/licenses/LGPL2.toml b/share/drom/licenses/LGPL2.toml index 9e5e8fb8..0d99dbf1 100644 --- a/share/drom/licenses/LGPL2.toml +++ b/share/drom/licenses/LGPL2.toml @@ -177,7 +177,7 @@ If you develop a new library, and you want it to be of the greatest possible use To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. one line to give the library's name and an idea of what it does. -Copyright (C) year name of author +Copyright (C) years name of author This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/share/drom/skeletons/packages/wasm_binding/build_wasm.sh b/share/drom/skeletons/packages/wasm_binding/build_wasm.sh new file mode 100755 index 00000000..a4422912 --- /dev/null +++ b/share/drom/skeletons/packages/wasm_binding/build_wasm.sh @@ -0,0 +1,75 @@ +#!/bin/bash + +path=src +output=dist/main.js +optimize="-O3" + +while getopts o:p:O: flag; do + case $flag in + o) output=${OPTARG};; + p) path=${OPTARG};; + O) optimize="-O"${OPTARG};; + esac +done + +src=( !(c-names-dot-c) ) + +src=(${src[@]/#/$path/}) + +emcc \ + $optimize \ + -o $output \ + ${src[@]} \ + -DKRML_NOUINT128 \ + -s ALLOW_MEMORY_GROWTH=1 \ + -s MODULARIZE=1 \ + -s EXPORT_NAME=wasm_loader \ + -s WASM_BIGINT=1 \ + -s EXPORTED_FUNCTIONS='[ "_malloc", "_free", "_reverse"]' + +sed -i '1s/^/\/\/Provides: wasm_loader const/' $output +sed -i '3i\ + var ArrayBuffer = joo_global_object.ArrayBuffer;\ + var Browser = joo_global_object.Browser;\ + var Buffer = joo_global_object.Buffer;\ + var Float32Array = joo_global_object.Float32Array;\ + var Float64Array = joo_global_object.Float64Array;\ + var Int16Array = joo_global_object.Int16Array;\ + var Int32Array = joo_global_object.Int32Array;\ + var Int8Array = joo_global_object.Int8Array;\ + var Promise = joo_global_object.Promise;\ + var TextDecoder = joo_global_object.TextDecoder;\ + var Uint16Array = joo_global_object.Uint16Array;\ + var Uint32Array = joo_global_object.Uint32Array;\ + var Uint8Array = joo_global_object.Uint8Array;\ + var WebAssembly = joo_global_object.WebAssembly;\ + var __dirname = joo_global_object.__dirname;\ + var __filename = joo_global_object.__filename;\ + var clearInterval = joo_global_object.clearInterval;\ + var console = joo_global_object.console;\ + var crypto = joo_global_object.crypto;\ + var fetch = joo_global_object.fetch;\ + var importScripts = joo_global_object.importScripts;\ + var print = joo_global_object.print;\ + var printErr = joo_global_object.printErr;\ + var process = joo_global_object.process;\ + var quit = joo_global_object.quit;\ + var read = joo_global_object.read;\ + var readbuffer = joo_global_object.readbuffer;\ + var readline = joo_global_object.readline;\ + var scriptArgs = joo_global_object.scriptArgs;\ + var setTimeout = joo_global_object.setTimeout;' $output +sed -e :a -e '$d;N;2,7ba' -e 'P;D' -i $output +echo " +//Provides: wasm_ready +//Requires: caml_failwith +function wasm_ready() { + caml_failwith('wasm not yet loaded'); +} + +//Provides: wasm +//Requires: wasm_loader, wasm_ready +var wasm = wasm_loader().then(function(r) { + wasm = r; + wasm_ready = function() { return true; }; +})" >> $output diff --git a/share/drom/skeletons/packages/wasm_binding/dune_ b/share/drom/skeletons/packages/wasm_binding/dune_ new file mode 100644 index 00000000..101dd4f3 --- /dev/null +++ b/share/drom/skeletons/packages/wasm_binding/dune_ @@ -0,0 +1,43 @@ +; generated by drom from package skeleton 'library' + +(library + (name !{library-name}) + (public_name !{name}) + (wrapped !{pack-modules}) + (libraries !{dune-libraries} !(package-dune-libraries)) + (foreign_stubs + (language c) + (names !(c-names)) + !(c-flags)) + (c_library_flags !(c-library-flags)) + !{dune-stanzas} + !(package-dune-stanzas) + ) + +(rule + (deps build_wasm.sh !(c-names-dot-c)) + (targets !{name}.js !{name}.wasm) + (action (system "./build_wasm.sh -p . -o !{name}.js"))) + +(library + (name !{library-name}_js) + (public_name !{name}.js) + (modules) + (modes byte) + (libraries !{library-name}) + (js_of_ocaml + (javascript_files !{name}.js wasm_utils.js stubs.js) + (flags --no-sourcemap)) + !{dune-stanzas} + !(package-dune-stanzas)) + +(install + (files (!{name}.wasm as www/js/!{name}.wasm)) + (section share) + (package !{name})) + +!{package-dune-files} +(documentation + (package !{package-name})) +!{package-dune-installs} +!(package-dune-trailer) diff --git a/share/drom/skeletons/packages/wasm_binding/index.mld b/share/drom/skeletons/packages/wasm_binding/index.mld new file mode 100644 index 00000000..dd5c51cd --- /dev/null +++ b/share/drom/skeletons/packages/wasm_binding/index.mld @@ -0,0 +1,10 @@ +{1 Library !{name}} + +!{description} + +!{escape:true}![if:pack] +The entry point of this library is the module: {\!!{pack}}. +![else] +This library exposes the following toplevel modules: +{\!modules:!{modules}} +![fi]!{escape:false} diff --git a/share/drom/skeletons/packages/wasm_binding/main.c b/share/drom/skeletons/packages/wasm_binding/main.c new file mode 100644 index 00000000..fc6df309 --- /dev/null +++ b/share/drom/skeletons/packages/wasm_binding/main.c @@ -0,0 +1,10 @@ +#include "stdint.h" + +void reverse(uint8_t *p, uint64_t len) { + uint8_t tmp; + for (int i = 0; i < len / 2; i++) { + tmp = p[i]; + p[i] = p[len-i-1]; + p[len-i-1] = tmp; + } +} diff --git a/share/drom/skeletons/packages/wasm_binding/main.h b/share/drom/skeletons/packages/wasm_binding/main.h new file mode 100644 index 00000000..80335c50 --- /dev/null +++ b/share/drom/skeletons/packages/wasm_binding/main.h @@ -0,0 +1,8 @@ +#ifndef __MAIN +#define __MAIN + +#include "stdint.h" + +void reverse(uint8_t* p, uint64_t len); + +#endif diff --git a/share/drom/skeletons/packages/wasm_binding/main.ml b/share/drom/skeletons/packages/wasm_binding/main.ml new file mode 100644 index 00000000..0c381c39 --- /dev/null +++ b/share/drom/skeletons/packages/wasm_binding/main.ml @@ -0,0 +1,12 @@ +!{header-ml} + +(* If you delete or rename this file, you should add + 'src/!{name}/main.ml' to the 'skip' field in "drom.toml" *) + +(* Example of reversal of a string *) +external ml_reverse : Bigstring.t -> unit = "ml_reverse" + +let reverse s = + let b = Bigstring.of_string s in + ml_reverse b; + Bigstring.to_string b diff --git a/share/drom/skeletons/packages/wasm_binding/package.toml b/share/drom/skeletons/packages/wasm_binding/package.toml new file mode 100644 index 00000000..266a7e16 --- /dev/null +++ b/share/drom/skeletons/packages/wasm_binding/package.toml @@ -0,0 +1,11 @@ +name = "!{name}" +dir = "!{dir}" +skeleton = "wasm_binding" +kind = "library" +gen-version = "version.ml" + +[fields] +package-dune-libraries = "bigstring" +c-names = "main" +c-names-dot-c = "main.c" +c-library-flags = "" \ No newline at end of file diff --git a/share/drom/skeletons/packages/wasm_binding/skeleton.toml b/share/drom/skeletons/packages/wasm_binding/skeleton.toml new file mode 100644 index 00000000..8bef7b3f --- /dev/null +++ b/share/drom/skeletons/packages/wasm_binding/skeleton.toml @@ -0,0 +1,14 @@ +[skeleton] +name = "wasm_binding" +inherits = "virtual" + +[file] +dune_ = { file = "dune", skips = "dune" } +"index.mld" = { skips = [ "docs" ] } +"main.ml" = { skips = [ "code" ] } +"main.c" = { skips = [ "code" ] } +"main.h" = { skips = [ "code" ] } +"stubs.c" = { skips = [ "code" ] } +"stubs.js" = { skips = [ "code" ] } +"wasm_utils.js" = { skips = [ "code" ] } +"build_wasm.sh" = { skips = [ "code" ] } \ No newline at end of file diff --git a/share/drom/skeletons/packages/wasm_binding/stubs.c b/share/drom/skeletons/packages/wasm_binding/stubs.c new file mode 100644 index 00000000..fffbac3f --- /dev/null +++ b/share/drom/skeletons/packages/wasm_binding/stubs.c @@ -0,0 +1,9 @@ +#define CAML_NAME_SPACE +#include "caml/mlvalues.h" +#include "caml/bigarray.h" +#include "main.h" + +CAMLprim value ml_reverse(value buf) { + reverse(Caml_ba_data_val(buf), Caml_ba_array_val(buf)->dim[0]); + return Val_unit; +} diff --git a/share/drom/skeletons/packages/wasm_binding/stubs.js b/share/drom/skeletons/packages/wasm_binding/stubs.js new file mode 100644 index 00000000..94085fbc --- /dev/null +++ b/share/drom/skeletons/packages/wasm_binding/stubs.js @@ -0,0 +1,11 @@ + +//Provides: ml_reverse +//Requires: wasm, wasm_ready, walloc_u8, wextract_u8, wu64 +function ml_reverse(b) { + wasm_ready(); + var n = wu64(b.data.length); + var p = walloc_u8(wasm, b); + wasm._reverse(p, n); + wextract_u8(wasm, b, p); + return 0 +} diff --git a/share/drom/skeletons/packages/wasm_binding/wasm_utils.js b/share/drom/skeletons/packages/wasm_binding/wasm_utils.js new file mode 100644 index 00000000..de1f4137 --- /dev/null +++ b/share/drom/skeletons/packages/wasm_binding/wasm_utils.js @@ -0,0 +1,51 @@ +//Provides: walloc_u8 +function walloc_u8(w, o) { + var p = w._malloc(o.data.length * o.data.BYTES_PER_ELEMENT); + w.HEAPU8.set(o.data, p); + return p; +} + +//Provides: wextract_u8 +function wextract_u8(w, o, p) { + var d = new joo_global_object.Uint8Array(w.HEAPU8.buffer, p, o.data.length); + for (var i = 0; i < o.data.length; i++) { o.data[i] = d[i]; }; + w._free(p); + return 0; +} + +//Provides: walloc_u32 +function walloc_u32(w, o) { + var d = new joo_global_object.Uint32Array(o.data.buffer); + var p = w._malloc(d.length * d.BYTES_PER_ELEMENT); + w.HEAPU32.set(d, p >> 2); + return p; +} + +//Provides: wextract_u32 +function wextract_u32(w, o, p) { + o.data = new joo_global_object.Uint8Array(w.HEAPU32.buffer, p, o.data.length); + w._free(p); + return 0; +} + +//Provides: wfree +function wfree(w, p) { + w._free(p); + return 0; +} + +//Provides: wu32 +//Requires: caml_failwith +function wu32(i32) { + var u32 = i32 >>> 0; + if (i32 != u32) caml_failwith("length is not a uint32"); + return u32; +} + +//Provides: wu64 +//Requires: caml_failwith +function wu64(i32) { + var u64 = joo_global_object.BigInt(i32 >>> 0); + if (i32 != u64) caml_failwith("length is not a uint64"); + return u64; +} diff --git a/share/drom/skeletons/projects/c_binding/drom.toml b/share/drom/skeletons/projects/c_binding/drom.toml index 74232f0c..c79126c9 100644 --- a/share/drom/skeletons/projects/c_binding/drom.toml +++ b/share/drom/skeletons/projects/c_binding/drom.toml @@ -9,7 +9,6 @@ edition = "!{edition}" github-organization = "!{github-organization}" license = "!{license-name}" min-edition = "!{min-edition}" -mode = "javascript" name = "!{name}" synopsis = "The !{name} project" version = "0.1.0" @@ -34,6 +33,7 @@ of the !{name} OCaml project skip = "" [dependencies] +conf-gsl = "2" [tools.ocamlformat] for-test = true diff --git a/share/drom/skeletons/projects/virtual/LICENSE.md b/share/drom/skeletons/projects/virtual/LICENSE.md index c2cada94..c2102251 100644 --- a/share/drom/skeletons/projects/virtual/LICENSE.md +++ b/share/drom/skeletons/projects/virtual/LICENSE.md @@ -1,3 +1,3 @@ -![skip:license]Copyright (c) !{year} !{copyright} +![skip:license]Copyright (c) !{years} !{copyright} !{license} diff --git a/share/drom/skeletons/projects/virtual/sphinx/license.rst b/share/drom/skeletons/projects/virtual/sphinx/license.rst index 36be1de4..a0c6f3e8 100644 --- a/share/drom/skeletons/projects/virtual/sphinx/license.rst +++ b/share/drom/skeletons/projects/virtual/sphinx/license.rst @@ -1,6 +1,6 @@ Copyright and License ===================== -Copyright (c) !{year} !{copyright} +Copyright (c) !{years} !{copyright} !{license} diff --git a/share/drom/skeletons/projects/wasm_binding/drom.toml b/share/drom/skeletons/projects/wasm_binding/drom.toml new file mode 100644 index 00000000..d39acfd7 --- /dev/null +++ b/share/drom/skeletons/projects/wasm_binding/drom.toml @@ -0,0 +1,54 @@ +[project] +drom-version = "0.1.0" + +[project] +authors = [!{authors-for-toml}] +skeleton = "wasm_binding" +copyright = "!{copyright}" +edition = "!{edition}" +github-organization = "!{github-organization}" +license = "!{license-name}" +min-edition = "!{min-edition}" +name = "!{name}" +synopsis = "The !{name} project" +version = "0.1.0" +windows-ci = true + +# keys that you could also define: +# sphinx-target = "...sphinx-target..." +# archive = "...archive..." +# dev-repo = "...dev-repo..." +# bug-reports = "...bug-reports..." +# doc-api = "...doc-api..." +# doc-gen = "...doc-gen..." +# homepage = "...homepage..." + +[project] +description = """ +This is the description +of the !{name} OCaml project +""" + +[drom] +skip = "" + +[dependencies] +bigstring = "0.3" + +[tools.ocamlformat] +for-test = true +[tools.odoc] +for-doc = true +[tools.ppx_expect] +for-test = true +[tools.ppx_inline_test] +for-test = true + +[project] +pack-modules = true +skip-dirs = [] + +[[package]] +skeleton = "wasm_binding" +dir = "src/!{name}" +name = "!{name}" diff --git a/share/drom/skeletons/projects/wasm_binding/skeleton.toml b/share/drom/skeletons/projects/wasm_binding/skeleton.toml new file mode 100644 index 00000000..efa85fb4 --- /dev/null +++ b/share/drom/skeletons/projects/wasm_binding/skeleton.toml @@ -0,0 +1,3 @@ +[skeleton] +name = "wasm_binding" +inherits = "virtual" diff --git a/sphinx/license.rst b/sphinx/license.rst index edf76884..c62222de 100644 --- a/sphinx/license.rst +++ b/sphinx/license.rst @@ -1,7 +1,7 @@ Copyright and License ===================== -Copyright (c) 2021 OCamlPro SAS & Origin Labs SAS +Copyright (c) 2020-2021 OCamlPro SAS & Origin Labs SAS This software is distributed under the terms of the GNU Lesser General Public License (LGPL) version 2.1 (included below). @@ -173,7 +173,7 @@ If you develop a new library, and you want it to be of the greatest possible use To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. one line to give the library's name and an idea of what it does. -Copyright (C) year name of author +Copyright (C) years name of author This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/src/drom/index.mld b/src/drom/index.mld index 91b000e0..40f1d3de 100644 --- a/src/drom/index.mld +++ b/src/drom/index.mld @@ -1,5 +1,6 @@ {1 Program drom} + The drom tool is a wrapper over opam/dune in an attempt to provide a cargo-like user experience. It can be used to create full OCaml projects with sphinx and odoc documentation. It has specific knowledge of Github and diff --git a/src/drom/main.ml b/src/drom/main.ml index 2a9d99b7..28139576 100644 --- a/src/drom/main.ml +++ b/src/drom/main.ml @@ -1,6 +1,6 @@ (**************************************************************************) (* *) -(* Copyright (c) 2021 OCamlPro SAS & Origin Labs SAS *) +(* Copyright (c) 2020-2021 OCamlPro SAS & Origin Labs SAS *) (* *) (* All rights reserved. *) (* This file is distributed under the terms of the GNU Lesser General *) diff --git a/src/drom/package.toml b/src/drom/package.toml index 1525867a..395c3c19 100644 --- a/src/drom/package.toml +++ b/src/drom/package.toml @@ -31,9 +31,6 @@ kind = "program" # module name used to pack modules (if pack-modules is true) # pack = "Mylib" -# compilation mode: "binary" (default) or "javascript" -# mode = "javascript" - # package library dependencies # [dependencies] # ez_file = ">=0.1 <1.3" diff --git a/src/drom_lib/ezToml.ml b/src/drom_lib/ezToml.ml index 6bc51aa7..2c2c6b9c 100644 --- a/src/drom_lib/ezToml.ml +++ b/src/drom_lib/ezToml.ml @@ -118,6 +118,16 @@ let get_bool_default table keys default = | exception Not_found -> default | s -> s +let get_int table keys = + match get table keys with + | TInt i -> i + | _ -> raise Not_found + +let get_int_default table keys default = + match get_int table keys with + | exception Not_found -> default + | i -> i + let rec put keys v table = match keys with | [] -> assert false diff --git a/src/drom_lib/index.mld b/src/drom_lib/index.mld index d536a680..82bbbbdf 100644 --- a/src/drom_lib/index.mld +++ b/src/drom_lib/index.mld @@ -1,5 +1,6 @@ {1 Library drom_lib} + The drom tool is a wrapper over opam/dune in an attempt to provide a cargo-like user experience. It can be used to create full OCaml projects with sphinx and odoc documentation. It has specific knowledge of Github and diff --git a/src/drom_lib/license.ml b/src/drom_lib/license.ml index f8dcfe30..5106489e 100644 --- a/src/drom_lib/license.ml +++ b/src/drom_lib/license.ml @@ -127,11 +127,14 @@ let header ?(sep = ml_sep) p = let line s = Printf.sprintf "%s %-70s%s" boc s eoc in String.concat "\n" ( [ starline; line "" ] - @ ( match p.copyright with - | None -> [] - | Some copyright -> - [ Printf.kprintf line "Copyright (c) %d %s" (Misc.date ()).Unix.tm_year - copyright; + @ ( match p.copyright with + | None -> [] + | Some copyright -> + let current_year = (Misc.date ()).Unix.tm_year in + let years = + if current_year = p.year then string_of_int current_year + else Printf.sprintf "%d-%d" p.year current_year in + [ Printf.kprintf line "Copyright (c) %s %s" years copyright; line "" ] ) @ [ line "All rights reserved." ] diff --git a/src/drom_lib/package.toml b/src/drom_lib/package.toml index 4aea985e..a1f4f71b 100644 --- a/src/drom_lib/package.toml +++ b/src/drom_lib/package.toml @@ -21,8 +21,8 @@ kind = "library" # name of a file to generate with the current version gen-version = "version.ml" -# supported file generators are "ocamllex", "ocamlyacc" and "menhir" -# default is [ "ocamllex", "ocamlyacc" ] +# supported file generators are "ocamllex", "ocamlyacc" and "menhir" +# default is [ "ocamllex", "ocamlyacc" ] # generators = [ "ocamllex", "menhir" ] # whether all modules should be packed/wrapped (default is true) @@ -31,13 +31,10 @@ pack-modules = true # module name used to pack modules (if pack-modules is true) # pack = "Mylib" -# compilation mode: "binary" (default) or "javascript" -# mode = "javascript" - # package library dependencies # [dependencies] # ez_file = ">=0.1 <1.3" -# base-unix = { libname = "unix", version = ">=base" } +# base-unix = { libname = "unix", version = ">=base" } [dependencies] directories = ">=0.2" ez_cmdliner = "0.2.0" diff --git a/src/drom_lib/project.ml b/src/drom_lib/project.ml index ca74db8e..e00e1a06 100644 --- a/src/drom_lib/project.ml +++ b/src/drom_lib/project.ml @@ -44,7 +44,7 @@ let rec dummy_project = profile = None; file = None ; share_dirs = [ "share" ] ; - + year = (Misc.date ()).Unix.tm_year; generators = StringSet.empty; } @@ -846,7 +846,7 @@ let project_of_toml ?file ?default table = generators := StringSet.union !generators p_generators ) packages; let generators = !generators in - + let year = EzToml.get_int_default table [ project_key; "year" ] d.year in let project = { package; packages; @@ -879,6 +879,7 @@ let project_of_toml ?file ?default table = profile; fields; generators; + year; } in package.project <- project; diff --git a/src/drom_lib/subst.ml b/src/drom_lib/subst.ml index ccd96b1e..bb051813 100644 --- a/src/drom_lib/subst.ml +++ b/src/drom_lib/subst.ml @@ -56,6 +56,11 @@ let project_brace (_, p) v = | "header-mll" -> License.header_mll p | "authors-ampersand" -> String.concat " & " p.authors (* general *) + | "start_year" -> string_of_int p.year + | "years" -> + let current_year = (Misc.date ()).Unix.tm_year in + if current_year = p.year then string_of_int p.year + else Printf.sprintf "%d-%d" p.year current_year | "year" -> (Misc.date ()).Unix.tm_year |> string_of_int | "month" -> (Misc.date ()).Unix.tm_mon |> Printf.sprintf "%02d" | "day" -> (Misc.date ()).Unix.tm_mday |> Printf.sprintf "%02d" diff --git a/src/drom_lib/types.ml b/src/drom_lib/types.ml index ed9b3934..07d16a2c 100644 --- a/src/drom_lib/types.ml +++ b/src/drom_lib/types.ml @@ -94,7 +94,8 @@ and project = share_dirs : string list ; mutable dependencies : (string * dependency) list; mutable tools : (string * dependency) list; - mutable fields : string StringMap.t + mutable fields : string StringMap.t; + year : int; } and profile = { flags : string StringMap.t } diff --git a/src/drom_lib/update.ml b/src/drom_lib/update.ml index 5c6fa179..aa75f26b 100644 --- a/src/drom_lib/update.ml +++ b/src/drom_lib/update.ml @@ -201,40 +201,6 @@ let update_files ?args ?(git = false) ?(create = false) p = else (p, changed) in - (* - let p, changed = - match mode with - | None -> (p, changed) - | Some mode -> - let js_dep = ("js_of_ocaml", [ Semantic (3, 6, 0) ]) in - let js_tool = ("js_of_ocaml", [ Semantic (3, 6, 0) ]) in - let ppx_tool = ("js_of_ocaml-ppx", [ Semantic (3, 6, 0) ]) in - let add_dep (name, depversions) deps changed = - let dep = - ( name, - { depversions; depname = None; deptest = false; depdoc = false } ) - in - match mode with - | Binary -> - if List.mem dep deps then - (EzList.remove dep deps, true) - else - (deps, changed) - | Javascript -> - if not (List.mem_assoc (fst dep) deps) then - (dep :: deps, true) - else - (deps, changed) - in - let dependencies, changed = add_dep js_dep p.dependencies changed in - let tools, changed = add_dep js_tool p.tools changed in - let tools, changed = add_dep ppx_tool tools changed in - List.iter (fun package -> - package.p_mode <- Some mode - ) p.packages; - ({ p with dependencies; tools }, changed) - in -*) List.iter (fun package -> package.project <- p) p.packages; Hashes.with_ctxt ~git (fun hashes -> diff --git a/src/drom_lib/version.mlt b/src/drom_lib/version.mlt index 68bfbbf6..674bb48d 100644 --- a/src/drom_lib/version.mlt +++ b/src/drom_lib/version.mlt @@ -13,7 +13,7 @@ let query cmd = let commit_hash = query "git show -s --pretty=format:%H" let commit_date = query "git show -s --pretty=format:%ci" -let version = "0.2.2" +let version = "0.3.0" let version = match commit_hash with | Some commit_hash ->