Как правило, эти системные инструменты должны позволять это. Все, что вам нужно, это описание системы и файлы FASL. Системный инструмент должен затем использовать файлы FASL для загрузки. Нужно только убедиться, что он не имеет жесткой зависимости от какого-либо исходного файла.
Таким образом, программное обеспечение поставлялось в мир Lisp десятилетиями (> 30 лет). В этом подходе нет ничего плохого. Если с конкретным инструментом (здесь ASDF, но есть и другие) есть проблема, следует обратиться к авторам.
Если у вас возникла практическая проблема, вы должны обсудить ее в списке рассылки ASDF или задать вопрос здесь. У вас есть практическая проблема с этим?
Это не поможет вам напрямую, но может подсказать, как обычно работает системный инструмент | ред.
Пример с LispWorks 6 и его собственным DEFSYSTEM
У нас есть три файла в каталоге FOO:
RJMBA:foo joswig$ ls -l
-rw-r--r-- 1 joswig admin 13 22 Jul 20:42 a.lisp
-rw-r--r-- 1 joswig admin 14 22 Jul 20:42 b.lisp
-rw-r--r-- 1 joswig admin 331 22 Jul 20:41 system.lisp
system.lisp содержит следующее описание системы:
(defvar *foo-directory*
(make-pathname :name nil
:type nil
:directory (pathname-directory *load-pathname*)
:defaults *load-pathname*))
(defsystem foo (:default-pathname *foo-directory*)
:members ("a" "b"))
Выше задает *foo-directory*
путь на основе пути к загруженному файлу.
Таким образом, мы можем установить реальный абсолютный путь, но не нужно указывать его вручную.
В качестве альтернативы мы могли бы использовать относительные имена путей - это зависит от того, что вы хотите использовать.
Я выбрал это, чтобы показать, как автоматически установить абсолютный путь.
Теперь я загружаю этот файл в LispWorks, а затем компилирую систему:
CL-USER 12 > (compile-system 'foo)
;;; Compiling file /Lisp/foo/a.lisp ...
;;; Safety = 3, Speed = 1, Space = 1, Float = 1, Interruptible = 1
;;; Compilation speed = 1, Debug = 2, Fixnum safety = 3
;;; Source level debugging is on
;;; Source file recording is on
;;; Cross referencing is on
; (TOP-LEVEL-FORM 0)
; (TOP-LEVEL-FORM 1)
;; Processing Cross Reference Information
;;; Compiling file /Lisp/foo/b.lisp ...
;;; Safety = 3, Speed = 1, Space = 1, Float = 1, Interruptible = 1
;;; Compilation speed = 1, Debug = 2, Fixnum safety = 3
;;; Source level debugging is on
;;; Source file recording is on
;;; Cross referencing is on
; (TOP-LEVEL-FORM 0)
; (TOP-LEVEL-FORM 1)
;; Processing Cross Reference Information
(FOO)
Мы создали два файла fasl.
Теперь я копирую файл system.lisp и файлы fasl в новый каталог:
RJMBA:Lisp joswig$ mkdir bar
RJMBA:Lisp joswig$ cp foo/system.lisp bar/system.lisp
RJMBA:Lisp joswig$ cp foo/a.64xfasl bar/a.64xfasl
RJMBA:Lisp joswig$ cp foo/b.64xfasl bar/b.64xfasl
Теперь я начну новый LispWorks в каталоге b
, загрузю файл system.lisp, а затем загрузлю систему:
RJMBA:Lisp joswig$ cd bar
RJMBA:bar joswig$ lispworks
LispWorks(R): The Common Lisp Programming Environment
Copyright (C) 1987-2009 LispWorks Ltd. All rights reserved.
Version 6.0.0
User joswig on RJMBA.local
...
CL-USER 1 > (load "system.lisp")
; Loading text file /Lisp/bar/system.lisp
;; Creating system "FOO"
#P"/Lisp/bar/system.lisp"
CL-USER 2 > (load-system 'foo)
; Loading fasl file /Lisp/bar/a.64xfasl
"a" ; whatever the file does
; Loading fasl file /Lisp/bar/b.64xfasl
"b" ; whatever the file does
(FOO)
Готово и работает.
Кроме того, это можно сделать с помощью относительных каталогов или так называемых логических путей. Логические пути имеют отображение от некоторого пути к физическому пути, что позволяет использовать независимые от системы пути - независимо от архитектуры, ОС и структур каталогов. Это дает дополнительный уровень независимости от конкретного сценария развертывания.