Как использовать объекты / методы Vala из C?

На данный момент мое приложение полностью написано на C, но я хотел бы начать добавлять объекты в Vala для использования в различных файлах C. Я знаю, что могу сгенерировать файлы .c / .h с помощью valac и включить их, но было бы предпочтительнее включить их в мою настройку automake в качестве исходного файла.

В противном случае просто напишите файл vapi для любого из файлов .c / .h и добавьте его как --pkg. К сожалению, это не так тривиально для того способа, который я хочу использовать.

Тем не менее, соответствующие дополнения.

configure.ac:

AM_PROG_VALAC([0.12.0])

dnl Only adding these to test the package include in vala
OFS_PACKAGES="--pkg gee-1.0"
AC_SUBST(OFS_PACKAGES)

Makefile.am:

VALAFLAGS = \
    @OFS_PACKAGES@

src_ofs_SOURCES = \
    src/main.c \
    src/test.vala

src / main.c

#include "test.h"

...

FooTest *object = foo_test_new ();

src / test.vala:

using Gee;

namespace Foo {

    public class Test : Object {

        public Test () {
            stdout.printf ("Test construction\n");
        }
    }
}

Когда я запускаю make, я получаю сообщение об ошибке

src/main.c:10:18: fatal error: test.h: No such file or directory

что неудивительно, учитывая, что вызов valac не произошел до вызова gcc. Итак, вопрос в том, действительно ли существует способ указать automake / make, чтобы сначала запустился valac, чтобы сгенерировать необходимые файлы для включения?

UPD:

Заставить его работать удалось с помощью следующих изменений:

Makefile.am:

VALAFLAGS = \
    -H ofs.h -C -c
    @OFS_PACKAGES@

src_ofs_SOURCES = \
    src/test.vala \
    src/main.c

person Geoff Johnson    schedule 22.08.2012    source источник


Ответы (1)


См. http://www.gnu.org/software/automake/manual/automake.html#Built-Sources-Example.

Самое простое решение - добавить test.h в BUILT_SOURCES:

BUILT_SOURCES += src/test.h
CLEANFILES += $(BUILT_SOURCES)

Вы можете расширить это, поместив ваши файлы vala в отдельную переменную:

src_ofs_VALASOURCES = $(filter %.valam,$(src_ofs_SOURCES))
BUILT_SOURCES += $(src_ofs_VALASOURCES:.vala=.h)

Альтернативный вариант - добавить его в nodist_ofs_SOURCES и в зависимости src/main.$(OBJEXT).

person ecatmur    schedule 22.08.2012
comment
Спасибо за это. Мне удалось заставить его работать, изменив порядок источников и valaflags (изменения будут опубликованы после этого), но я попробую ваши предложения, потому что они больше похожи на правильное решение. - person Geoff Johnson; 22.08.2012
comment
Вам также нужно будет попросить valac сгенерировать заголовок C (--header test.h), и вы, вероятно, захотите добавить цель test.h, которая зависит от файла штампа. Также обратите внимание, что это не один заголовок для каждого исходного файла, поэтому использовать * _SOURCES для генерации BUILT_SOURCES, вероятно, не очень хорошая идея. - person nemequ; 22.08.2012
comment
@nemequ Я как раз собирался опубликовать ответ, в котором говорилось, что я проверил предложения, сделанные ecatmur, и обнаружил проблему именно в том, что вы упомянули. Мое решение также заключалось в том, чтобы указать один файл заголовка с параметром --header для всех используемых файлов .vala, и я не использовал бит для расширения .vala = .h. Спасибо. - person Geoff Johnson; 23.08.2012