LINUX.ORG.RU

asdf, мать его

 


0

3

Я хочу, чтобы кеш фаслов создавался не в домашнем каталоге, а в другом месте. И чтобы больше ничего не сломалось. Во-первых, я не понял, зачем так переусложнена настройка. И неужели у моего вопроса нет решения?

★★★★★
Ответ на: комментарий от monk

Ты не мудри, ты пальцем покажи :)

Я это читал. Много чести читать целых три страницы для такого вопроса. Я их троекратно прочитал по диагонали и пришёл к мнению, что ответа на мой вопрос там нет. Вроде вот так решается:

https://mailman.common-lisp.net/pipermail/asdf-devel/2015-October/004962.html

Галочку пока не буду ставить, посмотрим, что ответят мэтры, если снизойдут.

den73 ★★★★★
() автор топика
Ответ на: комментарий от den73

Я свой вопрос уже решил.

Телепаты в отпуске. Я в битве экстрасенсов не участвую.

У тебя есть ещё что по делу сказать?

Это по делу было. Ты всегда такой тупой?

skiminok1986 ★★★★★
()
Ответ на: комментарий от den73

Они как обычно написали, что я неправильно сделал. Опять убил полчаса на чтение их ответа и на попытку понять, как же правильно. В итоге всё же остался при том, что ничего менять не буду.

asdf - это, наверное, наилучшая вещь, которую враги лиспа сделали для его ниспровержения. В теме ставлю галку.

den73 ★★★★★
() автор топика
Ответ на: комментарий от skiminok1986

Ты всегда такой тупой?

Да.

И глядя на него формируется мнение о лисперах. Хотя он в лиспе полный профан. Но ОЧЕНЬ энергичный.

anonymous
()
Ответ на: комментарий от den73

Они как обычно написали, что я неправильно сделал.

Правильно написали. Хачить неэкспорированные переменные оправдано только при полном отсутствии внешнего API к нужной функции.

А то, что ты написал делается через

(initialize-output-translations 
  '(asdf:initialize-output-translations
      `(:output-translations (t "c:/clcon/fasl-cache/asdf/")
                             :ignore-inherited-configuration)))

how to ensure default cache is disabled (documentation does not show this option)

Неправда. В разделе 9.3 явно указано

    ;; Disable global cache. Map / to /
    :disable-cache"

how to deal with environment variables on Windows,

Опять же, написано. Можешь целевой каталог единожды брать из такой переменной. Можешь прицепить не каталог, а функцию преобразования — тогда можно будет динамически выбирать на основании этих переменных.

what would

happen if some library would call configuration API after me, etc.

Написано в 9.3. Либо добавятся условия к твоей (если :inherit-configuration), либо твоя выкинется и установится новая (если :ignore-inherited-configuration)

monk ★★★★★
()
Последнее исправление: monk (всего исправлений: 1)
Ответ на: комментарий от monk

Во-первых, эта переменная экспортирована из uiop. Во-вторых, она документирована (см. мануал по asdf, ссылку на который ты сам и выкладывал), просто она документирована плохо. В-третьих, ты уверен, что написанное тобою будет работать?

CL-USER> (asdf:ensure-output-translations)
((#P"/home/denis/.cache/common-lisp/sbcl-1.2.7-linux-x86/**/*.*" t)
 (#P"/usr/local/lib/sbcl/**/*.*" t)
 (#P"/usr/local/lib/sbcl/**/*.*" #P"/usr/local/lib/sbcl/**/*.*")
 (t #P"/home/denis/.cache/common-lisp/sbcl-1.2.7-linux-x86/**/*.*"))
CL-USER> (asdf:initialize-output-translations
      `(:output-translations (t "/s2/clcon/fasl-cache/asdf/")
                             :ignore-inherited-configuration))
