static-link.lisp - clic - Clic is an command line interactive client for gopher written in Common LISP
 (HTM) git clone git://bitreich.org/clic/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/clic/
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) Tags
 (DIR) README
 (DIR) LICENSE
       ---
       static-link.lisp (4750B)
       ---
            1 ;; FIXME: arrange packages so that this can be moved in ASDF some time later?
            2 
            3 (in-package #:cffi-toolchain)
            4 
            5 (defun static-ops-enabled-p ()
            6   (ensure-toolchain-parameters)
            7   (and (or *linkkit-start* *linkkit-end*) t))
            8 
            9 (defclass static-runtime-op (monolithic-bundle-op link-op selfward-operation) ()
           10   (:documentation "Create a Lisp runtime linkable library for the system and its dependencies."))
           11 (defmethod bundle-type ((o static-runtime-op)) :program)
           12 (defmethod selfward-operation ((o static-runtime-op)) 'monolithic-lib-op)
           13 
           14 (defmethod output-files ((o static-runtime-op) (s system))
           15   #-(or ecl mkcl)
           16   (list (subpathname (component-pathname s)
           17                      (strcat (coerce-name s) "-runtime")
           18                      :type (bundle-pathname-type :program))))
           19 
           20 (defmethod perform ((o static-runtime-op) (s system))
           21   (link-lisp-executable
           22    (output-file o s)
           23    (link-all-library (first (input-files o s)))))
           24 
           25 (defclass static-image-op (image-op) ()
           26   (:documentation "Create a statically linked standalone image for the system."))
           27 #-(or ecl mkcl) (defmethod selfward-operation ((o static-image-op)) '(load-op static-runtime-op))
           28 #+(or ecl mkcl) (defmethod gather-operation ((o static-image-op)) 'compile-op)
           29 #+(or ecl mkcl) (defmethod gather-operation ((o static-image-op)) :object)
           30 
           31 (defclass static-program-op (program-op static-image-op) ()
           32   (:documentation "Create a statically linked standalone executable for the system."))
           33 
           34 ;; Problem? Its output may conflict with the program-op output :-/
           35 
           36 #-(or ecl mkcl)
           37 (defmethod perform ((o static-image-op) (s system))
           38   #-(or clisp sbcl) (error "Not implemented yet")
           39   #+(or clisp sbcl)
           40   (let* ((name (coerce-name s))
           41          (runtime (output-file 'static-runtime-op s))
           42          (image
           43            #+clisp (implementation-file "base/lispinit.mem")
           44            #+sbcl (subpathname (lisp-implementation-directory) "sbcl.core"))
           45          (output (output-file o s))
           46          (child-op (if (typep o 'program-op) 'program-op 'image-op)))
           47     (with-temporary-output (tmp output)
           48       (apply 'invoke runtime
           49              #+clisp "-M" #+sbcl "--core" image
           50              `(#+clisp ,@'("--silent" "-ansi" "-norc" "-x")
           51                #+sbcl ,@'("--noinform" "--non-interactive" "--no-sysinit" "--no-userinit" "--eval")
           52                ,(with-safe-io-syntax (:package :asdf)
           53                   (let ((*print-pretty* nil)
           54                         (*print-case* :downcase))
           55                     (format
           56                      ;; This clever staging allows to put things in a single form,
           57                      ;; as required for CLISP not to print output for the first form,
           58                      ;; yet allow subsequent forms to rely on packages defined by former forms.
           59                      nil "'(~@{#.~S~^ ~})"
           60                      '(require "asdf")
           61                      '(in-package :asdf)
           62                      `(progn
           63                         (setf asdf:*central-registry* ',asdf:*central-registry*)
           64                         (initialize-source-registry ',asdf::*source-registry-parameter*)
           65                         (initialize-output-translations ',asdf::*output-translations-parameter*)
           66                         (upgrade-asdf)
           67                         ,@(if-let (ql-home
           68                                    (symbol-value (find-symbol* '*quicklisp-home* 'ql-setup nil)))
           69                             `((load ,(subpathname ql-home "setup.lisp"))))
           70                         (load-system "cffi-grovel")
           71                         ;; We force the (final step of the) operation to take place
           72                         (defmethod operation-done-p
           73                             ((operation ,child-op) (system (eql (find-system ,name))))
           74                           nil)
           75                         ;; Some implementations (notably SBCL) die as part of dumping an image,
           76                         ;; so redirect output-files to desired destination, for this processs might
           77                         ;; never otherwise get a chance to move the file to destination.
           78                         (defmethod output-files
           79                             ((operation ,child-op) (system (eql (find-system ,name))))
           80                           (values (list ,tmp) t))
           81                         (operate ',child-op ,name)
           82                         (quit))))))))))
           83 
           84 #+(or ecl mkcl)
           85 (defmethod perform ((o static-image-op) (s system))
           86   (let (#+ecl
           87         (c::*ld-flags*
           88          (format nil "-Wl,--export-dynamic ~@[ ~A~]"
           89                  c::*ld-flags*)))
           90     (call-next-method)))
           91 
           92 ;; Allow for :static-FOO-op in ASDF definitions.
           93 (setf (find-class 'asdf::static-runtime-op) (find-class 'static-runtime-op)
           94       (find-class 'asdf::static-image-op) (find-class 'static-image-op)
           95       (find-class 'asdf::static-program-op) (find-class 'static-program-op))