OSX has a nice tool that takes static, dylibs, or shared libraries for different system architectures and can pack them into a single library that can be loaded on different hardware called `lipo`.
Not sure where the name comes from (I see people call the libraries it creates `fat` libraries but lipo is supposed to remove fat? Idk). Anyways it's simple to use:
lipo -output <file> -create <lib/arch1.dylib> <lib/arch2.dylib> # etc...
Use man lipo for more info
So for Python for iOS, the toolchain builds libraries for x86_64, i386, armv7, and arm64. To make this run on any device (iPhone or simulator) just run lipo and use that as the library. The os will load either one.
You can test which arches are packed in a file using the `file` command. Without it:
mbp:armv7 jrm$ file libffi.dylib
libffi.dylib: Mach-O dynamically linked shared library arm_v7
After running lipo:
mbp:Libraries jrm$ file libffi.dylib
libffi.dylib: Mach-O universal binary with 4 architectures: [i386: Mach-O dynamically linked shared library i386] [x86_64: Mach-O 64-bit dynamically linked shared library x86_64] [arm_v7: Mach-O dynamically linked shared library arm_v7] [arm64: Mach-O 64-bit dynamically linked shared library
Not sure where the name comes from (I see people call the libraries it creates `fat` libraries but lipo is supposed to remove fat? Idk). Anyways it's simple to use:
lipo -output <file> -create <lib/arch1.dylib> <lib/arch2.dylib> # etc...
Use man lipo for more info
LIPO(1) LIPO(1)
NAME
lipo - create or operate on universal files
SYNOPSIS
lipo [-info] [-detailed_info] [-arch arch_type input_file] ... [
input_file] ... [-arch_blank arch_type] [-create] [-thin arch_type]
[-replace arch_type filename] ... [-remove arch_type] ... [-extract
arch_type] ... [-extract_family arch_type] ... [-verify_arch
arch_type ...] [-output output_file] [-segalign arch_type value] ...
DESCRIPTION
The lipo command creates or operates on ``universal'' (multi-architec-
ture) files. It only ever produces one output file, and never alters
the input file. The operations that lipo performs are: listing the
architecture types in a universal file; creating a single universal
file from one or more input files; thinning out a single universal file
to one specified architecture type; and extracting, replacing, and/or
removing architectures types from the input file to create a single new
universal output file.
So for Python for iOS, the toolchain builds libraries for x86_64, i386, armv7, and arm64. To make this run on any device (iPhone or simulator) just run lipo and use that as the library. The os will load either one.
You can test which arches are packed in a file using the `file` command. Without it:
mbp:armv7 jrm$ file libffi.dylib
libffi.dylib: Mach-O dynamically linked shared library arm_v7
After running lipo:
mbp:Libraries jrm$ file libffi.dylib
libffi.dylib: Mach-O universal binary with 4 architectures: [i386: Mach-O dynamically linked shared library i386] [x86_64: Mach-O 64-bit dynamically linked shared library x86_64] [arm_v7: Mach-O dynamically linked shared library arm_v7] [arm64: Mach-O 64-bit dynamically linked shared library
arm64]
libffi.dylib (for architecture i386): Mach-O dynamically linked shared library i386
libffi.dylib (for architecture x86_64): Mach-O 64-bit dynamically linked shared library x86_64
libffi.dylib (for architecture armv7): Mach-O dynamically linked shared library arm_v7
libffi.dylib (for architecture arm64): Mach-O 64-bit dynamically linked shared library arm64
You can also add and remove arches with the tool (for release you probably don't need the IAs). Cool, one step closer to a complete Python for iOS build system!
libffi.dylib (for architecture x86_64): Mach-O 64-bit dynamically linked shared library x86_64
libffi.dylib (for architecture armv7): Mach-O dynamically linked shared library arm_v7
libffi.dylib (for architecture arm64): Mach-O 64-bit dynamically linked shared library arm64
You can also add and remove arches with the tool (for release you probably don't need the IAs). Cool, one step closer to a complete Python for iOS build system!
Happy coding!
Comments
Post a Comment