#!/usr/bin/env ruby require 'optparse' require 'pathname' require 'open3' # This tool checks an input path for all static libraries *.a files # and makes sure they were built with the most modern ObjC ABI version. # Parse command line options. options = {} OptionParser.new do |opts| opts.banner = 'Usage: staticlibchecker.rb [options]' opts.on('-i', '--input-path FOLDER', 'Input path') { |v| options[:input_path] = v } end.parse! input_path = "" if options[:input_path].nil? raise "No input path specified" else input_path = options[:input_path] end all_static_libs = Dir["#{input_path}/**/*.a"] puts all_static_libs category_class_var_flag = 1<<6 all_static_libs.each { |path| # Run otool against the static lib command = "otool -o #{path}" stdout, stderr, status = Open3.capture3(command) if !status.success? puts "Failed with output: #{stderr}" exit status.exitstatus end # extract 'flags' value match = stdout.match /^\s+flags\s+(0x[\d]+)$/ if match flags = Integer(match[1]) if (flags & category_class_var_flag) == category_class_var_flag puts "File: #{File.basename(path)} is ok" else puts "File: #{File.basename(path)} was built with an old ABI version! #{flags} #{category_class_var_flag}" end end }