АЛЬТЕРНАТИВЫ:
Простое копирование / вставка последней версии (но инструкции по установке могут измениться - см. Ниже!)
Библиотека Карла требует гораздо больше усилий для установки, но гораздо более приятного долгосрочного решения (оно превращает вашу библиотеку в Framework).
Используйте это, затем настройте, чтобы добавить поддержку сборок архива - c.f. @ Комментарий Фредерика ниже об изменениях, которые он использует, чтобы эта работа хорошо работала в режиме Архива.
ПОСЛЕДНИЕ ИЗМЕНЕНИЯ:
1. Добавлена поддержка iOS 10.x (при сохранении поддержки для старых платформ)
Информация о том, как использовать этот скрипт с проектом, встроенным в другой проект (хотя я настоятельно рекомендую НЕ делать этого, когда-либо - у Apple есть несколько ошибок show-stopper в Xcode, если вы встраиваете проекты внутри друг друга, от Xcode 3.x до Xcode 4.6.x)
Бонусный скрипт, позволяющий автоматически включать Bundles (т.е. включать файлы PNG, PLIST и т. Д. Из вашей библиотеки!) - см. Ниже (прокрутите вниз)
теперь поддерживает iPhone5 (используя обходной путь Apple к ошибкам в lipo). ПРИМЕЧАНИЕ: инструкции по установке изменились (возможно, я могу упростить это, изменив скрипт в будущем, но не хочу рисковать сейчас)
Раздел «копировать заголовки» теперь учитывает настройку сборки для расположения публичных заголовков (любезно предоставлено Фредериком Уолнером)
Добавлена явная настройка SYMROOT (может быть, вам тоже нужно установить OBJROOT?), Благодаря Дагу Дикинсону
SCRIPT (это то, что вы должны скопировать / вставить)
Инструкции по использованию / установке см. Ниже
##########################################
#
# c.f. /2675173/sozdaite-tolstuy-staticheskuy-biblioteku-ustroistvo-simulyator-ispolzuya-xcode-i-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
ИНСТРУКЦИЯ ПО УСТАНОВКЕ
- Создание статического проекта lib
- Выберите цель
- На вкладке «Настройки сборки» установите «Только для активной архитектуры» на «НЕТ» (для всех элементов)
- На вкладке «Фазы сборки» выберите «Добавить ... Новая фаза сборки ... Новая фаза сборки скрипта запуска»
- Скопируйте / вставьте скрипт (выше) в поле
... БОНУС ДОПОЛНИТЕЛЬНО:
- ДОПОЛНИТЕЛЬНО: если в вашей библиотеке есть заголовки, добавьте их в фазу «Копировать заголовки»
- ДОПОЛНИТЕЛЬНО: ... и перетащите их из раздела «Проект» в раздел «Общий»
- ДОПОЛНИТЕЛЬНО: ... и они будут автоматически экспортироваться при каждой сборке приложения в подкаталог каталога "debug-universal" (они будут в usr / local / include)
- ДОПОЛНИТЕЛЬНО: ПРИМЕЧАНИЕ: если вы также пытаетесь перетащить свой проект в другой проект Xcode, это приводит к ошибке в Xcode 4, из-за которой невозможно создать файл .IPA, если у вас есть Public Headers в ваш перетаскиваемый проект. Обходной путь: не вставляйте проекты xcode (слишком много ошибок в коде Apple!)
Если вы не можете найти выходной файл, вот обходной путь:
Добавьте следующий код в самый конец скрипта (любезно предоставлено Фредериком Уолнером): откройте "$ {CREATING_UNIVERSAL_DIR}"
Apple удаляет все выходные данные после 200 строк. Выберите свою цель, и на этапе запуска сценария вы ДОЛЖНЫ снять флажок: «Показать переменные среды в журнале сборки»
если вы используете пользовательский каталог «build output» для XCode4, то XCode помещает все ваши «неожиданные» файлы в неправильное место.
- Сборка проекта
- Нажмите на последний значок справа в левой верхней части Xcode4.
- Выберите верхний элемент (это ваша «самая последняя сборка». Apple должна выбрать его автоматически, но они не думают об этом)
- в главном окне, прокрутите вниз. Самая последняя строка должна выглядеть следующим образом: lipo: для текущей конфигурации (Debug) создайте выходной файл: /Users/blah/Library/Developer/Xcode/DerivedData/AppName-ashwnbutvodmoleijzlncudsekyf/Build/Products/Debug-universal/libTargetName.a*1097
... это местоположение вашей универсальной сборки.
Как включить файлы "без исходного кода" в ваш проект (PNG, PLIST, XML и т. Д.)
- Сделайте все выше, проверьте, работает ли
- Создайте новую фазу Run Script, которая наступает ПОСЛЕ ПЕРВОГО (скопируйте / вставьте код ниже)
- Создайте новую цель в Xcode типа "bundle"
- В вашем ГЛАВНОМ ПРОЕКТЕ, в «Фазах сборки», добавьте новый пакет как то, от чего он «зависит» (верхний раздел, нажмите кнопку «плюс», прокрутите вниз, найдите файл «.bundle» в ваших продуктах) 1114 *
- В вашей НОВОЙ ЦЕЛЕВОЙ ГРУППЕ в разделе «Этапы сборки» добавьте раздел «Копирование ресурсов комплекта» и перетащите в него все файлы PNG и т. Д.
Скрипт для автоматического копирования встроенных пакетов в ту же папку, что и статическая библиотека 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}"