ALTERNATIVE:
Facile copia / incolla dell'ultima versione (ma le istruzioni di installazione potrebbero cambiare - vedi sotto!)
La libreria di Karl richiede molto più sforzo per l'installazione, ma una soluzione a lungo termine molto più bella (converte la tua libreria in un Framework).
Usa questo, quindi modificalo per aggiungere il supporto per le build di Archive - vedi il commento di @ Frederik di seguito sulle modifiche che sta usando per farlo funzionare bene con la modalità Archive.
MODIFICHE RECENTI: 1. Aggiunto il supporto per iOS 10.x (mantenendo il supporto per le piattaforme più vecchie)
Informazioni su come utilizzare questo script con un progetto incorporato in un altro progetto (anche se consiglio vivamente di NON farlo, mai - Apple ha un paio di bug di blocco dello spettacolo in Xcode se si incorporano progetti uno dall'altro, da Xcode 3.x fino a Xcode 4.6.x)
Script bonus per permetterti di includere automaticamente i pacchetti (ad esempio includere file PNG, file PLIST ecc. Dalla tua libreria!) - vedi sotto (scorri verso il basso)
ora supporta iPhone5 (usando la soluzione alternativa di Apple ai bug in lipo). NOTA: le istruzioni di installazione sono cambiate (probabilmente posso semplificarlo cambiando lo script in futuro, ma non voglio rischiare ora)
La sezione "copia intestazioni" ora rispetta l'impostazione di costruzione per la posizione delle intestazioni pubbliche (per gentile concessione di Frederik Wallner)
Aggiunta l'impostazione esplicita di SYMROOT (forse è necessario impostare anche OBJROOT?), Grazie a Doug Dickinson
SCRIPT (questo è quello che devi copiare / incollare)
Per le istruzioni di utilizzo / installazione, vedere di seguito
##########################################
#
# 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
ISTRUZIONI PER L'INSTALLAZIONE
- Crea un progetto lib statico
- Seleziona l'obiettivo
- Nella scheda "Crea impostazioni", imposta "Crea solo architettura attiva" su "NO" (per tutti gli elementi)
- Nella scheda "Fasi di costruzione", seleziona "Aggiungi ... Nuova fase di costruzione ... Nuova fase di creazione dello script di esecuzione"
- Copia / incolla lo script (sopra) nella casella
... Utilizzo OPZIONALE BONUS:
- OPZIONALE: se nella libreria sono presenti intestazioni, aggiungerle alla fase "Copia intestazioni"
- OPZIONALE: ... e trascinarli dalla sezione "Progetto" alla sezione "Pubblico"
- OPZIONALE: ... e verranno esportati AUTOMATICAMENTE ogni volta che compili l'app, in una sottodirectory della directory "debug-universal" (saranno in usr / local / include)
- OPZIONALE: NOTA: se si tenta anche di trascinare / rilasciare il progetto in un altro progetto Xcode, questo espone un bug in Xcode 4, dove non è possibile creare un file .IPA se nel progetto di trascinamento / rilascio sono presenti intestazioni pubbliche. La soluzione alternativa: non incorporare progetti xcode (troppi bug nel codice Apple!)
Se non riesci a trovare il file di output, ecco una soluzione alternativa:
Aggiungi il seguente codice alla fine dello script (per gentile concessione di Frederik Wallner): apri "$ {CREATING_UNIVERSAL_DIR}"
Apple elimina tutto l'output dopo 200 righe. Seleziona la tua destinazione e, nella fase Esegui script, DEVI deselezionare: "Mostra variabili di ambiente nel registro build"
se stai usando una directory "build output" personalizzata per XCode4, XCode mette tutti i tuoi file "imprevisti" nella posizione sbagliata.
- Costruisci il progetto
- Fai clic sull'ultima icona a destra, nell'area in alto a sinistra di Xcode4.
- Seleziona l'elemento principale (questa è la tua "build più recente". Apple dovrebbe selezionarlo automaticamente, ma non ci hanno pensato)
- nella finestra principale, scorrere verso il basso. L'ultima riga dovrebbe contenere: lipo: per la configurazione corrente (debug) che crea il file di output: /Users/blah/Library/Developer/Xcode/DerivedData/AppName-ashwnbutvodmoleijzlncudsekyf/Build/Products/Debug-universal/libTargetName.a
... questa è la posizione della tua build universale.
Come includere file "non sourcecode" nel progetto (PNG, PLIST, XML, ecc.)
- Fai tutto quanto sopra, controlla che funzioni
- Crea una nuova fase Run Script che arriva DOPO IL PRIMO (copia / incolla il codice qui sotto)
- Crea un nuovo Target in Xcode, di tipo "bundle"
- Nel tuo PROGETTO PRINCIPALE, in "Crea fasi", aggiungi il nuovo pacchetto come qualcosa da cui "dipende" (sezione superiore, premi il pulsante più, scorri verso il basso, trova il file ".bundle" nei tuoi Prodotti)
- Nel tuo NUOVO OBIETTIVO DEL PACCHETTO, in "Crea fasi", aggiungi una sezione "Copia risorse del pacchetto" e trascina / rilascia tutti i file PNG ecc.
Script per copiare automaticamente i bundle creati nella stessa cartella della libreria statica 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}"