((#P"/usr/local/lib/sbcl/**/*.*" t)
 (#P"/usr/local/lib/sbcl/**/*.*" #P"/usr/local/lib/sbcl/**/*.*")
 (#P"/s2/clcon/fasl-cache/asdf/**/*.*" t)
 (t #P"/s2/clcon/fasl-cache/asdf/**/*.*")
 (#P"/home/denis/.cache/common-lisp/sbcl-1.2.7-linux-x86/**/*.*" t)
 (t #P"/home/denis/.cache/common-lisp/sbcl-1.2.7-linux-x86/**/*.*"))
CL-USER> 
Наличие двух строчек с t в левой части правила не создаёт иллюзию «нормально написанной конфигурации». clear-output-translations тоже не помогло, нет. Я не стану даже проверять, как работает эта конфигурация, потому что это заведомо неправильная конфигурация.

den73 ★★★★★
() автор топика
Ответ на: комментарий от monk

Написано в 9.3. Либо добавятся условия к твоей (если :inherit-configuration), либо твоя выкинется и установится новая (если :ignore-inherited-configuration)

Как бы то ни было, нет гарантии, что моя конфигурация сохранится и узнать это я могу только экспериментально. А значит, хорошего решения всё равно нет. Принцип KISS говорит о том, что в этом случае нужно поправить переменную.

Написано в 9.3. Либо добавятся условия к твоей (если :inherit-configuration), либо твоя выкинется и установится новая (если :ignore-inherited-configuration)

Как соотносятся результаты моего прошлого эксперимента с этой записью в документации?

den73 ★★★★★
() автор топика
Последнее исправление: den73 (всего исправлений: 2)
Ответ на: комментарий от den73

Наличие двух строчек с t в левой части правила не создаёт иллюзию

Читай это как cond. То есть на первой строчке с (t ...) выполнение заведомо прекратится. Так что по факту всё работает.

monk ★★★★★
()
Ответ на: комментарий от den73

Во-первых, эта переменная экспортирована из uiop.

Тогда почему пишешь

...
(setf uiop::*user-cache*
...

?

Во-вторых, она документирована (см. мануал по asdf)

Написано, что она применяется, (только) если в :output-translations есть (... :user-cache).

Мой вариант работает всегда, а твой только в том случае, если asdf не загружен ранее (например, в образ лиспа).

monk ★★★★★
()
Ответ на: комментарий от den73

Как бы то ни было, нет гарантии, что моя конфигурация сохранится и узнать это я могу только экспериментально.

Твой вариант менее надёжен.

Принцип KISS говорит о том, что в этом случае нужно поправить переменную.

Ну да. В Debian при тестировании OpenSSL, valgrind ругнулся на передачу неинициализированного указателя, то так им «принцип KISS» сказал строку закомментировать. Не путай KISS с говнокодингом.

monk ★★★★★
()
Ответ на: комментарий от den73

Как соотносятся результаты моего прошлого эксперимента с этой записью в документации?

Упс. Невнимательно прочитал. «An :inherit-configuration statement causes the search to recurse with the path specifications from the next configuration in the bulleted list.». То есть каждый запуск asdf:initialize-output-translations перезаписывает конфигурационные настройки. И, если в них есть :inherit-configuration, то будуь читаться пункты 3-7 описанные в разделе 9.1

monk ★★★★★
()
Ответ на: комментарий от monk

Мой вариант работает всегда, а твой только в том случае, если asdf не загружен ранее (например, в образ лиспа)

Нет, твой тоже работает не всегда - я приводил пример, когда не сработает.

Но в целом спасибо за замечания! Теперь этот кусок кода выглядит так:

(assert (null (find-package :uiop)))
(require :uiop)
(defconstant *clcon-uiop-user-cache-override* #P"c:/clcon/fasl-cache/asdf/")
(setf uiop:*user-cache* *clcon-uiop-user-cache-override*)
(require 'asdf)
(defun check-output-translations-ok ()
  "Call it now and once again at the end of loading to ensure that fasls are placed to a right place"
  (assert (equalp (asdf:apply-output-translations "c:/aaa.bbb")
    (merge-pathnames "c/aaa.bbb" *clcon-uiop-user-cache-override*))))
(check-output-translations-ok)
....
;и в конце ещё раз
(check-output-translations-ok)

den73 ★★★★★
() автор топика
Последнее исправление: den73 (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.