From a70e63b22dfd4beceb83893ab70d89e335ce9acf Mon Sep 17 00:00:00 2001 From: Eric Saxby Date: Thu, 30 May 2024 09:00:13 -0700 Subject: [PATCH] Add empty erlang library --- .gitignore | 11 ++ pgml-sdks/pgml/erlang/Makefile | 44 ++++++ pgml-sdks/pgml/erlang/README.md | 17 +++ .../erlang/native/pgml/.cargo/config.toml | 5 + pgml-sdks/pgml/erlang/native/pgml/Cargo.lock | 142 ++++++++++++++++++ pgml-sdks/pgml/erlang/native/pgml/Cargo.toml | 14 ++ pgml-sdks/pgml/erlang/native/pgml/README.md | 35 +++++ .../erlang/native/pgml/rust-toolchain.toml | 4 + pgml-sdks/pgml/erlang/native/pgml/src/lib.rs | 4 + pgml-sdks/pgml/erlang/rebar.config | 27 ++++ pgml-sdks/pgml/erlang/rebar.lock | 1 + pgml-sdks/pgml/erlang/src/cargo.hrl | 14 ++ pgml-sdks/pgml/erlang/src/pgml.app.src | 14 ++ pgml-sdks/pgml/erlang/src/pgml.erl | 33 ++++ 14 files changed, 365 insertions(+) create mode 100644 pgml-sdks/pgml/erlang/Makefile create mode 100644 pgml-sdks/pgml/erlang/README.md create mode 100644 pgml-sdks/pgml/erlang/native/pgml/.cargo/config.toml create mode 100644 pgml-sdks/pgml/erlang/native/pgml/Cargo.lock create mode 100644 pgml-sdks/pgml/erlang/native/pgml/Cargo.toml create mode 100644 pgml-sdks/pgml/erlang/native/pgml/README.md create mode 100644 pgml-sdks/pgml/erlang/native/pgml/rust-toolchain.toml create mode 100644 pgml-sdks/pgml/erlang/native/pgml/src/lib.rs create mode 100644 pgml-sdks/pgml/erlang/rebar.config create mode 100644 pgml-sdks/pgml/erlang/rebar.lock create mode 100644 pgml-sdks/pgml/erlang/src/cargo.hrl create mode 100644 pgml-sdks/pgml/erlang/src/pgml.app.src create mode 100644 pgml-sdks/pgml/erlang/src/pgml.erl diff --git a/.gitignore b/.gitignore index 74e0096c2..3a7a6f4a8 100644 --- a/.gitignore +++ b/.gitignore @@ -27,6 +27,17 @@ share/python-wheels/ *.egg MANIFEST +# Erlang +*.beam +*.plt +.erlang.cookie +.eunit +.rebar +.rebar3 +_build +priv/crates +rebar3.crashdump + # PyInstaller # Usually these files are written by a python script from a template # before PyInstaller builds the exe, so as to inject date/other infos into it. diff --git a/pgml-sdks/pgml/erlang/Makefile b/pgml-sdks/pgml/erlang/Makefile new file mode 100644 index 000000000..e303b91eb --- /dev/null +++ b/pgml-sdks/pgml/erlang/Makefile @@ -0,0 +1,44 @@ +REBAR3 ?= $(shell test -e `which rebar3` 2>/dev/null && which rebar3 || echo "./rebar3") + +.PHONY: deps test build + +all: build + +build: $(REBAR3) + @$(REBAR3) compile + +deps: + @$(REBAR3) deps + +fmt: + @$(REBAR3) fmt --write + +fmt-check: + @$(REBAR3) fmt --check + +shell: + @$(REBAR3) cargo clean + @$(REBAR3) shell + +clean: + @$(REBAR3) clean + +clean-all: + rm -rf $(CURDIR)/priv/crates + rm -rf $(CURDIR)/_build + +distclean: clean + @$(REBAR3) clean --all + +docs: + @$(REBAR3) edoc + +test: + @$(REBAR3) cargo clean + @$(REBAR3) eunit + +test-all: + @$(REBAR3) do eunit, ct, cover + +release: test + @$(REBAR3) as prod release diff --git a/pgml-sdks/pgml/erlang/README.md b/pgml-sdks/pgml/erlang/README.md new file mode 100644 index 000000000..6a18d969c --- /dev/null +++ b/pgml-sdks/pgml/erlang/README.md @@ -0,0 +1,17 @@ +# pgml + +An Erlang NIF library written in Rust + +## Build + +``` shell +make +make fmt +``` + +## Test + +``` shell +make test +``` + diff --git a/pgml-sdks/pgml/erlang/native/pgml/.cargo/config.toml b/pgml-sdks/pgml/erlang/native/pgml/.cargo/config.toml new file mode 100644 index 000000000..c6435672a --- /dev/null +++ b/pgml-sdks/pgml/erlang/native/pgml/.cargo/config.toml @@ -0,0 +1,5 @@ +[target.'cfg(target_os = "macos")'] +rustflags = [ + "-C", "link-arg=-undefined", + "-C", "link-arg=dynamic_lookup", +] \ No newline at end of file diff --git a/pgml-sdks/pgml/erlang/native/pgml/Cargo.lock b/pgml-sdks/pgml/erlang/native/pgml/Cargo.lock new file mode 100644 index 000000000..80fe79a2a --- /dev/null +++ b/pgml-sdks/pgml/erlang/native/pgml/Cargo.lock @@ -0,0 +1,142 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "memchr" +version = "2.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" + +[[package]] +name = "pgml" +version = "0.1.0" +dependencies = [ + "rustler", +] + +[[package]] +name = "proc-macro2" +version = "1.0.84" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec96c6a92621310b51366f1e28d05ef11489516e93be030060e5fc12024a49d6" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "regex" +version = "1.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" + +[[package]] +name = "rustler" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45d51ae0239c57c3a3e603dd855ace6795078ef33c95c85d397a100ac62ed352" +dependencies = [ + "rustler_codegen", + "rustler_sys", +] + +[[package]] +name = "rustler_codegen" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27061f1a2150ad64717dca73902678c124b0619b0d06563294df265bc84759e1" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "rustler_sys" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2062df0445156ae93cf695ef38c00683848d956b30507592143c01fe8fb52fda" +dependencies = [ + "regex", + "unreachable", +] + +[[package]] +name = "syn" +version = "2.0.66" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c42f3f41a2de00b01c0aaad383c5a45241efc8b2d1eda5661812fda5f3cdcff5" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "unreachable" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56" +dependencies = [ + "void", +] + +[[package]] +name = "void" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" diff --git a/pgml-sdks/pgml/erlang/native/pgml/Cargo.toml b/pgml-sdks/pgml/erlang/native/pgml/Cargo.toml new file mode 100644 index 000000000..a32d9be94 --- /dev/null +++ b/pgml-sdks/pgml/erlang/native/pgml/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "pgml" +version = "0.1.0" +edition = "2021" + + +[lib] +name = "pgml" +path = "src/lib.rs" +crate-type = ["dylib"] + + +[dependencies] +rustler = "0.33.0" diff --git a/pgml-sdks/pgml/erlang/native/pgml/README.md b/pgml-sdks/pgml/erlang/native/pgml/README.md new file mode 100644 index 000000000..7f477ccad --- /dev/null +++ b/pgml-sdks/pgml/erlang/native/pgml/README.md @@ -0,0 +1,35 @@ +# NIF for pgml + +## To compile the NIF in Erlang: + +Add the following lines to your `rebar.config` file: + +``` erlang +{plugins, [rebar3_rustler]}. + +{cargo_opts, [ + {src_dir, "native/pgml"} +]}. + +{provider_hooks, [ + {pre, [ + {compile, {cargo, build}} + ]}, + {post, [ + {clean, {cargo, clean}}, + {eunit, {cargo, test}} + ]} +]}. +``` + +## Build + +``` shell +cargo build +``` + +## Test + +``` shell +cargo test +``` diff --git a/pgml-sdks/pgml/erlang/native/pgml/rust-toolchain.toml b/pgml-sdks/pgml/erlang/native/pgml/rust-toolchain.toml new file mode 100644 index 000000000..0a135836b --- /dev/null +++ b/pgml-sdks/pgml/erlang/native/pgml/rust-toolchain.toml @@ -0,0 +1,4 @@ +[toolchain] +channel = "nightly" +components = [ "rustfmt", "clippy" ] +profile = "minimal" diff --git a/pgml-sdks/pgml/erlang/native/pgml/src/lib.rs b/pgml-sdks/pgml/erlang/native/pgml/src/lib.rs new file mode 100644 index 000000000..872841d8f --- /dev/null +++ b/pgml-sdks/pgml/erlang/native/pgml/src/lib.rs @@ -0,0 +1,4 @@ +rustler::init!("pgml", []); + +#[cfg(test)] +mod tests {} diff --git a/pgml-sdks/pgml/erlang/rebar.config b/pgml-sdks/pgml/erlang/rebar.config new file mode 100644 index 000000000..0f70a5eba --- /dev/null +++ b/pgml-sdks/pgml/erlang/rebar.config @@ -0,0 +1,27 @@ +{project_plugins, [{erlfmt, "~> 1.3"}]}. + +{erl_opts, [debug_info]}. + +{deps, []}. + +{plugins, [rebar3_cargo]}. + +{cargo_opts, [ + {src_dir, "native/pgml"} +]}. + +{provider_hooks, [ + {pre, [ + {compile, {cargo, build}} + ]}, + {post, [ + {clean, {cargo, clean}}, + {eunit, {cargo, test}} + ]} +]}. + +{erlfmt, [ + check, + verbose, + {files, ["src/*", "rebar.config"]} +]}. diff --git a/pgml-sdks/pgml/erlang/rebar.lock b/pgml-sdks/pgml/erlang/rebar.lock new file mode 100644 index 000000000..57afcca04 --- /dev/null +++ b/pgml-sdks/pgml/erlang/rebar.lock @@ -0,0 +1 @@ +[]. diff --git a/pgml-sdks/pgml/erlang/src/cargo.hrl b/pgml-sdks/pgml/erlang/src/cargo.hrl new file mode 100644 index 000000000..52e5abacf --- /dev/null +++ b/pgml-sdks/pgml/erlang/src/cargo.hrl @@ -0,0 +1,14 @@ +-cargo_header_version(1). +-ifndef(CARGO_LOAD_APP). +-define(CARGO_LOAD_APP, pgml). +-endif. +-ifndef(CARGO_HRL). +-define(CARGO_HRL, 1). +-define(load_nif_from_crate(__CRATE, __INIT), + (fun() -> + __APP = ?CARGO_LOAD_APP, + __PATH = filename:join([code:priv_dir(__APP), "crates", __CRATE, __CRATE]), + erlang:load_nif(__PATH, __INIT) + end)() +). +-endif. diff --git a/pgml-sdks/pgml/erlang/src/pgml.app.src b/pgml-sdks/pgml/erlang/src/pgml.app.src new file mode 100644 index 000000000..9560625ea --- /dev/null +++ b/pgml-sdks/pgml/erlang/src/pgml.app.src @@ -0,0 +1,14 @@ +{application, pgml, [ + {description, "An OTP library"}, + {vsn, "0.1.0"}, + {registered, []}, + {applications, [ + kernel, + stdlib + ]}, + {env, []}, + {modules, []}, + + {licenses, ["Apache 2.0"]}, + {links, []} +]}. diff --git a/pgml-sdks/pgml/erlang/src/pgml.erl b/pgml-sdks/pgml/erlang/src/pgml.erl new file mode 100644 index 000000000..9c22fea74 --- /dev/null +++ b/pgml-sdks/pgml/erlang/src/pgml.erl @@ -0,0 +1,33 @@ +-module(pgml). + +-export([]). + +-include("cargo.hrl"). + +-on_load init/0. + +-define(NOT_LOADED, not_loaded(?LINE)). + +%%%=================================================================== +%%% API +%%%=================================================================== + +%%%=================================================================== +%%% NIF +%%%=================================================================== + +init() -> + ?load_nif_from_crate(pgml, 0). + +not_loaded(Line) -> + erlang:nif_error({not_loaded, [{module, ?MODULE}, {line, Line}]}). + +%%%=================================================================== +%%% Tests +%%%=================================================================== + +-ifdef(TEST). + +-include_lib("eunit/include/eunit.hrl"). + +-endif.