From 1dcb49b0d4128e080b346a1187b24e558db7bc88 Mon Sep 17 00:00:00 2001 From: Anton Gorenko Date: Wed, 9 Mar 2011 15:37:48 +0600 Subject: [PATCH] gobject-introspection: GIR: tries to find .gir in a current vocabulary's directory, in system gir-1.0 (/usr/share/gir-1.0, /usr/local/share/gir-1.0) or user-defined (GIR_DIRS env. variable) directories; --- .../gobject-introspection.factor | 42 ++++++++++++++++--- 1 file changed, 37 insertions(+), 5 deletions(-) diff --git a/basis/gobject-introspection/gobject-introspection.factor b/basis/gobject-introspection/gobject-introspection.factor index 00ef41eefb..e2c000348f 100755 --- a/basis/gobject-introspection/gobject-introspection.factor +++ b/basis/gobject-introspection/gobject-introspection.factor @@ -1,15 +1,47 @@ ! Copyright (C) 2010 Anton Gorenko. ! See http://factorcode.org/license.txt for BSD license. -USING: accessors combinators gobject-introspection.common +USING: accessors combinators environment gobject-introspection.common gobject-introspection.ffi gobject-introspection.loader -gobject-introspection.types kernel lexer locals namespaces parser -sequences xml ; +gobject-introspection.types io io.files io.pathnames kernel lexer +locals make namespaces parser sequences splitting summary vocabs +vocabs.parser xml ; IN: gobject-introspection +ERROR: gir-not-found name paths ; + +M: gir-not-found summary + [ name>> "“" "” file not found on paths:\n" surround ] + [ paths>> "\n" join ] bi + "\n\nUse the existing path or declare GIR_DIRS environment variable" + 3append ; + xml xml>repository +: system-gir-dirs ( -- dirs ) + "XDG_DATA_DIRS" os-env "/usr/local/share/:/usr/share/" or + ":" split [ "gir-1.0" append-path ] map ; + +: custom-gir-dirs ( -- dirs ) + "GIR_DIRS" os-env ":" split ; + +: current-vocab-dirs ( -- dirs ) + [ + current-vocab vocab-name "." split "/" join dup , + dup file-name "ffi" = [ parent-directory , ] [ drop ] if + ] { } make ; + +:: resolve-gir-path ( path -- path ) + path exists? + [ path ] [ + current-vocab-dirs custom-gir-dirs system-gir-dirs + 3append sift :> paths + paths [ path append-path exists? ] find nip + [ path append-path ] [ path paths gir-not-found ] if* + ] if ; + +: define-gir-vocab ( path -- ) + resolve-gir-path dup " loading " write print + file>xml xml>repository { [ namespace>> name>> current-namespace-name set-global ] [ def-ffi-repository ]