ALTERNATIF:
Mudah menyalin / menempel versi terbaru (tetapi instruksi pemasangan dapat berubah - lihat di bawah!)
Perpustakaan Karl membutuhkan lebih banyak upaya untuk mensetup, tetapi solusi jangka panjang yang jauh lebih bagus (itu mengubah perpustakaan Anda menjadi Kerangka Kerja).
Gunakan ini, kemudian atur untuk menambahkan dukungan untuk Archive build - cf @ Frederik berkomentar di bawah ini tentang perubahan yang dia gunakan untuk menjadikan ini berfungsi dengan baik dengan mode Archive.
PERUBAHAN TERAKHIR: 1. Menambahkan dukungan untuk iOS 10.x (sambil mempertahankan dukungan untuk platform yang lebih lama)
Info tentang cara menggunakan skrip ini dengan proyek-embedded-in-another-project (walaupun saya sangat merekomendasikan TIDAK melakukan hal itu, Apple - ada beberapa bug show-stopper di Xcode jika Anda menanamkan proyek di dalam satu sama lain, dari Xcode 3.x hingga Xcode 4.6.x)
Skrip bonus untuk memungkinkan Anda menyertakan Bundel secara otomatis (yaitu, sertakan file PNG, file PLIST dll dari perpustakaan Anda!) - lihat di bawah (gulir ke bawah)
sekarang mendukung iPhone5 (menggunakan solusi Apple untuk bug di lipo). CATATAN: petunjuk pemasangan telah berubah (Saya mungkin dapat menyederhanakan ini dengan mengubah skrip di masa depan, tetapi tidak ingin mengambil risiko sekarang)
Bagian "copy header" sekarang menghormati pengaturan bangunan untuk lokasi header publik (milik Frederik Wallner)
Menambahkan pengaturan eksplisit SYMROOT (mungkin perlu OBJROOT diatur juga?), Terima kasih kepada Doug Dickinson
SCRIPT (ini yang harus Anda salin / tempel)
Untuk petunjuk penggunaan / instal, lihat di bawah
##########################################
#
# 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
INSTAL INSTRUKSI
- Buat proyek Lib statis
- Pilih Target
- Di tab "Bangun Pengaturan", set "Hanya Bangun Arsitektur Aktif" ke "TIDAK" (untuk semua item)
- Di tab "Bangun Fase", pilih "Tambahkan ... Fase Pembuatan Baru ... Fase Pembuatan Skrip Run Baru"
- Salin / rekatkan skrip (di atas) ke dalam kotak
... Penggunaan BONUS OPTIONAL:
- OPTIONAL: jika Anda memiliki header di perpustakaan Anda, tambahkan mereka ke fase "Copy Header"
- OPSIONAL: ... dan seret / jatuhkan dari bagian "Proyek" ke bagian "Publik"
- OPSIONAL: ... dan mereka akan secara OTOMATIS diekspor setiap kali Anda membangun aplikasi, ke dalam sub-direktori dari direktori "debug-universal" (mereka akan berada di usr / local / include)
- OPSIONAL: CATATAN: jika Anda juga mencoba untuk menyeret / jatuhkan proyek Anda ke proyek Xcode lain, ini memperlihatkan bug di Xcode 4, di mana ia tidak dapat membuat file .IPA jika Anda memiliki Public Header di proyek seret / jatuhkan Anda. Cara mengatasinya: jangan menyematkan proyek xcode (terlalu banyak bug dalam kode Apple!)
Jika Anda tidak dapat menemukan file output, berikut ini solusinya:
Tambahkan kode berikut ke bagian paling akhir dari skrip (milik Frederik Wallner): buka "$ {CREATING_UNIVERSAL_DIR}"
Apple menghapus semua output setelah 200 baris. Pilih Target Anda, dan dalam Fase Skrip Jalankan, Anda HARUS menghapus centang: "Tampilkan variabel lingkungan dalam log bangunan"
jika Anda menggunakan direktori "build output" khusus untuk XCode4, maka XCode menempatkan semua file "tak terduga" Anda di tempat yang salah.
- Bangun proyek
- Klik ikon terakhir di kanan, di area kiri atas Xcode4.
- Pilih item teratas (ini adalah "build terbaru" Anda. Apple harus memilihnya secara otomatis, tetapi mereka tidak memikirkannya)
- di jendela utama, gulir ke bawah. Baris terakhir harus berbunyi: lipo: untuk konfigurasi saat ini (Debug) membuat file output: /Users/blah/Library/Developer/Xcode/DerivedData/AppName-ashwnbutvodmoleijzlncudsekyf/Build/Products/Debug-universal/libTargetName.a
... itu adalah lokasi Universal Build Anda.
Cara memasukkan file "non-kode sumber" dalam proyek Anda (PNG, PLIST, XML, dll)
- Lakukan semuanya di atas, periksa berhasil
- Buat fase Run Script baru yang datang SETELAH PERTAMA (salin / tempel kode di bawah)
- Buat Target baru dalam Xcode, ketik "bundle"
- Di PROYEK UTAMA Anda, di "Bangun Fase", tambahkan bundel baru sebagai sesuatu yang "tergantung pada" (bagian atas, tekan tombol plus, gulir ke bawah, cari file ".bundle" di Produk Anda)
- Di TARGET BUNDLE BARU Anda, di "Bangun Fase", tambahkan bagian "Salin Sumber Daya Bundel", dan seret / letakkan semua file PNG dll ke dalamnya
Script untuk menyalin secara otomatis bundel bawaan ke folder yang sama dengan pustaka statis FAT Anda:
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}"