Как включить заголовок C из отдельного пакета Swift в часть C другого пакета Swift - PullRequest
0 голосов
/ 08 мая 2020

Я пишу многоплатформенный игровой движок для развлечения на Swift. Базовый c макет пакетов Swift выглядит следующим образом:

  1. NativeTypes: Некоторые C структуры, такие как Vectors, Matrices и т. Д.
  2. Engine: обертывает некоторые NativeTypes для создания em usable, плюс движок: в основном все, кроме кода, зависящего от платформы.
  3. PlatformImplementation: содержит цель Swift, реализующую различные протоколы c платформы от Engine, а также цель C для реализации специфики платформы c такие вещи, как средство визуализации Vulkan и еще много чего.

Мне нужно импортировать заголовки NativeTypes в C часть PlatformImplementation, чтобы я мог взять типы оттуда и передать их прямо в свой рендерер. Альтернативой является дублирование кода (необходимо точное выравнивание, et c.), Но, конечно, это будет проблемой.

Есть ли способ сделать это?

1 Ответ

0 голосов
/ 09 июня 2020

Я придумал (hacki sh, не идеальное!) Решение для всех, у кого также есть эта проблема. Хитрость заключается в том, чтобы просто сохранить локальное дерево зависимостей всех пакетов, а затем просто обойти его в C. Реализация:

1. Пакет, который должен импортировать заголовки C локально, зависит от пакета, содержащего заголовки C. Таким образом мы можем гарантировать стабильную структуру папок:

    dependencies:[
    .package(path: "./NativeCodePackage"),
    .package(path: "./OtherPackage")
],

2. В другом пакете импортируйте нужные заголовки из первого пакета, просто перейдя к ним, например:

    #define STR_IMPL(A) #A
#define STR(A) STR_IMPL(A)

#define NATIVEHEADERSDIR ../../../../../NativeCodePackage/Sources/NativeCodePackage/include

3. Наконец, просто импортируйте:

#include STR(NATIVEHEADERDIR/Maths/Vector.h)

Если вы хотите увидеть работающую реализацию этого, посмотрите мой проект движка Swift, где я реализую это решение: https://github.com/forbiddencactus/Galah

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...