LINUX.ORG.RU

Генерация libnautilus-extension.vapi

 


1

2

Из пакета nautilus-devel установлены:
/usr/share/gir-1.0/Nautilus-3.0.gir
/usr/include/nautilus/libnautilus-extension/nautilus-menu-item.h и т.д.

Сконвертировал:

$ vapigen --library ~/.local/share/vala/vapi/Nautilus-3.0 --pkg gio-2.0 --pkg gtk+-3.0 /usr/share/gir-1.0/Nautilus-3.0.gir
получил Nautilus-3.0.vapi:
[CCode (cprefix = "Nautilus", gir_namespace = "Nautilus", gir_version = "3.0", lower_case_cprefix = "nautilus_")]
namespace Nautilus {
.........
	[CCode (cheader_filename = "Nautilus-3.0.h", type_id = "nautilus_menu_item_get_type ()")]
	public class MenuItem : GLib.Object {
		public weak Nautilus.MenuItemDetails details;
		[CCode (has_construct_function = false)]
		public MenuItem (string name, string label, string tip, string icon);
		public static void list_free (GLib.List<Nautilus.MenuItem> item_list);
		public void set_submenu (Nautilus.Menu menu);
		[NoAccessorMethod]
		public string icon { owned get; set; }
		[NoAccessorMethod]
		public string label { owned get; set; }
		[NoAccessorMethod]
		public Nautilus.Menu menu { owned get; set; }
		[NoAccessorMethod]
		public string name { owned get; construct; }
		[NoAccessorMethod]
		public bool priority { get; set; }
		[NoAccessorMethod]
		public bool sensitive { get; set; }
		[NoAccessorMethod]
		public string tip { owned get; set; }
		[HasEmitter]
		public virtual signal void activate ();
	}
......
}
Компилирую программу:
using Nautilus;
...
Nautilus.MenuItem item = new Nautilus.MenuItem("name", "label", "tip", null);
...
и получаю ошибку:
[1/4] Compiling Vala source
....
Compilation succeeded
[2/3] Compiling C object 'src/extension@exe/extension@exe_main.c.o'.
FAILED: src/extension@exe/extension@exe_main.c.o 
ccache cc  -Isrc/extension@exe -Isrc -I../../../../../Projects/extension/src -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include -I/usr/include/gtk-3.0 -I/usr/include/gio-unix-2.0/ -I/usr/include/pango-1.0 -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/pixman-1 -I/usr/include/freetype2 -I/usr/include/harfbuzz -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/libpng16 -fdiagnostics-color=always -pipe -D_FILE_OFFSET_BITS=64 -w -O0 -g -O2 -g -pthread -MMD -MQ 'src/extension@exe/extension@exe_main.c.o' -MF 'src/extension@exe/src_extension@exe_main.c.o.d' -o 'src/extension@exe/src_extension@exe_main.c.o' -c 'src/extension@exe/main.c'
src/extension@exe/main.c:28:26: fatal error: Nautilus-3.0.h: No such file or directory
 #include "Nautilus-3.0.h"
                          ^
compilation terminated.
ninja: build stopped: subcommand failed.
Да, Nautilus-3.0.h действительно нет. Попробовал заменить в Nautilus-3.0.vapi хидер:
[CCode (cheader_filename = "nautilus-menu-item.h", type_id = "nautilus_menu_item_get_type ()")]
Все равно получаю ошибку:
.......main.c:28:32: fatal error: nautilus-menu-item.h: No such file or directory
 #include "nautilus-menu-item.h"
                                ^
compilation terminated.
ninja: build stopped: subcommand failed.

Что не так?

★★★

Последнее исправление: nvl (всего исправлений: 3)

fatal error: Nautilus-3.0.h: No such file or directory

Да, Nautilus-3.0.h действительно нет. Попробовал заменить в Nautilus-3.0.vapi хидер

fatal error: nautilus-menu-item.h: No such file or directory

Значит, его тоже нет. Попробуй указать -Ipath/to/include компилятору Си.

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

Тут такая проблема. Если указать в meson.build зависимость от libnautilus-extension

