30 use_openwrt_container:
33 coverity_project_name:
36 coverity_check_packages:
38 coverity_compiler_template_list:
42 coverity_force_compile_packages:
56 name: Setup build ${{ inputs.target }}/${{ inputs.subtarget }}
57 runs-on: ubuntu-latest
59 owner_lc: ${{ steps.lower_owner.outputs.owner_lc }}
60 ccache_hash: ${{ steps.ccache_hash.outputs.ccache_hash }}
61 container_tag: ${{ steps.determine_tools_container.outputs.container_tag }}
65 uses: actions/checkout@v3
67 - name: Set lower case owner name
70 OWNER_LC=$(echo "${{ github.repository_owner }}" \
71 | tr '[:upper:]' '[:lower:]')
73 if [ ${{ inputs.use_openwrt_container }} == "true" ]; then
77 echo "owner_lc=$OWNER_LC" >> $GITHUB_OUTPUT
79 - name: Generate ccache hash
82 CCACHE_HASH=$(md5sum include/kernel-* | awk '{ print $1 }' \
83 | md5sum | awk '{ print $1 }')
84 echo "ccache_hash=$CCACHE_HASH" >> $GITHUB_OUTPUT
86 # Per branch tools container tag
87 # By default stick to latest
88 # For official test targetting openwrt stable branch
89 # Get the branch or parse the tag and push dedicated tools containers
90 # For local test to use the correct container for stable release testing
91 # you need to use for the branch name a prefix of openwrt-[0-9][0-9].[0-9][0-9]-
92 - name: Determine tools container tag
93 id: determine_tools_container
96 if [ -n "${{ github.base_ref }}" ]; then
97 if echo "${{ github.base_ref }}" | grep -q -E '^openwrt-[0-9][0-9]\.[0-9][0-9]$'; then
98 CONTAINER_TAG="${{ github.base_ref }}"
100 elif [ ${{ github.ref_type }} == "branch" ]; then
101 if echo "${{ github.ref_name }}" | grep -q -E '^openwrt-[0-9][0-9]\.[0-9][0-9]$'; then
102 CONTAINER_TAG=${{ github.ref_name }}
103 elif echo "${{ github.ref_name }}" | grep -q -E '^openwrt-[0-9][0-9]\.[0-9][0-9]-'; then
104 CONTAINER_TAG="$(echo ${{ github.ref_name }} | sed 's/^\(openwrt-[0-9][0-9]\.[0-9][0-9]\)-.*/\1/')"
106 elif [ ${{ github.ref_type }} == "tag" ]; then
107 if echo "${{ github.ref_name }}" | grep -q -E '^v[0-9][0-9]\.[0-9][0-9]\..+'; then
108 CONTAINER_TAG=openwrt-"$(echo ${{ github.ref_name }} | sed 's/^v\([0-9][0-9]\.[0-9][0-9]\)\..\+/\1/')"
111 echo "Tools container to use tools:$CONTAINER_TAG"
112 echo "container_tag=$CONTAINER_TAG" >> $GITHUB_OUTPUT
115 name: Build ${{ inputs.target }}/${{ inputs.subtarget }}
117 runs-on: ubuntu-latest
119 container: ghcr.io/${{ needs.setup_build.outputs.owner_lc }}/tools:${{ needs.setup_build.outputs.container_tag }}
126 - name: Checkout master directory
127 uses: actions/checkout@v3
131 - name: Checkout packages feed
132 if: inputs.include_feeds == true
133 uses: actions/checkout@v3
135 repository: openwrt/packages
136 path: openwrt/feeds/packages
138 - name: Checkout luci feed
139 if: inputs.include_feeds == true
140 uses: actions/checkout@v3
142 repository: openwrt/luci
143 path: openwrt/feeds/luci
145 - name: Checkout routing feed
146 if: inputs.include_feeds == true
147 uses: actions/checkout@v3
149 repository: openwrt/routing
150 path: openwrt/feeds/routing
152 - name: Checkout telephony feed
153 if: inputs.include_feeds == true
154 uses: actions/checkout@v3
156 repository: openwrt/telephony
157 path: openwrt/feeds/telephony
159 - name: Fix permission
161 chown -R buildbot:buildbot openwrt
163 - name: Prepare prebuilt tools
164 shell: su buildbot -c "sh -e {0}"
165 working-directory: openwrt
167 mkdir -p staging_dir build_dir
168 ln -s /prebuilt_tools/staging_dir/host staging_dir/host
169 ln -s /prebuilt_tools/build_dir/host build_dir/host
171 ./scripts/ext-tools.sh --refresh
173 - name: Update & Install feeds
174 if: inputs.include_feeds == true
175 shell: su buildbot -c "sh -e {0}"
176 working-directory: openwrt
178 ./scripts/feeds update -a
179 ./scripts/feeds install -a
181 - name: Parse toolchain file
182 if: inputs.build_toolchain == false
184 working-directory: openwrt
186 TOOLCHAIN_PATH=snapshots
188 if [ -n "${{ github.base_ref }}" ]; then
189 if echo "${{ github.base_ref }}" | grep -q -E '^openwrt-[0-9][0-9]\.[0-9][0-9]$'; then
190 major_ver="$(echo ${{ github.base_ref }} | sed 's/^openwrt-/v/')"
192 elif [ "${{ github.ref_type }}" = "branch" ]; then
193 if echo "${{ github.ref_name }}" | grep -q -E '^openwrt-[0-9][0-9]\.[0-9][0-9]$'; then
194 major_ver="$(echo ${{ github.ref_name }} | sed 's/^openwrt-/v/')"
195 elif echo "${{ github.ref_name }}" | grep -q -E '^openwrt-[0-9][0-9]\.[0-9][0-9]-'; then
196 major_ver="$(echo ${{ github.ref_name }} | sed 's/^openwrt-\([0-9][0-9]\.[0-9][0-9]\)-.*/v\1/')"
198 elif [ "${{ github.ref_type }}" = "tag" ]; then
199 if echo "${{ github.ref_name }}" | grep -q -E '^v[0-9][0-9]\.[0-9][0-9]\..+'; then
200 major_ver="$(echo ${{ github.ref_name }} | sed 's/^\(v[0-9][0-9]\.[0-9][0-9]\)\..\+/\1/')"
204 if [ -n "$major_ver" ]; then
206 latest_tag="$(git tag --sort=-creatordate -l $major_ver* | head -n1)"
207 if [ -n "$latest_tag" ]; then
208 TOOLCHAIN_PATH=releases/$(echo $latest_tag | sed 's/^v//')
212 SUMS_FILE="https://downloads.cdn.openwrt.org/$TOOLCHAIN_PATH/targets/${{ inputs.target }}/${{ inputs.subtarget }}/sha256sums"
213 if curl $SUMS_FILE | grep -q ".*openwrt-toolchain.*tar.xz"; then
214 TOOLCHAIN_STRING="$( curl $SUMS_FILE | grep ".*openwrt-toolchain.*tar.xz")"
215 TOOLCHAIN_FILE=$(echo "$TOOLCHAIN_STRING" | sed -n -e 's/.*\(openwrt-toolchain.*\).tar.xz/\1/p')
217 echo "toolchain-type=external_toolchain" >> $GITHUB_OUTPUT
218 elif curl $SUMS_FILE | grep -q ".*openwrt-sdk.*tar.xz"; then
219 TOOLCHAIN_STRING="$( curl $SUMS_FILE | grep ".*openwrt-sdk.*tar.xz")"
220 TOOLCHAIN_FILE=$(echo "$TOOLCHAIN_STRING" | sed -n -e 's/.*\(openwrt-sdk.*\).tar.xz/\1/p')
222 echo "toolchain-type=external_sdk" >> $GITHUB_OUTPUT
224 echo "toolchain-type=internal" >> $GITHUB_OUTPUT
227 echo "TOOLCHAIN_FILE=$TOOLCHAIN_FILE" >> "$GITHUB_ENV"
228 echo "TOOLCHAIN_PATH=$TOOLCHAIN_PATH" >> "$GITHUB_ENV"
231 uses: actions/cache@v3
233 path: openwrt/.ccache
234 key: ccache-kernel-${{ inputs.target }}/${{ inputs.subtarget }}-${{ needs.setup_build.outputs.ccache_hash }}
236 ccache-kernel-${{ inputs.target }}/${{ inputs.subtarget }}-
238 - name: Download external toolchain/sdk
239 if: inputs.build_toolchain == false && steps.parse-toolchain.outputs.toolchain-type != 'internal'
240 shell: su buildbot -c "sh -e {0}"
241 working-directory: openwrt
243 wget -O - https://downloads.cdn.openwrt.org/${{ env.TOOLCHAIN_PATH }}/targets/${{ inputs.target }}/${{ inputs.subtarget }}/${{ env.TOOLCHAIN_FILE }}.tar.xz \
246 - name: Configure testing kernel
247 if: inputs.testing == true
248 shell: su buildbot -c "sh -e {0}"
249 working-directory: openwrt
251 echo CONFIG_TESTING_KERNEL=y >> .config
253 - name: Configure all kernel modules
254 if: inputs.build_all_kmods == true
255 shell: su buildbot -c "sh -e {0}"
256 working-directory: openwrt
258 echo CONFIG_ALL_KMODS=y >> .config
260 - name: Configure all modules
261 if: inputs.build_all_modules == true
262 shell: su buildbot -c "sh -e {0}"
263 working-directory: openwrt
265 echo CONFIG_ALL=y >> .config
267 - name: Configure all boards
268 if: inputs.build_all_boards == true
269 shell: su buildbot -c "sh -e {0}"
270 working-directory: openwrt
272 echo CONFIG_TARGET_MULTI_PROFILE=y >> .config
273 echo CONFIG_TARGET_PER_DEVICE_ROOTFS=y >> .config
274 echo CONFIG_TARGET_ALL_PROFILES=y >> .config
276 - name: Configure external toolchain
277 if: inputs.build_toolchain == false && steps.parse-toolchain.outputs.toolchain-type == 'external_toolchain'
278 shell: su buildbot -c "sh -e {0}"
279 working-directory: openwrt
281 echo CONFIG_DEVEL=y >> .config
282 echo CONFIG_AUTOREMOVE=y >> .config
283 echo CONFIG_CCACHE=y >> .config
285 ./scripts/ext-toolchain.sh \
286 --toolchain ${{ env.TOOLCHAIN_FILE }}/toolchain-* \
288 --config ${{ inputs.target }}/${{ inputs.subtarget }}
290 - name: Adapt external sdk to external toolchain format
291 if: inputs.build_toolchain == false && steps.parse-toolchain.outputs.toolchain-type == 'external_sdk'
292 shell: su buildbot -c "sh -e {0}"
293 working-directory: openwrt
295 TOOLCHAIN_DIR=${{ env.TOOLCHAIN_FILE }}/staging_dir/$(ls ${{ env.TOOLCHAIN_FILE }}/staging_dir | grep toolchain)
296 TOOLCHAIN_BIN=$TOOLCHAIN_DIR/bin
299 # Find target name from toolchain info.mk
300 GNU_TARGET_NAME=$(cat $TOOLCHAIN_DIR/info.mk | grep TARGET_CROSS | sed 's/^TARGET_CROSS=\(.*\)-$/\1/')
304 # Revert sdk wrapper scripts applied to all the bins
305 for app in $(find . -name "*.bin"); do
306 TARGET_APP=$(echo $app | sed 's/\.\/\.\(.*\)\.bin/\1/')
308 mv .$TARGET_APP.bin $TARGET_APP
311 # Setup the wrapper script in the sdk toolchain dir simulating an external toolchain build
312 cp $OPENWRT_DIR/target/toolchain/files/wrapper.sh $GNU_TARGET_NAME-wrapper.sh
313 for app in cc gcc g++ c++ cpp ld as ; do
314 [ -f $GNU_TARGET_NAME-$app ] && mv $GNU_TARGET_NAME-$app $GNU_TARGET_NAME-$app.bin
315 ln -sf $GNU_TARGET_NAME-wrapper.sh $GNU_TARGET_NAME-$app
318 - name: Configure external toolchain with sdk
319 if: inputs.build_toolchain == false && steps.parse-toolchain.outputs.toolchain-type == 'external_sdk'
320 shell: su buildbot -c "sh -e {0}"
321 working-directory: openwrt
323 echo CONFIG_DEVEL=y >> .config
324 echo CONFIG_AUTOREMOVE=y >> .config
325 echo CONFIG_CCACHE=y >> .config
327 ./scripts/ext-toolchain.sh \
328 --toolchain ${{ env.TOOLCHAIN_FILE }}/staging_dir/toolchain-* \
330 --config ${{ inputs.target }}/${{ inputs.subtarget }}
332 - name: Configure internal toolchain
333 if: inputs.build_toolchain == true || steps.parse-toolchain.outputs.toolchain-type == 'internal'
334 shell: su buildbot -c "sh -e {0}"
335 working-directory: openwrt
337 echo CONFIG_DEVEL=y >> .config
338 echo CONFIG_AUTOREMOVE=y >> .config
339 echo CONFIG_CCACHE=y >> .config
341 echo "CONFIG_TARGET_${{ inputs.target }}=y" >> .config
342 echo "CONFIG_TARGET_${{ inputs.target }}_${{ inputs.subtarget }}=y" >> .config
346 - name: Show configuration
347 shell: su buildbot -c "sh -e {0}"
348 working-directory: openwrt
349 run: ./scripts/diffconfig.sh
352 shell: su buildbot -c "sh -e {0}"
353 working-directory: openwrt
354 run: make tools/install -j$(nproc) BUILD_LOG=1 || ret=$? .github/workflows/scripts/show_build_failures.sh
356 - name: Build toolchain
357 shell: su buildbot -c "sh -e {0}"
358 working-directory: openwrt
359 run: make toolchain/install -j$(nproc) BUILD_LOG=1 || ret=$? .github/workflows/scripts/show_build_failures.sh
362 if: inputs.build_kernel == true
363 shell: su buildbot -c "sh -e {0}"
364 working-directory: openwrt
365 run: make target/compile -j$(nproc) BUILD_LOG=1 || ret=$? .github/workflows/scripts/show_build_failures.sh
367 - name: Build Kernel Kmods
368 if: inputs.build_kernel == true
369 shell: su buildbot -c "sh -e {0}"
370 working-directory: openwrt
371 run: make package/linux/compile -j$(nproc) BUILD_LOG=1 || ret=$? .github/workflows/scripts/show_build_failures.sh
373 - name: Build everything
374 if: inputs.build_full == true
375 shell: su buildbot -c "sh -e {0}"
376 working-directory: openwrt
377 run: make -j$(nproc) BUILD_LOG=1 || ret=$? .github/workflows/scripts/show_build_failures.sh
379 - name: Coverity prepare toolchain
380 if: inputs.coverity_check_packages != ''
381 shell: su buildbot -c "sh -e {0}"
382 working-directory: openwrt
384 wget -q https://scan.coverity.com/download/linux64 --post-data "token=${{ secrets.coverity_api_token }}&project=${{ inputs.coverity_project_name }}" -O coverity.tar.gz
385 wget -q https://scan.coverity.com/download/linux64 --post-data "token=${{ secrets.coverity_api_token }}&project=${{ inputs.coverity_project_name }}&md5=1" -O coverity.tar.gz.md5
386 echo ' coverity.tar.gz' >> coverity.tar.gz.md5
387 md5sum -c coverity.tar.gz.md5
389 mkdir cov-analysis-linux64
390 tar xzf coverity.tar.gz --strip 1 -C cov-analysis-linux64
391 export PATH=$(pwd)/cov-analysis-linux64/bin:$PATH
393 for template in ${{ inputs.coverity_compiler_template_list }}; do
394 cov-configure --template --comptype gcc --compiler "$template"
397 - name: Clean and recompile packages with Coverity toolchain
398 if: inputs.coverity_check_packages != ''
399 shell: su buildbot -c "bash {0}"
400 working-directory: openwrt
402 set -o pipefail -o errexit
404 coverity_check_packages=(${{ inputs.coverity_check_packages }})
405 printf -v clean_packages "package/%s/clean " "${coverity_check_packages[@]}"
406 make -j$(nproc) BUILD_LOG=1 $clean_packages || ret=$? .github/workflows/scripts/show_build_failures.sh
408 coverity_force_compile_packages=(${{ inputs.coverity_force_compile_packages }})
409 printf -v force_compile_packages "package/%s/compile " "${coverity_force_compile_packages[@]}"
410 make -j$(nproc) BUILD_LOG=1 $force_compile_packages || ret=$? .github/workflows/scripts/show_build_failures.sh
412 printf -v compile_packages "package/%s/compile " "${coverity_check_packages[@]}"
413 export PATH=$(pwd)/cov-analysis-linux64/bin:$PATH
414 cov-build --dir cov-int make -j $(nproc) BUILD_LOG=1 $compile_packages || ret=$? .github/workflows/scripts/show_build_failures.sh
416 - name: Upload build to Coverity for analysis
417 if: inputs.coverity_check_packages != ''
418 shell: su buildbot -c "sh -e {0}"
419 working-directory: openwrt
421 tar czf cov-int.tar.gz ./cov-int
423 --form token="${{ secrets.coverity_api_token }}" \
424 --form email="contact@openwrt.org" \
425 --form file=@cov-int.tar.gz \
426 --form version="${{ github.ref_name }}-${{ github.sha }}" \
427 --form description="OpenWrt ${{ github.ref_name }}-${{ github.sha }}" \
428 "https://scan.coverity.com/builds?project=${{ inputs.coverity_project_name }}"
432 uses: actions/upload-artifact@v3
434 name: ${{ inputs.target }}-${{ inputs.subtarget }}-logs