Доброго времени суток!
В ходе разработки нового проекта на
Common Lisp столкнулся с такой задачей:
подключить библиотеки (конкретно,
cl-gtk2 с зависимостями) к разрабатываемому проекту для реализации
GUI, при условии полного отсутствия подключения рабочего ПК к интернету (НИИ, подключение к интернету отсутствует по соображениям безопасности).
Из-за отсутствия интернета на рабочем месте, использование
quicklisp и/или
asdf не имеет смысла. Единственный вариант:
(load "/path/whith/module/module-name.lisp")Учитывая, сколько зависимостей у
cl-gtk2(если все делать нормально - через quicklisp):
(ql:quickload "cffi")
(ql:quickload "trivial-garbage")
(ql:quickload "iterate")
(ql:quickload "bordeaux-threads")
(ql:quickload "closer-mop")
(ql:quickload "cl-opengl")
(ql:quickload "cl-cairo2")я не представляю как подключить всю эту кучу, правильно и без
quicklisp.
Конечно, можно скачать вручную исходники каждой необходимой библиотеки дома, принести на флешке на работу и, потом, сорить
load'ами в коде, но хочеться нормально все написать... Вы меня понимаете...
Короче: на работе нет интернета, есть возможность принести нужные модули (исходники
cl-gtk2 с зависимостями) с собой, из дома, на флешке. Как без
quicklisp и
asdf грамотно все зависимости учесть и подключить эти библиотеки к проекту?
Помогите, пожалуйста.
Заранее, благодарю.
> использование quicklisp и/или asdf не имеет смысла.
Использовать quicklisp действительно смысла нет, но при чём тут asdf? ASDF это система сборки, упрощённо говоря аналог make/cmake/ant/etc. Поэтому тебе надо использовать ASDF. Просто почитай документацию и разберись, что это такое.
Но ты можешь использовать даже quicklisp. Скачай дома с его помощью нужные библиотеки и просто принеси на работу всю папку quicklisp (ну и настроить .sbclrc или что там у тебя надо будет).
На чистой системе делаешь
(ql:quickload "cl-gtk2-gtk")
Quicklisp тянет зависимости, получившуюся папку ~/quicklisp/, файлы ~/quicklisp.lisp и .sbclrc копируешь на другой компьютер и на месте подстраиваешь.
Возможно, что нужно загрузить и другие какие-то системы до копирования папки.
Без Quicklisp тоже можно, и нередко оправдано, но не очень удобно.
Скачиваешь все пакеты, которые нужны на флешку, переносишь другой компьютер, а затем объясняешь ASDF, куда ты эти пакеты положил.
Раньше это было через настройку ASDF:*CENTRAL-REGISTRY*, как сейчас - не знаю. Пользуюсь Quicklisp :)
> Раньше это было через настройку ASDF:*CENTRAL-REGISTRY*, как сейчас - не знаю.
В файл ~/.config/common-lisp/source-registry.conf.d/local.conf пишешь :
(:tree "/path/to/you/common-lisp/")
>asdf не имеет смысла
Согласен с предыдущими ораторами) Не только имеет, но это и единственный практический вариант. asdf это де факто стандарт оформления CL библиотек (систем) для построения и загрузки в нужном порядке, как make, только мощнее. Отучать пакеты от использования asdf это такая же безумная идея, как попытаться избавиться от использования make в построении gtk и пакетах на которые он завязан.
Спасибо за ответ!
Я, в принципе, так и предполагал. Только есть одно
НО: дома
GNU/Debian на рабочем компьютере, на работе -
MS Windows 7 (тоже издержки специфики работы в НИИ...).
Есть вероятность, что получу конфликт путей?
Не, ну конечно можно сильно не выпендриваться: скачать
LTK, дистрибутив
Tcl/Tk для
MS Windows и
GUI сделать на этой связке. Там зависимостей вообще нет. Только функционнал бедноват...
asdf:*central-registry* тоже никуда не делся.
1. Пытаешься перенести.
2. Когда что-то не загружается - дебаггер в зубы и разбираешься :)
3. Если совсем не можешь разобраться, в quicklisp есть каталог для локальных проектов.
>Есть вероятность, что получу конфликт путей?
Должно быть все ok. Убедись только, что директория которую ты добавишь в asdf:*central-registry*
(pushnew "с:/whatever-dir-you-brought-from-home/" asdf:*central-registry* :test #'equal)
или через config как archimag написал, содержит слэш на конце. asdf будет рекурсивно шерстить эту директорию на предмет .asd файлов.
И да, cl-gtk2 на винде? Оно вообще там заводится?
Большое спасибо всем!!!
Буду разбираться.
от себя добавлю: расположить файлы библиотек так, чтобы квиклисп "подумал", что он их уже скачал когда-то и сейчас надо просто загрузить, у меня не получилось . А ASDF-ом получилось. Хотя, квиклиспом было бы изящней.
оказывается все просто. Надо зип файл библиотеки распаковать в место, указанное в переменной ql:*local-project-directories*, вызвать (ql:REGISTER-LOCAL-PROJECTS) и потом можно (ql:quickload ...)
CL> ql:*local-project-directories*
(#P"C:/Users/master/AppData/Roaming/quicklisp/local-projects/")
CL> (ql:REGISTER-LOCAL-PROJECTS)
NIL
CL> (ql:quickload :lift)
To load "lift":
Load 1 ASDF system:
lift
; Loading "lift"
[package com.metabang.trivial-timeout]............
[package lift]....................................
[package lift]....................................
[package lift]....................................
....................
(:LIFT)
CL> специально шнурок витой пары выдернул
asdf:monolithic-concatenate-source-op из ASDF3 как надёжное одноразовое решение. Надо смотреть - ASDF иногда отдельно загружать нужно.
Здравствуйте, всем! У меня такая же проблема. Только попроще, с интеренетом.
Пытаюсь настроить пакет "cl-gtk2-gtk", под SBCL 1.1.8 (X86). Операционка - Windows 7.
Шаги:
1. загружаю asdf.
(load "C:/Program Files (x86)/quicklisp/asdf.lisp")
2. теперь quicklisp.
(load "C:/Program Files (x86)/quicklisp/setup.lisp")
3. теперь эти
(ql:quickload "alexandria")
(ql:quickload "cffi")
(ql:quickload "trivial-garbage")
(ql:quickload "iterate")
(ql:quickload "bordeaux-threads")
(ql:quickload "closer-mop")
(ql:quickload "cl-opengl")
Никаких проблем за исключнием того, что создаётся папка Lisp на диске D. Так как это всё скачано туда.
4. а вот теперь (ql:quickload "cl-cairo2") выдаёт ошибку
* (ql:quickload "cl-cairo2")
To load "cl-cairo2":
Load 1 ASDF system:
cl-cairo2
; Loading "cl-cairo2"
..................................................
[package metabang.bind]...........................
[package metabang.bind.developer].................
[package cl-utilities]............................
[package cl-colors]...............................
[package cl-cairo2]
debugger invoked on a LOAD-FOREIGN-LIBRARY-ERROR in thread
#<THREAD "main thread" RUNNING {23FF3BE9}>:
Unable to load foreign library (LIBCAIRO).
Error opening shared object "libcairo-2.dll"
Установил "libcairo-2.dll" в папку с SBCL. Теперь новая ошибка: Отсутствует libfontconfig-1.dll
Установил, теперь хочет xmlparse.dll, затем xmltok.dll.
И снова ошибка, теперь такая: Точка входа в процедуру XML_SetDoctypeDeclHandler не найдена в библиотеке DLL xmlparse.dll.
До (ql:quickload "cl-gtk2-gtk") я таким образом не добираюсь.
Я вообще на верном пути?
> Я вообще на верном пути?
Теоретически - да. Засада может быть в том, что вот все эти dll-ки дожны быть "правильных, совместимых" версий. Лучше всего, если их скомпилировалли в одном и том же месте в одном и то же время. Но, как было сказано, GTK2 несколько старовата и найти комплект совместимых библиотек может быть не так просто. Можно, конечно, самому собрать, но это если есть опыт и вкус к этому делу.
Но это я так, чисто теоретически, ибо под виндой уже много лет не работал, просто вспоминаю как это было.
archimag: Тогда может быть посоветуете что-нибудь более надёжное? Стандартный набор творческого человека, GUI, база данных, графика.