diff --git a/README.md b/README.md
index 59a52173..af99bb01 100644
--- a/README.md
+++ b/README.md
@@ -56,6 +56,7 @@ Currently, this action is basically intended to be used in combination with an a
| codesign | false | Sign build products using `codesign` on macOS | String | |
| codesign-prefix | false | Prefix for the `codesign` identifier on macOS | String | |
| codesign-options | false | Specifies a set of option flags to be embedded in the code signature on macOS. See the `codesign` manpage for details. | String | |
+| upx | false | Compress binaries using [UPX](https://upx.github.io) on some platforms | Boolean | `false` |
\[1] Required one of `token` input option or `GITHUB_TOKEN` environment variable. Not required when `dry-run` input option is set to `true`.
\[2] This is optional but it is recommended that this always be set to clarify which target you are building for if macOS is included in the matrix because GitHub Actions changed the default architecture of macos-latest since macos-14.
diff --git a/action.yml b/action.yml
index 60df38c4..d54693fb 100644
--- a/action.yml
+++ b/action.yml
@@ -108,6 +108,10 @@ inputs:
codesign_options:
description: Alias for 'codesign-options'
required: false
+ upx:
+ description: Compress binaries using UPX on some platforms
+ required: false
+ default: 'false'
outputs:
archive:
@@ -163,3 +167,4 @@ runs:
INPUT_CODESIGN: ${{ inputs.codesign }}
INPUT_CODESIGN_PREFIX: ${{ inputs.codesign-prefix || inputs.codesign_prefix }}
INPUT_CODESIGN_OPTIONS: ${{ inputs.codesign-options || inputs.codesign_options }}
+ INPUT_UPX: ${{ inputs.upx }}
diff --git a/main.sh b/main.sh
index d21093af..801f2811 100755
--- a/main.sh
+++ b/main.sh
@@ -330,6 +330,7 @@ build() {
*) bail "unrecognized build tool '${build_tool}'" ;;
esac
}
+
do_codesign() {
if [[ -n "${INPUT_CODESIGN:-}" ]]; then
local codesign_options=(--sign "${INPUT_CODESIGN}")
@@ -374,6 +375,32 @@ case "${INPUT_TARGET:-}" in
;;
esac
+# Compress binaries with UPX
+if [[ "${INPUT_UPX:-}" = "true" ]]; then
+ compress_binaries() {
+ for bin_exe in "${bins[@]}"; do
+ x upx --best --lzma "${target_dir}/${bin_exe}"
+ done
+ }
+
+ case "${host_os}" in
+ windows)
+ choco install upx -y
+ compress_binaries
+ ;;
+ linux)
+ sudo apt-get install -y upx-ucl
+ compress_binaries
+ ;;
+ macos)
+ # MacOS is not currently supported by UPX.
+ ;;
+ *)
+ warn "UPX is not available on ${host_os}"
+ ;;
+ esac
+fi
+
case "${host_os}" in
macos)
if type -P codesign >/dev/null; then