Skip to content

Instantly share code, notes, and snippets.

@evands
Created January 14, 2015 20:40
Show Gist options
  • Select an option

  • Save evands/8ba4f227b00ae14a9303 to your computer and use it in GitHub Desktop.

Select an option

Save evands/8ba4f227b00ae14a9303 to your computer and use it in GitHub Desktop.

Revisions

  1. evands created this gist Jan 14, 2015.
    59 changes: 59 additions & 0 deletions combine_static_libraries.sh
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,59 @@
    #!/bin/sh

    # Combined all static libaries in the current directory into a single static library
    # It is hardcoded to use the i386, armv7, and armv7s architectures; this can easily be changed via the 'archs' variable at the top
    # The script takes a single argument, which is the name of the final, combined library to be created.
    #
    # For example:
    # => combine_static_libraries.sh combined-library
    #
    # Script by Evan Schoenberg, Regular Rate and Rhythm Software
    # Thanks to Claudiu Ursache for his blog post at http://www.cvursache.com/2013/10/06/Combining-Multi-Arch-Binaries/ which detailed the technique automated by this script
    #####
    # $1 = Name of output archive
    #####

    archs=(i386 armv7 armv7s)
    libraries=(*.a)
    libtool="/usr/bin/libtool"

    echo "Combining ${libraries[*]}..."

    for library in ${libraries[*]}
    do
    lipo -info $library

    # Extract individual architectures for this library
    for arch in ${archs[*]}
    do
    lipo -extract $arch $library -o ${library}_${arch}.a
    done
    done

    # Combine results of the same architecture into a library for that architecture
    source_combined=""
    for arch in ${archs[*]}
    do
    source_libraries=""

    for library in ${libraries[*]}
    do
    source_libraries="${source_libraries} ${library}_${arch}.a"
    done

    $libtool -static ${source_libraries} -o "${1}_${arch}.a"
    source_combined="${source_combined} ${1}_${arch}.a"

    # Delete intermediate files
    rm ${source_libraries}
    done

    # Merge the combined library for each architecture into a single fat binary
    lipo -create $source_combined -o $1.a

    # Delete intermediate files
    rm ${source_combined}

    # Show info on the output library as confirmation
    echo "Combination complete."
    lipo -info $1.a