web-dev-qa-db-fra.com

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

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'archivage 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 toute personne qui établit un lien avec ma bibliothèque dans leur application et qui tente 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 device + simulator, je ne peux donc pas utiliser Build & Archive, mais je lance plutôt xcodebuild à partir de la ligne de commande à partir de mon script. Comment puis-je faire en sorte que xcodebuild génère une bibliothèque compatible avec le bitcode approprié?

80
nevyn

Bitcode est une fonctionnalité de compilation (et non une fonctionnalité de lien), 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 code binaire en exécutant otool -l (my .o or .a file) | grep __LLVM.

Lorsque vous générez normalement, Xcode ajoute l'indicateur de construction -fembed-bitcode-marker À toute invocation de clang. Cela semble être une sorte de "c'est là que serait le bitcode, si bitcode était activé", et n'active pas réellement le bitcode.

Lorsque vous "Construisez et archivez", cet indicateur est remplacé par -fembed-bitcode, Qui crée en réalité un fichier binaire compatible Bitcode.

Il semble y avoir deux façons de faire xcodebuild utiliser -fembed-bitcode:

  • Utilisez l'action 'archive', comme dans xcodebuild -target LookbackSDK archive Au lieu de xcodebuild -target LookbackSDK build. Cela a pour effet secondaire de placer des fichiers binaires dans votre organiseur Xcode au lieu du dossier build/, Bien que vous puissiez contourner ce problème en utilisant -exportArchive -archivePath ./build (Merci @ JensAyton )
  • Forcer l'utilisation du drapeau en ajoutant d'autres drapeaux en C avec OTHER_CFLAGS="-fembed-bitcode". Votre invocation xcodebuild 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 de système de construction, mais il générera des avertissements pour chaque fichier, car à présent, -fembed-bitcode-marker Et -fembed-bitcode Sont envoyés à clang. Heureusement, ce dernier gagne, générant une bibliothèque compatible Bitcode!

Ressources

126
nevyn

Avec Xcode 8, je ne pouvais pas obtenir OTHER_CFLAGS="-fembed-bitcode" travailler. Je continuais à courir dans quelque chose comme was built without full bitcode. All frameworks and dylibs for bitcode must be generated from Xcode Archive or Install build quand j'ai essayé de créer une version archive d'une application contenant mon framework statique.

Ce que je cherchais vraiment était ceci:

BITCODE_GENERATION_MODE=bitcode

En fait, j'utilise un script d'exécution à l'intérieur d'une cible agrégée. La ligne complète de xcodebuild 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

34
Aaron Ash

Une fois que vous avez ajouté la prise en charge de bitcode pour la bibliothèque statique, celle-ci ne sera plus compatible avec Xcode 6. L'application n'archivera pas.

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

Accédez aux paramètres de construction, recherchez "drapeaux de compilateur personnalisés". Ajouter -fembed-bitcode. Cela construira votre lib avec bitcode.

17
Gautam Jain

sélectionnez un projet dans les paramètres de construction -> autres indicateurs C, définissez Debug sur -fembed-bitcode-marker et sur Libérer sur -fembed-bitcode

Dans les 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, puis définissez Debug sur le marqueur, Release en bitcode.

Éditez le schéma en tant que version. Ensuite, léchez le fichier library.a et récupérez le chemin de la construction.

4