@@ -478,130 +478,6 @@ jobs:
478478 flags : nightly,${{ matrix.job.os }}
479479 fail_ci_if_error : false
480480
481- compute_size :
482- name : Binary sizes
483- needs : [ min_version, deps ]
484- runs-on : ${{ matrix.job.os }}
485- permissions :
486- contents : write
487- env :
488- SCCACHE_GHA_ENABLED : " true"
489- RUSTC_WRAPPER : " sccache"
490- CARGO_INCREMENTAL : 0
491- strategy :
492- fail-fast : false
493- matrix :
494- job :
495- - { os: ubuntu-latest , features: feat_os_unix }
496- steps :
497- - uses : actions/checkout@v6
498- with :
499- persist-credentials : false
500- - uses : dtolnay/rust-toolchain@stable
501- - uses : Swatinem/rust-cache@v2
502- - name : Run sccache-cache
503- uses : mozilla-actions/sccache-action@v0.0.9
504- - name : " `make install PROFILE=release-fast`"
505- shell : bash
506- run : |
507- export CARGO_TARGET_DIR=cargo-target RUSTFLAGS="${RUSTFLAGS} -C strip=symbols" PROFILE=release-fast MANPAGES=n COMPLETIONS=n LOCALES=n
508- mkdir -p "${CARGO_TARGET_DIR}" && sudo mount -t tmpfs -o noatime,size=16G tmpfs "${CARGO_TARGET_DIR}"
509- make install DESTDIR=target/size-release/
510- make install COMPLETIONS=n MULTICALL=y LN="ln -vf" DESTDIR=target/size-multi-release/
511- ZSTD_CLEVEL=19 tar --zstd -caf individual-x86_64-unknown-linux-gnu.tar.zst -C target/size-release/usr/local bin
512- - name : Publish
513- uses : softprops/action-gh-release@v2
514- if : github.event_name == 'push' && github.ref == 'refs/heads/main'
515- with :
516- tag_name : latest-commit
517- draft : false
518- prerelease : true
519- files : |
520- individual-x86_64-unknown-linux-gnu.tar.zst
521- env :
522- GITHUB_TOKEN : ${{ secrets.GITHUB_TOKEN }}
523- - name : Test for hardlinks
524- shell : bash
525- run : |
526- [ $(stat -c %i target/size-multi-release/usr/local/bin/cp) = $(stat -c %i target/size-multi-release/usr/local/bin/coreutils) ]
527- - name : Compute uutil release sizes
528- shell : bash
529- run : |
530- ## Compute uutil release sizes
531- DATE=$(date --rfc-email)
532- find target/size-release/usr/local/bin -type f -printf '%f\0' | sort -z |
533- while IFS= read -r -d '' name; do
534- size=$(du -s target/size-release/usr/local/bin/$name | awk '{print $1}')
535- echo "\"$name\""
536- echo "$size"
537- done | \
538- jq -n \
539- --arg date "$DATE" \
540- --arg sha "$GITHUB_SHA" \
541- 'reduce inputs as $name ({}; . + { ($name): input }) | { ($date): {sha: $sha, sizes: map_values(.)} }' > individual-size-result.json
542- SIZE=$(cat individual-size-result.json | jq '[.[] | .sizes | .[]] | reduce .[] as $num (0; . + $num)')
543- SIZE_MULTI=$(du -s target/size-multi-release/usr/local/bin/coreutils | awk '{print $1}')
544- jq -n \
545- --arg date "$DATE" \
546- --arg sha "$GITHUB_SHA" \
547- --arg size "$SIZE" \
548- --arg multisize "$SIZE_MULTI" \
549- '{($date): { sha: $sha, size: $size, multisize: $multisize, }}' > size-result.json
550- - name : Download the previous individual size result
551- uses : dawidd6/action-download-artifact@v14
552- with :
553- workflow : CICD.yml
554- name : individual-size-result
555- repo : uutils/coreutils
556- path : dl
557- - name : Download the previous size result
558- uses : dawidd6/action-download-artifact@v14
559- with :
560- workflow : CICD.yml
561- name : size-result
562- repo : uutils/coreutils
563- path : dl
564- - name : Check uutil release sizes
565- shell : bash
566- run : |
567- check() {
568- # Warn if the size increases by more than 5%
569- threshold='1.05'
570-
571- if [[ "$2" -eq 0 || "$3" -eq 0 ]]; then
572- echo "::warning file=$4::Invalid size for $1. Sizes cannot be 0."
573- return
574- fi
575-
576- ratio=$(jq -n "$2 / $3")
577- echo "$1: size=$2, previous_size=$3, ratio=$ratio, threshold=$threshold"
578- if [[ "$(jq -n "$ratio > $threshold")" == 'true' ]]; then
579- echo "::warning file=$4::Size of $1 increases by more than 5%"
580- fi
581- }
582- ## Check individual size result
583- while read -r name previous_size; do
584- size=$(cat individual-size-result.json | jq -r ".[] | .sizes | .\"$name\"")
585- check "\`$name\` binary" "$size" "$previous_size" 'individual-size-result.json'
586- done < <(cat dl/individual-size-result.json | jq -r '.[] | .sizes | to_entries[] | "\(.key) \(.value)"')
587- ## Check size result
588- size=$(cat size-result.json | jq -r '.[] | .size')
589- previous_size=$(cat dl/size-result.json | jq -r '.[] | .size')
590- check 'multiple binaries' "$size" "$previous_size" 'size-result.json'
591- multisize=$(cat size-result.json | jq -r '.[] | .multisize')
592- previous_multisize=$(cat dl/size-result.json | jq -r '.[] | .multisize')
593- check 'multicall binary' "$multisize" "$previous_multisize" 'size-result.json'
594- - name : Upload the individual size result
595- uses : actions/upload-artifact@v6
596- with :
597- name : individual-size-result
598- path : individual-size-result.json
599- - name : Upload the size result
600- uses : actions/upload-artifact@v6
601- with :
602- name : size-result
603- path : size-result.json
604-
605481 build :
606482 permissions :
607483 contents : write # to create GitHub release (softprops/action-gh-release)
@@ -628,7 +504,7 @@ jobs:
628504 - { os: ubuntu-latest , target: i686-unknown-linux-gnu , features: "feat_os_unix,test_risky_names", use-cross: use-cross }
629505 - { os: ubuntu-latest , target: i686-unknown-linux-musl , features: feat_os_unix_musl , use-cross: use-cross }
630506 - { os: ubuntu-latest , target: x86_64-unknown-linux-gnu , features: "feat_os_unix,test_risky_names", use-cross: use-cross, skip-publish: true }
631- - { os: ubuntu-latest , target: x86_64-unknown-linux-gnu , features: "feat_os_unix,uudoc" , use-cross: no, workspace-tests: true }
507+ - { os: ubuntu-latest, target: x86_64-unknown-linux-gnu, features: "feat_os_unix,uudoc", use-cross: no, workspace-tests: true, individual: "--workspace --bins --config=profile.release.codegen-units=1 --exclude uu_runcon --exclude uu_chcon" }
632508 - { os: ubuntu-latest , target: x86_64-unknown-linux-musl , features: feat_os_unix_musl , use-cross: use-cross }
633509 - { os: ubuntu-latest , target: x86_64-unknown-redox , features: feat_os_unix_redox , use-cross: redoxer , skip-tests: true }
634510 - { os: ubuntu-latest , target: wasm32-unknown-unknown , default-features: false, features: uucore/format, skip-tests: true, skip-package: true, skip-publish: true }
@@ -855,8 +731,8 @@ jobs:
855731 shell : bash
856732 if : matrix.job.skip-publish != true
857733 run : |
858- ## Build
859- ${{ steps.vars.outputs.CARGO_CMD }} ${{ steps.vars.outputs.CARGO_CMD_OPTIONS }} build --release --config=profile.release.strip=true \
734+ # libstdbuf is not stripped by cargo's config
735+ RUSTFLAGS="-C strip=symbols" ${{ steps.vars.outputs.CARGO_CMD }} ${{ steps.vars.outputs.CARGO_CMD_OPTIONS }} build --release ${{ matrix.job.individual }} \
860736 --target=${{ matrix.job.target }} ${{ matrix.job.cargo-options }} ${{ steps.vars.outputs.CARGO_FEATURES_OPTION }} ${{ steps.vars.outputs.CARGO_DEFAULT_FEATURES_OPTION }}
861737 - name : Package
862738 if : matrix.job.skip-publish != true
@@ -877,6 +753,13 @@ jobs:
877753 *) tar czf '${{ steps.vars.outputs.PKG_NAME }}' '${{ steps.vars.outputs.PKG_BASENAME }}'/* ;;
878754 esac
879755 popd >/dev/null
756+ - name : Package individual binaries
757+ if : matrix.job.individual != ''
758+ run : |
759+ mkdir -p individual
760+ (cd target/${{ matrix.job.target }}/release && mv $(./coreutils --list) -t ../../../individual ||:)
761+ individual/true --version
762+ ZSTD_CLEVEL=19 tar --zstd -caf individual-${{ matrix.job.target }}.tar.zst individual
880763 - name : Package manpages and completions
881764 if : matrix.job.target == 'x86_64-unknown-linux-gnu' && matrix.job.features == 'feat_os_unix,uudoc'
882765 run : |
@@ -899,6 +782,7 @@ jobs:
899782 files : |
900783 ${{ steps.vars.outputs.STAGING }}/${{ steps.vars.outputs.PKG_NAME }}
901784 docs.tar.zst
785+ individual-${{ matrix.job.target }}.tar.zst
902786 env :
903787 GITHUB_TOKEN : ${{ secrets.GITHUB_TOKEN }}
904788 - name : Publish latest commit
@@ -911,8 +795,92 @@ jobs:
911795 files : |
912796 ${{ steps.vars.outputs.STAGING }}/${{ steps.vars.outputs.PKG_NAME }}
913797 docs.tar.zst
798+ individual-${{ matrix.job.target }}.tar.zst
914799 env :
915800 GITHUB_TOKEN : ${{ secrets.GITHUB_TOKEN }}
801+ - name : Compute uutil release sizes
802+ if : matrix.job.individual != '' # todo: support all platforms
803+ shell : bash
804+ run : |
805+ ## Compute uutil release sizes
806+ DATE=$(date --rfc-email)
807+ find individual -type f -printf '%f\0' | sort -z |
808+ while IFS= read -r -d '' name; do
809+ size=$(du -s individual/$name | awk '{print $1}')
810+ echo "\"$name\""
811+ echo "$size"
812+ done | \
813+ jq -n \
814+ --arg date "$DATE" \
815+ --arg sha "$GITHUB_SHA" \
816+ 'reduce inputs as $name ({}; . + { ($name): input }) | { ($date): {sha: $sha, sizes: map_values(.)} }' > individual-size-result.json
817+ SIZE=$(cat individual-size-result.json | jq '[.[] | .sizes | .[]] | reduce .[] as $num (0; . + $num)')
818+ SIZE_MULTI=$(du -s target/${{ matrix.job.target }}/release/coreutils | awk '{print $1}')
819+ jq -n \
820+ --arg date "$DATE" \
821+ --arg sha "$GITHUB_SHA" \
822+ --arg size "$SIZE" \
823+ --arg multisize "$SIZE_MULTI" \
824+ '{($date): { sha: $sha, size: $size, multisize: $multisize, }}' > size-result.json
825+ - name : Download the previous individual size result
826+ if : matrix.job.individual != ''
827+ uses : dawidd6/action-download-artifact@v12
828+ with :
829+ workflow : CICD.yml
830+ name : individual-size-result
831+ repo : uutils/coreutils
832+ path : dl
833+ - name : Download the previous size result
834+ if : matrix.job.individual != ''
835+ uses : dawidd6/action-download-artifact@v12
836+ with :
837+ workflow : CICD.yml
838+ name : size-result
839+ repo : uutils/coreutils
840+ path : dl
841+ - name : Check uutil release sizes
842+ if : matrix.job.individual != ''
843+ shell : bash
844+ run : |
845+ check() {
846+ # Warn if the size increases by more than 5%
847+ threshold='1.05'
848+
849+ if [[ "$2" -eq 0 || "$3" -eq 0 ]]; then
850+ echo "::warning file=$4::Invalid size for $1. Sizes cannot be 0."
851+ return
852+ fi
853+
854+ ratio=$(jq -n "$2 / $3")
855+ echo "$1: size=$2, previous_size=$3, ratio=$ratio, threshold=$threshold"
856+ if [[ "$(jq -n "$ratio > $threshold")" == 'true' ]]; then
857+ echo "::warning file=$4::Size of $1 increases by more than 5%"
858+ fi
859+ }
860+ ## Check individual size result
861+ while read -r name previous_size; do
862+ size=$(cat individual-size-result.json | jq -r ".[] | .sizes | .\"$name\"")
863+ check "\`$name\` binary" "$size" "$previous_size" 'individual-size-result.json'
864+ done < <(cat dl/individual-size-result.json | jq -r '.[] | .sizes | to_entries[] | "\(.key) \(.value)"')
865+ ## Check size result
866+ size=$(cat size-result.json | jq -r '.[] | .size')
867+ previous_size=$(cat dl/size-result.json | jq -r '.[] | .size')
868+ check 'multiple binaries' "$size" "$previous_size" 'size-result.json'
869+ multisize=$(cat size-result.json | jq -r '.[] | .multisize')
870+ previous_multisize=$(cat dl/size-result.json | jq -r '.[] | .multisize')
871+ check 'multicall binary' "$multisize" "$previous_multisize" 'size-result.json'
872+ - name : Upload the individual size result
873+ if : matrix.job.individual != ''
874+ uses : actions/upload-artifact@v6
875+ with :
876+ name : individual-size-result
877+ path : individual-size-result.json
878+ - name : Upload the size result
879+ if : matrix.job.individual != ''
880+ uses : actions/upload-artifact@v6
881+ with :
882+ name : size-result
883+ path : size-result.json
916884
917885 test_busybox :
918886 name : Tests/BusyBox test suite
0 commit comments