From 79fafbb1b901aa7c539228150cd4f314ffcbc730 Mon Sep 17 00:00:00 2001 From: Michael Graeb Date: Fri, 24 Jan 2025 10:40:26 -0800 Subject: [PATCH 1/8] Integration test for aws_cpu_has_feature() --- .gitignore | 3 + bin/system_info/test-print-system-info.py | 102 ++++++++++++++++++++++ builder.json | 6 +- 3 files changed, 110 insertions(+), 1 deletion(-) create mode 100755 bin/system_info/test-print-system-info.py diff --git a/.gitignore b/.gitignore index 53f9e6811..9fe765dfd 100644 --- a/.gitignore +++ b/.gitignore @@ -69,3 +69,6 @@ cmake-build* # CBMC files *.goto *.log + +# source code for system_info and other test apps +!bin diff --git a/bin/system_info/test-print-system-info.py b/bin/system_info/test-print-system-info.py new file mode 100755 index 000000000..2ec14288d --- /dev/null +++ b/bin/system_info/test-print-system-info.py @@ -0,0 +1,102 @@ +#!/usr/bin/env python3 +import argparse +import os +from pathlib import Path +import platform +import re +from subprocess import run +from typing import Dict, List, Optional + +PARSER = argparse.ArgumentParser( + description="Run print-sys-info to detect CPU features. Fail if the results seem wrong.") +PARSER.add_argument("print-sys-info-path", + help="Path to print-sys-info app") + + +def main(): + args = PARSER.parse_args() + + if args.print_sys_info: + app = Path(args.print_sys_info_path) + if not app.exists: + exit("FAILED: file not found: {app}") + else: + app = find_app() + + app_features_yesno: Dict[str, bool] = detect_features_from_app(app) + + os_features_list = detect_features_from_os() + + +def find_app(build_dir: Optional[str]) -> Path: + build_dir = find_build_dir() + + app_name = 'print-sys-info' + if os.name == 'nt': + app_name = app_name + '.exe' + + for file in build_dir.glob(f"**/{app_name}"): + return file + + exit("FAILED: Can't find print-sys-info. Pass location as argument") + + +def find_build_dir() -> Path: + dir = Path(__file__).parent + while dir is not None: + for build_dir in dir.glob('build'): + return build_dir + dir = dir.parent + + exit("FAILED: Can't find print-sys-info. Pass location as argument") + + +def detect_features_from_app(app_path: Path) -> Dict[str, bool]: + result = run([str(app_path)], + capture_output=True, + text=True) + print(result.stderr) + print(result.stdout) + if result.returncode != 0: + exit(f"FAILED: {app_path.name} exited with {result.returncode}") + + lines = result.stdout.splitlines() + + machine = platform.machine().lower() + if machine in ['x86_64', 'amd64']: + machine = 'amd' + elif machine.startswith('arm') or machine == 'aarch64': + machine = 'arm' + else: + print(f"SKIP TEST: unknown platform.machine(): {machine}") + exit(0) + + # looking for lines like: + # 'arm_crypto': true, + # 'amd_sse4_1': false + features = {} + for line in lines: + if m := re.search(f"'{machine}_(.+)': (false|true)", line): + name = m.group(1) + is_present = m.group(2) == 'true' + features[name] = is_present + if not features: + raise RuntimeError("Cannot find features text in stdout ???") + + return features + + +def detect_features_from_os() -> List[str]: + features = [] + + try: + with open('/proc/cpuinfo') as f: + cpuinfo_text = f.read() + except: + exit("SKIP TEST: currently, this test only works on machines with /proc/cpuinfo") + + # for line in cpuinfo_text: + + +if __name__ == '__main__': + main() diff --git a/builder.json b/builder.json index cdb127746..a9b263e95 100644 --- a/builder.json +++ b/builder.json @@ -19,5 +19,9 @@ ["dir", "/s", "/b"] ] } - } + }, + "test_steps": [ + "test", + ["python3", "{source_dir}/bin/system_info/test-print-system-info.py", "{install_dir}/bin/print-sys-info{exe}"] + ] } From 81d4ea60ebdf241f2279f32586a477a25798ca21 Mon Sep 17 00:00:00 2001 From: Michael Graeb Date: Fri, 24 Jan 2025 19:01:28 +0000 Subject: [PATCH 2/8] WIP --- bin/system_info/test-print-system-info.py | 41 ++++++++++++++++------- builder.json | 2 +- 2 files changed, 30 insertions(+), 13 deletions(-) diff --git a/bin/system_info/test-print-system-info.py b/bin/system_info/test-print-system-info.py index 2ec14288d..4d4bab7b5 100755 --- a/bin/system_info/test-print-system-info.py +++ b/bin/system_info/test-print-system-info.py @@ -9,27 +9,30 @@ PARSER = argparse.ArgumentParser( description="Run print-sys-info to detect CPU features. Fail if the results seem wrong.") -PARSER.add_argument("print-sys-info-path", +PARSER.add_argument("--print-sys-info-path", help="Path to print-sys-info app") +PARSER.add_argument("--build-dir", + help="Search this dir for print-sys-info app") def main(): args = PARSER.parse_args() - if args.print_sys_info: + if args.print_sys_info_path: app = Path(args.print_sys_info_path) - if not app.exists: - exit("FAILED: file not found: {app}") else: - app = find_app() + app = find_app(args.build_dir) app_features_yesno: Dict[str, bool] = detect_features_from_app(app) os_features_list = detect_features_from_os() + # TODO: compare app_features_yesno and os_features_list + def find_app(build_dir: Optional[str]) -> Path: - build_dir = find_build_dir() + if build_dir is None: + build_dir = find_build_dir() app_name = 'print-sys-info' if os.name == 'nt': @@ -38,7 +41,8 @@ def find_app(build_dir: Optional[str]) -> Path: for file in build_dir.glob(f"**/{app_name}"): return file - exit("FAILED: Can't find print-sys-info. Pass location as argument") + exit(f"FAILED: Can't find '{app_name}' under: {build_dir}." + "\nPass --build-dir to hint location.") def find_build_dir() -> Path: @@ -48,13 +52,14 @@ def find_build_dir() -> Path: return build_dir dir = dir.parent - exit("FAILED: Can't find print-sys-info. Pass location as argument") + exit("FAILED: Can't find build dir. Pass --build-dir to hint location.") def detect_features_from_app(app_path: Path) -> Dict[str, bool]: result = run([str(app_path)], capture_output=True, text=True) + print(f"--- {app_path} ---") print(result.stderr) print(result.stdout) if result.returncode != 0: @@ -76,7 +81,8 @@ def detect_features_from_app(app_path: Path) -> Dict[str, bool]: # 'amd_sse4_1': false features = {} for line in lines: - if m := re.search(f"'{machine}_(.+)': (false|true)", line): + m = re.search(f"'{machine}_(.+)': (false|true)", line) + if m: name = m.group(1) is_present = m.group(2) == 'true' features[name] = is_present @@ -89,13 +95,24 @@ def detect_features_from_app(app_path: Path) -> Dict[str, bool]: def detect_features_from_os() -> List[str]: features = [] + cpuinfo_path = '/proc/cpuinfo' try: - with open('/proc/cpuinfo') as f: + with open(cpuinfo_path) as f: cpuinfo_text = f.read() except: - exit("SKIP TEST: currently, this test only works on machines with /proc/cpuinfo") + print(f"SKIP TEST: currently, this test only works on machines with /proc/cpuinfo") + exit(0) + + # looking for line like: flags : fpu vme de pse ... + print(f"--- {cpuinfo_path} ---") + for line in cpuinfo_text.splitlines(): + print(line) + m = re.match(r"flags\s+:(.*)", line) + if m: + flags = m.group(1).split() + return flags - # for line in cpuinfo_text: + exit(f"FAILED: Cannot detect 'flags' in {cpuinfo_path}") if __name__ == '__main__': diff --git a/builder.json b/builder.json index a9b263e95..e4d50754d 100644 --- a/builder.json +++ b/builder.json @@ -22,6 +22,6 @@ }, "test_steps": [ "test", - ["python3", "{source_dir}/bin/system_info/test-print-system-info.py", "{install_dir}/bin/print-sys-info{exe}"] + ["python3", "{source_dir}/bin/system_info/test-print-system-info.py", "--build-dir", "{build_dir}"] ] } From 5a4318fc292a8174070c5b5bb4acffa090a7fe50 Mon Sep 17 00:00:00 2001 From: Michael Graeb Date: Tue, 28 Jan 2025 15:55:38 +0000 Subject: [PATCH 3/8] rename some of what gets printed out to match what linux prints in /proc/cpuinfo --- bin/system_info/print_system_info.c | 4 ++-- bin/system_info/test-print-system-info.py | 19 ++++++++++++++++--- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/bin/system_info/print_system_info.c b/bin/system_info/print_system_info.c index aac1b570f..6267ebb7f 100644 --- a/bin/system_info/print_system_info.c +++ b/bin/system_info/print_system_info.c @@ -46,10 +46,10 @@ int main(void) { fprintf(stdout, " 'arm_crypto': %s,\n", aws_cpu_has_feature(AWS_CPU_FEATURE_ARM_CRYPTO) ? "true" : "false"); fprintf(stdout, " 'amd_sse4_1': %s,\n", aws_cpu_has_feature(AWS_CPU_FEATURE_SSE_4_1) ? "true" : "false"); fprintf(stdout, " 'amd_sse4_2': %s,\n", aws_cpu_has_feature(AWS_CPU_FEATURE_SSE_4_2) ? "true" : "false"); - fprintf(stdout, " 'amd_clmul': %s,\n", aws_cpu_has_feature(AWS_CPU_FEATURE_CLMUL) ? "true" : "false"); + fprintf(stdout, " 'amd_pclmulqdq': %s,\n", aws_cpu_has_feature(AWS_CPU_FEATURE_CLMUL) ? "true" : "false"); fprintf(stdout, " 'amd_vpclmulqdq': %s,\n", aws_cpu_has_feature(AWS_CPU_FEATURE_VPCLMULQDQ) ? "true" : "false"); fprintf(stdout, " 'amd_avx2': %s,\n", aws_cpu_has_feature(AWS_CPU_FEATURE_AVX2) ? "true" : "false"); - fprintf(stdout, " 'amd_avx512': %s,\n", aws_cpu_has_feature(AWS_CPU_FEATURE_AVX512) ? "true" : "false"); + fprintf(stdout, " 'amd_avx512f': %s,\n", aws_cpu_has_feature(AWS_CPU_FEATURE_AVX512) ? "true" : "false"); fprintf(stdout, " 'amd_bmi2': %s\n", aws_cpu_has_feature(AWS_CPU_FEATURE_BMI2) ? "true" : "false"); fprintf(stdout, " }\n"); diff --git a/bin/system_info/test-print-system-info.py b/bin/system_info/test-print-system-info.py index 4d4bab7b5..84aad5977 100755 --- a/bin/system_info/test-print-system-info.py +++ b/bin/system_info/test-print-system-info.py @@ -23,16 +23,29 @@ def main(): else: app = find_app(args.build_dir) - app_features_yesno: Dict[str, bool] = detect_features_from_app(app) + app_features_presence: Dict[str, bool] = detect_features_from_app(app) os_features_list = detect_features_from_os() - # TODO: compare app_features_yesno and os_features_list + for (feature, is_present) in app_features_presence.items(): + if is_present: + if not feature in os_features_list: + exit(f"FAILED: aws-c-common thinks CPU supports '{feature}', " + + "but OS doesn't seem to think so") + else: + if feature in os_features_list: + exit("FAILED: aws-c-common doesn't think CPU supports '{feature}', " + + "but OS says it does") + + print("SUCCESS: aws-c-common and OS agree on CPU features") def find_app(build_dir: Optional[str]) -> Path: if build_dir is None: build_dir = find_build_dir() + else: + build_dir = Path(build_dir) + build_dir = build_dir.absolute() app_name = 'print-sys-info' if os.name == 'nt': @@ -41,7 +54,7 @@ def find_app(build_dir: Optional[str]) -> Path: for file in build_dir.glob(f"**/{app_name}"): return file - exit(f"FAILED: Can't find '{app_name}' under: {build_dir}." + exit(f"FAILED: Can't find '{app_name}' under: {build_dir}" "\nPass --build-dir to hint location.") From ead4604b310a087faa2ca1a4a127381daa6ad616 Mon Sep 17 00:00:00 2001 From: Michael Graeb Date: Tue, 28 Jan 2025 09:06:33 -0800 Subject: [PATCH 4/8] aliases for feature names --- bin/system_info/print_system_info.c | 4 +- bin/system_info/test-print-system-info.py | 61 +++++++++++++++-------- 2 files changed, 42 insertions(+), 23 deletions(-) diff --git a/bin/system_info/print_system_info.c b/bin/system_info/print_system_info.c index 6267ebb7f..aac1b570f 100644 --- a/bin/system_info/print_system_info.c +++ b/bin/system_info/print_system_info.c @@ -46,10 +46,10 @@ int main(void) { fprintf(stdout, " 'arm_crypto': %s,\n", aws_cpu_has_feature(AWS_CPU_FEATURE_ARM_CRYPTO) ? "true" : "false"); fprintf(stdout, " 'amd_sse4_1': %s,\n", aws_cpu_has_feature(AWS_CPU_FEATURE_SSE_4_1) ? "true" : "false"); fprintf(stdout, " 'amd_sse4_2': %s,\n", aws_cpu_has_feature(AWS_CPU_FEATURE_SSE_4_2) ? "true" : "false"); - fprintf(stdout, " 'amd_pclmulqdq': %s,\n", aws_cpu_has_feature(AWS_CPU_FEATURE_CLMUL) ? "true" : "false"); + fprintf(stdout, " 'amd_clmul': %s,\n", aws_cpu_has_feature(AWS_CPU_FEATURE_CLMUL) ? "true" : "false"); fprintf(stdout, " 'amd_vpclmulqdq': %s,\n", aws_cpu_has_feature(AWS_CPU_FEATURE_VPCLMULQDQ) ? "true" : "false"); fprintf(stdout, " 'amd_avx2': %s,\n", aws_cpu_has_feature(AWS_CPU_FEATURE_AVX2) ? "true" : "false"); - fprintf(stdout, " 'amd_avx512f': %s,\n", aws_cpu_has_feature(AWS_CPU_FEATURE_AVX512) ? "true" : "false"); + fprintf(stdout, " 'amd_avx512': %s,\n", aws_cpu_has_feature(AWS_CPU_FEATURE_AVX512) ? "true" : "false"); fprintf(stdout, " 'amd_bmi2': %s\n", aws_cpu_has_feature(AWS_CPU_FEATURE_BMI2) ? "true" : "false"); fprintf(stdout, " }\n"); diff --git a/bin/system_info/test-print-system-info.py b/bin/system_info/test-print-system-info.py index 84aad5977..cf0145332 100755 --- a/bin/system_info/test-print-system-info.py +++ b/bin/system_info/test-print-system-info.py @@ -4,7 +4,7 @@ from pathlib import Path import platform import re -from subprocess import run +import subprocess from typing import Dict, List, Optional PARSER = argparse.ArgumentParser( @@ -15,6 +15,14 @@ help="Search this dir for print-sys-info app") +FEATURE_ALIASES = { + 'avx512': ['avx512f'], + 'clmul': ['pclmulqdq'], + 'crc': ['crc32'], + 'crypto': ['aes'], +} + + def main(): args = PARSER.parse_args() @@ -23,19 +31,26 @@ def main(): else: app = find_app(args.build_dir) + # run print-sys-info. get feature names and whether it thinks they're supported app_features_presence: Dict[str, bool] = detect_features_from_app(app) + # get feature info from OS (i.e. read /proc/cpuinfo on linux), get back list of supported features os_features_list = detect_features_from_os() - for (feature, is_present) in app_features_presence.items(): - if is_present: - if not feature in os_features_list: - exit(f"FAILED: aws-c-common thinks CPU supports '{feature}', " + - "but OS doesn't seem to think so") - else: - if feature in os_features_list: - exit("FAILED: aws-c-common doesn't think CPU supports '{feature}', " + - "but OS says it does") + # For each feature that print-sys-info says was (or wasn't) there, + # check the os_features_list and make sure it is (or isn't_ present. + for (feature, app_presence) in app_features_presence.items(): + os_presence = feature in os_features_list + if not os_presence: + # sometimes a feature has a mildly different name across platforms + for alias in FEATURE_ALIASES.get(feature, []): + if alias in os_features_list: + os_presence = True + break + + if app_presence != os_presence: + exit(f"FAILED: aws-c-common and OS disagree on whether CPU supports feature '{feature}'\n" + + f"\taws-c-common:{app_presence} OS:{os_presence}") print("SUCCESS: aws-c-common and OS agree on CPU features") @@ -44,8 +59,7 @@ def find_app(build_dir: Optional[str]) -> Path: if build_dir is None: build_dir = find_build_dir() else: - build_dir = Path(build_dir) - build_dir = build_dir.absolute() + build_dir = Path(build_dir).absolute() app_name = 'print-sys-info' if os.name == 'nt': @@ -59,7 +73,7 @@ def find_app(build_dir: Optional[str]) -> Path: def find_build_dir() -> Path: - dir = Path(__file__).parent + dir = Path(__file__).parent.absolute() while dir is not None: for build_dir in dir.glob('build'): return build_dir @@ -69,9 +83,10 @@ def find_build_dir() -> Path: def detect_features_from_app(app_path: Path) -> Dict[str, bool]: - result = run([str(app_path)], - capture_output=True, - text=True) + result = subprocess.run([str(app_path)], + universal_newlines=True, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) print(f"--- {app_path} ---") print(result.stderr) print(result.stdout) @@ -116,16 +131,20 @@ def detect_features_from_os() -> List[str]: print(f"SKIP TEST: currently, this test only works on machines with /proc/cpuinfo") exit(0) - # looking for line like: flags : fpu vme de pse ... + # looking for line like: + # flags : fpu vme de pse ... + # OR + # features : fp asimd evtstrm ... print(f"--- {cpuinfo_path} ---") for line in cpuinfo_text.splitlines(): + line = line.lower() print(line) - m = re.match(r"flags\s+:(.*)", line) + m = re.match(r"(flags|features)\s+:(.*)", line) if m: - flags = m.group(1).split() - return flags + features = m.group(2).split() + return features - exit(f"FAILED: Cannot detect 'flags' in {cpuinfo_path}") + exit(f"FAILED: Cannot detect CPU features in {cpuinfo_path}") if __name__ == '__main__': From 92a5c0ca49043320a37e39bd702a72d677202aea Mon Sep 17 00:00:00 2001 From: Michael Graeb Date: Tue, 28 Jan 2025 09:23:25 -0800 Subject: [PATCH 5/8] deal with CI that does -DUSE_CPU_EXTENSIONS=OFF --- bin/system_info/print_system_info.c | 6 ++++++ bin/system_info/test-print-system-info.py | 8 ++++++++ 2 files changed, 14 insertions(+) diff --git a/bin/system_info/print_system_info.c b/bin/system_info/print_system_info.c index aac1b570f..5197e5d85 100644 --- a/bin/system_info/print_system_info.c +++ b/bin/system_info/print_system_info.c @@ -53,6 +53,12 @@ int main(void) { fprintf(stdout, " 'amd_bmi2': %s\n", aws_cpu_has_feature(AWS_CPU_FEATURE_BMI2) ? "true" : "false"); fprintf(stdout, " }\n"); +#if defined(AWS_USE_CPU_EXTENSIONS) + fprintf(stdout, " 'use cpu extensions': true\n"); +#else + fprintf(stdout, " 'use cpu extensions': false\n"); +#endif + fprintf(stdout, "}\n"); aws_system_environment_release(env); aws_logger_clean_up(&logger); diff --git a/bin/system_info/test-print-system-info.py b/bin/system_info/test-print-system-info.py index cf0145332..027cf2cf9 100755 --- a/bin/system_info/test-print-system-info.py +++ b/bin/system_info/test-print-system-info.py @@ -114,6 +114,14 @@ def detect_features_from_app(app_path: Path) -> Dict[str, bool]: name = m.group(1) is_present = m.group(2) == 'true' features[name] = is_present + + # if aws-c-common compiled with -DUSE_CPU_EXTENSIONS=OFF, skip this this test + for line in lines: + m = re.search(f"'use cpu extensions': false", line) + if m: + print("SKIP TEST: aws-c-common compiled with -DUSE_CPU_EXTENSIONS=OFF") + exit(0) + if not features: raise RuntimeError("Cannot find features text in stdout ???") From f47bb67bb94fea149747967230eeacfaeb309ac7 Mon Sep 17 00:00:00 2001 From: Michael Graeb Date: Wed, 29 Jan 2025 15:27:01 -0800 Subject: [PATCH 6/8] try ubuntu-24.04-arm --- .github/workflows/ci.yml | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c0f31fbe1..1cdb3eb18 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -305,6 +305,19 @@ jobs: chmod a+x builder ./builder build -p ${{ env.PACKAGE_NAME }} + linux-arm64: + runs-on: ubuntu-24.04-arm # latest + steps: + - uses: aws-actions/configure-aws-credentials@v4 + with: + role-to-assume: ${{ env.CRT_CI_ROLE }} + aws-region: ${{ env.AWS_DEFAULT_REGION }} + - name: Build ${{ env.PACKAGE_NAME }} + consumers + run: | + python3 -c "from urllib.request import urlretrieve; urlretrieve('${{ env.BUILDER_HOST }}/${{ env.BUILDER_SOURCE }}/${{ env.BUILDER_VERSION }}/builder.pyz?run=${{ env.RUN }}', 'builder')" + chmod a+x builder + ./builder build -p ${{ env.PACKAGE_NAME }} + cross_compile: name: Cross Compile ${{matrix.arch}} runs-on: ubuntu-24.04 # latest From 8a523bdbcde0a5eae9f528d313f672ee4b24090e Mon Sep 17 00:00:00 2001 From: Michael Graeb Date: Thu, 30 Jan 2025 07:32:37 -0800 Subject: [PATCH 7/8] test builder branch that doesn't always disable armv8 tests --- .github/workflows/ci.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1cdb3eb18..086fef273 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -6,9 +6,9 @@ on: - 'main' env: - BUILDER_VERSION: v0.9.72 + BUILDER_VERSION: ubuntu-arm BUILDER_HOST: https://d19elf31gohf1l.cloudfront.net - BUILDER_SOURCE: releases + BUILDER_SOURCE: channels PACKAGE_NAME: aws-c-common LINUX_BASE_IMAGE: ubuntu-18-x64 RUN: ${{ github.run_id }}-${{ github.run_number }} @@ -323,7 +323,7 @@ jobs: runs-on: ubuntu-24.04 # latest strategy: matrix: - arch: [linux-armv6, linux-armv7, linux-arm64, android-armv7] + arch: [linux-armv6, linux-armv7, android-armv7] steps: - uses: aws-actions/configure-aws-credentials@v4 with: From 4596003a43c1e6b826904b5bb47bf1b233a8a585 Mon Sep 17 00:00:00 2001 From: Michael Graeb Date: Thu, 30 Jan 2025 15:37:06 -0800 Subject: [PATCH 8/8] forget about ubuntu-arm for now. aws-crt-builder is having issues. we'll tackle this another time... --- .github/workflows/ci.yml | 19 +++---------------- 1 file changed, 3 insertions(+), 16 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 086fef273..c0f31fbe1 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -6,9 +6,9 @@ on: - 'main' env: - BUILDER_VERSION: ubuntu-arm + BUILDER_VERSION: v0.9.72 BUILDER_HOST: https://d19elf31gohf1l.cloudfront.net - BUILDER_SOURCE: channels + BUILDER_SOURCE: releases PACKAGE_NAME: aws-c-common LINUX_BASE_IMAGE: ubuntu-18-x64 RUN: ${{ github.run_id }}-${{ github.run_number }} @@ -305,25 +305,12 @@ jobs: chmod a+x builder ./builder build -p ${{ env.PACKAGE_NAME }} - linux-arm64: - runs-on: ubuntu-24.04-arm # latest - steps: - - uses: aws-actions/configure-aws-credentials@v4 - with: - role-to-assume: ${{ env.CRT_CI_ROLE }} - aws-region: ${{ env.AWS_DEFAULT_REGION }} - - name: Build ${{ env.PACKAGE_NAME }} + consumers - run: | - python3 -c "from urllib.request import urlretrieve; urlretrieve('${{ env.BUILDER_HOST }}/${{ env.BUILDER_SOURCE }}/${{ env.BUILDER_VERSION }}/builder.pyz?run=${{ env.RUN }}', 'builder')" - chmod a+x builder - ./builder build -p ${{ env.PACKAGE_NAME }} - cross_compile: name: Cross Compile ${{matrix.arch}} runs-on: ubuntu-24.04 # latest strategy: matrix: - arch: [linux-armv6, linux-armv7, android-armv7] + arch: [linux-armv6, linux-armv7, linux-arm64, android-armv7] steps: - uses: aws-actions/configure-aws-credentials@v4 with: