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