Как обнаружить 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! присутствует в подфайле