ALTERNATİFLERİ:
En son sürümün kolay kopyalanması / yapıştırılması (ancak yükleme talimatları değişebilir - aşağıya bakın!)
Karl'ın kütüphanesi kurulum için daha fazla çaba harcar, ancak çok daha güzel uzun vadeli bir çözüm (kütüphanenizi bir Çerçeveye dönüştürür).
Bunu kullanın, sonra Arşiv yapıları için destek eklemek için ince ayar yapın - cf @ Frederik'in aşağıdaki Arşiv modu ile güzel çalışması için kullandığı değişikliklerle ilgili yorumu.
SON DEĞİŞİKLİKLER: 1. iOS 10.x için destek eklendi (eski platformlar için destek korunurken)
Bu komut dosyasını başka bir projeye katıştırılmış bir projeyle nasıl kullanacağınız hakkında bilgi (bunu yapmamanızı şiddetle tavsiye ederim. 3.x - Xcode 4.6.x arası)
Paketleri otomatik olarak eklemenize izin veren bonus komut dosyası (örn. Kütüphanenizden PNG dosyaları, PLIST dosyaları vb. Dahil edin!) - aşağıya bakın (aşağıya kaydırın)
artık iPhone5'i destekliyor (Apple'ın lipo'daki hatalara geçici çözümünü kullanarak). NOT: yükleme talimatları değişti (muhtemelen betiği gelecekte değiştirerek basitleştirebilirim, ancak şimdi risk almak istemiyorum)
"kopya başlıkları" bölümü artık genel başlıkların konumu için oluşturma ayarına saygı duyuyor (Frederik Wallner'ın izniyle)
Doug Dickinson sayesinde SYMROOT'un açık ayarı eklendi (belki de OBJROOT'un da ayarlanması gerekir?)
SCRIPT (kopyalamanız / yapıştırmanız gereken şey budur)
Kullanım / kurulum talimatları için aşağıya bakın
##########################################
#
# 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
TALİMATLARI YÜKLE
- Statik bir lib projesi oluşturma
- Hedefi Seçin
- "Derleme Ayarları" sekmesinde, "Yalnızca Etkin Mimari Oluştur" u "HAYIR" olarak ayarlayın ( tüm öğeler için)
- "Derleme Aşamaları" sekmesinde, "Ekle ... Yeni Derleme Aşaması ... Yeni Komut Dosyası Oluşturma Safhası Çalıştır" ı seçin
- Komut dosyasını (yukarıda) kopyalayın / kutuya yapıştırın
... BONUS OPSİYONEL kullanımı:
- İSTEĞE BAĞLI: kitaplığınızda başlıklar varsa, bunları "Başlıkları Kopyala" aşamasına ekleyin
- İSTEĞE BAĞLI: ... ve "Proje" bölümünden "Genel" bölümüne sürükleyip bırakın
- İSTEĞE BAĞLI: ... ve uygulamayı her oluşturduğunuzda "hata ayıklama evrensel" dizininin bir alt dizinine OTOMATİK olarak dışa aktarılırlar (usr / local / include dizininde olacaklar)
- İSTEĞE BAĞLI: NOT: ayrıca projenizi başka bir Xcode projesine sürükleyip bırakmaya çalışırsanız, Xcode 4'te sürükleyip bırakılan projenizde Genel Üstbilgiler varsa bir .IPA dosyası oluşturamayacak bir hata ortaya çıkar. Çözüm: xcode projelerini yerleştirmeyin (Apple kodunda çok fazla hata var!)
Çıktı dosyasını bulamıyorsanız, işte size bir geçici çözüm:
Komut dosyasının sonuna aşağıdaki kodu ekleyin (Frederik Wallner'ın izniyle): "$ {CREATING_UNIVERSAL_DIR}"
Apple 200 satırdan sonra tüm çıktıları siler. Hedefinizi seçin ve Komut Dosyası Çalıştırma Aşamasında, "Oluşturma günlüğünde ortam değişkenlerini göster"
XCode4 için özel bir "derleme çıktısı" dizini kullanıyorsanız, XCode tüm "beklenmeyen" dosyalarınızı yanlış yere koyar.
- Projeyi derleyin
- Xcode4'un sol üst kısmındaki sağdaki son simgeye tıklayın.
- En üstteki öğeyi seçin (bu "en son derlemeniz" dir. Apple bunu otomatik olarak seçmelidir, ancak bunu düşünmediler)
- ana pencerede aşağıya kaydırın. En son satır şunu okumalıdır: lipo: geçerli yapılandırma (Hata Ayıklama) için çıktı dosyası oluşturma: /Users/blah/Library/Developer/Xcode/DerivedData/AppName-ashwnbutvodmoleijzlncudsekyf/Build/Products/Debug-universal/libTargetName.a
... Universal Build'ınızın yeri budur.
Projenize "kaynak kodu olmayan" dosyalar nasıl eklenir (PNG, PLIST, XML, vb.)
- Yukarıdaki her şeyi yapın, çalışıp çalışmadığını kontrol edin
- İLK BİRİNDEN SONRA yeni bir Komut Dosyası Çalıştır aşaması oluşturun (aşağıdaki kodu kopyalayın / yapıştırın)
- Xcode içinde "paket" türünde yeni bir Hedef oluşturun
- ANA PROJENİZDE, "Yapılandırma Aşamaları" nda, yeni paketi "bağlı" bir şey olarak ekleyin (üst bölüm, artı düğmesine basın, aşağı kaydırın, Ürünlerinizdeki ".bundle" dosyasını bulun)
- YENİ BUNDLE HEDEFİNİZE, "Derleme Aşamaları" alanına, "Paket Kaynaklarını Kopyala" bölümü ekleyin ve tüm PNG dosyalarını vb. İçine sürükleyip bırakın.
Oluşturulan paketleri otomatik olarak FAT statik kitaplığınızla aynı klasöre kopyalayan komut dosyası:
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}"