← Архив: Common Lisp

Прблема с asdf на Windows

Author: · 25.11.2009 22:58
· original author: Jenya
Следующие строки:
(require 'asdf)
(require 'asdf-install)
(asdf-install:install :cl-ppcre)
выдают ошибку:
Install where?
1) System-wide install:
System in C:\Program Files\Steel Bank Common Lisp\1.0.29\site-systems\
Files in C:\Program Files\Steel Bank Common Lisp\1.0.29\site\
2) Personal installation:
System in C:\Users\123\.sbcl\systems\
Files in C:\Users\123\.sbcl\site\
--> 1
Downloading 157665 bytes from http://weitz.de/files/cl-ppcre.tar.gz ...
debugger invoked on a SIMPLE-ERROR:
could not open a temporary file: No such file or directory
Type HELP for debugger help, or (SB-EXT:QUIT) to exit from SBCL.
restarts (invokable by number or by possibly-abbreviated name):
0: [SKIP-GPG-CHECK] Don't check GPG signature for this package
1: [ABORT ] Exit debugger, returning to top level.
(SB-IMPL::GET-DESCRIPTOR-FOR #<SB-IMPL::STRING-INPUT-STREAM {23DEECC9}> (0))[:EXTERNAL]
0] 0
Installing C:\Program Files\Steel Bank Common Lisp\1.0.29\CL-PPCRE.asdf-install-tmp in C:\Program Files\Steel Bank Common Lisp\1.0.29\site\,C:\Program Files\Steel Bank Common Lisp\1.0.29\site-systems\
debugger invoked on a SIMPLE-ERROR:
couldn't fork child process: No such file or directory
Type HELP for debugger help, or (SB-EXT:QUIT) to exit from SBCL.
restarts (invokable by number or by possibly-abbreviated name):
0: [ABORT] Exit debugger, returning to top level.
(RUN-PROGRAM
"tar"
("-tzf"
"C:\\Program Files\\Steel Bank Common Lisp\\1.0.29\\CL-PPCRE.asdf-install-tmp"))[:EXTERNAL]
0] 0
Подскажите пожалуйста как решить эту проблему?
· original author: Love5an
Ну, суть в том, что asdf-install на винде не то чтобы особо работает.
В данном случае он пытается запустить юникс-утилиту gpg, а такой, естественно, на винде нет, разве что через mingw/msys или cygwin.
· original author: Jenya
cygwin установлен. Как конкретно поступить?
· original author: Love5an
скомпилировать sbcl под cygwin?
хотя я никогда не пробовал
вообще, а почему бы не скачать cl-ppcre самостоятельно и просто распаковать куда-нибудь, например, в директорию с sbcl(будет без лишних бубнов находить системы, если имя директории с библиотекой совпадает с именем asd файла, емнип)?
· original author: hardreset
>скомпилировать sbcl под cygwin?
>хотя я никогда не пробовал\
sbcl есть и под венду:
http://prdownloads.sourceforge.net/sbcl/sbcl-1.0.29-x86-windows-binary.msi
· original author: andy128k
> ... просто распаковать куда-нибудь, например, в директорию с sbcl...
Я недавно так развлекался. Такое подходит только для простых пакетов, а вот, например, cl-gtk2 так не попользуешь.
· original author: Love5an
>Я недавно так развлекался. Такое подходит только для простых пакетов, а вот, например, cl-gtk2 так не попользуешь.
Вообще говоря, да. Поэтому я, например, написал скрипт, который вычленяет из .lnk файлов пути(тупо, регулярным выражением  "[cCdD]:[\\\\/][ -~]+\\.[aA][sS][dD]"), и складываю .lnk на .asd файлы в специальную папку, которая отображается в asdf:*central-registry*
руки никак не дойдут написать нормальный парсер .lnk
Но, кстати, в CCL на винде lnk при поиске систем парсятся, вот код оттуда, если интересно:
http://paste.lisp.org/display/91121
можно, используя это, написать соответствующую функцию, например
(defun search-for-system-in-windows (system)
  (let ((system-name (asdf::coerce-name system))) ;;там, в asdf, такая функция есть
   (loop for lnk in (directory (merge-pathnames *asdf-registry-directory*
                                                 ;;допустим, пусть эта переменная у нас будет хранить
                                                ;;путь к директории с .lnk
                                                ;;например "C:\\SBCL\\SYSTEMS\\"
                                                "*.lnk"
)
)

          for system-path = (parse-windows-shortcut lnk)
          when (string-equal system-name (pathname-name system-path))
          do (return system-path)
)
)
)

 и запихнуть ее в asdf:*system-definition-search-functions*
· original author: andy128k
У меня вот такой вариант получился.
(defun search-for-system-in-windows (system)
  (let ((system-name (asdf::coerce-name system)))
    (dolist (dir asdf:*central-registry*)
      (dolist (lnk (directory (merge-pathnames (eval dir) "*.lnk")))
        (let ((system-path (parse-windows-shortcut lnk)))
          (when (string-equal system-name (pathname-name system-path))
            (return-from search-for-system-in-windows system-path)
)
)
)
)
)
)

(pushnew #'search-for-system-in-windows
  asdf:*system-definition-search-functions*
)
· original author: Love5an
>У меня вот такой вариант получился.
код очень по-сишному(или, по крайней мере, по-жабьему) выглядит :)
· original author: andy128k
> код очень по-сишному(или, по крайней мере, по-жабьему) выглядит :)
Зато работает :-P
· original author: archimag
Я что-то ступил, ведь у нас на wiki уже есть статья про asdf: http://lisper.ru/wiki/cookbook:asdf - вот надо бы её доработать, написать раздел про винду, ну и вообще доработать :)
· original author: treep
По желанию трудящихся обновил статью про ASDF :) Убрал ужасный код с load asd (стыд мне!) Если есть жедание можно постепенно писать о том как ставить такой-то лисп на такую-то ОС "чтобы всё работало" соотв. часть кукбука.