embedding ecl without (build-program)

Daniel Kochmański daniel at turtleware.eu
Mon Feb 29 14:28:55 UTC 2016

Thanks for the information how you have resolved the issue. As far as I
see in the code, compile-file shouldn't delete files, if the names were

(to-delete (nconc (unless c-file (list c-pathname))
                  (unless h-file (list h-pathname))
                  (unless data-file (list data-pathname))))

I would much appreciate, if you could submit this proposal as a feature
request on the gitlab.com/embeddable-common-lisp/ecl/issues with the
description of the interface and expected result and an example of the
expected output (may be a pseudo-code of course). It will simplify
things for me greatly.


Juraj Variny writes:

> In the end have hacked it together using c:build-static-library, which leaves 
> things to be desired:
> (let ((compiler::*USER-CC-FLAGS* "-I... put here $CFLAGS from the build 
> system....")
>     (compiler::*USER-LD-FLAGS* "... put here $LDFLAGS from the build system... 
> ")
>     (objfile (compile-file "src/common/lisp/lispinterface" :system-p t)))
>     (print objfile)
>     (print (c:build-static-library "lispinterface" :lisp-files (list objfile) 
> :init-name "lispinterface_INIT")))
> For example the CFLAGS and LDFLAGS must be synchronized with the build system 
> somehow. The resulting liblispinterface.a must be added to linker for whole 
> project. Rest of the application then calls only cl_boot and 
> lispinterface_INIT like:
> cl_object the_block = read_VV(OBJNULL, lispinterface_INIT);
> So I'd still like to see ECL function that would do above but only generate 
> all C/C++ output file(s) without compiling. 
> Currently it's possible only when you specify output for compile-file, (setf 
> c::*delete-files* nil) and fish C files out from /tmp.
> Regards,
> Juraj
> On Monday 29 February 2016 13:28:09 you wrote:
>> Hello,
>> Juraj Variny writes:
>> > Hello,
>> > 
>> > Is there is a way for ECL only to generate a bunch of .cpp files that can
>> > be fed to existing build system? I'm halfway there by generating C from
>> > my (ffi:c-inline) stuff like:
>> > 
>> > (compile-file "src/common/lisp/lispinterface.lisp" :output-file
>> > "src/common/lisp/lispinterface.cpp").
>> generally that's how it's done (generating the C files).
>> > But how do I initialize it on app startup? Looks like
>> > 
>> > void init_fas_CODE(cl_object flag)
>> > 
>> > should be called, but with what parameters?
>> I'm afraid that it won't work the way you want it to run. Standalone
>> executables (and the shared libraries), still require libecl to run
>> (linked either dynamically or statically, note however that static
>> linkage results in covering code you link with with LGPLv2).
>> > Some background: I am trying to embed ECL in a big C++ app with its own
>> > byzantine build system (ftjam with own layer on top of it). These C++
>> > functions I am interfacing are not exposed externally (and I prefer not
>> > to), thus trying to load .fas file at runtime results in linker error.
>> > Also, I can't use (build-program) which won't work together with the
>> > build system.
>> > 
>> > However, if (build-program) knows how to neatly pack whole initialization
>> > into one C function, that would solve the problem, too.
>> As already said, C code requires ECL runtime (library). Path I would
>> suggest would be linking ECL dynamically (providing .so file or .dll
>> depending on platform), and loading the code in built FAS file with the
>> ECL's si_load_binary.
>> Note, that if you don't change the platform nor the ECL, you may
>> precompile FAS and load them at your convenience later.
>> > Regards,
>> > 
>> > Juraj
>> Best regards,
>> Daniel

Daniel Kochmański ;; aka jackdaniel | Poznań, Poland
TurtleWare - Daniel Kochmański      | www.turtleware.eu

"Be the change that you wish to see in the world." - Mahatma Gandhi

More information about the ecl-devel mailing list