ALTERNATIVES:
Copier / coller facile de la dernière version (mais les instructions d'installation peuvent changer - voir ci-dessous!)
La bibliothèque de Karl prend beaucoup plus d'efforts à configurer, mais une solution à long terme beaucoup plus agréable (elle convertit votre bibliothèque en un Framework).
Utilisez-le, puis ajustez-le pour ajouter la prise en charge des versions d'archives - voir le commentaire de @ @ Frederik ci-dessous sur les modifications qu'il utilise pour que cela fonctionne correctement avec le mode Archive.
MODIFICATIONS RÉCENTES: 1. Ajout de la prise en charge d'iOS 10.x (tout en maintenant la prise en charge des anciennes plates-formes)
Informations sur la façon d'utiliser ce script avec un projet intégré dans un autre projet (bien que je recommande fortement de ne PAS le faire, jamais - Apple a quelques bogues de blocage dans Xcode si vous intégrez des projets les uns dans les autres, à partir de Xcode 3.x à Xcode 4.6.x)
Script bonus pour vous permettre d'inclure automatiquement des bundles (c'est-à-dire inclure des fichiers PNG, des fichiers PLIST, etc. de votre bibliothèque!) - voir ci-dessous (faites défiler vers le bas)
prend désormais en charge iPhone5 (en utilisant la solution de contournement d'Apple pour les bogues dans lipo). REMARQUE: les instructions d'installation ont changé (je peux probablement simplifier cela en changeant le script à l'avenir, mais je ne veux pas le risquer maintenant)
La section "copier les en-têtes" respecte désormais le paramètre de construction pour l'emplacement des en-têtes publics (avec l'aimable autorisation de Frederik Wallner)
Ajout du paramètre explicite de SYMROOT (peut-être que OBJROOT doit également être défini?), Grâce à Doug Dickinson
SCRIPT (c'est ce que vous devez copier / coller)
Pour les instructions d'utilisation / d'installation, voir ci-dessous
##########################################
#
# c.f. /programming/3520977/build-fat-static-library-device-simulator-using-xcode-and-sdk-4
#
# Version 2.82
#
# Latest Change:
# - MORE tweaks to get the iOS 10+ and 9- working
# - Support iOS 10+
# - Corrected typo for iOS 1-10+ (thanks @stuikomma)
#
# Purpose:
# Automatically create a Universal static library for iPhone + iPad + iPhone Simulator from within XCode
#
# Author: Adam Martin - http://twitter.com/redglassesapps
# Based on: original script from Eonil (main changes: Eonil's script WILL NOT WORK in Xcode GUI - it WILL CRASH YOUR COMPUTER)
#
set -e
set -o pipefail
#################[ Tests: helps workaround any future bugs in Xcode ]########
#
DEBUG_THIS_SCRIPT="false"
if [ $DEBUG_THIS_SCRIPT = "true" ]
then
echo "########### TESTS #############"
echo "Use the following variables when debugging this script; note that they may change on recursions"
echo "BUILD_DIR = $BUILD_DIR"
echo "BUILD_ROOT = $BUILD_ROOT"
echo "CONFIGURATION_BUILD_DIR = $CONFIGURATION_BUILD_DIR"
echo "BUILT_PRODUCTS_DIR = $BUILT_PRODUCTS_DIR"
echo "CONFIGURATION_TEMP_DIR = $CONFIGURATION_TEMP_DIR"
echo "TARGET_BUILD_DIR = $TARGET_BUILD_DIR"
fi
#####################[ part 1 ]##################
# First, work out the BASESDK version number (NB: Apple ought to report this, but they hide it)
# (incidental: searching for substrings in sh is a nightmare! Sob)
SDK_VERSION=$(echo ${SDK_NAME} | grep -o '\d\{1,2\}\.\d\{1,2\}$')
# Next, work out if we're in SIM or DEVICE
if [ ${PLATFORM_NAME} = "iphonesimulator" ]
then
OTHER_SDK_TO_BUILD=iphoneos${SDK_VERSION}
else
OTHER_SDK_TO_BUILD=iphonesimulator${SDK_VERSION}
fi
echo "XCode has selected SDK: ${PLATFORM_NAME} with version: ${SDK_VERSION} (although back-targetting: ${IPHONEOS_DEPLOYMENT_TARGET})"
echo "...therefore, OTHER_SDK_TO_BUILD = ${OTHER_SDK_TO_BUILD}"
#
#####################[ end of part 1 ]##################
#####################[ part 2 ]##################
#
# IF this is the original invocation, invoke WHATEVER other builds are required
#
# Xcode is already building ONE target...
#
# ...but this is a LIBRARY, so Apple is wrong to set it to build just one.
# ...we need to build ALL targets
# ...we MUST NOT re-build the target that is ALREADY being built: Xcode WILL CRASH YOUR COMPUTER if you try this (infinite recursion!)
#
#
# So: build ONLY the missing platforms/configurations.
if [ "true" == ${ALREADYINVOKED:-false} ]
then
echo "RECURSION: I am NOT the root invocation, so I'm NOT going to recurse"
else
# CRITICAL:
# Prevent infinite recursion (Xcode sucks)
export ALREADYINVOKED="true"
echo "RECURSION: I am the root ... recursing all missing build targets NOW..."
echo "RECURSION: ...about to invoke: xcodebuild -configuration \"${CONFIGURATION}\" -project \"${PROJECT_NAME}.xcodeproj\" -target \"${TARGET_NAME}\" -sdk \"${OTHER_SDK_TO_BUILD}\" ${ACTION} RUN_CLANG_STATIC_ANALYZER=NO" BUILD_DIR=\"${BUILD_DIR}\" BUILD_ROOT=\"${BUILD_ROOT}\" SYMROOT=\"${SYMROOT}\"
xcodebuild -configuration "${CONFIGURATION}" -project "${PROJECT_NAME}.xcodeproj" -target "${TARGET_NAME}" -sdk "${OTHER_SDK_TO_BUILD}" ${ACTION} RUN_CLANG_STATIC_ANALYZER=NO BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" SYMROOT="${SYMROOT}"
ACTION="build"
#Merge all platform binaries as a fat binary for each configurations.
# Calculate where the (multiple) built files are coming from:
CURRENTCONFIG_DEVICE_DIR=${SYMROOT}/${CONFIGURATION}-iphoneos
CURRENTCONFIG_SIMULATOR_DIR=${SYMROOT}/${CONFIGURATION}-iphonesimulator
echo "Taking device build from: ${CURRENTCONFIG_DEVICE_DIR}"
echo "Taking simulator build from: ${CURRENTCONFIG_SIMULATOR_DIR}"
CREATING_UNIVERSAL_DIR=${SYMROOT}/${CONFIGURATION}-universal
echo "...I will output a universal build to: ${CREATING_UNIVERSAL_DIR}"
# ... remove the products of previous runs of this script
# NB: this directory is ONLY created by this script - it should be safe to delete!
rm -rf "${CREATING_UNIVERSAL_DIR}"
mkdir "${CREATING_UNIVERSAL_DIR}"
#
echo "lipo: for current configuration (${CONFIGURATION}) creating output file: ${CREATING_UNIVERSAL_DIR}/${EXECUTABLE_NAME}"
xcrun -sdk iphoneos lipo -create -output "${CREATING_UNIVERSAL_DIR}/${EXECUTABLE_NAME}" "${CURRENTCONFIG_DEVICE_DIR}/${EXECUTABLE_NAME}" "${CURRENTCONFIG_SIMULATOR_DIR}/${EXECUTABLE_NAME}"
#########
#
# Added: StackOverflow suggestion to also copy "include" files
# (untested, but should work OK)
#
echo "Fetching headers from ${PUBLIC_HEADERS_FOLDER_PATH}"
echo " (if you embed your library project in another project, you will need to add"
echo " a "User Search Headers" build setting of: (NB INCLUDE THE DOUBLE QUOTES BELOW!)"
echo ' "$(TARGET_BUILD_DIR)/usr/local/include/"'
if [ -d "${CURRENTCONFIG_DEVICE_DIR}${PUBLIC_HEADERS_FOLDER_PATH}" ]
then
mkdir -p "${CREATING_UNIVERSAL_DIR}${PUBLIC_HEADERS_FOLDER_PATH}"
# * needs to be outside the double quotes?
cp -r "${CURRENTCONFIG_DEVICE_DIR}${PUBLIC_HEADERS_FOLDER_PATH}"* "${CREATING_UNIVERSAL_DIR}${PUBLIC_HEADERS_FOLDER_PATH}"
fi
fi
INSTALLER LES INSTRUCTIONS
- Créer un projet de bibliothèque statique
- Sélectionnez la cible
- Dans l'onglet "Build Settings", définissez "Build Active Architecture Only" sur "NO" (pour tous les éléments)
- Dans l'onglet "Build Phases", sélectionnez "Add ... New Build Phase ... New Run Script Build Phase"
- Copiez / collez le script (ci-dessus) dans la boîte
... BONUS OPTIONAL utilisation:
- FACULTATIF: si vous avez des en-têtes dans votre bibliothèque, ajoutez-les à la phase "Copier les en-têtes"
- FACULTATIF: ... et faites-les glisser de la section "Projet" vers la section "Public"
- FACULTATIF: ... et ils seront AUTOMATIQUEMENT exportés chaque fois que vous construirez l'application, dans un sous-répertoire du répertoire "debug-universal" (ils seront dans usr / local / include)
- FACULTATIF: REMARQUE: si vous essayez également de faire glisser / déposer votre projet dans un autre projet Xcode, cela expose un bogue dans Xcode 4, où il ne peut pas créer un fichier .IPA si vous avez des en-têtes publics dans votre projet glisser / déposer. Solution: n'intégrez pas de projets xcode (trop de bogues dans le code d'Apple!)
Si vous ne trouvez pas le fichier de sortie, voici une solution:
Ajoutez le code suivant à la fin du script (avec la permission de Frederik Wallner): ouvrez "$ {CREATING_UNIVERSAL_DIR}"
Apple supprime toutes les sorties après 200 lignes. Sélectionnez votre cible et dans la phase d'exécution du script, vous DEVEZ décocher: "Afficher les variables d'environnement dans le journal de génération"
si vous utilisez un répertoire "build output" personnalisé pour XCode4, alors XCode place tous vos fichiers "inattendus" au mauvais endroit.
- Construire le projet
- Cliquez sur la dernière icône à droite, dans le coin supérieur gauche de Xcode4.
- Sélectionnez l'élément supérieur (il s'agit de votre "version la plus récente". Apple devrait le sélectionner automatiquement, mais ils n'y ont pas pensé)
- dans la fenêtre principale, faites défiler vers le bas. La toute dernière ligne doit se lire: lipo: pour la configuration actuelle (débogage), création du fichier de sortie: /Users/blah/Library/Developer/Xcode/DerivedData/AppName-ashwnbutvodmoleijzlncudsekyf/Build/Products/Debug-universal/libTargetName.a
... c'est l'emplacement de votre Universal Build.
Comment inclure des fichiers "non sourcecode" dans votre projet (PNG, PLIST, XML, etc.)
- Faites tout ce qui précède, vérifiez que cela fonctionne
- Créez une nouvelle phase d'exécution de script qui vient APRÈS LA PREMIÈRE (copiez / collez le code ci-dessous)
- Créer une nouvelle cible dans Xcode, de type "bundle"
- Dans votre MAIN PROJECT, dans "Build Phases", ajoutez le nouveau bundle comme quelque chose dont il "dépend" (section supérieure, appuyez sur le bouton plus, faites défiler vers le bas, trouvez le fichier ".bundle" dans vos produits)
- Dans votre NOUVELLE CIBLE BUNDLE, dans "Build Phases", ajoutez une section "Copy Bundle Resources", et glissez / déposez tous les fichiers PNG, etc.
Script pour copier automatiquement le ou les bundles intégrés dans le même dossier que votre bibliothèque statique FAT:
echo "RunScript2:"
echo "Autocopying any bundles into the 'universal' output folder created by RunScript1"
CREATING_UNIVERSAL_DIR=${SYMROOT}/${CONFIGURATION}-universal
cp -r "${BUILT_PRODUCTS_DIR}/"*.bundle "${CREATING_UNIVERSAL_DIR}"