Перенаправление вывода ASDF
Я хотел бы установить каталог, в котором ASDF хранит скомпилированные файлы. Я предпочитаю делать это из сценария оболочки. Согласно этой странице, необходимо определить переменную среды ASDF_OUTPUT_TRANSLATIONS
,
ОК, вот оно:
$ export ASDF_OUTPUT_TRANSLATIONS="$HOME/.cache/common-lisp/my-dir/"
Но когда я пытаюсь проверить конфигурацию, она не работает:
$ clisp -x "(asdf:compile-system :my-system)"
Выход:
;; Loading file /home/mark/.clisprc.lisp ...
;; Loading file /home/mark/quicklisp/setup.lisp ...
*** - Uneven number of components in source to destination mapping:
"/home/mark/.cache/common-lisp/my-dir/"
Bye.
До свидания. Ну, это один из возможных выходов. Я пытался присвоить много значений ASDF_OUTPUT_TRANSLATIONS
, Четный и нечетный. Маленький и большой. Нет успеха Это было бы намного проще, если бы был пример такой конфигурации, но я не смог его найти.
Другая проблема заключается в том, что я не знаю, будут ли системы, которые будут компилироваться, перезаписывать файлы с одинаковыми именами друг друга, когда ASDF помещает все в один каталог. Что мне действительно нужно, так это временно установить выходной каталог из сценария оболочки, чтобы каждый файл находился в предсказуемом месте независимо от того, где находятся исходные файлы.
2 ответа
Мне удалось следующее:
$ export ASDF_OUTPUT_TRANSLATIONS="/:$HOME/.cache/common-lisp/my-dir/"
Примечание 1: каталог назначения может не существовать: в этом случае ASDF создаст его.
Примечание 2: нельзя использовать такие символы, как *
или же **
в этой строке. каталог /
обозначает все возможные каталоги.
Примечание 3: ASDF создаст подкаталоги внутри my-dir
как это:
/home/mark/.cache/common-lisp/my-dir/home/mark/path/to/source/files/
Это не совсем то, что я хотел, но, поскольку я могу определить, где находятся исходные файлы перед сборкой, поместив их в подкаталог каталога, в котором находится мой сценарий оболочки, это не является критической проблемой.
То, как я читаю http://common-lisp.net/project/asdf/asdf/Controlling-where-ASDF-saves-compiled-files.html, вам нужно разместить там сопоставление, которое указывает совпадение и перевод. В синтаксисе sexp вы можете указать его как (t "/home.../...dir/")
, где t
означает соответствие всем.
Вы также можете использовать функции для перевода каталогов:
(t (:function (lambda (dir) #|translate dir as you like|#)))
Также прочитайте о том, где поставить такие директивы. Кажется, переменная окружения обрабатывается неким особым синтаксисом, который я до конца не понял. Вместо этого вы можете использовать файлы конфигурации, если это не сработает.
редактировать: извините, просто читая документацию (которая действительно имеет место для улучшения) http://common-lisp.net/project/asdf/asdf/Output-Configuration-DSL.html. Возможно, вам нужно быть немного более явным:
(:output-translations (t "/foo/bar"))
Соответствующий синтаксис "дружественный к оболочке" может быть таким:
**/:/foo/bar