Compiling a binary that uses quicklisp

Brandon Hale bthaleproductions at gmail.com
Fri Feb 10 23:37:04 UTC 2023


Wow, thank you so much for figuring all of that out. I tried to make the changes you suggested, and I'm still running into errors, but I'm not sure I have the exact version of str that you do, so I imagine that is the reason. I was able to make a build with a different package ("vector") and it worked fine. Who would have guessed it was a package I was using?

I think I will talk to the str developers upstream and let them know ecl won't MAKE-BUILD with it. In the meantime, I may implement the functions I used from str myself, or embed a source code file from str with just the functions I need, depending on the license of str.

Thank you very much for your help,
Brandon Hale

On 2/10/23 14:36, Daniel Kochmański wrote:
> I think that you should not call quickload in the package file. ASDF should solve depenencies based on a sole (ql:quickload 'cl-i3).
> 
> I've tried to reproduce your issue and I've succeeded. After quick investigation it seems that the system cl-str expects that its
> source code will be available to asdf at any time (even after the compilation). The offensive line is this:
> 
> cl-str-20221106-git/str.lisp:144:(defvar +version+ (asdf:component-version (asdf:find-system "str")))
> 
> Basically it is as if you were expecting that both make and linux source code are both available at startup.
> 
> If you replace this line to maintain some reasonable sanity it will look like this:
> (defvar +version+ #.(asdf:component-version (asdf:find-system "str")))
> 
> Another issue with this system is that it does not declare dependencies on "uiop" and "asdf" despite using both. str.asd
> should have
> 
> :depends-on (:cl-ppcre
>                :cl-ppcre-unicode
>                :cl-change-case
>                "asdf"
>                "uiop")
> 
> note the last two lines. With that the following builds and runs without a hitch:
> 
> brandon.asd:
> (in-package #:asdf-user)
> (asdf:defsystem "brandon"
>   :name "brandon"
>   :depends-on ("str")
>   :components ((:file "main")))
> 
> main.lisp:
> (defpackage #:brandon
>   (:use #:cl))
> (in-package #:brandon)
> 
> (defun main (str)
>   (format t "Hello ~a!~%" str))
> 
> build.lisp (not part of the system):
> (in-package #:cl-user)
> 
> ;;; Make the system recognizable by ASDF
> (asdf:load-asd "brandon.asd")
> 
> ;;; Pull dependencies and load macros
> (asdf:load-system "brandon")
> 
> ;;; Build the program (shared object)
> (asdf:make-build "brandon" :type :program
>                            :move-here "./brandon.out")
> 
> (asdf:make-build "brandon" :type :program
>                            :monolithic t
>                            :move-here ".")
> 
> ----
> 
> note that if you don't want repl then probably you want to add (progn (main "HI") (ext:quit)) in the epilogue code.
> 
> Best regards,
> Daniel
> 
> p.s if you feel like it you may make issues in cl-str repository bugtracker.
> 
> --
> Daniel Kochmański ;; aka jackdaniel | Przemyśl, Poland
> TurtleWare - Daniel Kochmański      | www.turtleware.eu[http://www.turtleware.eu]
> 
> "Be the change that you wish to see in the world." - Mahatma Gandhi
> 
> 
> ------- Original Message -------
> On Friday, February 10th, 2023 at 20:02, Brandon Hale <bthaleproductions at gmail.com> wrote:
> 
>> Maybe I should get my project up in a repo, but it looks like I have the dependency listed. Here is my package's .asd named cl-i3.asd:
>> 
>> (asdf:defsystem #:cl-i3
>>   :name "cl-i3"
>>   :description "A replacement for i3status written in Common Lisp."
>>   :author "Brandon Hale <bthaleproductions at gmail.com>"
>>   :license "GPLv3"
>>   :version "1.0"
>>   :depends-on (#:cl-ansi-text #:trivial-battery #:str)
>>   :components ((:file "main")))
>> 
>> And the top portion of my main.lisp:
>> 
>> (ql:quickload :trivial-battery)
>> (ql:quickload :str)
>> ;; allows for colors to be printed
>> (ql:quickload :cl-ansi-text)
>> (defpackage :cl-i3
>>   (:use #:common-lisp))
>> 
>> I am definitely not an expert on Common Lisp packages, but this does load up in slime on my machine when I do a
>> 
>> (ql:quickload :cl-i3)
>> 
>> with ecl 21.2.1-3 from Arch Linux.
>> 
>> 
>> I need to look at the well-commented example again to see what I'm doing wrong methinks.
>> 
>> Brandon Hale
>> 
>> On 2/10/23 01:07, Daniel Kochmański wrote:
>>> Hello Brandon,
>>> 
>>> 
>>> ------- Original Message -------
>>> On Friday, February 10th, 2023 at 00:20, Brandon Hale <bthaleproductions at gmail.com> wrote:
>>> 
>>> 
>>>> Hello all,
>>>> 
>>>> I apologize if this is either the wrong place to get help with ecl, or if this is asked all of the time.
>>> this is the right place, don't worry :)
>>> 
>>> 
>>>> I've written a small replacement for i3status with common lisp and want to use ecl to make a binary so when i3wm loads, it just loads the cl-i3status binary. I've looked at the ecl documentation online and it suggests doing something like this:
>>>> 
>>>> (ql:quickload :cl-i3)
>>>> 
>>>> (asdf:make-build :cl-i3
>>>> 
>>>>                  :type :program
>>>> 
>>>>                  :move-here #P"/home/brandon/Programming/lisp/cl-i3/"
>>>> 
>>>>                  :prologue-code '(require 'asdf))
>>>> 
>>>> So, I run this and the binary appears. However, when I try to run it, I get this output:
>>>> 
>>>> ;;; Loading #P"/usr/lib/ecl-21.2.1/asdf.fas"
>>>> ;;; Computing Hangul syllable names
>>>> Condition of type: MISSING-COMPONENT
>>>> Component "str" not found
>>>> 
>>>> Available restarts:
>>>> 
>>>> 1. (RETRY) Retry ASDF operation.
>>>> 2. (CLEAR-CONFIGURATION-AND-RETRY) Retry ASDF operation after resetting the configuration.
>>>> 
>>>> Top level in: #<process TOP-LEVEL 0x557ade1c2f80>.
>>>>> 
>>>> I imagine it is just because of my use of quicklisp packages, but how do I compile the packages into the binary?
>>> this error message seems to suggest that you use a system "str" without declaring it in dependencies. In your
>>> project file my-project.asd add
>>> 
>>> (defsystem "my-project"
>>>   ...
>>>   :depends-on (... "str")
>>>   ...)
>>> 
>>> depending on what you want from your project you may not need (require 'asdf) in the prologue code. Also you
>>> may consider passing :monolithic t flag to make-build.
>>> 
>>> Make sure that you study well-commented example in ecl source repository under examples/asdf_with_dependence/.
>>> 
>>> Last but not least make sure that you use the latest release (currently it is 21.2.1) or a build from the branch
>>> "develop" if you are not afraid of cutting your self on the bleeding edge ;).
>>> 
>>> If none of these advises helps then please try to minimize the test case to the minimum (basically an asd system
>>> with a singly stub file and all dependencies you need) and make an issue ticket on gitlab
>>> 
>>> https://gitlab.com/embeddable-common-lisp/ecl/-/issues
>>> 
>>> mind that such action requires registration on the gitlab platform.
>>> 
>>>> Thank you very much for any help you can offer,
>>>> 
>>>> Brandon Hale
>>> Best regards,
>>> Daniel
>>> 
>>> -- 
>>> Daniel Kochmański ;; aka jackdaniel | Przemyśl, Poland
>>> TurtleWare - Daniel Kochmański      | www.turtleware.eu[http://www.turtleware.eu]
>>> 
>>> "Be the change that you wish to see in the world." - Mahatma Gandhi
>>> 
>  
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mailman.common-lisp.net/pipermail/ecl-devel/attachments/20230210/6dab61b4/attachment-0001.html>


More information about the ecl-devel mailing list