extension_deps = [
  dependency('gio-2.0', version: '>= 2.50'),
  dependency('gtk+-3.0', version: '>= 3.22'),
  dependency('libnautilus-extension'),
]
то с хидерами все нормально, но при этом ругается на отсуствие libnautilus-extension.vapi
....
Found pkg-config: /bin/pkg-config (1.3.9)
Native dependency gio-2.0 found: YES 2.54.0
Native dependency gtk+-3.0 found: YES 3.22.21
Native dependency libnautilus-extension found: YES 3.26.0
Native dependency glib-2.0 found: YES 2.54.0
...
valac -C --debug --pkg libnautilus-extension --pkg gtk+-3.0 --pkg gio-2.0 --color=always -d src/extension@exe --gresources=../../../../../Projects/extension_/src/extension.gresource.xml --target-glib=2.50 ../../../../../Projects/extension_/src/Nautilus-3.0.vapi ../../../../../Projects/extension_/src/main.vala ../../../../../Projects/extension_/src/window.vala
error: Package `libnautilus-extension' not found in specified Vala API directories or GObject-Introspection GIR directories
Compilation failed: 1 error(s), 0 warning(s)

nvl ★★★
() автор топика

Сделал такой хак в meson.build:

.........
extension_deps = [
  dependency('gio-2.0', version: '>= 2.50'),
  dependency('gtk+-3.0', version: '>= 3.22'),
]

vala_vapi_deps = meson.get_compiler('vala').find_library('Nautilus-3.0',
  dirs: join_paths(meson.current_source_dir(), 'vapi')
)
c_headers_deps = meson.get_compiler('c').find_library('libnautilus-extension')
.........
executable('extension', extension_sources,
  vala_args: '--target-glib=2.50',
  dependencies: [extension_deps, vala_vapi_deps, c_headers_deps],
  install: true,
)
Собралось:
.........
Found pkg-config: /usr/bin/pkg-config (1.3.9)
Native dependency gio-2.0 found: YES 2.54.0
Native dependency gtk+-3.0 found: YES 3.22.21
Library Nautilus-3.0 found: YES
Library libnautilus-extension found: YES
Native dependency glib-2.0 found: YES 2.54.0
........
Compilation succeeded - 0 warning(s)

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

Раз тема успешно решена (кстати, можно галочкой отметить), то задам оффтопный вопросик: когда у Vala появятся биндинги к Qt 5? Если это произойдет когда-либо, я немедленно записываюсь в фанаты Vala, пишу плагин к Qt Creator, и вообще во все поля.

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

Раз тема успешно решена (кстати, можно галочкой отметить)

Мне кажется, что это не решение, а выход из положения. И с vapi у меня не все в порядке. Пока до этого не дошел, но пока не знаю, что делать с этим:

	[CCode (cheader_filename = "Nautilus-3.0.h", has_type_id = false)]
	[Compact]
	public class File {
	}
	[CCode (cheader_filename = "Nautilus-3.0.h", has_type_id = false)]
	[Compact]
	public class OperationHandle {
	}

Т.е. на что менять Nautilus-3.0.h... Весь Nautilus-3.0.vapi

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

Очень очень жаль, прям идеальная пара вырисовывается теоретически. Может в Qt 6, когда (по слухам) сделают какие-то важные шаги по превращению Qt в «чисто библиотеку», может тогда выйдет, надеюсь.

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от CYB3R

Пока сам пытаюсь. Вроде все нашел, кроме

	[CCode (cheader_filename = "Nautilus-3.0.h", has_type_id = false)]
	[Compact]
	public class File {
	}

Текущий Nautilus-3.0.vapi

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

Добавь, пожалуйста, команду, которой ты его сгененрировал. Потому что я помню, что тоже с подобной задачей долго возился.

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

Добавь, пожалуйста, команду, которой ты его сгененрировал.

Так в первом сообщении, первый блок кода.

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

Да, искал соотвествующую функцию и т.п. в хидерах и вручную менял «Nautilus-3.0.h» на соотвествующий реальный хидер. А есть какой-то иной способ?

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

Да, у vapigen куча функций и если с ним определённым образом извратиться, можно получить нормальный сгенерированный VAPI. У меня даже как-то получилось. Проблема только в том, что я сейчас не вспомню, как.

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

Уже и не помню, с чем был связан изврат, может, не с vapigen, а с gobject-introspection. Но то, что с первой попытки у меня сгенерировался vapi с несуществующими заголовочными файлами, а с попытки номер N получился хороший работающий vapi — это было.

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

Интересно было бы.

В данном случае, все репозиторное из пакета nautilus-devel: готовый Nautilus-3.0.gir и хидеры в /usr/include/. Если и как-то извращаться, то только с vapigen...

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

Нужно через dbus экспортировать API Qt.

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

Уже и не помню, с чем был связан изврат, может, не с vapigen, а с gobject-introspection.

Вместо репозиторного Nautilus-3.0.gir, сгенерировал свой libnautilus-extension.gir с помощью g-ir-scanner указав заголовочные файлы (ключ: --c-include), оформил в виде скрипта g_ir_scanner_nautilus.sh
потом сгенерировал vapi:

$ vapigen --library libnautilus-extension --pkg gio-2.0 --pkg gtk+-3.0 libnautilus-extension.gir
Все заголовочные файлы указаны в каждом блоке CCode:
[CCode (cheader_filename = "nautilus/libnautilus-extension/nautilus-column-provider.h,nautilus/libnautilus-extension/nautilus-column.h,nautilus/libnautilus-extension/nautilus-extension-types.h,nautilus/libnautilus-extension/nautilus-file-info.h,nautilus/libnautilus-extension/nautilus-info-provider.h,nautilus/libnautilus-extension/nautilus-location-widget-provider.h,nautilus/libnautilus-extension/nautilus-menu-item.h,nautilus/libnautilus-extension/nautilus-menu-provider.h,nautilus/libnautilus-extension/nautilus-menu.h,nautilus/libnautilus-extension/nautilus-property-page-provider.h,nautilus/libnautilus-extension/nautilus-property-page.h", type_id = "nautilus_column_get_type ()")]
не очень эстетично, но все же.

Название такое же как у библиотеки, чтоб не извращаться в meson.build: libnautilus-extension.vapi

nvl ★★★
() автор топика
28 декабря 2017 г.
Ответ на: комментарий от CYB3R

Оказывается очень важна аннотация в заголовочном файле, я думал это просто комментарии:

/* header.h */

typedef struct _TElement TElement;

gchar* t_type_get_string1 (TType* self); //without annotation
/**
 * t_type_get_string2:
 *
 * Returns: (nullable)
 */
gchar* t_type_get_string2 (TType* self); //with annotation
GList*  t_type_get_list1    (TType* self); //without annotation
/**
 * t_type_type_get_list2:
 *
 * Returns: (nullable) (element-type T.Element) (transfer full): GList of TElement
 */
GList*  t_type_get_list2    (TType* self); //with annotation
На выходе получается:
namespace T {
  public class Type : GLib.Object {
     public string  get_string1 (); //without annotation
     public string? get_string2 (); //with annotation
     /* t_get_list1 without annotation is absent */
     public GLib.List<T.Element>? get_list2 (); //with annotation
  }
}
https://wiki.gnome.org/Projects/GObjectIntrospection/Annotations

nvl ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.