ALTERNATIVES:
https://gist.github.com/3705459 - facile de copier/coller de la version la plus récente (mais les instructions d'installation peut changer - voir ci-dessous!)
Karl bibliothèque (http://stackoverflow.com/a/5721978/153422 ) prend beaucoup plus d'efforts pour l'installation, mais beaucoup plus agréable à long terme de la solution (il convertit votre bibliothèque dans un Cadre).
MODIFICATIONS RÉCENTES:
Info sur comment 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 un couple de show-bouchon de bugs dans Xcode si vous intégrez des projets à l'intérieur les uns des autres, à partir de Xcode 3.x par le biais de Xcode 4.6.x)
Bonus de script pour vous permettre d'auto-inclure les Grappes (c'est à dire inclure les fichiers PNG, fichiers PLIST etc à partir de votre bibliothèque!) - voir ci-dessous (faites défiler vers le bas)
prend désormais en charge iPhone5 (à l'aide d'Apple solution de contournement pour les bugs en lipo). REMARQUE: les instructions d'installation ont changé (je peux probablement simplifier cela en modifiant le script à l'avenir, mais ne veulent pas prendre le risque maintenant)
"copie des en-têtes de section" respecte maintenant le paramètre de construction pour l'emplacement des en-têtes publics (avec l'aimable autorisation de Frederik Wallner)
Ajouté la définition explicite de SYMROOT (peut-être besoin OBJROOT être trop?), merci à Doug Dickinson
SCRIPT (c'est ce que vous avez copier/coller)
Pour l'utilisation / instructions d'installation, voir ci-dessous
##########################################
#
# c.f. http://stackoverflow.com/questions/3520977/build-fat-static-library-device-simulator-using-xcode-and-sdk-4
#
# Version 2.7
#
# Latest Change:
# - Supports iPhone 5 / iPod Touch 5 (uses Apple's workaround to lipo bug)
#
# 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 '.\{3\}$')
# 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
INSTRUCTIONS D'INSTALLATION
- Créer une lib statique projet
- Sélectionnez la Cible
- Dans "Build Settings", onglet set "Construire Active Seulement l'Architecture" à "NO" (pour tous les éléments)
- Dans les "Phases de construction" de l'onglet, sélectionnez "Ajouter ... Nouvelle Phase de construction ... de Nouvelles Exécuter le Script Phase de construction"
- Copier/coller le script (ci-dessus) dans la boîte
...BONUS FACULTATIF utilisation:
- FACULTATIF: si vous avez les en-têtes dans votre bibliothèque, les ajouter à la "Copie des en-Têtes" phase
- En OPTION: ...et faites-le glisser/déposer depuis la partie "Projet" pour le "Public" de la section
- En OPTION: ...et ils seront AUTOMATIQUEMENT exportées chaque fois que vous générez l'application, dans un sous-répertoire de "debug-universel" directory (ils seront dans usr/local/include)
- En OPTION: REMARQUE: si vous aussi essayer de glisser/déposer de votre projet dans un autre projet Xcode, ce qui les expose à un bug dans Xcode 4, où il ne peut pas créer un .Fichier IPA si vous avez des Publics les en-Têtes dans votre glissé/déplacé de projet. La solution: ne pas intégrer des projets xcode (trop de bugs d'Apple dans le code!)
Si vous ne pouvez pas trouver le fichier de sortie, voici une solution de contournement:
Ajoutez le code suivant à la fin du script (avec l'aimable autorisation de Frederik Wallner): ouvrir "${CREATING_UNIVERSAL_DIR}"
Apple supprime toutes les données de sortie au bout de 200 lignes. Sélectionnez votre Cible, et dans l'Exécution d'un Script Phase, vous DEVEZ décocher la case: "Afficher les variables d'environnement dans le build log"
-
si vous êtes en utilisant une mesure de construire "sortie" répertoire pour XCode4, puis XCode met tous vos "inattendue" des fichiers dans le mauvais endroit.
- Construire le projet
- Cliquez sur la dernière icône à droite, dans la zone en haut à gauche de Xcode4.
- Sélectionnez l'élément du haut (c'est votre "plus récente génération". Apple devrait automatique-sélectionnez-le, mais ils n'ont pas pensé à ça)
- dans la fenêtre principale, faites défiler vers le bas. La dernière ligne devrait lire: lipo: pour la configuration actuelle (Debug) la création de fichier de sortie: /Users/blah/Library/Developer/Xcode/DerivedData/AppName-ashwnbutvodmoleijzlncudsekyf/Build/Products/Debug-universal/libTargetName.a
...c'est l'emplacement de votre version Universelle.
Comment inclure "non sourcecode" les fichiers dans votre projet (PNG, PLIST, XML, etc)
- Faire tout ce qui précède, vérifier qu'il fonctionne
- Créer un nouveau Exécuter le Script de la phase 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 PROJET, dans les "Phases de construction", d'ajouter le nouveau bundle comme quelque chose qu'il "dépend" (section du haut, frapper la touche plus, faites défiler vers le bas, de trouver les ".bundle" fichier dans vos Produits)
- Dans votre NOUVEAU FAISCEAU CIBLE, dans les "Phases de construction", ajouter un "Copier Bundle de Ressources", et faites-le glisser/déplacer tous les fichiers PNG etc en elle
Script de copie automatique intégré bundle(s) dans le même dossier que votre GRAISSE bibliothèque statique:
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}"