|
@ -0,0 +1,47 @@ |
|
|
|
|
|
import argparse |
|
|
|
|
|
import subprocess |
|
|
|
|
|
import os |
|
|
|
|
|
|
|
|
|
|
|
def get_dependencies(file): |
|
|
|
|
|
# Call otool -L file to obtain the dependencies. |
|
|
|
|
|
proc = subprocess.Popen(["otool", "-L", args.binary], stdout=subprocess.PIPE) |
|
|
|
|
|
result = {} |
|
|
|
|
|
for line_bytes in proc.stdout: |
|
|
|
|
|
line = line_bytes.decode("utf-8").strip() |
|
|
|
|
|
lib = line.split()[0] |
|
|
|
|
|
if (lib.startswith("@")): |
|
|
|
|
|
lib = lib.split("/", 1)[1] |
|
|
|
|
|
(base, file) = os.path.split(lib) |
|
|
|
|
|
print(base + " // " + file) |
|
|
|
|
|
|
|
|
|
|
|
return result |
|
|
|
|
|
|
|
|
|
|
|
def parse_arguments(): |
|
|
|
|
|
parser = argparse.ArgumentParser(description='Package the storm binary on Mac OS.') |
|
|
|
|
|
parser.add_argument('binary', help='the binary to package') |
|
|
|
|
|
args = parser.parse_args() |
|
|
|
|
|
return args |
|
|
|
|
|
|
|
|
|
|
|
dep_exeptions = set() |
|
|
|
|
|
dep_exeptions.add("libSystem.B.dylib") |
|
|
|
|
|
dep_exeptions.add("libc++.1.dylib") |
|
|
|
|
|
|
|
|
|
|
|
def rec_gather_all_dependencies(file, deps = set()): |
|
|
|
|
|
current_deps = get_dependencies(file) |
|
|
|
|
|
new_deps = current_deps.keys() - dep_exeptions - deps |
|
|
|
|
|
deps = deps | current_deps.keys() |
|
|
|
|
|
|
|
|
|
|
|
for d in new_deps: |
|
|
|
|
|
rec_gather_all_dependencies(file, deps) |
|
|
|
|
|
|
|
|
|
|
|
return deps |
|
|
|
|
|
|
|
|
|
|
|
def print_deps(deps): |
|
|
|
|
|
print("Found the following dependencies:") |
|
|
|
|
|
for d in deps: |
|
|
|
|
|
print(d) |
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__": |
|
|
|
|
|
args = parse_arguments() |
|
|
|
|
|
deps = rec_gather_all_dependencies(args.binary) |
|
|
|
|
|
print_deps(deps) |