2016-02-23 5 views
7

私が理解したところでは、ビットコードは、中間バイナリ形式のバイナリを生成することを可能にします。したがって、ARMまたはx64アーキテクチャにコンパイルする前のステップです。ビットコードを使用して汎用iOSフレームワークを作成することはできますか?

iOS 8以降、iOS用に "実際の" .frameworkファイルを作成することは可能です。ただし、フレームワークファイルは、デフォルトでは1つのアーキテクチャ(エミュレータ、iPhone)用にのみコンパイルされます。 .frameworkファイルを配布する場合は、iOSエミュレータと互換性のあるファイルを提供し、iPhoneにも展開可能なファイルを提供する方がよいでしょう。 lipoを使用して、そのようなファットファイルを作成するスクリプトのさまざまな例が見つかります。

ただし、異なるアーキテクチャのファットファイルを作成することなく、ビットコードとしてコンパイルされた.frameworkのみを配布することは可能でしょうか?ビットコードは、私の.frameworkのために有効にしても残念ながら

、:

  • 異なるファイルは、「アーカイブ」メニューは、フレームワークの目標のために有効にしているように見える場合でも、対象アーキテクチャ
  • に応じて、デフォルトで作成され、私も、私の主催ビューで、結果を見つけることができません

は私がビットコードの概念で何かを誤解していますか、私は何かを欠場か?

答えて

7

ユニバーサルフラットフレームワークを提供する必要があります。 lipoによって作成されます。

  • ユニバーサルフレームワークを作成するために、ビルドターゲットを追加Yes
  • にビットコード、Targets->Build Setting->Enable Bitcodeを有効

    Aggregateターゲットを作成し、Build Phrase -> Run Scriptに次のスクリプトをコピーします。

 

    ###################### 
    # Options 
    ###################### 

    #verbose 
    set -x 

    REVEAL_ARCHIVE_IN_FINDER=false 

    FRAMEWORK_NAME="${PROJECT_NAME}" 

    SIMULATOR_LIBRARY_PATH="${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${FRAMEWORK_NAME}.framework" 

    DEVICE_LIBRARY_PATH="${BUILD_DIR}/${CONFIGURATION}-iphoneos/${FRAMEWORK_NAME}.framework" 

    UNIVERSAL_LIBRARY_DIR="${BUILD_DIR}/${CONFIGURATION}-iphoneuniversal" 

    FRAMEWORK="${UNIVERSAL_LIBRARY_DIR}/${FRAMEWORK_NAME}.framework" 


    ###################### 
    # Build Frameworks 
    ###################### 
    # Build for simulator 
    xcodebuild -target ${PROJECT_NAME} -sdk iphonesimulator -configuration ${CONFIGURATION} ARCHS="i386 x86_64" ONLY_ACTIVE_ARCH=NO clean build CONFIGURATION_BUILD_DIR=${BUILD_DIR}/${CONFIGURATION}-iphonesimulator 
    # Build for device 
    xcodebuild -scheme ${PROJECT_NAME} -sdk iphoneos -configuration ${CONFIGURATION} ARCHS="armv7 armv7s arm64" ONLY_ACTIVE_ARCH=NO clean archive CONFIGURATION_BUILD_DIR=${BUILD_DIR}/${CONFIGURATION}-iphoneos 

    ###################### 
    # Create directory for universal 
    ###################### 

    rm -rf "${UNIVERSAL_LIBRARY_DIR}" 

    mkdir "${UNIVERSAL_LIBRARY_DIR}" 

    mkdir "${FRAMEWORK}" 


    ###################### 
    # Copy files Framework 
    ###################### 

    cp -r "${DEVICE_LIBRARY_PATH}/." "${FRAMEWORK}" 


    ###################### 
    # Make an universal binary 
    ###################### 

    lipo "${SIMULATOR_LIBRARY_PATH}/${FRAMEWORK_NAME}" "${DEVICE_LIBRARY_PATH}/${FRAMEWORK_NAME}" -create -output "${FRAMEWORK}/${FRAMEWORK_NAME}" | echo 

    # For Swift framework, Swiftmodule needs to be copied in the universal framework 
    if [ -d "${SIMULATOR_LIBRARY_PATH}/Modules/${FRAMEWORK_NAME}.swiftmodule/" ]; then 
    cp -f ${SIMULATOR_LIBRARY_PATH}/Modules/${FRAMEWORK_NAME}.swiftmodule/* "${FRAMEWORK}/Modules/${FRAMEWORK_NAME}.swiftmodule/" | echo 
    fi 

    if [ -d "${DEVICE_LIBRARY_PATH}/Modules/${FRAMEWORK_NAME}.swiftmodule/" ]; then 
    cp -f ${DEVICE_LIBRARY_PATH}/Modules/${FRAMEWORK_NAME}.swiftmodule/* "${FRAMEWORK}/Modules/${FRAMEWORK_NAME}.swiftmodule/" | echo 
    fi 

    ###################### 
    # On Release, copy the result to release directory 
    ###################### 
    OUTPUT_DIR="${PROJECT_DIR}/build/${FRAMEWORK_NAME}-${CONFIGURATION}-iphoneuniversal/" 

    rm -rf "$OUTPUT_DIR" 
    mkdir -p "$OUTPUT_DIR" 

    cp -r "${FRAMEWORK}" "$OUTPUT_DIR" 

    if [ ${REVEAL_ARCHIVE_IN_FINDER} = true ]; then 
    open "${OUTPUT_DIR}/" 
    fi 

注意を

  • ビットコードだけiphoneosためarchiveビルドに梱包されてちょうどotoolいるので、あなたがarchパラメータを指定しない場合は、何も__LLVM存在しません、ビットコードが含まれているかどうかを確認するために

  • otool -l -arch arm64 <yourframework_binary>|grep __LLVMをSDK 1つのホストアーチ(シミュレータ)を印刷します。

+1

もう一度質問をお読みください。それはまさに私が避けたいものです(私の質問では「lipo」と言いました)。とにかく普遍的なバイナリを作成する必要がある場合、私はビットコードとして何かをコンパイルする目的を理解していません。そして私は 'archive'ビルドで作成されたフレームワークファイルを見つけることができません。 –

+0

bitcodeは、Xcodeでコンパイルされた中間のLLVM IRであり、Javaバイトコードとは異なり、arch依存であるため、すべてのスライスに独自のビットコードセクションが必要です。 中間コードなので、Appleは新しいバージョンをアップロードせずに最終的なマシンコードに最適化するためにこれを使うことができます。これが主な目的です – xfdai

+0

スクリプトから 'archive'で作成されたフレームワークは' $ {DEVICE_LIBRARY_PATH} /モジュール/ $ {FRAMEWORK_NAME} ' [こちら](https://developer.apple.com/library/mac/documentation/DeveloperTools/Reference/XcodeBuildSettingRef/1-Build_Setting_Reference/build_setting_ref.html#//)をご覧ください。 apple_ref/doc/uid/TP40003931-CH3-SW39) – xfdai

関連する問題