Перенаправление вывода 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
Другие вопросы по тегам