ports/devel/cl-freebsd-asdf-init/files/cl-freebsd-asdf-init.lisp.in
Joseph Mingrone 5f777d562c
devel/cl-freebsd-asdf-init: Update to 20250101
- Install the Common Lisp configuration file without executable bits on.
- Tweak the output translations so that inherited configuration is
  respected.

Sponsored by:	The FreeBSD Foundation
2025-01-01 01:50:14 -04:00

181 lines
6.7 KiB
Common Lisp
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

;; cl-freebsd-asdf-init.lisp - Configure ASDF to work with FreeBSD ports
;;
;; SPDX-License-Identifier: BSD-2-Clause
;;
;; Copyright (c) 2003 Henrik Motakef <henrik.motakef@web.de>
;; Copyright (c) 2024 Joseph Mingrone <jrm@FreeBSD.org>
;;
;; This file configures ASDF to work with Common Lisp (CL) installed via
;; FreeBSD ports. To load it when your Lisp implementation starts, add
;;
;; (load "%%PREFIX%%/etc/cl-freebsd-asdf-init.lisp")
;;
;; to your init file.
;;
;; These are the initialization files for the supported CL implementations:
;;
;; CLISP:
;; ~/.clisprc
;;
;; CLOZURE CL / OPENMCL:
;; ~/.ccl-init.lisp
;;
;; SBCL:
;; %%PREFIX%%/etc/sbclrc
;; ~/.sbclrc
;;
;; After that, use ASDF to load systems installed from ports like this:
;;
;; (asdf:load-system :alexandria)
;;
;; ** Detailed Explanation **
;;
;; This ASDF initialization enables working with CL installed via FreeBSD
;; ports by serving three key functions:
;;
;; 1. It configures a central registry to tell ASDF where to find systems
;; installed via FreeBSD CL ports.
;;
;; 2. It sets up output translations so no code from CL ports needs to be
;; compiled at load time.
;;
;; CL ports have binary variants for each supported CL implementation. For
;; example, devel/cl-alexandria includes the Alexandria sources, and
;; devel/cl-alexandria-sbcl installs the compiled code (fasl) for SBCL.
;; The output translations defined here tell ASDF where to look for the
;; binary code.
;;
;; If you prefer to build systems at load time, simply install the CL port
;; without the associated fasl port, and ASDF will build and write fasl to
;; a cache under ${HOME}.
;;
;; 3. It configures specific ASDF output translations for building CL ports.
;;
;;;; Package declaration
(defpackage :freebsd-asdf
(:use :common-lisp)
(:export #:*asdf-pathname*
#:unsupported-lisp-implementation))
(in-package :freebsd-asdf)
;;;; Implementation-specific functions
(define-condition unsupported-lisp-implementation ()
()
(:report (lambda (condition stream)
(declare (ignore condition)
(type stream stream))
(format stream "Your Lisp system, ~A ~A, is ~
currently not supported by the FreeBSD ports system."
(lisp-implementation-type)
(lisp-implementation-version)))))
(defun lisp-specific-fasl-subdir ()
"Return the subdirectory in which fasl files for this Lisp
implementations should be stored, as a string without any slashes.
If no subdirectory for the current implementation is known, signal an
error of type UNSUPPORTED-LISP-IMPLEMENTATION.
This function has to be extended for each new Lisp implementation that
should be able to use the ASDF-based Lisp ports."
#+ccl "cclfasl"
#+clisp "clispfasl"
#+sbcl "sbclfasl"
#-(or ccl clisp sbcl) (error 'unsupported-lisp-implementation))
(defun lisp-specific-fasl-extension ()
"Return the extension used for fasl files for this Lisp implementations as a
string.
This function has to be extended for each new Lisp implementation that
should be able to use the ASDF-based Lisp ports."
#+ccl "fx64fsl"
#+clisp "fas"
#+sbcl "fasl"
;; #-(or clisp cmu sbcl openmcl) (error 'unsupported-lisp-implementation))
#-(or ccl clisp sbcl) (error 'unsupported-lisp-implementation))
;;;; Paths
(defvar *asdf-pathname*
;; Determine the path to the ASDF library to load.
(let* ((port-asdf "%%PREFIX%%/lib/common-lisp/asdf/build/asdf.lisp")
(port-asdf-fasl (concatenate 'string
"%%PREFIX%%/lib/common-lisp/asdf/"
(lisp-specific-fasl-subdir)
"/build/asdf."
(lisp-specific-fasl-extension)))
(asdf-port-p (probe-file port-asdf))
(asdf-port-fasl-p (probe-file port-asdf-fasl)))
(cond
((and asdf-port-p asdf-port-fasl-p) port-asdf-fasl)
((and (member :ccl *features*)) "%%PREFIX%%/lib/ccl/tools/asdf.fx64fsl")
((and (member :clisp *features*)) "%%PREFIX%%/lib/clisp/asdf/asdf.fas")
((and (member :sbcl *features*)) "%%PREFIX%%/lib/sbcl/contrib/asdf.fasl")
(asdf-port-p port-asdf)
(t (error "Could not find any ASDF to load.")))))
(defvar *system-registry*
"%%PREFIX%%/lib/common-lisp/system-registry/"
"FreeBSD's contribution to the central registry for ASDF system
definitions. This will be added to asdf:*central-registry*, you should
modify that in order to add other directories.")
;;;; Load and configure ASDF
;;(load *asdf-pathname* :verbose t :print nil)
(load *asdf-pathname*)
(pushnew *system-registry* asdf:*central-registry*)
;; Set up output translations
(let* ((freebsd-translations '(:inherit-configuration)))
;; Create translations to point source to fasl.
(dolist (path (directory "%%PREFIX%%/lib/common-lisp/*/"))
(let* ((base-dir (pathname-directory path))
(source (make-pathname
:directory (append base-dir (list :wild-inferiors))
:name :wild
:type :wild))
(ctarget (make-pathname
:directory (append
base-dir
(list (lisp-specific-fasl-subdir)))))
(target (make-pathname
:directory (append base-dir
(list (lisp-specific-fasl-subdir)
:wild-inferiors))
:name :wild
:type :wild)))
;; Only create translation when source is not system registry and
;; ctarget exists.
(when (and
(not (string= *system-registry* (namestring path)))
(uiop:directory-exists-p ctarget))
(pushnew (list source target) freebsd-translations))))
;; When building a port, redirect fasl files to WRKSRC.
(when (and (uiop:getenv "FBSD_ASDF_COMPILE_PORT")
(uiop:getenv "PORTNAME")
(uiop:getenv "WRKSRC"))
(let* ((wrksrc (uiop:getenv "WRKSRC"))
(portname (uiop:getenv "PORTNAME"))
(source (make-pathname
:directory
(append (pathname-directory
#P"%%PREFIX%%/lib/common-lisp/")
(list portname :wild-inferiors))))
(target (make-pathname
:directory (append (pathname-directory wrksrc)
(list :wild-inferiors)))))
(pushnew (list source target) freebsd-translations)))
(asdf:initialize-output-translations
(cons :output-translations freebsd-translations)))
;;;; asdf-init.lisp ends here