Comment puis-je xcodebuild une bibliothèque statique avec Bitcode activé?

88

Xcode 7 introduit Bitcode , qui est une sorte de binaire intermédiaire LLVM qui signifie que les serveurs d'Apple peuvent recompiler mon application pour différentes architectures sans ma participation.

Chez Lookback, je distribue un framework d'archive statique avec notre bibliothèque. Il semble que lorsque vous construisez avec autre chose qu'un "Build & Archive", le bitcode n'est pas réellement émis dans ma bibliothèque, et quiconque se connecte avec ma bibliothèque dans son application et essaie de faire un Build & Archive avec Bitcode activé obtiendra l'un des deux avertissements:

  • 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. (si lib est construit avec 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) (si lib est construit avec Xcode 7 avec un xcodebuild normal)

J'ai un script de construction qui construit un binaire universel appareil + simulateur, donc je ne peux pas utiliser Build & Archive, mais plutôt, je lance à xcodebuildpartir de la ligne de commande à partir de mon script. Comment puis-je xcodebuildgénérer une bibliothèque compatible avec le bitcode?

Nevyn
la source
HI @nevyn J'essaie de faire compiler votre SDK dans une application qui utilise le bitcode. Y a-t-il un moyen?
Stoff81
@ Stoff81 Désolé, je travaille dessus. Je dois d'abord faire fonctionner toutes mes dépendances avec Bitcode, et c'est un peu de travail.
nevyn

Réponses:

137

Bitcode est une fonctionnalité de compilation (pas une fonctionnalité de liaison) ce qui signifie que chaque fichier .o doit contenir une section supplémentaire appelée __bitcode lorsqu'il est construit avec bitcode. Vous pouvez vérifier si votre binaire est compatible avec le bitcode en exécutantotool -l (my .o or .a file) | grep __LLVM .

Lorsque vous construisez normalement, Xcode ajoute l'indicateur de construction -fembed-bitcode-marker à tout appel de clang. Cela semble être une sorte de chose 'c'est là que le bitcode irait, si le bitcode était activé', et n'active pas réellement le bitcode.

Lorsque vous "Construire et archiver", cet indicateur est remplacé par -fembed-bitcode, ce qui crée vraiment un binaire compatible Bitcode.

Il semble y avoir deux façons d' xcodebuildutiliser -fembed-bitcode:

  • Utilisez l'action 'archiver', comme dans xcodebuild -target LookbackSDK archiveau lieu de xcodebuild -target LookbackSDK build. Cela a pour effet secondaire de placer des binaires dans votre organisateur Xcode au lieu du build/dossier, bien que vous puissiez contourner cela en utilisant -exportArchive -archivePath ./build(merci @JensAyton )
  • Forcer l'utilisation de l'indicateur en ajoutant d'autres indicateurs C avec OTHER_CFLAGS="-fembed-bitcode". Votre xcodebuildinvocation ressemblerait à quelque chose comme xcodebuild OTHER_CFLAGS="-fembed-bitcode" -target LookbackSDK build.

Ce dernier est ce que j'ai choisi pour ne pas avoir à changer mon système de construction, mais il générera des avertissements pour chaque fichier, puisque maintenant les deux -fembed-bitcode-markeret -fembed-bitcodesont envoyés à clang. Heureusement, ce dernier gagne, générant une bibliothèque compatible Bitcode!

Ressources

Nevyn
la source
9
FWIW, vous pouvez vous débarrasser de l'avertissement d' -fembed-bitcode-markerêtre ignoré en ajoutant -Qunused-argumentségalement.
mstorsjo du
quel exportFormat utilise pour un xcodebuild d'un framework? Seuls «ipa», «pkg» et «app» semblent être définis ( developer.apple.com/library/mac/documentation/Darwin/Reference/… ).
Fabian Köbel
@nevyn Still n'a pas pu créer mon application principale qui contient le fichier de cadre personnalisé qui à son tour contient un script de construction avec l'indicateur mentionné ci-dessus.
ravoorinandan
otool -l (mon fichier .o ou .a). Voulez-vous dire otool -l (mon fichier .o ou .a) | grep __bitcode?
Mike M
1
@MikeM non en fait otool -l myfile.o | grep __LLVM, car il y aura un segment __bitcode même s'il n'y a qu'un marqueur de bitcode au lieu d'un vrai bitcode.
nevyn
40

Avec Xcode 8, je ne pouvais pas me rendre OTHER_CFLAGS="-fembed-bitcode"au travail. J'ai continué à rencontrer quelque chose du genre was built without full bitcode. All frameworks and dylibs for bitcode must be generated from Xcode Archive or Install buildlorsque j'ai essayé de créer une version d'archive d'une application contenant mon framework statique.

Ce que je cherchais vraiment, c'était ceci:

BITCODE_GENERATION_MODE=bitcode

J'utilise en fait un Run Script à l'intérieur d'une cible agrégée, la ligne xcodebuild complète ressemble à ceci (juste pour référence):

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
la source
2
+1, la BITCODE_GENERATION_MODE=bitcodeméthode semble être préférée, comme suggéré dans cette réponse également.
William Denniss
Cela a également résolu mon problème alors que la réponse par défaut ne le fait plus.
Kamchatka
Sauveur de vie! Merci!
vidalbenjoe
17

Une fois que vous avez ajouté la prise en charge du bitcode pour la bibliothèque statique, elle ne sera plus compatible avec Xcode 6. L'application ne sera pas archivée.

Je voudrais mentionner clairement le réglage du bitcode car la réponse de @ nevyn m'a un peu dérouté.

Allez dans les paramètres de construction, recherchez «indicateurs de compilateur personnalisés». Ajouter -fembed-bitcode. Cela construira votre bibliothèque avec bitcode.

Gautam Jain
la source
6

Sélectionnez le projet Sur les paramètres de construction -> Autres indicateurs C, définissez Debug sur -fembed-bitcode-marker et Release sur -fembed-bitcode

Sur Paramètres de construction, cliquez sur le signe + en haut pour ajouter un paramètre de construction défini par l'utilisateur avec le nom BITCODE_GENERATION_MODE, et définissez Debug sur marqueur, Release sur bitcode

Modifier le schéma en tant que version Cliquez ensuite sur la bibliothèque souhaitée. Un fichier et obtenez le chemin de construction. Obtenez le dossier Release du formulaire de bibliothèque.

Oshitha Wimalasuriya
la source