Looks great. A few minor nits and a larger issue.
Minor nits: * dangling ( at end of line, not in style * in the initialize-instance, I would still catch the :lisp-files and assert that it's null. That's protecting against people using it outside ECL (even on ECL, I'd like to get rid of it, but oh well — if people need something like that, the right thing is declare a component that has the proper input and/or output files. * in argv0, remove mkcl from comment about unsupported lisps. * you seem to have uncovered a bug in the untested prebuilt-system functionality it that is not for mkcl only. I tried to fix those bugs, please see 3.1.0.96. Also includes fix to image-op and a test of image-op in test-program.script. If you care about prebuilt-system, can you add tests for it in test-bundle and/or test-program?
Major issue: I think the way you special-case the hello-world example is defeating part of the point of the exercise. The point is that there should be a portable way to build executables on *all* supported lisps with the same defsystem, automatically calling the entry-point, etc.
That's why on ECL I need this uiop-library-file, to make sure UIOP is loaded, so we can call restore-image. That's also why create-image does the epilogue processing for you. I actually encourage you to reuse the create-image abstraction as is on MKCL, replacing the apply 'c::builder kind by an apply 'c::build-program and/or an apply (ecase kind ...) or an (ecase kind ...).
You need to download the lisp-invocation library. It includes an entry for MKCL that is copied over from ECL; if things have diverged, please send me a fix. While we're at it, please test cl-launch too if you have time: in the cl-launch repository, run ./cl-launch.sh -l mkcl -B tests.
—♯ƒ • François-René ÐVB Rideau •Reflection&Cybernethics• http://fare.tunes.org The most urgent, is not that Government should teach, but that it should let teach. All monopolies are despicable, but the worst of them all, is the monopoly on education. — F. Bastiat