ALTERNATIVAS:
Copiar / pegar fácilmente la última versión (pero las instrucciones de instalación pueden cambiar, ¡vea a continuación!)
La biblioteca de Karl requiere mucho más esfuerzo para la configuración, pero una solución mucho mejor a largo plazo (convierte su biblioteca en un Framework).
Use esto, luego modifíquelo para agregar soporte para las compilaciones de archivo : consulte el comentario de @ Frederik a continuación sobre los cambios que está utilizando para que esto funcione bien con el modo Archivo.
CAMBIOS RECIENTES: 1. Soporte agregado para iOS 10.x (mientras se mantiene el soporte para plataformas más antiguas)
Información sobre cómo usar esta secuencia de comandos con un proyecto incrustado en otro proyecto (aunque recomiendo NO hacerlo nunca, Apple tiene un par de errores que evitan el show en Xcode si incrusta proyectos dentro de otro, desde Xcode 3.x hasta Xcode 4.6.x)
Secuencia de comandos de bonificación para permitirle incluir paquetes automáticamente (es decir, incluir archivos PNG, archivos PLIST, etc. de su biblioteca). Consulte a continuación (desplácese hacia abajo)
ahora es compatible con iPhone5 (usando la solución de Apple para los errores en lipo). NOTA: las instrucciones de instalación han cambiado (probablemente pueda simplificar esto cambiando el script en el futuro, pero no quiero arriesgarlo ahora)
La sección "copiar encabezados" ahora respeta la configuración de compilación para la ubicación de los encabezados públicos (cortesía de Frederik Wallner)
Se agregó la configuración explícita de SYMROOT (¿tal vez necesite OBJROOT para configurarse también?), Gracias a Doug Dickinson
SCRIPT (esto es lo que tienes que copiar / pegar)
Para las instrucciones de uso / instalación, ver abajo
##########################################
#
# 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
INSTRUCCIONES DE INSTALACIÓN
- Crear un proyecto lib estático
- Seleccione el objetivo
- En la pestaña "Configuración de compilación", configure "Construir solo arquitectura activa" en "NO" (para todos los elementos)
- En la pestaña "Fases de compilación", seleccione "Agregar ... Nueva fase de compilación ... Nueva fase de compilación de script de ejecución"
- Copie / pegue el script (arriba) en el cuadro
... BONO OPCIONAL uso:
- OPCIONAL: si tiene encabezados en su biblioteca, agréguelos a la fase "Copiar encabezados"
- OPCIONAL: ... y arrástrelos / suéltelos desde la sección "Proyecto" a la sección "Público"
- OPCIONAL: ... y se exportarán AUTOMÁTICAMENTE cada vez que construya la aplicación, en un subdirectorio del directorio "debug-universal" (estarán en usr / local / include)
- OPCIONAL: NOTA: si también intenta arrastrar / soltar su proyecto en otro proyecto Xcode, esto expone un error en Xcode 4, donde no puede crear un archivo .IPA si tiene encabezados públicos en su proyecto de arrastrar / soltar. La solución: no incrustar proyectos de xcode (¡demasiados errores en el código de Apple!)
Si no puede encontrar el archivo de salida, aquí hay una solución alternativa:
Agregue el siguiente código al final del guión (cortesía de Frederik Wallner): abra "$ {CREATING_UNIVERSAL_DIR}"
Apple elimina toda la salida después de 200 líneas. Seleccione su Destino, y en la Fase de Ejecutar Script, DEBE desmarcar: "Mostrar variables de entorno en el registro de compilación"
si está utilizando un directorio personalizado de "salida de compilación" para XCode4, entonces XCode coloca todos sus archivos "inesperados" en el lugar incorrecto.
- Construye el proyecto
- Haga clic en el último icono a la derecha, en el área superior izquierda de Xcode4.
- Seleccione el elemento superior (esta es su "compilación más reciente". Apple debería seleccionarlo automáticamente, pero no pensaron en eso)
- en la ventana principal, desplácese hacia abajo. La última línea debería leer: lipo: para la configuración actual (depuración) creando el archivo de salida: /Users/blah/Library/Developer/Xcode/DerivedData/AppName-ashwnbutvodmoleijzlncudsekyf/Build/Products/Debug-universal/libTargetName.a
... esa es la ubicación de su Construcción Universal.
Cómo incluir archivos "sin código fuente" en su proyecto (PNG, PLIST, XML, etc.)
- Haz todo lo anterior, verifica que funcione
- Cree una nueva fase Ejecutar script que viene DESPUÉS DE LA PRIMERA (copie / pegue el código a continuación)
- Cree un nuevo destino en Xcode, de tipo "paquete"
- En su PROYECTO PRINCIPAL, en "Fases de compilación", agregue el nuevo paquete como algo de lo que "depende" (sección superior, presione el botón más, desplácese hacia abajo, busque el archivo ".bundle" en sus Productos)
- En su NUEVO OBJETIVO DE PAQUETE, en "Fases de compilación", agregue una sección "Copiar recursos de paquete" y arrastre / suelte todos los archivos PNG, etc.
Script para copiar automáticamente los paquetes integrados en la misma carpeta que su biblioteca estática 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}"