Построение фреймворка только для заголовка для iOS с Bazel (для использования собственной реализацией iOS) - PullRequest
2 голосов
/ 28 февраля 2020

Сводка

В настоящее время я пытаюсь создать библиотеку только для заголовков C ++ (17) для iOS. Эта библиотека должна выводить .framework, который должен использоваться в стандартном приложении iOS. Библиотека также (конечно) имеет другие зависимости, которые имеют исходные файлы.

Фон

  • Существующая установка использует Bazel, и до этого момента Tulsi использовала для интеграции, но теперь это должно измениться на версии версий библиотек (если Tulsi не может сгенерировать iOS .framework в комплекте с заголовочными файлами, которые я еще не видел - сообщите мне, если он существует).

  • Использование изначально ios_framework из build_bazel_rules_apple , пока в документации не было ясно, что это должно использоваться только в пределах цели Bazel ios (то есть с использованием ios_application) и что это не может быть затем извлечено и использовано отдельно в другом проекте.

  • Затем я повернулся к ios_static_framework (также замечено в build_bazel_rules_apple ), который кажется быть правильным, однако я никогда не смогу заставить его поддерживать структуру заголовка.

В настоящее время

Bazel

Использование ios_static_framework req Пользователь (очевидно) сначала оборачивает нормальный cc_library objc_library, который затем может быть помещен в deps из ios_static_framework, то есть

# BUILD example (assume all rules are loaded and WORKSPACE is setup correctly)
cc_library(
 name = "somelib",
 deps = [
  "//otherlib0", # A sub part of the lib I am trying to build
  "//otherlib1" # Another sub part of the lib I am trying to build
 ],
 hdrs = glob(["**/*.h"]),
 visibility=["//visibility:public"]
)

objc_library(
 name = "somelibwrapperobjc",
 deps = [
  "//:somelib"
 ],
 hdrs = glob(["**/*.h"]),
 visibility=["//visibility:public"]
)

ios_static_framework(
 name = "somelibidealoutput",
 families = ["iphone"],
 hdrs = glob(["**/*.h"]),
 umbrella_header = "libheader.h",
 deps = [
  "//:somelibwrapperobjc"
 ]
)

Похоже, что он также собирается без cc_library шаг к тому же результату, и на выходе получается каталог с somelibidealoutput.framework и заголовочным файлом libheader.h, но все остальное пропало.

Так что ^^ не работает.

CMake

Итак, я попробовал CMake с нуля.

cmake_minimum_required(VERSION 3.1)
project(myproject C CXX)
include_directories(${PROJECT_SOURCE_DIR}/projectincludesadditional)
set(HEADER_FILES
    myheader1.hpp
    onelayer/myheader2.hpp
    additional/header/myheader3.hpp
    ...
)

Затем я попытался Следующая часть двумя разными способами. Поскольку библиотеки CMake только для заголовков являются простыми, я попытался:

add_library(mylibrary INTERFACE)
target_include_directories(mylibrary INTERFACE ${HEADER_FILES})

, которые затем можно связать с реальной библиотекой, а также с другой альтернативой:

add_library(myconsuminglibrary SHARED
 ${HEADER_FILES})

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

set_target_properties(myconsuminglibrary PROPERTIES
 FRAMEWORK TRUE
 FRAMEWORK_VERSION CXX
 LINKER_LANGUAGE CXX
 MACOSX_FRAMEWORK_IDENTIFIER com.something.idontcare
 MACOSX_FRAMEWORK_INFO_PLIST info.plist
 VERSION 16.4.0
 SOVERSION 1.0.0
 PUBLIC_HEADER "myuselessumbrellaheaderthatdoesntpullanyotherheadersin.hpp"
 XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer"
)

Но заголовки не копируются поперек! только указанный заголовок publi c зонтик (и даже если там есть включение, оно не скопирует его, так как это не лексизирует файл.

Я следовал за возможным решением здесь (на cmake) в предложенных комментариях, но кажется, что он просто копирует один слой глубиной и снова удаляет структуру файла.

Должен ли я просто использовать простой install и предполагать, что это лучший способ использования этих заголовков в фреймворке? По сути, скопируйте их и надейтесь на лучшее?

Xcode

Наконец, я попытался создать традиционный фреймворк xcode, начинающийся с нуля. xcode.

Мне удалось получить все для сборки, как и ожидалось (с минимальными изменениями), но этот требуемый путь к проекту xcode изменился и т. д. c.

Однако, это выравнивает иерархию заголовки и, следовательно, все относительные пути заголовков снова становятся бесполезными в потребляющем приложении / библиотеке.

Вопрос

  1. Может ах Библиотека C ++ только для eader будет скомпилирована в динамическую / stati c библиотеку для iOS?
  2. Если да, то какая система сборки и какие изменения конфигурации необходимы для моей сборки CMake / Bazel система?
  3. Любые другие предложения ??
...