OUTDIR := public/packages define GUILE_MODULE (use-modules (ice-9 rdelim) (ice-9 ports) (ice-9 regex)) (define (convert-version version) (string-join (map (compose number->string string->number) (string-split version #\.)) ".")) (define (get-multifile-module-version module-name) (call-with-input-file (format #f "~a/~a.el" module-name module-name) (lambda (p) (let loop ((line (read-line p))) (if (eof-object? line) "Not found!" (let ((m (string-match "^;; Version: (.*)" line))) (if m (format #f "~a-~a.tar" module-name (convert-version (match:substring m 1))) (loop (read-line p))))))))) (define (get-module-version module-name) (call-with-input-file (format #f "~a.el" module-name) (lambda (p) (let loop ((line (read-line p))) (if (eof-object? line) "Not found!" (let ((m (string-match "^;; Version: (.*)" line))) (if m (format #f "~a-~a.el" module-name (convert-version (match:substring m 1))) (loop (read-line p))))))))) endef $(guile $(GUILE_MODULE)) define upload = emacs --quick --batch \ --eval "(setq package-user-dir \"local-elpa/\")" \ --load oni-package.el \ --funcall package-initialize \ --eval "(let ((package-archive-upload-base \"$(OUTDIR)/\")) \ (mkdir package-archive-upload-base t) \ (package-upload-file $1))" endef define upload-multi-file = $(call upload,(car (sort (file-expand-wildcards \"$1/dist/*.tar\") #'string>))) endef package: \ $(OUTDIR)/$(guile (get-module-version "oni-alert")) \ $(OUTDIR)/$(guile (get-module-version "oni-autohotkey")) \ $(OUTDIR)/$(guile (get-module-version "oni-bat")) \ $(OUTDIR)/$(guile (get-module-version "oni-bats")) \ $(OUTDIR)/$(guile (get-module-version "oni-bookmark")) \ $(OUTDIR)/$(guile (get-module-version "oni-browse-url")) \ $(OUTDIR)/$(guile (get-module-version "oni-c")) \ $(OUTDIR)/$(guile (get-module-version "oni-circe")) \ $(OUTDIR)/$(guile (get-module-version "oni-clojure")) \ $(OUTDIR)/$(guile (get-module-version "oni-cmake")) \ $(OUTDIR)/$(guile (get-module-version "oni-common-lisp")) \ $(OUTDIR)/$(guile (get-module-version "oni-company")) \ $(OUTDIR)/$(guile (get-module-version "oni-compilation")) \ $(OUTDIR)/$(guile (get-module-version "oni-conf")) \ $(OUTDIR)/$(guile (get-module-version "oni-core")) \ $(OUTDIR)/$(guile (get-module-version "oni-corfu")) \ $(OUTDIR)/$(guile (get-module-version "oni-counsel")) \ $(OUTDIR)/$(guile (get-module-version "oni-cpp")) \ $(OUTDIR)/$(guile (get-module-version "oni-csharp")) \ $(OUTDIR)/$(guile (get-module-version "oni-css")) \ $(OUTDIR)/$(guile (get-module-version "oni-data-dir")) \ $(OUTDIR)/$(guile (get-module-version "oni-diff-hl")) \ $(OUTDIR)/$(guile (get-module-version "oni-dired")) \ $(OUTDIR)/$(guile (get-module-version "oni-docker")) \ $(OUTDIR)/$(guile (get-module-version "oni-ediff")) \ $(OUTDIR)/$(guile (get-module-version "oni-elfeed")) \ $(OUTDIR)/$(guile (get-module-version "oni-elisp")) \ $(OUTDIR)/$(guile (get-module-version "oni-elm")) \ $(OUTDIR)/$(guile (get-module-version "oni-embrace")) \ $(OUTDIR)/$(guile (get-module-version "oni-emms")) \ $(OUTDIR)/$(guile (get-module-version "oni-epub")) \ $(OUTDIR)/$(guile (get-module-version "oni-eshell")) \ $(OUTDIR)/$(guile (get-module-version "oni-eww")) \ $(OUTDIR)/$(guile (get-module-version "oni-fish")) \ $(OUTDIR)/$(guile (get-module-version "oni-flycheck")) \ $(OUTDIR)/$(guile (get-module-version "oni-git-commit")) \ $(OUTDIR)/$(guile (get-module-version "oni-gnus")) \ $(OUTDIR)/$(guile (get-module-version "oni-grep")) \ $(OUTDIR)/$(guile (get-module-version "oni-groovy")) \ $(OUTDIR)/$(guile (get-multifile-module-version "oni-gui")) \ $(OUTDIR)/$(guile (get-module-version "oni-haml")) \ $(OUTDIR)/$(guile (get-module-version "oni-haskell")) \ $(OUTDIR)/$(guile (get-module-version "oni-highlight-indent-guides")) \ $(OUTDIR)/$(guile (get-module-version "oni-html")) \ $(OUTDIR)/$(guile (get-module-version "oni-hydra")) \ $(OUTDIR)/$(guile (get-module-version "oni-ivy")) \ $(OUTDIR)/$(guile (get-module-version "oni-jabber")) \ $(OUTDIR)/$(guile (get-module-version "oni-java")) \ $(OUTDIR)/$(guile (get-module-version "oni-js")) \ $(OUTDIR)/$(guile (get-module-version "oni-json")) \ $(OUTDIR)/$(guile (get-module-version "oni-log-edit")) \ $(OUTDIR)/$(guile (get-module-version "oni-lsp")) \ $(OUTDIR)/$(guile (get-module-version "oni-lua")) \ $(OUTDIR)/$(guile (get-module-version "oni-lui")) \ $(OUTDIR)/$(guile (get-module-version "oni-magit")) \ $(OUTDIR)/$(guile (get-module-version "oni-makefile")) \ $(OUTDIR)/$(guile (get-module-version "oni-notmuch")) \ $(OUTDIR)/$(guile (get-module-version "oni-nxml")) \ $(OUTDIR)/$(guile (get-multifile-module-version "oni-org")) \ $(OUTDIR)/$(guile (get-module-version "oni-org-roam")) \ $(OUTDIR)/$(guile (get-module-version "oni-package")) \ $(OUTDIR)/$(guile (get-module-version "oni-paredit")) \ $(OUTDIR)/$(guile (get-multifile-module-version "oni-php")) \ $(OUTDIR)/$(guile (get-module-version "oni-powershell")) \ $(OUTDIR)/$(guile (get-module-version "oni-prescient")) \ $(OUTDIR)/$(guile (get-module-version "oni-projectile")) \ $(OUTDIR)/$(guile (get-module-version "oni-python")) \ $(OUTDIR)/$(guile (get-module-version "oni-ruby")) \ $(OUTDIR)/$(guile (get-module-version "oni-rust")) \ $(OUTDIR)/$(guile (get-module-version "oni-scheme")) \ $(OUTDIR)/$(guile (get-module-version "oni-shackle")) \ $(OUTDIR)/$(guile (get-module-version "oni-sh")) \ $(OUTDIR)/$(guile (get-module-version "oni-shr")) \ $(OUTDIR)/$(guile (get-module-version "oni-slack")) \ $(OUTDIR)/$(guile (get-module-version "oni-smartparens")) \ $(OUTDIR)/$(guile (get-module-version "oni-smt")) \ $(OUTDIR)/$(guile (get-module-version "oni-sort")) \ $(OUTDIR)/$(guile (get-module-version "oni-termux")) \ $(OUTDIR)/$(guile (get-module-version "oni-tramp")) \ $(OUTDIR)/$(guile (get-module-version "oni-tui")) \ $(OUTDIR)/$(guile (get-module-version "oni-twig")) \ $(OUTDIR)/$(guile (get-module-version "oni-ui")) \ $(OUTDIR)/$(guile (get-module-version "oni-vc")) \ $(OUTDIR)/$(guile (get-module-version "oni-vterm")) \ $(OUTDIR)/$(guile (get-module-version "oni-web")) \ $(OUTDIR)/$(guile (get-module-version "oni-yaml")) \ $(OUTDIR)/$(guile (get-multifile-module-version "oni-yasnippet")) cd public && tar cvzf emacs-config.tar.gz . clean: rm -rfv .eldev public find . -type d -name '.eldev' -exec rm -rv '{}' \; find . -type d -name 'dist' -exec rm -rv '{}' \; install-%: emacs --batch \ --load oni-package.el \ --funcall package-initialize \ --eval "(add-to-list 'package-archives '(\"test\" . \"$(TEST_ARCHIVE)\"))" \ --eval '(package-refresh-contents)' \ --eval "(package-install '$*)" unit-test-%: install-% emacs --batch \ --load oni-package.el \ --funcall package-initialize \ --load ert \ --load "test/$*-test.el" \ --eval "(setq ert-batch-backtrace-right-margin nil)" \ --funcall ert-run-tests-batch-and-exit integration-test-%: install-% bats test/integration/$*.bats ## Single-file packages $(OUTDIR)/$(guile (get-module-version "oni-smartparens")): oni-smartparens.el $(call upload,\"$<\") $(OUTDIR)/$(guile (get-module-version "oni-flycheck")): oni-flycheck.el $(call upload,\"$<\") $(OUTDIR)/$(guile (get-module-version "oni-sh")): oni-sh.el \ $(OUTDIR)/$(guile (get-module-version "oni-smartparens")) \ $(OUTDIR)/$(guile (get-module-version "oni-flycheck")) $(call upload,\"$<\") $(OUTDIR)/$(guile (get-module-version "oni-company")): oni-company.el \ $(OUTDIR)/$(guile (get-module-version "oni-prescient")) $(call upload,\"$<\") $(OUTDIR)/$(guile (get-module-version "oni-compilation")): oni-compilation.el $(call upload,\"$<\") $(OUTDIR)/$(guile (get-module-version "oni-conf")): oni-conf.el $(call upload,\"$<\") $(OUTDIR)/$(guile (get-module-version "oni-core")): oni-core.el $(call upload,\"$<\") $(OUTDIR)/$(guile (get-module-version "oni-corfu")): oni-corfu.el \ $(OUTDIR)/$(guile (get-module-version "oni-prescient")) $(call upload,\"$<\") $(OUTDIR)/$(guile (get-module-version "oni-counsel")): oni-counsel.el $(call upload,\"$<\") $(OUTDIR)/$(guile (get-module-version "oni-cpp")): oni-cpp.el $(call upload,\"$<\") $(OUTDIR)/$(guile (get-module-version "oni-csharp")): oni-csharp.el \ $(OUTDIR)/$(guile (get-module-version "oni-company")) \ $(OUTDIR)/$(guile (get-module-version "oni-flycheck")) \ $(OUTDIR)/$(guile (get-module-version "oni-hydra")) \ $(OUTDIR)/$(guile (get-module-version "oni-lsp")) \ $(OUTDIR)/$(guile (get-module-version "oni-smartparens")) $(call upload,\"$<\") $(OUTDIR)/$(guile (get-module-version "oni-css")): oni-css.el \ $(OUTDIR)/$(guile (get-module-version "oni-company")) \ $(OUTDIR)/$(guile (get-module-version "oni-hydra")) $(call upload,\"$<\") $(OUTDIR)/$(guile (get-module-version "oni-prescient")): oni-prescient.el \ $(OUTDIR)/$(guile (get-module-version "oni-data-dir")) $(call upload,\"$<\") $(OUTDIR)/$(guile (get-module-version "oni-data-dir")): oni-data-dir.el $(call upload,\"$<\") $(OUTDIR)/$(guile (get-module-version "oni-diff-hl")): oni-diff-hl.el $(call upload,\"$<\") $(OUTDIR)/$(guile (get-module-version "oni-dired")): oni-dired.el $(call upload,\"$<\") $(OUTDIR)/$(guile (get-module-version "oni-docker")): oni-docker.el $(call upload,\"$<\") $(OUTDIR)/$(guile (get-module-version "oni-ediff")): oni-ediff.el $(call upload,\"$<\") $(OUTDIR)/$(guile (get-module-version "oni-elfeed")): oni-elfeed.el $(call upload,\"$<\") $(OUTDIR)/$(guile (get-module-version "oni-elisp")): oni-elisp.el \ $(OUTDIR)/$(guile (get-module-version "oni-flycheck")) \ $(OUTDIR)/$(guile (get-module-version "oni-company")) \ $(OUTDIR)/$(guile (get-module-version "oni-paredit")) \ $(OUTDIR)/$(guile (get-module-version "oni-hydra")) $(call upload,\"$<\") $(OUTDIR)/$(guile (get-module-version "oni-elm")): oni-elm.el $(call upload,\"$<\") $(OUTDIR)/$(guile (get-module-version "oni-embrace")): oni-embrace.el $(call upload,\"$<\") $(OUTDIR)/$(guile (get-module-version "oni-emms")): oni-emms.el $(call upload,\"$<\") $(OUTDIR)/$(guile (get-module-version "oni-epub")): oni-epub.el $(call upload,\"$<\") $(OUTDIR)/$(guile (get-module-version "oni-eshell")): oni-eshell.el $(call upload,\"$<\") $(OUTDIR)/$(guile (get-module-version "oni-eww")): oni-eww.el $(call upload,\"$<\") $(OUTDIR)/$(guile (get-module-version "oni-fish")): oni-fish.el $(call upload,\"$<\") $(OUTDIR)/$(guile (get-module-version "oni-git-commit")): oni-git-commit.el $(call upload,\"$<\") $(OUTDIR)/$(guile (get-module-version "oni-gnus")): oni-gnus.el $(call upload,\"$<\") $(OUTDIR)/$(guile (get-module-version "oni-grep")): oni-grep.el $(call upload,\"$<\") $(OUTDIR)/$(guile (get-module-version "oni-groovy")): oni-groovy.el $(call upload,\"$<\") $(OUTDIR)/$(guile (get-module-version "oni-haml")): oni-haml.el $(call upload,\"$<\") $(OUTDIR)/$(guile (get-module-version "oni-haskell")): oni-haskell.el $(call upload,\"$<\") $(OUTDIR)/$(guile (get-module-version "oni-highlight-indent-guides")): oni-highlight-indent-guides.el $(call upload,\"$<\") $(OUTDIR)/$(guile (get-module-version "oni-html")): oni-html.el $(call upload,\"$<\") $(OUTDIR)/$(guile (get-module-version "oni-hydra")): oni-hydra.el $(call upload,\"$<\") $(OUTDIR)/$(guile (get-module-version "oni-ivy")): oni-ivy.el $(call upload,\"$<\") $(OUTDIR)/$(guile (get-module-version "oni-jabber")): oni-jabber.el $(call upload,\"$<\") $(OUTDIR)/$(guile (get-module-version "oni-java")): oni-java.el $(call upload,\"$<\") $(OUTDIR)/$(guile (get-module-version "oni-js")): oni-js.el $(call upload,\"$<\") $(OUTDIR)/$(guile (get-module-version "oni-json")): oni-json.el $(call upload,\"$<\") $(OUTDIR)/$(guile (get-module-version "oni-log-edit")): oni-log-edit.el $(call upload,\"$<\") $(OUTDIR)/$(guile (get-module-version "oni-lsp")): oni-lsp.el $(call upload,\"$<\") $(OUTDIR)/$(guile (get-module-version "oni-lua")): oni-lua.el $(call upload,\"$<\") $(OUTDIR)/$(guile (get-module-version "oni-lui")): oni-lui.el $(call upload,\"$<\") $(OUTDIR)/$(guile (get-module-version "oni-magit")): oni-magit.el $(call upload,\"$<\") $(OUTDIR)/$(guile (get-module-version "oni-makefile")): oni-makefile.el $(call upload,\"$<\") $(OUTDIR)/$(guile (get-module-version "oni-notmuch")): oni-notmuch.el $(call upload,\"$<\") $(OUTDIR)/$(guile (get-module-version "oni-nxml")): oni-nxml.el $(call upload,\"$<\") $(OUTDIR)/$(guile (get-module-version "oni-org-roam")): oni-org-roam.el $(call upload,\"$<\") $(OUTDIR)/$(guile (get-module-version "oni-package")): oni-package.el $(call upload,\"$<\") $(OUTDIR)/$(guile (get-module-version "oni-paredit")): oni-paredit.el $(call upload,\"$<\") $(OUTDIR)/$(guile (get-module-version "oni-powershell")): oni-powershell.el $(call upload,\"$<\") $(OUTDIR)/$(guile (get-module-version "oni-projectile")): oni-projectile.el $(call upload,\"$<\") $(OUTDIR)/$(guile (get-module-version "oni-python")): oni-python.el \ $(OUTDIR)/$(guile (get-module-version "oni-company")) \ $(OUTDIR)/$(guile (get-module-version "oni-flycheck")) \ $(OUTDIR)/$(guile (get-module-version "oni-hydra")) \ $(OUTDIR)/$(guile (get-module-version "oni-lsp")) $(call upload,\"$<\") $(OUTDIR)/$(guile (get-module-version "oni-ruby")): oni-ruby.el $(call upload,\"$<\") $(OUTDIR)/$(guile (get-module-version "oni-rust")): oni-rust.el $(call upload,\"$<\") $(OUTDIR)/$(guile (get-module-version "oni-scheme")): oni-scheme.el $(call upload,\"$<\") $(OUTDIR)/$(guile (get-module-version "oni-shackle")): oni-shackle.el $(call upload,\"$<\") $(OUTDIR)/$(guile (get-module-version "oni-shr")): oni-shr.el $(call upload,\"$<\") $(OUTDIR)/$(guile (get-module-version "oni-slack")): oni-slack.el $(call upload,\"$<\") $(OUTDIR)/$(guile (get-module-version "oni-smt")): oni-smt.el $(call upload,\"$<\") $(OUTDIR)/$(guile (get-module-version "oni-sort")): oni-sort.el $(call upload,\"$<\") $(OUTDIR)/$(guile (get-module-version "oni-termux")): oni-termux.el $(call upload,\"$<\") $(OUTDIR)/$(guile (get-module-version "oni-tramp")): oni-tramp.el $(call upload,\"$<\") $(OUTDIR)/$(guile (get-module-version "oni-tui")): oni-tui.el $(call upload,\"$<\") $(OUTDIR)/$(guile (get-module-version "oni-twig")): oni-twig.el $(call upload,\"$<\") $(OUTDIR)/$(guile (get-module-version "oni-ui")): oni-ui.el $(call upload,\"$<\") $(OUTDIR)/$(guile (get-module-version "oni-vc")): oni-vc.el $(call upload,\"$<\") $(OUTDIR)/$(guile (get-module-version "oni-vterm")): oni-vterm.el $(call upload,\"$<\") $(OUTDIR)/$(guile (get-module-version "oni-web")): oni-web.el $(call upload,\"$<\") $(OUTDIR)/$(guile (get-module-version "oni-yaml")): oni-yaml.el $(call upload,\"$<\") $(OUTDIR)/$(guile (get-module-version "oni-alert")): oni-alert.el $(call upload,\"$<\") $(OUTDIR)/$(guile (get-module-version "oni-autohotkey")): oni-autohotkey.el $(call upload,\"$<\") $(OUTDIR)/$(guile (get-module-version "oni-bat")): oni-bat.el $(call upload,\"$<\") $(OUTDIR)/$(guile (get-module-version "oni-bats")): oni-bats.el \ $(OUTDIR)/$(guile (get-module-version "oni-sh")) $(call upload,\"$<\") $(OUTDIR)/$(guile (get-module-version "oni-bookmark")): oni-bookmark.el $(call upload,\"$<\") $(OUTDIR)/$(guile (get-module-version "oni-browse-url")): oni-browse-url.el $(call upload,\"$<\") $(OUTDIR)/$(guile (get-module-version "oni-c")): oni-c.el $(call upload,\"$<\") $(OUTDIR)/$(guile (get-module-version "oni-circe")): oni-circe.el $(call upload,\"$<\") $(OUTDIR)/$(guile (get-module-version "oni-clojure")): oni-clojure.el $(call upload,\"$<\") $(OUTDIR)/$(guile (get-module-version "oni-cmake")): oni-cmake.el $(call upload,\"$<\") $(OUTDIR)/$(guile (get-module-version "oni-common-lisp")): oni-common-lisp.el $(call upload,\"$<\") ## oni-gui oni-gui/dist/$(guile (get-multifile-module-version "oni-gui")): \ oni-gui/oni-gui.el \ $(OUTDIR)/$(guile (get-module-version "oni-ui")) cd oni-gui && eldev package $(OUTDIR)/$(guile (get-multifile-module-version "oni-gui")): \ oni-gui/dist/$(guile (get-multifile-module-version "oni-gui")) $(call upload-multi-file,oni-gui) ## oni-org oni-org/dist/$(guile (get-multifile-module-version "oni-org")): \ oni-org/oni-org.el \ $(OUTDIR)/$(guile (get-module-version "oni-alert")) \ $(OUTDIR)/$(guile (get-module-version "oni-hydra")) cd oni-org && eldev package $(OUTDIR)/$(guile (get-multifile-module-version "oni-org")): \ oni-org/dist/$(guile (get-multifile-module-version "oni-org")) $(call upload-multi-file,oni-org) ## oni-php oni-php/dist/$(guile (get-multifile-module-version "oni-php")): \ oni-php/oni-php.el \ $(OUTDIR)/$(guile (get-module-version "oni-flycheck")) \ $(OUTDIR)/$(guile (get-module-version "oni-prescient")) \ $(OUTDIR)/$(guile (get-module-version "oni-data-dir")) \ $(OUTDIR)/$(guile (get-module-version "oni-hydra")) \ $(OUTDIR)/$(guile (get-module-version "oni-corfu")) cd oni-php && eldev package $(OUTDIR)/$(guile (get-multifile-module-version "oni-php")): \ oni-php/dist/$(guile (get-multifile-module-version "oni-php")) $(call upload-multi-file,oni-php) ## oni-yasnippet oni-yasnippet/dist/$(guile (get-multifile-module-version "oni-yasnippet")): \ oni-yasnippet/oni-yasnippet.el cd oni-yasnippet && eldev package $(OUTDIR)/$(guile (get-multifile-module-version "oni-yasnippet")): \ oni-yasnippet/dist/$(guile (get-multifile-module-version "oni-yasnippet")) $(call upload-multi-file,oni-yasnippet)