I have the following directory structure:
my-project/
├── my-project.asd
├── package.lisp # defpackage.
├── utils.lisp # Functions used by main.lisp.
└── main.lisp # Main program.
my-project.asd
:
(defsystem "my-project"
:components ((:file "package")
(:file "utils")
(:file "main")))
package.lisp
:
(defpackage :com.example
(:use :cl))
utils.lisp
:
(in-package :com.example)
(defun double (x)
(* x 2))
main.lisp
:
(in-package :com.example)
(format t "~a" (double 3))
The problem is: how do I compile and run main.lisp
using ASDF?
I was able to compile and run the program by:
$ mv my-project ~/common-lisp/.
$ sbcl
* (require :asdf)
* (asdf:load-system :my-project)
However, this is incredibly silly. I do not want to move my project into ~/common-lisp/
just to run it. I want to compile and run the program right from the project directory itself. The my-project/
directory could be anywhere, and I want it to be possible to be placed anywhere. In other words, I would like to load the system from the current directory.
Think of make
, where I can compile files right from the directory of the Makefile
itself. How do I similarly compile and run a Common Lisp program from the directory of the *.asd
file itself?
(I am using SBCL version 1.4.5 and ASDF version 3.3.1)
I found that it is possible to do the following:
Note:
(require "asdf")
is the recommended way to load ASDF, according to the "Loading ASDF" section of the ASDF manual.asdf:load-asd
must be an absolute path and might not fail with any error when the path given to it is incorrect (!), so make sure that the given absolute path is correct.Using
cl:load
instead ofasdf:load-asd
might also appear to work, but the ASDF manual explicitly warns against this practice: