@cryptotaxi247 / netdata-1 / commits / d7a9b8297

Start using new GitHub hosted ARM runners for CI when appropriate. (#19427)

* Start using new GitHub hosted ARM runners for CI when appropriate. * Fix matrix generation. * Fix actionlint error. * Don't fail fast for static builds. * Bump OpenSSL, cURL, and Bash versions for static builds. * Fix more actionlint errors. * Fix 32-bit ARM OpenSSL build. * Fix ppc64le static openssl build. * Fix duplicate key. * Fix openssl ppc64le build again. * Third attempt at fixing POWER8+ static builds. --------- Co-authored-by: Ilya Mashchenko <ilya@netdata.cloud>

Austin S. Hemmelgarn committed Feb 3, 2025 at 11:26 UTC d7a9b829764992224809c2c0b2dc400bc561a6ac
9 files changed +229 -76
.github/data/distros.yml
+37
@@ -6,7 +6,10 @@ platform_map: # map packaging architectures to docker platforms
6 arm64: linux/arm64/v8
7 armhf: linux/arm/v7
8 armhfp: linux/arm/v7
9 + armv6l: linux/arm/v6
10 + armv7l: linux/arm/v7
11 i386: linux/386
12 + ppc64le: linux/ppc64le
13 x86_64: linux/amd64
14 arch_order: # sort order for per-architecture jobs in CI
15 - amd64
@@ -14,8 +17,42 @@ arch_order: # sort order for per-architecture jobs in CI
17 - i386
18 - armhf
19 - armhfp
20 + - armv6l
21 + - armv7l
22 - arm64
23 - aarch64
24 + - ppc64le
25 +arch_data: # Mapping of per-architecture matrix behavior.
26 + amd64: &amd64
27 + qemu: false
28 + runner: ubuntu-24.04
29 + x86_64: *amd64
30 + i386: *amd64
31 + armhf: &arm
32 + qemu: false
33 + runner: ubuntu-24.04-arm
34 + armhfp: *arm
35 + armv6l: *arm
36 + armv7l: *arm
37 + arm64: &arm64
38 + qemu: false
39 + runner: ubuntu-24.04-arm
40 + aarch64: *arm64
41 + ppc64le:
42 + qemu: true
43 + runner: ubuntu-24.04
44 +static_arches: # Static build architectures
45 + - x86_64
46 + - armv6l
47 + - armv7l
48 + - aarch64
49 + - ppc64le
50 +docker_arches: # Docker build archtiectures
51 + - amd64
52 + - i386
53 + - armv7l
54 + - arm64
55 + - ppc64le
56 default_sentry: &default_sentry # Default configuration for Sentry usage
57 amd64: false
58 x86_64: false
.github/scripts/gen-matrix-docker.py new
+23
@@ -0,0 +1,23 @@
1 +#!/usr/bin/env python3
2 +
3 +import json
4 +
5 +from ruamel.yaml import YAML
6 +
7 +yaml = YAML(typ='safe')
8 +entries = list()
9 +
10 +with open('.github/data/distros.yml') as f:
11 + data = yaml.load(f)
12 +
13 +for arch in data['docker_arches']:
14 + entries.append({
15 + 'arch': arch,
16 + 'platform': data['platform_map'][arch],
17 + 'runner': data['arch_data'][arch]['runner'],
18 + 'qemu': data['arch_data'][arch]['qemu'],
19 + })
20 +
21 +entries.sort(key=lambda k: data['arch_order'].index(k['arch']))
22 +matrix = json.dumps({'include': entries}, sort_keys=True)
23 +print(matrix)
.github/scripts/gen-matrix-packaging.py
+3 -1
@@ -30,7 +30,9 @@ for i, v in enumerate(data['include']):
30 'builder_rev': data['include'][i]['packages']['builder_rev'],
31 'platform': data['platform_map'][arch],
32 'bundle_sentry': data['include'][i]['bundle_sentry'][arch],
33 - 'arch': arch
33 + 'arch': arch,
34 + 'runner': data['arch_data'][arch]['runner'],
35 + 'qemu': data['arch_data'][arch]['qemu'],
36 })
37
38 entries.sort(key=lambda k: (data['arch_order'].index(k['arch']), k['distro'], k['version']))
.github/scripts/gen-matrix-static.py new
+22
@@ -0,0 +1,22 @@
1 +#!/usr/bin/env python3
2 +
3 +import json
4 +
5 +from ruamel.yaml import YAML
6 +
7 +yaml = YAML(typ='safe')
8 +entries = list()
9 +
10 +with open('.github/data/distros.yml') as f:
11 + data = yaml.load(f)
12 +
13 +for arch in data['static_arches']:
14 + entries.append({
15 + 'arch': arch,
16 + 'runner': data['arch_data'][arch]['runner'],
17 + 'qemu': data['arch_data'][arch]['qemu'],
18 + })
19 +
20 +entries.sort(key=lambda k: data['arch_order'].index(k['arch']))
21 +matrix = json.dumps({'include': entries}, sort_keys=True)
22 +print(matrix)
.github/workflows/build.yml
+57 -18
@@ -65,6 +65,7 @@ jobs:
65 .github/workflows/build.yml
66 .github/scripts/build-static.sh
67 .github/scripts/get-static-cache-key.sh
68 + .github/scripts/gen-matrix-static.py
69 .github/scripts/gen-matrix-build.py
70 .github/scripts/run-updater-check.sh
71 packaging/cmake/
@@ -181,20 +182,58 @@ jobs:
182 && needs.file-check.outputs.run == 'true'
183 }}
184
185 + static-matrix: # Generate the static build matrix.
186 + name: Prepare Build Matrix
187 + runs-on: ubuntu-latest
188 + if: github.event_name != 'workflow_dispatch'
189 + outputs:
190 + matrix: ${{ steps.set-matrix.outputs.matrix }}
191 + steps:
192 + - name: Checkout
193 + id: checkout
194 + uses: actions/checkout@v4
195 + - name: Prepare tools
196 + id: prepare
197 + run: |
198 + sudo apt-get update || true
199 + sudo apt-get install -y python3-ruamel.yaml
200 + - name: Read build matrix
201 + id: set-matrix
202 + run: |
203 + matrix="$(.github/scripts/gen-matrix-static.py)"
204 + echo "Generated matrix: ${matrix}"
205 + echo "matrix=${matrix}" >> "${GITHUB_OUTPUT}"
206 + - name: Failure Notification
207 + uses: rtCamp/action-slack-notify@v2
208 + env:
209 + SLACK_COLOR: 'danger'
210 + SLACK_FOOTER: ''
211 + SLACK_ICON_EMOJI: ':github-actions:'
212 + SLACK_TITLE: 'Static build matrix preparation failed:'
213 + SLACK_USERNAME: 'GitHub Actions'
214 + SLACK_MESSAGE: |-
215 + ${{ github.repository }}: Failed to prepare build matrix for build checks.
216 + Checkout: ${{ steps.checkout.outcome }}
217 + Prepare tools: ${{ steps.prepare.outcome }}
218 + Read build matrix: ${{ steps.set-matrix.outcome }}
219 + SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_URL }}
220 + if: >-
221 + ${{
222 + failure()
223 + && startsWith(github.ref, 'refs/heads/master')
224 + && github.event_name != 'pull_request'
225 + && github.repository == 'netdata/netdata'
226 + }}
227 +
228 build-static: # Build the static binary archives, and store them as artifacts.
229 name: Build Static
186 - runs-on: ubuntu-latest
230 needs:
231 - file-check
232 + - static-matrix
233 strategy:
190 - matrix:
191 - arch:
192 - - x86_64
193 - - armv6l
194 - - armv7l
195 - - aarch64
196 - - ppc64le
234 fail-fast: false
235 + matrix: ${{ fromJson(needs.static-matrix.outputs.matrix) }}
236 + runs-on: ${{ matrix.runner }}
237 steps:
238 - name: Skip Check
239 id: skip
@@ -230,7 +269,7 @@ jobs:
269 key: ${{ steps.cache-key.outputs.key }}
270 - name: Set up QEMU
271 id: qemu
233 - if: needs.file-check.outputs.run == 'true'
272 + if: matrix.qemu && needs.file-check.outputs.run == 'true'
273 run: |
274 sudo apt-get update
275 sudo apt-get upgrade -y
@@ -239,7 +278,7 @@ jobs:
278 if: github.event_name != 'workflow_dispatch' && needs.file-check.outputs.run == 'true' # Don’t use retries on PRs.
279 run: |
280 export EXTRA_INSTALL_FLAGS=${{ needs.file-check.outputs.skip-go }}
242 - export SKIP_EMULATION=1
281 + [ "${{ matrix.qemu }}" == "true" ] || export SKIP_EMULATION=1
282 .github/scripts/build-static.sh ${{ matrix.arch }}
283 - name: Build
284 if: github.event_name == 'workflow_dispatch' && needs.file-check.outputs.run == 'true'
@@ -250,7 +289,7 @@ jobs:
289 max_attempts: 3
290 command: |
291 export EXTRA_INSTALL_FLAGS=${{ needs.file-check.outputs.skip-go }}
253 - export SKIP_EMULATION=1
292 + [ "${{ matrix.qemu }}" == "true" ] || export SKIP_EMULATION=1
293 .github/scripts/build-static.sh ${{ matrix.arch }}
294 - name: Store
295 id: store
@@ -374,7 +413,7 @@ jobs:
413 SLACK_TITLE: 'Windows build failed:'
414 SLACK_USERNAME: 'GitHub Actions'
415 SLACK_MESSAGE: |-
377 - ${{ github.repository }}: Updater checks for ${{ matrix.distro }} failed.
416 + ${{ github.repository }}: Windows build failed.
417 Checkout: ${{ steps.checkout.outcome }}
418 Set Up Dependencies: ${{ steps.deps.outcome }}
419 Build Netdata: ${{ steps.build.outcome }}
@@ -672,10 +711,10 @@ jobs:
711 SLACK_COLOR: 'danger'
712 SLACK_FOOTER: ''
713 SLACK_ICON_EMOJI: ':github-actions:'
675 - SLACK_TITLE: 'Updater checks for ${{ matrix.distro }} failed:'
714 + SLACK_TITLE: 'Updater checks failed:'
715 SLACK_USERNAME: 'GitHub Actions'
716 SLACK_MESSAGE: |-
678 - ${{ github.repository }}: Updater checks for ${{ matrix.distro }} failed.
717 + ${{ github.repository }}: Updater checks for failed.
718 Checkout: ${{ steps.checkout.outcome }}
719 Fetch artifacts: ${{ steps.fetch-artifacts.outcome }}
720 Prepare artifact directory: ${{ steps.prepare.outcome }}
@@ -893,7 +932,7 @@ jobs:
932
933 # Remaining jobs are only used for CI checks, and not as part of the release process
934
896 - matrix: # Generate the shared build matrix for our Linux build tests.
935 + src-matrix: # Generate the shared build matrix for our Linux build tests.
936 name: Prepare Build Matrix
937 runs-on: ubuntu-latest
938 if: github.event_name != 'workflow_dispatch'
@@ -941,12 +980,12 @@ jobs:
980 runs-on: ubuntu-latest
981 if: github.event_name != 'workflow_dispatch'
982 needs:
944 - - matrix
983 + - src-matrix
984 - file-check
985 strategy:
986 fail-fast: false
987 max-parallel: 8
949 - matrix: ${{ fromJson(needs.matrix.outputs.matrix) }}
988 + matrix: ${{ fromJson(needs.src-matrix.outputs.matrix) }}
989 steps:
990 - name: Skip Check
991 id: skip
@@ -995,7 +1034,7 @@ jobs:
1034 ${{ github.repository }}: Build tests for ${{ matrix.distro }} failed.
1035 Checkout: ${{ steps.checkout.outcome }}
1036 Set up Buildx: ${{ steps.buildx.outcome }}
998 - Build test environment: ${{ steps.build1.outcome }}
1037 + Build test environment: ${{ steps.build.outcome }}
1038 netdata-installer: ${{ steps.build-cloud.outcome }}
1039 SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_URL }}
1040 if: >-
.github/workflows/docker.yml
+60 -36
@@ -72,6 +72,7 @@ jobs:
72 netdata-installer.sh
73 .github/workflows/docker.yml
74 .github/scripts/docker-test.sh
75 + .github/scripts/gen-matrix-docker.py
76 .github/scripts/gen-docker-tags.py
77 .github/scripts/gen-docker-imagetool-args.py
78 packaging/cmake/
@@ -116,19 +117,57 @@ jobs:
117 echo 'skip-go=' >> "${GITHUB_OUTPUT}"
118 fi
119
120 + matrix:
121 + name: Generate Docker Build Matrix
122 + runs-on: ubuntu-latest
123 + outputs:
124 + matrix: ${{ steps.set-matrix.outputs.matrix }}
125 + steps:
126 + - name: Checkout
127 + id: checkout
128 + uses: actions/checkout@v4
129 + - name: Prepare tools
130 + id: prepare
131 + run: |
132 + sudo apt-get update || true
133 + sudo apt-get install -y python3-ruamel.yaml
134 + - name: Read build matrix
135 + id: set-matrix
136 + run: |
137 + matrix="$(.github/scripts/gen-matrix-docker.py)"
138 + echo "Generated matrix: ${matrix}"
139 + echo "matrix=${matrix}" >> "${GITHUB_OUTPUT}"
140 + - name: Failure Notification
141 + uses: rtCamp/action-slack-notify@v2
142 + env:
143 + SLACK_COLOR: 'danger'
144 + SLACK_FOOTER: ''
145 + SLACK_ICON_EMOJI: ':github-actions:'
146 + SLACK_TITLE: 'Docker build matrix preparation failed:'
147 + SLACK_USERNAME: 'GitHub Actions'
148 + SLACK_MESSAGE: |-
149 + ${{ github.repository }}: Failed to prepare build matrix for build checks.
150 + Checkout: ${{ steps.checkout.outcome }}
151 + Prepare tools: ${{ steps.prepare.outcome }}
152 + Read build matrix: ${{ steps.set-matrix.outcome }}
153 + SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_URL }}
154 + if: >-
155 + ${{
156 + failure()
157 + && startsWith(github.ref, 'refs/heads/master')
158 + && github.event_name != 'pull_request'
159 + && github.repository == 'netdata/netdata'
160 + }}
161 +
162 build-images:
163 name: Build Docker Images
164 needs:
165 - file-check
123 - runs-on: ubuntu-latest
166 + - matrix
167 + runs-on: ${{ matrix.runner }}
168 strategy:
125 - matrix:
126 - platform:
127 - - linux/amd64
128 - - linux/i386
129 - - linux/arm/v7
130 - - linux/arm64
131 - - linux/ppc64le
169 + matrix: ${{ fromJson(needs.matrix.outputs.matrix) }}
170 + # Fail fast on releases, but run everything to completion on other triggers.
171 fail-fast: false
172 steps:
173 - name: Skip Check
@@ -152,7 +191,7 @@ jobs:
191 run: echo "OFFICIAL_IMAGE=true" >> "${GITHUB_ENV}"
192 - name: Setup QEMU
193 id: qemu
155 - if: matrix.platform != 'linux/i386' && matrix.platform != 'linux/amd64' && needs.file-check.outputs.run == 'true'
194 + if: matrix.qemu && needs.file-check.outputs.run == 'true'
195 run: |
196 sudo apt-get update
197 sudo apt-get upgrade -y
@@ -237,15 +276,10 @@ jobs:
276 needs:
277 - build-images
278 - gen-tags
279 + - matrix
280 strategy:
241 - matrix:
242 - platform:
243 - - linux/amd64
244 - - linux/i386
245 - - linux/arm/v7
246 - - linux/arm64
247 - - linux/ppc64le
248 - runs-on: ubuntu-latest
281 + matrix: ${{ fromJson(needs.matrix.outputs.matrix) }}
282 + runs-on: ${{ matrix.runner }}
283 steps:
284 - name: Checkout
285 id: checkout
@@ -268,7 +302,7 @@ jobs:
302 run: echo "OFFICIAL_IMAGE=true" >> "${GITHUB_ENV}"
303 - name: Setup QEMU
304 id: qemu
271 - if: matrix.platform != 'linux/i386' && matrix.platform != 'linux/amd64'
305 + if: matrix.qemu
306 uses: docker/setup-qemu-action@v3
307 - name: Setup Buildx
308 id: prepare
@@ -391,15 +425,10 @@ jobs:
425 needs:
426 - build-images
427 - gen-tags
428 + - matrix
429 strategy:
395 - matrix:
396 - platform:
397 - - linux/amd64
398 - - linux/i386
399 - - linux/arm/v7
400 - - linux/arm64
401 - - linux/ppc64le
402 - runs-on: ubuntu-latest
430 + matrix: ${{ fromJson(needs.matrix.outputs.matrix) }}
431 + runs-on: ${{ matrix.runner }}
432 steps:
433 - name: Checkout
434 id: checkout
@@ -422,7 +451,7 @@ jobs:
451 run: echo "OFFICIAL_IMAGE=true" >> "${GITHUB_ENV}"
452 - name: Setup QEMU
453 id: qemu
425 - if: matrix.platform != 'linux/i386' && matrix.platform != 'linux/amd64'
454 + if: matrix.qemu
455 uses: docker/setup-qemu-action@v3
456 - name: Setup Buildx
457 id: prepare
@@ -547,15 +576,10 @@ jobs:
576 needs:
577 - build-images
578 - gen-tags
579 + - matrix
580 strategy:
551 - matrix:
552 - platform:
553 - - linux/amd64
554 - - linux/i386
555 - - linux/arm/v7
556 - - linux/arm64
557 - - linux/ppc64le
558 - runs-on: ubuntu-latest
581 + matrix: ${{ fromJson(needs.matrix.outputs.matrix) }}
582 + runs-on: ${{ matrix.runner }}
583 steps:
584 - name: Checkout
585 id: checkout
@@ -578,7 +602,7 @@ jobs:
602 run: echo "OFFICIAL_IMAGE=true" >> "${GITHUB_ENV}"
603 - name: Setup QEMU
604 id: qemu
581 - if: matrix.platform != 'linux/i386' && matrix.platform != 'linux/amd64'
605 + if: matrix.qemu
606 uses: docker/setup-qemu-action@v3
607 - name: Setup Buildx
608 id: prepare
.github/workflows/packaging.yml
+12 -14
@@ -190,7 +190,7 @@ jobs:
190
191 build:
192 name: Build
193 - runs-on: ubuntu-latest
193 + runs-on: ${{ matrix.runner }}
194 env:
195 DOCKER_CLI_EXPERIMENTAL: enabled
196 needs:
@@ -230,7 +230,7 @@ jobs:
230 fi
231 - name: Setup QEMU
232 id: qemu
233 - if: matrix.platform != 'linux/i386' && matrix.platform != 'linux/amd64' && needs.file-check.outputs.run == 'true'
233 + if: matrix.qemu && needs.file-check.outputs.run == 'true'
234 run: |
235 sudo apt-get update
236 sudo apt-get upgrade -y
@@ -274,14 +274,6 @@ jobs:
274 -e VERSION=${{ needs.version-check.outputs.version }} -e DISTRO_VERSION=${{ matrix.version }} \
275 --platform=${{ matrix.platform }} -v "$PWD":/netdata ${{ matrix.base_image }} \
276 /netdata/.github/scripts/pkg-test.sh
277 - - name: SSH setup
278 - id: ssh-setup
279 - if: github.event_name == 'workflow_dispatch' && github.repository == 'netdata/netdata' && needs.file-check.outputs.run == 'true'
280 - uses: shimataro/ssh-key-action@v2
281 - with:
282 - key: ${{ secrets.NETDATABOT_PACKAGES_SSH_KEY }}
283 - name: id_ecdsa
284 - known_hosts: ${{ secrets.PACKAGES_KNOWN_HOSTS }}
277 - name: Import GPG Keys
278 id: import-keys
279 if: needs.file-check.outputs.run == 'true' && matrix.format == 'deb' && github.event_name != 'pull_request'
@@ -293,6 +285,14 @@ jobs:
285 if: needs.file-check.outputs.run == 'true' && matrix.format == 'deb' && github.event_name != 'pull_request'
286 shell: bash
287 run: .github/scripts/deb-sign.sh artifacts ${{ steps.import-keys.outputs.fingerprint }}
288 + - name: SSH setup
289 + id: ssh-setup
290 + if: github.event_name == 'workflow_dispatch' && github.repository == 'netdata/netdata' && needs.file-check.outputs.run == 'true'
291 + uses: shimataro/ssh-key-action@v2
292 + with:
293 + key: ${{ secrets.NETDATABOT_PACKAGES_SSH_KEY }}
294 + name: id_ecdsa
295 + known_hosts: ${{ secrets.PACKAGES_KNOWN_HOSTS }}
296 - name: Upload to packages.netdata.cloud
297 id: package-upload
298 continue-on-error: true
@@ -325,15 +325,13 @@ jobs:
325 ${{ github.repository }}: ${{ matrix.repo_distro }} ${{ matrix.version }} package build for ${{ matrix.arch }} failed.
326 Checkout: ${{ steps.checkout.outcome }}
327 Setup QEMU: ${{ steps.qemu.outcome }}
328 - Setup Docker: ${{ steps.docker-config.outcome }}
328 Fetch images: ${{ steps.fetch-images.outcome }}
329 Build: ${{ steps.build.outcome }}
330 Test: ${{ steps.test.outcome }}
332 - Publish to PackageCloud: ${{ steps.upload.outcome }}
333 - Import SSH Key: ${{ steps.ssh-setup.outcome }}
334 - Publish to packages.netdata.cloud: ${{ steps.package-upload.outcome }}
331 Import GPG Keys: ${{ steps.import-keys.outcome }}
332 Sign DEB Packages: ${{ steps.sign-deb.outcome }}
333 + Import SSH Key: ${{ steps.ssh-setup.outcome }}
334 + Publish to packages.netdata.cloud: ${{ steps.package-upload.outcome }}
335 Publish to packages2.netdata.cloud: ${{ steps.package2-upload.outcome }}
336 SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_URL }}
337 if: >-
packaging/makeself/bundled-packages.version
+4 -4
@@ -1,13 +1,13 @@
1 # Source of truth for all the packages we bundle in static builds
2 PACKAGES=("OPENSSL" "CURL" "BASH" "IOPING" "LIBNETFILTER_ACT")
3 SOURCE_TYPES=("GH_REPO_CLONE" "GH_REPO_CLONE" "DW_TARBALL" "GH_REPO_SOURCE" "DW_TARBALL")
4 -OPENSSL_VERSION="openssl-3.3.2"
4 +OPENSSL_VERSION="openssl-3.4.0"
5 OPENSSL_SOURCE="https://github.com/openssl/openssl"
6 -CURL_VERSION="curl-8_10_1"
6 +CURL_VERSION="curl-8_11_1"
7 CURL_SOURCE="https://github.com/curl/curl"
8 -BASH_VERSION="5.1.16"
8 +BASH_VERSION="5.2.37"
9 BASH_ARTIFACT_SOURCE="http://ftp.gnu.org/gnu/bash"
10 -BASH_ARTIFACT_SHA256="5bac17218d3911834520dad13cd1f85ab944e1c09ae1aba55906be1f8192f558"
10 +BASH_ARTIFACT_SHA256="9599b22ecd1d5787ad7d3b7bf0c59f312b3396d1e281175dd1f8a4014da621ff"
11 IOPING_VERSION="1.3"
12 IOPING_SOURCE="https://github.com/koct9i/ioping"
13 IOPING_ARTIFACT_SHA256="7aa48e70aaa766bc112dea57ebbe56700626871052380709df3a26f46766e8c8"
packaging/makeself/jobs/20-openssl.install.sh
+11 -3
@@ -36,9 +36,17 @@ fi
36 cd "${NETDATA_MAKESELF_PATH}/tmp/openssl" || exit 1
37
38 if [ "${CACHE_HIT:-0}" -eq 0 ]; then
39 - sed -i "s/disable('static', 'pic', 'threads');/disable('static', 'pic');/" Configure
40 - run ./config -static threads no-tests --prefix=/openssl-static --openssldir=/opt/netdata/etc/ssl
41 - run make -j "$(nproc)"
39 + COMMON_CONFIG="-static threads no-tests --prefix=/openssl-static --openssldir=/opt/netdata/etc/ssl"
40 +
41 + sed -i "s/disable('static', 'pic', 'threads');/disable('static', 'pic');/" Configure
42 +
43 + # shellcheck disable=SC2086
44 + case "${BUILDARCH}" in
45 + armv6l|armv7l) run ./config ${COMMON_CONFIG} linux-armv4 ;;
46 + *) run ./config ${COMMON_CONFIG} ;;
47 + esac
48 +
49 + run make -j "$(nproc)"
50 fi
51
52 run make -j "$(nproc)" install_sw