Como posso xcodebuild uma biblioteca estática com Bitcode habilitado?

89

Xcode 7 apresenta Bitcode , que é algum tipo de binário intermediário LLVM que significa que os servidores da Apple podem recompilar meu aplicativo para diferentes arquiteturas sem meu envolvimento.

No Lookback, distribuo uma estrutura de arquivo estático com nossa biblioteca. Parece que quando você constrói com qualquer coisa que não seja um "Build & Archive", o bitcode não é realmente emitido para minha biblioteca, e qualquer um que se conectar com minha biblioteca em seu aplicativo e tentar fazer um Build & Archive com Bitcode habilitado terá dois avisos:

  • ld: 'Lookback(Lookback.o)' does not contain bitcode. You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE), obtain an updated library from the vendor, or disable bitcode for this target. (se lib for construído com Xcode 6)
  • ld: warning: full bitcode bundle could not be generated because 'Lookback(Lookback.o)' was built only with bitcode marker. The library must be generated from Xcode archive build with bitcode enabled (Xcode setting ENABLE_BITCODE) (se lib for construído com Xcode 7 com um xcodebuild normal)

Eu tenho um script de compilação que cria um binário universal de dispositivo + simulador, então não posso usar Build & Archive, mas em vez disso, executo a xcodebuildpartir da linha de comando do meu script. Como posso fazer xcodebuildgerar uma biblioteca habilitada para bitcode adequada?

nevyn
fonte
HI @nevyn Estou tentando fazer seu SDK compilar em um aplicativo que usa bitcode. Há algum caminho?
Stoff81
@ Stoff81 Desculpe, estou trabalhando nisso. Preciso que todas as minhas dependências funcionem com o Bitcode primeiro, e é um pouco trabalhoso.
nevyn

Respostas:

137

Bitcode é um recurso de tempo de compilação (não um recurso de tempo de link), o que significa que cada arquivo .o deve conter uma seção extra chamada __bitcode quando construído com bitcode. Você pode confirmar se seu binário é compatível com código de bits executando otool -l (my .o or .a file) | grep __LLVM.

Quando você constrói normalmente, o Xcode adiciona o sinalizador de construção -fembed-bitcode-markera qualquer invocação do clang. Isso parece ser uma espécie de 'é para onde o bitcode iria, se o bitcode estivesse habilitado', e não habilita o bitcode.

Quando você "Construir e Arquivar", este sinalizador é substituído por -fembed-bitcode, que realmente cria um binário habilitado para Bitcode.

Parece haver duas maneiras de fazer xcodebuilduso -fembed-bitcode:

  • Use a ação 'arquivar', como em em xcodebuild -target LookbackSDK archivevez de xcodebuild -target LookbackSDK build. Isso tem o efeito colateral de colocar binários em seu Xcode Organizer em vez de na build/pasta, embora você possa contornar isso usando -exportArchive -archivePath ./build(obrigado @JensAyton )
  • Force o uso do sinalizador adicionando Outros sinalizadores C com OTHER_CFLAGS="-fembed-bitcode". Sua xcodebuildinvocação seria semelhante a xcodebuild OTHER_CFLAGS="-fembed-bitcode" -target LookbackSDK build.

Este último é o que eu escolhi para não ter que mudar meu sistema de compilação, mas irá gerar avisos para cada arquivo, pois agora ambos -fembed-bitcode-markere -fembed-bitcodesão enviados para o clang. Felizmente, o último ganha, gerando uma biblioteca habilitada para Bitcode!

Recursos

nevyn
fonte
9
FWIW, você pode se livrar do aviso sobre -fembed-bitcode-markerser ignorado adicionando -Qunused-argumentstambém.
mstorsjo
qual exportFormat usar para um xcodebuild de um framework? Apenas "ipa", "pkg" e "app" parecem estar definidos ( developer.apple.com/library/mac/documentation/Darwin/Reference/… ).
Fabian Köbel
@nevyn Ainda não consegui construir meu aplicativo principal, que tem o arquivo de estrutura personalizado que, por sua vez, contém um script de construção com a sinalização mencionada acima.
Ravoorinandan
otool -l (meu arquivo .o ou .a). Você quer dizer otool -l (meu arquivo .o ou .a) | grep __bitcode?
Mike M
1
@MikeM não otool -l myfile.o | grep __LLVM, na verdade , porque haverá um segmento __bitcode mesmo se houver apenas um marcador de código de bits em vez do código de bits real.
nevyn
41

Com o Xcode 8, não consegui OTHER_CFLAGS="-fembed-bitcode"trabalhar. Continuei encontrando algo parecido com was built without full bitcode. All frameworks and dylibs for bitcode must be generated from Xcode Archive or Install buildquando tentei criar um arquivo de compilação de um aplicativo contendo minha estrutura estática.

O que eu realmente estava procurando era isto:

BITCODE_GENERATION_MODE=bitcode

Na verdade, estou usando um Run Script dentro de um destino agregado, a linha xcodebuild completa se parece com isto (apenas para referência):

xcodebuild BITCODE_GENERATION_MODE=bitcode OTHER_CFLAGS="-fembed-bitcode" -target "${PROJECT_NAME}" ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphoneos BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build

Aaron Ash
fonte
2
+1, o BITCODE_GENERATION_MODE=bitcodemétodo parece ser o preferido, como sugerido também nesta resposta .
William Denniss
Isso também corrigiu meu problema, enquanto a resposta padrão não o faz mais.
Kamchatka
Salva-vidas! Obrigado!
vidalbenjoe
17

Depois de adicionar suporte a bitcode para a biblioteca estática, ele não será compatível com o Xcode 6. O aplicativo não será arquivado.

Eu gostaria de mencionar claramente a configuração do bitcode, pois a resposta de @evynn me confundiu um pouco.

Vá para Configurações de compilação, procure por "sinalizadores de compilador personalizados". Adicionar -fembed-bitcode. Isso irá construir sua biblioteca com bitcode.

Gautam Jain
fonte
6

Selecione o projeto em Configurações de compilação -> Outros sinalizadores C, defina Depurar como -fembed-bitcode-marker e Release para -fembed-bitcode

Em Build Settings, clique no sinal + na parte superior para adicionar uma configuração de build definida pelo usuário com o nome BITCODE_GENERATION_MODE e defina Debug para marcador, Release para bitcode

Edite o esquema como versão Em seguida, clique na biblioteca desejada. Um arquivo e obtenha o caminho de construção. Obtenha a pasta Release do formulário da biblioteca.

Oshitha Wimalasuriya
fonte