xref: /aosp_15_r20/external/aws-crt-java/codebuild/macos_compatibility_check.py (revision 3c7ae9de214676c52d19f01067dc1a404272dc11)
1*3c7ae9deSAndroid Build Coastguard Workerimport sys
2*3c7ae9deSAndroid Build Coastguard Workerimport subprocess
3*3c7ae9deSAndroid Build Coastguard Workerimport os
4*3c7ae9deSAndroid Build Coastguard Workerimport re
5*3c7ae9deSAndroid Build Coastguard Worker
6*3c7ae9deSAndroid Build Coastguard Worker
7*3c7ae9deSAndroid Build Coastguard Workerdef main():
8*3c7ae9deSAndroid Build Coastguard Worker    if sys.platform != 'darwin':
9*3c7ae9deSAndroid Build Coastguard Worker        print("WARNING: Not running on macos. Skip the compatibility validation.")
10*3c7ae9deSAndroid Build Coastguard Worker        # Exit quietly if run on a non-darwin machine.
11*3c7ae9deSAndroid Build Coastguard Worker        sys.exit(0)
12*3c7ae9deSAndroid Build Coastguard Worker
13*3c7ae9deSAndroid Build Coastguard Worker    # Default target macos version setup in pom.xml > ${cmake.min_osx_version}
14*3c7ae9deSAndroid Build Coastguard Worker    supported_version = "10.9"
15*3c7ae9deSAndroid Build Coastguard Worker    arch = "x86_64"
16*3c7ae9deSAndroid Build Coastguard Worker
17*3c7ae9deSAndroid Build Coastguard Worker
18*3c7ae9deSAndroid Build Coastguard Worker    # otool result has a different format between arm and x64
19*3c7ae9deSAndroid Build Coastguard Worker    # for arm: we check for "minos"
20*3c7ae9deSAndroid Build Coastguard Worker    # for x64: The format will be:
21*3c7ae9deSAndroid Build Coastguard Worker    #
22*3c7ae9deSAndroid Build Coastguard Worker    # Load command 8
23*3c7ae9deSAndroid Build Coastguard Worker    # cmd LC_VERSION_MIN_MACOSX
24*3c7ae9deSAndroid Build Coastguard Worker    #   cmdsize 16
25*3c7ae9deSAndroid Build Coastguard Worker    #   version 10.9
26*3c7ae9deSAndroid Build Coastguard Worker    #       sdk 12.1
27*3c7ae9deSAndroid Build Coastguard Worker    # Load command 9
28*3c7ae9deSAndroid Build Coastguard Worker    otool_cmd = "otool -l target/cmake-build/lib/osx/{}/cruntime/libaws-crt-jni.dylib | grep -A3 \'LC_VERSION_MIN_MACOSX\' | grep -E version | tr -s ' ' | cut -f3 -d' ' | tr -d '[:space:]'".format(arch)
29*3c7ae9deSAndroid Build Coastguard Worker
30*3c7ae9deSAndroid Build Coastguard Worker    if len(sys.argv) > 1:
31*3c7ae9deSAndroid Build Coastguard Worker        # Parsing the macos archtecture
32*3c7ae9deSAndroid Build Coastguard Worker        arch = sys.argv[1]
33*3c7ae9deSAndroid Build Coastguard Worker    else:
34*3c7ae9deSAndroid Build Coastguard Worker        # If the archtecture is not set, set from system call
35*3c7ae9deSAndroid Build Coastguard Worker        arch = os.uname().machine
36*3c7ae9deSAndroid Build Coastguard Worker        print("uname result {}".format(arch))
37*3c7ae9deSAndroid Build Coastguard Worker
38*3c7ae9deSAndroid Build Coastguard Worker    if re.match(r'^(aarch64|armv[6-8]|arm64)', arch):
39*3c7ae9deSAndroid Build Coastguard Worker        arch = "armv8"
40*3c7ae9deSAndroid Build Coastguard Worker        # The oldest version we can target on arm64 is 11.0
41*3c7ae9deSAndroid Build Coastguard Worker        supported_version = "11.0"
42*3c7ae9deSAndroid Build Coastguard Worker        otool_cmd = "otool -l target/cmake-build/lib/osx/{}/cruntime/libaws-crt-jni.dylib | grep -E minos | tr -s ' ' | cut -f3 -d' ' | tr -d ' ' | tr -d '[:space:]'".format(arch)
43*3c7ae9deSAndroid Build Coastguard Worker
44*3c7ae9deSAndroid Build Coastguard Worker    print("Start to validate the build binary for MacOS with architecture {}, expected min os version: {}".format(arch,supported_version))
45*3c7ae9deSAndroid Build Coastguard Worker    result = subprocess.check_output(otool_cmd, shell=True).decode("utf-8")
46*3c7ae9deSAndroid Build Coastguard Worker
47*3c7ae9deSAndroid Build Coastguard Worker    if result != supported_version:
48*3c7ae9deSAndroid Build Coastguard Worker        # Failed
49*3c7ae9deSAndroid Build Coastguard Worker        print("Failed the compatibility validation on MacOS architecture {}, expected '{}' and built '{}'".format(arch, supported_version, result))
50*3c7ae9deSAndroid Build Coastguard Worker        sys.exit(1)
51*3c7ae9deSAndroid Build Coastguard Worker
52*3c7ae9deSAndroid Build Coastguard Worker    print("Pass the compatibility validation on MacOS architecture {} with min supported os version '{}'".format(arch,result))
53*3c7ae9deSAndroid Build Coastguard Worker    sys.exit(0)
54*3c7ae9deSAndroid Build Coastguard Worker
55*3c7ae9deSAndroid Build Coastguard Workerif __name__ == "__main__":
56*3c7ae9deSAndroid Build Coastguard Worker    main()
57