mirror of
https://github.com/kanaka/mal.git
synced 2024-08-17 09:40:21 +03:00
The update from ubuntu:vivid to ubuntu:20.04 update the version of sbcl from 1.2.4.debian to 2.0.1.debian. This resulted in the cl-launch based build process no longer working: dependencies were not resolved (but running it several times would eventually resolve them. So use an sbcl build command directly when building for sbcl. Note: updating the image to ubuntu:24.04 upgrades the version of sbcl to 2.2.9.debian. Something about that version breaks how we do hash-maps. They become temperamental: hash-map creation often results in a nil object returned and doing (get hm key) usually results in nil returned even if the key shows as being present.
71 lines
3.1 KiB
Makefile
71 lines
3.1 KiB
Makefile
# Helper functions
|
|
define record_lisp
|
|
$(shell (test -f "hist/$(1)_impl" && grep -q $(2) "hist/$(1)_impl") || echo $(2) > "hist/$(1)_impl")
|
|
endef
|
|
|
|
define steps
|
|
$(if $(MAKECMDGOALS),\
|
|
$(if $(findstring all,$(MAKECMDGOALS)),\
|
|
stepA_mal,\
|
|
$(filter step%, $(MAKECMDGOALS))),\
|
|
stepA_mal)
|
|
endef
|
|
|
|
LISP ?= sbcl
|
|
ABCL ?= abcl
|
|
MKCL ?= mkcl
|
|
|
|
BINS = step0_repl step1_read_print step2_eval step3_env step4_if_fn_do \
|
|
step5_tco step6_file step7_quote step8_macros step9_try stepA_mal
|
|
|
|
# TODO: In theory cl-launch should be able to build standalone executable using
|
|
# MKCL unfortunately the executable crashes on startup
|
|
STANDALONE_EXE = sbcl clisp ccl ecl cmucl
|
|
|
|
ROOT_DIR := $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST))))
|
|
|
|
# Record the Common Lisp implementation used for all steps built in this
|
|
# invocation This is used in the targets to rebuild the step if the
|
|
# implementation changes
|
|
$(foreach step, $(call steps), $(call record_lisp,$(patsubst step%,%,$(step)),$(LISP)))
|
|
|
|
.PRECIOUS: hist/%_impl
|
|
|
|
all : $(BINS)
|
|
|
|
hist/%_impl: ;
|
|
|
|
# CL_LAUNCH_VERSION is only defined while building it. We change to the
|
|
# directory of the CL_LAUNCH_FILE in --wrap script so that the script can find the dumped
|
|
# image even if invoked from some directory different from where it
|
|
# currently resides
|
|
step% : src/step%.lisp src/utils.lisp src/types.lisp src/env.lisp src/printer.lisp src/reader.lisp src/core.lisp hist/%_impl
|
|
|
|
ifeq ($(LISP),clisp)
|
|
@echo "=============================================================="
|
|
@echo "WARNING: This build might fail since GNU Clisp does not have bundled version of asdf (yet)"
|
|
@echo "Please do something like below to make it work"
|
|
@echo "(mkdir -p ~/common-lisp/ && cd ~/common-lisp && git clone -b release https://gitlab.common-lisp.net/asdf/asdf.git && cd asdf && make)"
|
|
@echo "=============================================================="
|
|
endif
|
|
|
|
ifneq ($(filter $(LISP),$(STANDALONE_EXE)),)
|
|
sbcl --eval '(load "~/quicklisp/setup.lisp")' --eval '(asdf:initialize-source-registry `(:source-registry (:tree "$(ROOT_DIR)") :inherit-configuration))' --eval '(ql:quickload :uiop)' --eval '(ql:quickload :cl-readline)' --eval '(ql:quickload :genhash)' --eval '(asdf:load-system "$@")' --eval '(asdf:operate :build-op "$@")' --eval "(save-lisp-and-die \"$@\" :executable t :toplevel #'(lambda () (mal:main)))" --quit
|
|
else ifeq ($(LISP),abcl)
|
|
echo -n '#!/bin/sh\ncd `dirname $$0` ; $(ABCL) --noinform --noinit --nosystem --load run-abcl.lisp -- $@ $$@' > $@
|
|
chmod +x $@
|
|
else ifeq ($(LISP),mkcl)
|
|
$(MKCL) -eval '(progn (require "asdf") (push *default-pathname-defaults* asdf:*central-registry*) (asdf:load-system "$@") (quit))'
|
|
echo -n '#!/bin/sh\ncd `dirname $$0` ; $(MKCL) -q -load run-mkcl.lisp -- $@ $$@' > $@
|
|
chmod +x $@
|
|
else ifeq ($(LISP),allegro)
|
|
cl-launch --wrap 'if [ -z "$$CL_LAUNCH_VERSION" ] ; then cd "$$(dirname $$CL_LAUNCH_FILE)" ; fi' --verbose --lisp $(LISP) --source-registry $(ROOT_DIR) --system $@ --dump images/$@.$(LISP).image -o $@ --entry 'mal:main'
|
|
else
|
|
@echo "Unsupported Lisp implementation $(LISP)"
|
|
@exit 1
|
|
endif
|
|
|
|
clean:
|
|
find . -maxdepth 1 -name 'step*' -executable -delete
|
|
rm -f *.lib *.fas[l] images/* hist/*_impl
|