Bagaimana cara xcodebuild perpustakaan statis dengan Bitcode diaktifkan?

89

Xcode 7 memperkenalkan Bitcode , yang merupakan semacam biner perantara LLVM yang berarti server Apple dapat mengkompilasi ulang aplikasi saya untuk arsitektur yang berbeda tanpa keterlibatan saya.

Di Lookback, saya mendistribusikan kerangka arsip statis dengan perpustakaan kami. Tampaknya ketika Anda membangun dengan apa pun kecuali "Bangun & Arsip", bitcode sebenarnya tidak dipancarkan ke perpustakaan saya, dan siapa pun yang menautkan dengan perpustakaan saya di aplikasi mereka dan mencoba melakukan Bangun & Arsip dengan Bitcode diaktifkan akan mendapatkan salah satu dua peringatan:

  • ld: 'Lookback(Lookback.o)' does not contain bitcode. You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE), obtain an updated library from the vendor, or disable bitcode for this target. (jika lib dibangun dengan Xcode 6)
  • ld: warning: full bitcode bundle could not be generated because 'Lookback(Lookback.o)' was built only with bitcode marker. The library must be generated from Xcode archive build with bitcode enabled (Xcode setting ENABLE_BITCODE) (jika lib dibangun dengan Xcode 7 dengan xcodebuild normal)

Saya memiliki skrip build yang membangun biner universal perangkat + simulator, jadi saya tidak dapat menggunakan Build & Archive, tetapi saya menjalankan xcodebuilddari baris perintah dari skrip saya. Bagaimana cara membuat xcodebuildpustaka berkemampuan bitcode yang tepat?

nevyn
sumber
HI @nevyn Saya mencoba mendapatkan SDK Anda untuk dikompilasi dalam aplikasi yang menggunakan bitcode. Apakah ada jalan
Stoff81
@ Stoff81 Maaf, saya sedang mengerjakannya. Saya perlu membuat semua dependensi saya bekerja dengan Bitcode terlebih dahulu, dan ini cukup merepotkan.
nevyn

Jawaban:

137

Bitcode adalah fitur waktu kompilasi (bukan fitur waktu tautan) yang berarti bahwa setiap file .o harus berisi bagian tambahan yang disebut __bitcode saat dibuat dengan bitcode. Anda dapat mengonfirmasi apakah biner Anda kompatibel dengan bitcode dengan menjalankan otool -l (my .o or .a file) | grep __LLVM.

Saat Anda membangun secara normal, Xcode menambahkan bendera build -fembed-bitcode-marker ke permintaan clang apa pun. Ini sepertinya semacam 'ini adalah tempat bitcode akan pergi, jika bitcode diaktifkan', dan tidak benar-benar mengaktifkan bitcode.

Saat Anda "Membangun & Mengarsipkan", tanda ini diganti dengan -fembed-bitcode, yang benar-benar membangun biner yang mendukung Bitcode.

Tampaknya ada dua cara untuk xcodebuildmemanfaatkan -fembed-bitcode:

  • Gunakan tindakan 'arsip', seperti dalam xcodebuild -target LookbackSDK archivebukan xcodebuild -target LookbackSDK build. Ini memiliki efek samping menempatkan binari di Xcode Organizer Anda alih-alih build/folder, meskipun Anda dapat mengatasinya dengan menggunakan -exportArchive -archivePath ./build(terima kasih @JensAyton )
  • Paksa penggunaan bendera dengan menambahkan Bendera C Lainnya dengan OTHER_CFLAGS="-fembed-bitcode". xcodebuildDoa Anda akan terlihat seperti ini xcodebuild OTHER_CFLAGS="-fembed-bitcode" -target LookbackSDK build.

Yang terakhir adalah apa yang saya pilih sehingga saya tidak perlu mengubah sistem build saya, tetapi ini akan menghasilkan peringatan untuk setiap file, karena sekarang keduanya -fembed-bitcode-markerdan -fembed-bitcodedikirim ke dentang. Luckilly yang terakhir menang, menghasilkan pustaka yang mendukung Bitcode!

Sumber daya

nevyn
sumber
9
FWIW, Anda dapat menyingkirkan peringatan tentang -fembed-bitcode-markerdiabaikan dengan menambahkan -Qunused-argumentsjuga.
mstorsjo
exportFormat mana yang digunakan untuk xcodebuild dari sebuah framework? Hanya "ipa", "pkg", dan "app" yang tampaknya ditentukan ( developer.apple.com/library/mac/documentation/Darwin/Reference/… ).
Fabian Köbel
@nevyn Masih tidak dapat membangun aplikasi utama saya yang memiliki file kerangka khusus yang pada gilirannya berisi skrip build dengan bendera yang disebutkan di atas.
ravoorinandan
otool -l (file .o atau .a saya). Apakah maksud Anda otool -l (file .o atau .a saya) | grep __bitcode?
Mike M
1
@MikeM sebenarnya tidak otool -l myfile.o | grep __LLVM, karena akan ada segmen __bitcode meskipun hanya ada penanda bitcode di sana, bukan bitcode asli.
nevyn
41

Dengan Xcode 8, saya tidak bisa mulai OTHER_CFLAGS="-fembed-bitcode"bekerja. Saya terus mengalami sesuatu di sepanjang baris was built without full bitcode. All frameworks and dylibs for bitcode must be generated from Xcode Archive or Install buildketika saya mencoba membuat arsip build dari aplikasi yang berisi kerangka statis saya.

Apa yang sebenarnya saya cari adalah ini:

BITCODE_GENERATION_MODE=bitcode

Saya sebenarnya menggunakan Run Script di dalam target agregat, baris xcodebuild lengkap terlihat seperti ini (hanya untuk referensi):

xcodebuild BITCODE_GENERATION_MODE=bitcode OTHER_CFLAGS="-fembed-bitcode" -target "${PROJECT_NAME}" ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphoneos BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build

Aaron Ash
sumber
2
+1, BITCODE_GENERATION_MODE=bitcodemetode tampaknya lebih disukai, seperti yang disarankan dalam jawaban ini juga.
William Denniss
Ini juga memperbaiki masalah saya sedangkan jawaban default tidak lagi.
Kamchatka
Penolong! Terima kasih!
vidalbenjoe
17

Setelah Anda menambahkan dukungan bitcode untuk lib statis, itu tidak akan kompatibel dengan Xcode 6. Aplikasi tidak akan mengarsipkan.

Saya ingin menyebutkan dengan jelas pengaturan untuk bitcode karena jawaban @ nevyn sedikit membingungkan saya.

Pergi ke Build settings, cari "custom compiler flags". Menambahkan-fembed-bitcode . Ini akan membangun lib Anda dengan bitcode.

Gautam Jain
sumber
6

Pilih proyek Pada Pengaturan Build -> Bendera C lainnya, setel Debug ke -fembed-bitcode-marker dan Rilis ke -fembed-bitcode

Pada Build Settings, klik tanda + di bagian atas untuk menambahkan pengaturan build yang ditentukan pengguna dengan nama BITCODE_GENERATION_MODE, dan setel Debug ke penanda, Lepaskan ke bitcode

Edit skema sebagai Rilis Kemudian klik perpustakaan yang diinginkan. File dan dapatkan jalur build. Dapatkan folder rilis formulir perpustakaan.

Oshitha Wimalasuriya
sumber