Как обнаружить use_frameworks! во время компиляции

Я разрабатываю Cocoapod. Кто-то, кто использует мой модуль, может выбрать, включать ли эту строку в свои Podfile:

use_frameworks!

Если они включают его, мой код будет скомпилирован в .framework файл. Если нет, он будет скомпилирован в .a файл.

Я хотел бы использовать макросы препроцессора, чтобы включить в код какао другой код, в зависимости от того, use_frameworks! настоящее.

Например, что-то вроде этого:

#if PODFILE_CONTAINS_USE_FRAMEWORKS
@import My_Library;
#else
#import <My-Library/MyLibrary.h>
#end

Эта ситуация возникает, когда у вас есть имя стручка, которое не c99extidentifier совместимый.

Я уже пытался проверить #if defined COCOAPODS, но это определено в обоих этих случаях.

2 ответа

Получил это работает.

Этот фрагмент должен идти в Podfile:

post_install do |pi|
    pi.pods_project.targets.each do |target|
        target.build_configurations.each do |config|
            unless pi.podfile.defined_in_file.read().include? "\nuse_frameworks!\n"
              config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= ['$(inherited)']
              config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] << 'NO_USE_FRAMEWORKS=1'
            end
        end
    end
end

Затем в исходном файле код выглядит так:

#if defined NO_USE_FRAMEWORKS
#import <My-Library/MyLibrary.h>
#else
@import My_Library;
#endif

По умолчанию @import синтаксис, если символа нет.

Таким образом, фрагмент Podfile действительно нужно добавить, только если use_frameworks! нет Но это будет работать в любом случае.

У меня была аналогичная проблема, как у вас здесь. Я хотел импортировать сгенерированный Swift заголовок из Objective C в пределах одного и того же Cocopod, но заголовок находится в разных местах в зависимости от типа библиотеки (и, следовательно, наличия или отсутствия use_frameworks!). Мне удалось импортировать правильный файл в обоих случаях без изменения файла Podfile.


Что я сделал

Чтобы импортировать заголовок как в статическую библиотеку (без use_frameworks!), так и в динамическую структуру (с use_frameworks!), я использовал кое-что, что нашел здесь :

Там в основном макрос препроцессора компилятора __has_include ( header-name )чтобы узнать, действительно ли у него есть файл импорта в этом конкретном месте.

Итак, если файл есть, я использую этот импорт, в противном случае я использую другой (при условии, что третьих вариантов нет).

Итак, в моем случае импорт выглядит так:

      #if defined __has_include && __has_include(<MyLibrary-Swift.h>)
#import <MyLibrary-Swift.h>
#else
#import <MyLibrary/MyLibrary-Swift.h>
#endif

Для запуска пользовательского кода в соответствии с наличием use_frameworks!

В вашем случае вы можете использовать __has_include(<MyLibrary-Swift.h>)как podfile DOESN'T contain use_frameworks!как это:

      #if defined __has_include && __has_include(<MyLibrary-Swift.h>)
// use_frameworks! is NOT present
#else
// use_frameworks! is present
#endif

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

  • MyLibrary-Swift.h -> если использовать_frameworks! НЕ присутствует в подфайле
  • MyLibrary/MyLibrary-Swift.h -> если использовать_frameworks! присутствует в подфайле
Другие вопросы по тегам