← Архив: Common Lisp

Подключение библиотек в проекте на Common Lisp

Author: · 13.02.2015 22:15
· original author: karlkorp
Доброго времени суток!
В ходе разработки нового проекта на 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 грамотно все зависимости учесть и подключить эти библиотеки к проекту?
Помогите, пожалуйста.
Заранее, благодарю.
· original author: archimag
> использование quicklisp и/или asdf не имеет смысла.
Использовать quicklisp действительно смысла нет, но при чём тут asdf? ASDF это система сборки, упрощённо говоря аналог make/cmake/ant/etc. Поэтому тебе надо использовать ASDF. Просто почитай документацию и разберись, что это такое. 
· original author: archimag
Но ты можешь использовать даже quicklisp. Скачай дома с его помощью нужные библиотеки и просто принеси на работу всю папку quicklisp (ну и настроить .sbclrc или что там у тебя надо будет).
· original author: dmitrys99
На чистой системе делаешь 
(ql:quickload "cl-gtk2-gtk")
Quicklisp тянет зависимости, получившуюся папку ~/quicklisp/, файлы ~/quicklisp.lisp и .sbclrc  копируешь на другой компьютер и на месте подстраиваешь.
Возможно, что нужно загрузить и другие какие-то системы до копирования папки.
Без Quicklisp тоже можно, и нередко оправдано, но не очень удобно.
Скачиваешь все пакеты, которые нужны на флешку, переносишь другой компьютер, а затем объясняешь ASDF, куда ты эти пакеты положил.
Раньше это было через настройку ASDF:*CENTRAL-REGISTRY*, как сейчас - не знаю. Пользуюсь Quicklisp :)
· original author: archimag
> Раньше это было через настройку ASDF:*CENTRAL-REGISTRY*, как сейчас - не знаю.
В файл ~/.config/common-lisp/source-registry.conf.d/local.conf  пишешь :
(:tree "/path/to/you/common-lisp/")
· original author: vi1
>asdf не имеет смысла


Согласен с предыдущими ораторами) Не только имеет, но это и единственный практический вариант. asdf это де факто стандарт оформления CL библиотек (систем) для построения и загрузки в нужном порядке, как make, только мощнее. Отучать пакеты от использования asdf  это такая же безумная идея, как попытаться избавиться от использования make в построении gtk и пакетах на которые он завязан.
· original author: karlkorp
Спасибо за ответ!
Я, в принципе, так и предполагал. Только есть одно НО: дома GNU/Debian на рабочем компьютере, на работе - MS Windows 7 (тоже издержки специфики работы в НИИ...).
Есть вероятность, что получу конфликт путей?
Не, ну конечно можно сильно не выпендриваться: скачать LTK, дистрибутив Tcl/Tk для MS Windows и GUI сделать на этой связке. Там зависимостей вообще нет. Только функционнал бедноват...
· original author: den73
asdf:*central-registry* тоже никуда не делся.
· original author: den73
1. Пытаешься перенести.
2. Когда что-то не загружается - дебаггер в зубы и разбираешься :)
3. Если совсем не можешь разобраться, в quicklisp есть каталог для локальных проектов.
· original author: vi1
>Есть вероятность, что получу конфликт путей?


Должно быть все ok. Убедись только, что директория которую ты добавишь в asdf:*central-registry*
(pushnew "с:/whatever-dir-you-brought-from-home/" asdf:*central-registry* :test #'equal)


или через config как archimag написал, содержит слэш на конце. asdf будет рекурсивно шерстить эту директорию на предмет .asd файлов.
· original author: vi1
И да, cl-gtk2 на винде? Оно вообще там заводится?
· original author: andy128k
Очень даже заводится.
· original author: karlkorp
Большое спасибо всем!!!
Буду разбираться.
· original author: dima0905
от себя добавлю: расположить файлы библиотек так, чтобы квиклисп "подумал", что он их уже скачал когда-то и сейчас надо просто загрузить, у меня не получилось . А ASDF-ом получилось. Хотя, квиклиспом было бы изящней.
· original author: dima0905
оказывается все просто. Надо зип файл библиотеки распаковать в место, указанное в переменной 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> специально шнурок витой пары выдернул
· original author: motopeh
asdf:monolithic-concatenate-source-op из ASDF3 как надёжное одноразовое решение. Надо смотреть - ASDF иногда отдельно загружать нужно.
· original author: Ovod
Здравствуйте, всем! У меня такая же проблема. Только попроще, с интеренетом.
Пытаюсь настроить пакет "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") я таким образом не добираюсь.
Я вообще на верном пути?
· original author: archimag
> Я вообще на верном пути?
Теоретически - да. Засада может быть в том, что вот все эти dll-ки дожны быть "правильных, совместимых" версий. Лучше всего, если их скомпилировалли в одном и том же месте в одном и то же время.  Но, как было сказано, GTK2 несколько старовата и найти комплект совместимых библиотек может быть не так просто. Можно, конечно, самому собрать, но это если есть опыт и вкус к этому делу. 
Но это я так, чисто теоретически, ибо под виндой уже много лет не работал, просто вспоминаю как это было.
· original author: Ovod
archimagТогда может быть посоветуете что-нибудь более надёжное? Стандартный набор творческого человека, GUI, база данных, графика.