# HG changeset patch # User ellis # Date 1684550329 14400 # Node ID 1fedeaa5bfc5073a355a55b2da4492e77be7bf78 # Parent c520966de7faa92d4b35af8c8e65c17cbb714d58 tweaks to ffi and makefile diff -r c520966de7fa -r 1fedeaa5bfc5 build.rs --- a/build.rs Mon May 15 21:40:24 2023 -0400 +++ b/build.rs Fri May 19 22:38:49 2023 -0400 @@ -13,4 +13,5 @@ cbindgen::generate(crate_dir) .expect("Unable to find cbindgen.toml configuration file") .write_to_file(build_dir.join("demo.h")); + } diff -r c520966de7fa -r 1fedeaa5bfc5 demo.asd --- a/demo.asd Mon May 15 21:40:24 2023 -0400 +++ b/demo.asd Fri May 19 22:38:49 2023 -0400 @@ -11,7 +11,6 @@ #+(or ccl sbcl) :clack :clog - :clog-web :cl-rocksdb :verbose :alexandria diff -r c520966de7fa -r 1fedeaa5bfc5 demo.ros --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/demo.ros Fri May 19 22:38:49 2023 -0400 @@ -0,0 +1,12 @@ +#!/bin/sh +#|-*- mode:lisp -*-|# +#| +exec ros -Q -- $0 "$@" +|# +(progn ;;init forms + (ros:ensure-asdf) + #+quicklisp(ql:quickload '(demo) :silent t)) + +(defun main (&rest argv) + (declare (ignorable argv)) + (demo:main)) diff -r c520966de7fa -r 1fedeaa5bfc5 ffi.lisp --- a/ffi.lisp Mon May 15 21:40:24 2023 -0400 +++ b/ffi.lisp Fri May 19 22:38:49 2023 -0400 @@ -1,11 +1,28 @@ (in-package :demo) +(defparameter quiche-lib-path #p"./ffi/libquiche.dylib") +(defparameter rocksdb-lib-path #p"./ffi/librocksdb.dylib") +(defparameter demo-lib-path (find-rs-cdylib "libdemo.dylib")) +(defmacro find-rs-cdylib (name &optional debug) + "Find the rust dll specified by NAME." + (cond + ((uiop:directory-exists-p (merge-pathnames *cargo-target* "release")) + `,(mkstr "./target/release/" name)) + ((uiop:directory-exists-p (merge-pathnames *cargo-target* "debug")) + `,(mkstr "./target/debug/" name)) + (t `(progn + ,(uiop:run-program '("cargo" "build" (unless debug "--release")) :output t) + (find-rs-cdylib ,name ,debug))))) (define-foreign-library demo (:win32 (:default "demo")) (t (:default "libdemo"))) +(define-foreign-library quiche + (:win32 (:default "quiche")) + (t (:default "libquiche"))) +(define-foreign-library rocksdb + (:win32 (:default "rocksdb")) + (t (:default "librocksdb"))) -(defun install-demo-lib (&optional path) - (if path - (use-foreign-library path) - (let ((path (rs-find-dll "libdemo.dylib"))) - (use-foreign-library path)))) +(defun load-libdemo () (load-foreign-library (find-rs-cdylib "libdemo.dylib"))) +(defun install-quiche-lib (&optional path) (load-foreign-library (or path quiche-lib-path))) +(defun install-rocksdb-lib (&optional path) (load-foreign-library (or path rocksdb-lib-path))) diff -r c520966de7fa -r 1fedeaa5bfc5 ffi/demo.h --- a/ffi/demo.h Mon May 15 21:40:24 2023 -0400 +++ b/ffi/demo.h Fri May 19 22:38:49 2023 -0400 @@ -10,6 +10,12 @@ #include #include +#define KEY_LEN 32 + +#define OUT_LEN 32 + +#define OUT_LEN_HEX (OUT_LEN * 2) + typedef struct CustomService CustomService; /** diff -r c520966de7fa -r 1fedeaa5bfc5 install.lisp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/install.lisp Fri May 19 22:38:49 2023 -0400 @@ -0,0 +1,5 @@ +(asdf:load-asd "demo.asd") +(ql:quickload :demo) +;; (asdf:make :demo) +(save-lisp-and-die "demo") +(quit) diff -r c520966de7fa -r 1fedeaa5bfc5 makefile --- a/makefile Mon May 15 21:40:24 2023 -0400 +++ b/makefile Fri May 19 22:38:49 2023 -0400 @@ -1,12 +1,16 @@ +M ?= release L ?= sbcl -O ?= /tmp/demo +P ?= python3 + +RS:Cargo.toml build.rs lib.rs obj fig +CL:*.asd *.lisp .PHONY:build -$(O):;mkdir -p $@ -clean:;rm -rf *.fasl;scriipts/clean.ros -fmt:;scripts/fmt.ros -build:;scripts/build.ros -docs:;scripts/docs.ros -test:;scripts/test.ros -pack:;scripts/pack.ros -check:;scripts/check.ros -ci:clean fmt build docs test pack; +clean:;rm -rf *.fasl;cargo clean +fmt:;cargo fmt +build:$(RS) $(CL);cargo build --$(M);$L install.lisp +ffi:build;cp target/$(M)/libdemo.dylib ffi;cd ffi;$(P) ffi/build.py +docs:$(RS);cargo doc +test:$(RS);cargo test +#pack:;scripts/pack.ros +#check:;scripts/check.ros +ci:clean fmt build ffi docs test; diff -r c520966de7fa -r 1fedeaa5bfc5 pkg.lisp --- a/pkg.lisp Mon May 15 21:40:24 2023 -0400 +++ b/pkg.lisp Fri May 19 22:38:49 2023 -0400 @@ -10,57 +10,68 @@ (#:bt #:bordeaux-threads) (#:cli #:clingon)) ;; db.lisp - (:export #:create-options - #:destroy-options - #:increase-parallelism - #:optimize-level-style-compaction - #:set-create-if-missing - #:create-writeoptions - #:destroy-writeoptions - #:create-readoptions - #:destroy-readoptions - #:open-db - #:close-db - #:cancel-all-background-work - #:put-kv - #:put-kv-str - #:get-kv - #:get-kv-str - #:create-iter - #:destroy-iter - #:move-iter-to-first - #:move-iter-forward - #:move-iter-backword - #:valid-iter-p - #:iter-key - #:iter-key-str - #:iter-value - #:iter-value-str - #:with-open-db - #:with-iter) + (:export + #:create-options + #:destroy-options + #:increase-parallelism + #:optimize-level-style-compaction + #:set-create-if-missing + #:create-writeoptions + #:destroy-writeoptions + #:create-readoptions + #:destroy-readoptions + #:open-db + #:close-db + #:cancel-all-background-work + #:put-kv + #:put-kv-str + #:get-kv + #:get-kv-str + #:create-iter + #:destroy-iter + #:move-iter-to-first + #:move-iter-forward + #:move-iter-backword + #:valid-iter-p + #:iter-key + #:iter-key-str + #:iter-value + #:iter-value-str + #:with-open-db + #:with-iter) ;; demo.lisp - (:export #:main - #:demo-path - #:db-path - #:cli-opts - #:cli-handler - #:cli-cmd) + (:export + #:main + #:demo-path + #:db-path + #:cli-opts + #:cli-handler + #:cli-cmd) ;; ui.lisp - (:export #:on-new-window - #:start-ui) + (:export + #:on-new-window + #:start-ui) ;; tk.lisp (:export - #:*cargo-target* - #:*rs-macros* + #:source-dir #:random-id #:scan-dir #:mkstr #:symb - #:sbq-reader - #:rs-find-dll + #:sbq-reader) + ;; rs.lisp + (:export + #:*cargo-target* + #:*rs-macros* #:rs-defmacro #:rs-macroexpand-1 #:rs-macroexpand) ;; ffi.lisp - ;; (:export) - ) + (:export + #:quiche-lib-path + #:rocksdb-lib-path + #:demo-lib-path + #:find-rs-cdylib + #:install-demo-lib + #:install-quiche-lib + #:install-rocksdb-lib)) diff -r c520966de7fa -r 1fedeaa5bfc5 rs.lisp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rs.lisp Fri May 19 22:38:49 2023 -0400 @@ -0,0 +1,70 @@ +;;; RUST DSL +(in-package :demo) + +(defvar *cargo-target* #p"/Users/ellis/dev/otom8/demo/target/") +(defvar *rs-macros* nil) + +(defun rs-mod-form (crate &optional mods pub) + "Generate a basic mod form (CRATE . [MODS] [PUB])" + `(,crate ,mods ,pub)) + +(defmacro with-rs-env (imports &body body) + "Generate an environment for use within a Rust generator macro." + `(let ((imports ,(mapcar #'rs-mod-form imports))) + (format nil "~A~&~A" imports ',body))) + +(defun rs-use (crate &optional mods pub) + "Generate a single Rust use statement." + (concatenate + 'string + (if pub "pub " "") + "use " crate "::{" + (cond + ((consp mods) + (reduce + (lambda (x y) (format nil "~A,~A" x y)) + mods)) + (t mods)) + "};")) + +(defun rs-mod (mod &optional pub) + "Generate a single Rust mod statement." + (concatenate + 'string + (if pub "pub " "") + "mod " mod ";")) + +(defun rs-imports (&rest imports) + "Generate a string of Rust 'use' statements." + (cond + ((consp imports) + (mapcar (lambda (x) (apply #'rs-use (apply #'rs-mod-form x))) imports)) + (t imports))) + +(defmacro rs-extern-c-fn (name args &optional pub unsafe no-mangle &body body) + "Generate a Rust extern 'C' fn." + `(concatenate + 'string + ,(when no-mangle (format nil "#[no_mangle]~&")) + ,(when pub "pub ") + ,(when unsafe "unsafe ") + "extern \"C\" fn " ,name "(" + ,(cond + ((consp args) (reduce (lambda (x y) (format nil "~A,~A" x y)) args)) + (t args)) + ")" "{" ,@body "}")) + +(defun rs-obj-impl (obj) + "Implement Objective for give OBJ." + (format nil "impl Objective for ~A {};" obj)) + +;; (defun rs-macroexpand-1 (form &optional env)) + +;; (defun rs-macroexpand (env &rest body) +;; "Cbindgen is quite the menace and really doesn't like our macros used +;; to generate C FFI bindings. To compensate for this, we use a tool +;; called cargo-expand by the most excellent dtolnay which expands Rust +;; macros. The expansions are assembled into an equivalent Rust source +;; file which cbindgen won't get stuck in an infinite compile loop on.") + +;;; diff -r c520966de7fa -r 1fedeaa5bfc5 scripts/build.ros --- a/scripts/build.ros Mon May 15 21:40:24 2023 -0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,23 +0,0 @@ -#!/bin/sh -#|-*- mode:lisp -*-|# -#| -exec ros -Q -- $0 "$@" -|# -(progn ;;init forms - (ros:ensure-asdf) - #+quicklisp(ql:quickload '() :silent t) - ) - -(defpackage :ros.script.build.3891893519 - (:use :cl)) -(in-package :ros.script.build.3891893519) - -(defun main (&rest argv) - (declare (ignorable argv)) - (write-line "> cargo build --release") - (uiop:run-program "cargo build --release") - (wrie-line " built rust libs and bindings") - (asdf:load-asd "cl-demo.asd") - (asdf:load-system "demo") - (asdf:make :demo)) -;;; vim: set ft=lisp lisp: diff -r c520966de7fa -r 1fedeaa5bfc5 scripts/clean.ros --- a/scripts/clean.ros Mon May 15 21:40:24 2023 -0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,23 +0,0 @@ -#!/bin/sh -#|-*- mode:lisp -*-|# -#| -exec ros -Q -- $0 "$@" ; -|# - -;; clean:;rm -rf out *.fasl;pushd rust;cargo clean;popd - -(progn ;;init forms - (ros:ensure-asdf) - #+quicklisp(ql:quickload '() :silent t) - ) - -(defpackage :ros.script.clean.3891893753 - (:use :cl)) -(in-package :ros.script.clean.3891893753) - -(defun main (&rest argv) - (declare (ignorable argv)) - (write-line "> cargo clean") - (uiop:run-program "cargo clean") - (write-line " cleaned rust crates")) -;;; vim: set ft=lisp lisp: diff -r c520966de7fa -r 1fedeaa5bfc5 scripts/docs.ros --- a/scripts/docs.ros Mon May 15 21:40:24 2023 -0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,14 +0,0 @@ -#!/bin/sh -#|-*- mode:lisp -*-|# -#| -exec ros -Q -- $0 "$@" -|# -(progn ;;init forms - (ros:ensure-asdf) - #+quicklisp(ql:quickload '() :silent t)) - -(defun main (&rest argv) - (declare (ignorable argv)) - (write-line "> cargo doc") - (uiop:run-program "cargo doc") - (write-line " generated rust documentation")) diff -r c520966de7fa -r 1fedeaa5bfc5 scripts/fmt.ros --- a/scripts/fmt.ros Mon May 15 21:40:24 2023 -0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,20 +0,0 @@ -#!/bin/sh -#|-*- mode:lisp -*-|# -#| -exec ros -Q -- $0 "$@" -|# -(progn ;;init forms - (ros:ensure-asdf) - #+quicklisp(ql:quickload '() :silent t) - ) - -(defpackage :ros.script.build.3891893519 - (:use :cl)) -(in-package :ros.script.build.3891893519) - -(defun main (&rest argv) - (declare (ignorable argv)) - (write-line "> cargo fmt") - (uiop:run-program "cargo fmt") - (write-line " formatted rust code")) -;;; vim: set ft=lisp lisp: diff -r c520966de7fa -r 1fedeaa5bfc5 tk.lisp --- a/tk.lisp Mon May 15 21:40:24 2023 -0400 +++ b/tk.lisp Fri May 19 22:38:49 2023 -0400 @@ -1,9 +1,5 @@ (in-package :demo) -(defvar *cargo-target* #p"/Users/ellis/dev/otom8/demo/target/") - -(defvar *rs-macros* nil) - (defun mkstr (&rest args) (with-output-to-string (s) (dolist (a args) (princ a s)))) @@ -30,80 +26,3 @@ (eval-when (:execute) (set-dispatch-macro-character #\# #\` #'demo:sbq-reader)) - -;;; RUST MACROS -(defmacro rs-find-dll (name &optional debug) - "Find the rust dll specified by NAME." - (cond - ((uiop:directory-exists-p (merge-pathnames *cargo-target* "release")) - `,(mkstr "./target/release/" name)) - ((uiop:directory-exists-p (merge-pathnames *cargo-target* "debug")) - `,(mkstr "./target/debug/" name)) - (t `(progn - ,(uiop:run-program '("cargo" "build" (unless debug "--release")) :output t) - (rs-find-dll ,name ,debug))))) - -(defun rs-mod-form (crate &optional mods pub) - "Generate a basic mod form (CRATE . [MODS] [PUB])" - `(,crate ,mods ,pub)) - -(defmacro with-rs-env (imports &body body) - "Generate an environment for use within a Rust generator macro." - `(let ((imports ,(mapcar #'rs-mod-form imports))) - (format nil "~A~&~A" imports ',body))) - -(defun rs-use (crate &optional mods pub) - "Generate a single Rust use statement." - (concatenate - 'string - (if pub "pub " "") - "use " crate "::{" - (cond - ((consp mods) - (reduce - (lambda (x y) (format nil "~A,~A" x y)) - mods)) - (t mods)) - "};")) - -(defun rs-mod (mod &optional pub) - "Generate a single Rust mod statement." - (concatenate - 'string - (if pub "pub " "") - "mod " mod ";")) - -(defun rs-imports (&rest imports) - "Generate a string of Rust 'use' statements." - (cond - ((consp imports) - (mapcar (lambda (x) (apply #'rs-use (apply #'rs-mod-form x))) imports)) - (t imports))) - -(defmacro rs-extern-c-fn (name args &optional pub unsafe no-mangle &body body) - "Generate a Rust extern 'C' fn." - `(concatenate - 'string - ,(when no-mangle (format nil "#[no_mangle]~&")) - ,(when pub "pub ") - ,(when unsafe "unsafe ") - "extern \"C\" fn " ,name "(" - ,(cond - ((consp args) (reduce (lambda (x y) (format nil "~A,~A" x y)) args)) - (t args)) - ")" "{" ,@body "}")) - -(defun rs-obj-impl (obj) - "Implement Objective for give OBJ." - (format nil "impl Objective for ~A {};" obj)) - -;; (defun rs-macroexpand-1 (form &optional env)) - -;; (defun rs-macroexpand (env &rest body) -;; "Cbindgen is quite the menace and really doesn't like our macros used -;; to generate C FFI bindings. To compensate for this, we use a tool -;; called cargo-expand by the most excellent dtolnay which expands Rust -;; macros. The expansions are assembled into an equivalent Rust source -;; file which cbindgen won't get stuck in an infinite compile loop on.") - -;;;