diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 00000000..69fcadc8 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,113 @@ +name: Build All Platforms + +on: + push: + branches: + - main + pull_request: + branches: + - main + +jobs: + + windows-x64: + name: Windows Build (x64) + runs-on: windows-latest + steps: + - uses: actions/checkout@v4 + + - name: Prepare Directories + run: | + mkdir dist + mkdir packages + + # ---------------------- + # Cache CUDA SDK + - name: Cache CUDA SDK + uses: actions/cache@v3 + id: cuda-cache + with: + path: C:\ProgramData\chocolatey\lib\cuda + key: windows-cuda-12-2 + + - name: Install CUDA SDK (if not cached) + if: steps.cuda-cache.outputs.cache-hit != 'true' + run: | + choco install cuda -y + refreshenv + + - name: Prepare AI models + shell: cmd + run: | + set "KOKORO_CACHE=%USERPROFILE%\.cache\k" + mkdir "%KOKORO_CACHE%" + curl -L https://github.com/DavidValin/kokoro-micro/raw/main/models/0.bin -o "%KOKORO_CACHE%\0.bin" + curl -L https://github.com/DavidValin/kokoro-micro/raw/main/models/0.onnx -o "%KOKORO_CACHE%\0.onnx" + + # ---------------------- + # Build Variants (Windows) + + - name: Build Windows CPU + shell: pwsh + run: | + Write-Host "=== Loading MSVC environment (x64) ===" + + $vsdev = "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\Tools\VsDevCmd.bat" + + cmd /c "`"$vsdev`" -arch=x64 && set" | ForEach-Object { + if ($_ -match "^(.*?)=(.*)$") { + Set-Item -Path "Env:$($matches[1])" -Value $matches[2] + } + } + + ./build_windows.ps1 cpu + + - name: Build Windows Vulkan + shell: pwsh + run: | + Write-Host "=== Loading MSVC environment (x64) ===" + + $vsdev = "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\Tools\VsDevCmd.bat" + + cmd /c "`"$vsdev`" -arch=x64 && set" | ForEach-Object { + if ($_ -match "^(.*?)=(.*)$") { + Set-Item -Path "Env:$($matches[1])" -Value $matches[2] + } + } + + ./build_windows.ps1 vulkan + + - name: Build Windows CUDA + shell: pwsh + run: | + Write-Host "=== Loading MSVC environment (x64) ===" + + $vsdev = "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\Tools\VsDevCmd.bat" + + cmd /c "`"$vsdev`" -arch=x64 && set" | ForEach-Object { + if ($_ -match "^(.*?)=(.*)$") { + Set-Item -Path "Env:$($matches[1])" -Value $matches[2] + } + } + + ./build_windows.ps1 cuda + + # ---------------------- + # Upload artifacts + - name: Upload CPU Artifact + uses: actions/upload-artifact@v4 + with: + name: windows-x64-cpu + path: target-cross\cpu + + - name: Upload Vulkan Artifact + uses: actions/upload-artifact@v4 + with: + name: windows-x64-vulkan + path: target-cross\vulkan + + - name: Upload CUDA Artifact + uses: actions/upload-artifact@v4 + with: + name: windows-x64-cuda + path: target-cross\cuda diff --git a/.gitignore b/.gitignore index a265721d..6eb656d7 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,7 @@ +assets/openblas* target target-cross dist .DS_Store -NEXT_STEPS.txt \ No newline at end of file +NEXT_STEPS.txt +deps diff --git a/Cargo.lock b/Cargo.lock index 40de90ca..286e8975 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -24,7 +24,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed7572b7ba83a31e20d1b48970ee402d2e3e0537dcfe0a3ff4d6eb7508617d43" dependencies = [ "alsa-sys", - "bitflags 2.11.0", + "bitflags 2.11.1", "cfg-if", "libc", ] @@ -50,9 +50,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.21" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a" +checksum = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d" dependencies = [ "anstyle", "anstyle-parse", @@ -65,15 +65,15 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.13" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" +checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" [[package]] name = "anstyle-parse" -version = "0.2.7" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" +checksum = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e" dependencies = [ "utf8parse", ] @@ -100,9 +100,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.101" +version = "1.0.102" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f0e0fee31ef5ed1ba1316088939cea399010ed7731dba877ed44aeb407a75ea" +checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" [[package]] name = "arbitrary" @@ -143,7 +143,7 @@ version = "0.69.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "cexpr", "clang-sys", "itertools 0.12.1", @@ -166,7 +166,7 @@ version = "0.71.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f58bf3d7db68cfbac37cfc485a8d711e87e064c3d0fe0435b92f7a407f9d6b3" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "cexpr", "clang-sys", "itertools 0.13.0", @@ -175,7 +175,7 @@ dependencies = [ "proc-macro2", "quote", "regex", - "rustc-hash 2.1.1", + "rustc-hash 2.1.2", "shlex", "syn", ] @@ -186,14 +186,14 @@ version = "0.72.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "993776b509cfb49c750f11b8f07a46fa23e0a1386ffc01fb1e7d343efc387895" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "cexpr", "clang-sys", "itertools 0.13.0", "proc-macro2", "quote", "regex", - "rustc-hash 2.1.1", + "rustc-hash 2.1.2", "shlex", "syn", ] @@ -206,9 +206,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.11.0" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" +checksum = "c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3" [[package]] name = "block-buffer" @@ -230,9 +230,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.19.1" +version = "3.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dd9dc738b7a8311c7ade152424974d8115f2cdad61e8dab8dac9f2362298510" +checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" [[package]] name = "byteorder" @@ -248,9 +248,9 @@ checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" [[package]] name = "cc" -version = "1.2.56" +version = "1.2.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aebf35691d1bfb0ac386a69bac2fde4dd276fb618cf8bf4f5318fe285e821bb2" +checksum = "d16d90359e986641506914ba71350897565610e87ce0ad9e6f28569db3dd5c6d" dependencies = [ "find-msvc-tools", "jobserver", @@ -311,9 +311,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.58" +version = "4.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63be97961acde393029492ce0be7a1af7e323e6bae9511ebfac33751be5e6806" +checksum = "1ddb117e43bbf7dacf0a4190fef4d345b9bad68dfc649cb349e7d17d28428e51" dependencies = [ "clap_builder", "clap_derive", @@ -321,9 +321,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.58" +version = "4.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f13174bda5dfd69d7e947827e5af4b0f2f94a4a3ee92912fba07a66150f21e2" +checksum = "714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069f" dependencies = [ "anstream", "anstyle", @@ -333,9 +333,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.55" +version = "4.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a92793da1a46a5f2a02a6f4c46c6496b28c43638adea8306fcb0caa1634f24e5" +checksum = "f2ce8604710f6733aa641a2b3731eaa1e8b3d9973d5e3565da11800813f997a9" dependencies = [ "heck", "proc-macro2", @@ -345,24 +345,24 @@ dependencies = [ [[package]] name = "clap_lex" -version = "1.0.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a822ea5bc7590f9d40f1ba12c0dc3c2760f3482c6984db1573ad11031420831" +checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" [[package]] name = "cmake" -version = "0.1.57" +version = "0.1.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75443c44cd6b379beb8c5b45d85d0773baf31cce901fe7bb252f4eff3008ef7d" +checksum = "c0f78a02292a74a88ac736019ab962ece0bc380e3f977bf72e376c5d78ff0678" dependencies = [ "cc", ] [[package]] name = "colorchoice" -version = "1.0.4" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" +checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" [[package]] name = "combine" @@ -501,7 +501,7 @@ version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f476fe445d41c9e991fd07515a6f463074b782242ccf4a5b7b1d1012e70824df" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "crossterm_winapi", "libc", "mio 0.8.11", @@ -549,9 +549,9 @@ checksum = "0c87e182de0887fd5361989c677c4e8f5000cd9491d6d563161a8f3a5519fc7f" [[package]] name = "der" -version = "0.7.10" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" +checksum = "71fd89660b2dc699704064e59e9dba0147b903e85319429e131620d022be411b" dependencies = [ "pem-rfc7468", "zeroize", @@ -605,7 +605,7 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "block2", "libc", "objc2", @@ -648,9 +648,9 @@ dependencies = [ [[package]] name = "env_filter" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a1c3cc8e57274ec99de65301228b537f1e4eedc1b8e0f9411c6caac8ae7308f" +checksum = "32e90c2accc4b07a8456ea0debdc2e7587bdd890680d71173a15d4ae604f6eef" dependencies = [ "log", "regex", @@ -658,9 +658,9 @@ dependencies = [ [[package]] name = "env_logger" -version = "0.11.9" +version = "0.11.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2daee4ea451f429a58296525ddf28b45a3b64f1acf6587e2067437bb11e218d" +checksum = "0621c04f2196ac3f488dd583365b9c09be011a4ab8b9f37248ffcc8f6198b56a" dependencies = [ "anstream", "anstyle", @@ -710,9 +710,9 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.3.0" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" +checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6" [[package]] name = "ffi-support" @@ -796,9 +796,9 @@ checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" [[package]] name = "futures-channel" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" dependencies = [ "futures-core", "futures-sink", @@ -806,21 +806,21 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" +checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" [[package]] name = "futures-io" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" +checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" [[package]] name = "futures-macro" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" dependencies = [ "proc-macro2", "quote", @@ -829,21 +829,21 @@ dependencies = [ [[package]] name = "futures-sink" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" +checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" [[package]] name = "futures-task" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" +checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" [[package]] name = "futures-util" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" dependencies = [ "futures-core", "futures-io", @@ -852,7 +852,6 @@ dependencies = [ "futures-task", "memchr", "pin-project-lite", - "pin-utils", "slab", ] @@ -888,20 +887,20 @@ dependencies = [ "cfg-if", "js-sys", "libc", - "r-efi", + "r-efi 5.3.0", "wasip2", "wasm-bindgen", ] [[package]] name = "getrandom" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "139ef39800118c7683f2fd3c98c1b23c09ae076556b435f8e9064ae108aaeeec" +checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555" dependencies = [ "cfg-if", "libc", - "r-efi", + "r-efi 6.0.0", "wasip2", "wasip3", ] @@ -914,9 +913,9 @@ checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" [[package]] name = "h2" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f44da3a8150a6703ed5d34e164b875fd14c2cdab9af1252a9a1020bde2bdc54" +checksum = "171fefbc92fe4a4de27e0698d6a5b392d6a0e333506bc49133760b3bcf948733" dependencies = [ "atomic-waker", "bytes", @@ -942,9 +941,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.16.1" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" +checksum = "4f467dd6dccf739c208452f8014c75c18bb8301b050ad1cfb27153803edb0f51" [[package]] name = "heck" @@ -1020,9 +1019,9 @@ checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" [[package]] name = "hyper" -version = "1.8.1" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" +checksum = "6299f016b246a94207e63da54dbe807655bf9e00044f73ded42c3ac5305fbcca" dependencies = [ "atomic-waker", "bytes", @@ -1034,7 +1033,6 @@ dependencies = [ "httparse", "itoa", "pin-project-lite", - "pin-utils", "smallvec", "tokio", "want", @@ -1042,15 +1040,14 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.27.7" +version = "0.27.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" +checksum = "33ca68d021ef39cf6463ab54c1d0f5daf03377b70561305bb89a8f83aab66e0f" dependencies = [ "http", "hyper", "hyper-util", "rustls", - "rustls-pki-types", "tokio", "tokio-rustls", "tower-service", @@ -1124,12 +1121,13 @@ dependencies = [ [[package]] name = "icu_collections" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" +checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c" dependencies = [ "displaydoc", "potential_utf", + "utf8_iter", "yoke", "zerofrom", "zerovec", @@ -1137,9 +1135,9 @@ dependencies = [ [[package]] name = "icu_locale_core" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" +checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" dependencies = [ "displaydoc", "litemap", @@ -1150,9 +1148,9 @@ dependencies = [ [[package]] name = "icu_normalizer" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" +checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4" dependencies = [ "icu_collections", "icu_normalizer_data", @@ -1164,15 +1162,15 @@ dependencies = [ [[package]] name = "icu_normalizer_data" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" +checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38" [[package]] name = "icu_properties" -version = "2.1.2" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" +checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de" dependencies = [ "icu_collections", "icu_locale_core", @@ -1184,15 +1182,15 @@ dependencies = [ [[package]] name = "icu_properties_data" -version = "2.1.2" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" +checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14" [[package]] name = "icu_provider" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" +checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" dependencies = [ "displaydoc", "icu_locale_core", @@ -1222,9 +1220,9 @@ dependencies = [ [[package]] name = "idna_adapter" -version = "1.2.1" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" dependencies = [ "icu_normalizer", "icu_properties", @@ -1232,31 +1230,21 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.13.0" +version = "2.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" dependencies = [ "equivalent", - "hashbrown 0.16.1", + "hashbrown 0.17.0", "serde", "serde_core", ] [[package]] name = "ipnet" -version = "2.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" - -[[package]] -name = "iri-string" -version = "0.7.10" +version = "2.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c91338f0783edbd6195decb37bae672fd3b165faffb89bf7b9e6942f8b1a731a" -dependencies = [ - "memchr", - "serde", -] +checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" [[package]] name = "is_terminal_polyfill" @@ -1284,15 +1272,15 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" [[package]] name = "jiff" -version = "0.2.20" +version = "0.2.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c867c356cc096b33f4981825ab281ecba3db0acefe60329f044c1789d94c6543" +checksum = "f00b5dbd620d61dfdcb6007c9c1f6054ebd75319f163d886a9055cec1155073d" dependencies = [ "jiff-static", "log", @@ -1303,9 +1291,9 @@ dependencies = [ [[package]] name = "jiff-static" -version = "0.2.20" +version = "0.2.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7946b4325269738f270bb55b3c19ab5c5040525f83fd625259422a9d25d9be5" +checksum = "e000de030ff8022ea1da3f466fbb0f3a809f5e51ed31f6dd931c35181ad8e6d7" dependencies = [ "proc-macro2", "quote", @@ -1321,7 +1309,7 @@ dependencies = [ "cesu8", "cfg-if", "combine", - "jni-sys", + "jni-sys 0.3.1", "log", "thiserror 1.0.69", "walkdir", @@ -1330,9 +1318,31 @@ dependencies = [ [[package]] name = "jni-sys" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" +checksum = "41a652e1f9b6e0275df1f15b32661cf0d4b78d4d87ddec5e0c3c20f097433258" +dependencies = [ + "jni-sys 0.4.1", +] + +[[package]] +name = "jni-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2" +dependencies = [ + "jni-sys-macros", +] + +[[package]] +name = "jni-sys-macros" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" +dependencies = [ + "quote", + "syn", +] [[package]] name = "jobserver" @@ -1346,10 +1356,12 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.85" +version = "0.3.98" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c942ebf8e95485ca0d52d97da7c5a2c387d0e7f0ba4c35e93bfcaee045955b3" +checksum = "67df7112613f8bfd9150013a0314e196f4800d3201ae742489d999db2f979f08" dependencies = [ + "cfg-if", + "futures-util", "once_cell", "wasm-bindgen", ] @@ -1389,9 +1401,9 @@ checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" [[package]] name = "libc" -version = "0.2.182" +version = "0.2.186" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6800badb6cb2082ffd7b6a67e6125bb39f18782f793520caee8cb8846be06112" +checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" [[package]] name = "libloading" @@ -1411,13 +1423,14 @@ checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" [[package]] name = "libredox" -version = "0.1.12" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d0b95e02c851351f877147b7deea7b1afb1df71b63aa5f8270716e0c5720616" +checksum = "e02f3bb43d335493c96bf3fd3a321600bf6bd07ed34bc64118e9293bdffea46c" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "libc", - "redox_syscall 0.7.1", + "plain", + "redox_syscall 0.7.5", ] [[package]] @@ -1428,15 +1441,15 @@ checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" [[package]] name = "linux-raw-sys" -version = "0.11.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" [[package]] name = "litemap" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" +checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" [[package]] name = "lock_api" @@ -1536,9 +1549,9 @@ dependencies = [ [[package]] name = "mio" -version = "1.1.1" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" +checksum = "50b7e5b27aa02a74bac8c3f23f448f8d87ff11f92d3aac1a6ed369ee08cc56c1" dependencies = [ "libc", "wasi", @@ -1547,9 +1560,9 @@ dependencies = [ [[package]] name = "native-tls" -version = "0.2.16" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d5d26952a508f321b4d3d2e80e78fc2603eaefcdf0c30783867f19586518bdc" +checksum = "465500e14ea162429d264d44189adc38b199b62b1c21eea9f69e4b73cb03bbf2" dependencies = [ "libc", "log", @@ -1598,8 +1611,8 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2076a31b7010b17a38c01907c45b945e8f11495ee4dd588309718901b1f7a5b7" dependencies = [ - "bitflags 2.11.0", - "jni-sys", + "bitflags 2.11.1", + "jni-sys 0.3.1", "log", "ndk-sys", "num_enum", @@ -1618,7 +1631,7 @@ version = "0.5.0+25.2.9519653" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c196769dd60fd4f363e11d948139556a344e79d451aeb2fa2fd040738ef7691" dependencies = [ - "jni-sys", + "jni-sys 0.3.1", ] [[package]] @@ -1627,7 +1640,7 @@ version = "0.31.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d6d0705320c1e6ba1d912b5e37cf18071b6c2e9b7fa8215a1e8a7651966f5d3" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "cfg-if", "cfg_aliases", "libc", @@ -1694,9 +1707,9 @@ dependencies = [ [[package]] name = "num_enum" -version = "0.7.5" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1207a7e20ad57b847bbddc6776b968420d38292bbfe2089accff5e19e82454c" +checksum = "5d0bca838442ec211fa11de3a8b0e0e8f3a4522575b5c4c06ed722e005036f26" dependencies = [ "num_enum_derive", "rustversion", @@ -1704,9 +1717,9 @@ dependencies = [ [[package]] name = "num_enum_derive" -version = "0.7.5" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff32365de1b6743cb203b710788263c44a03de03802daf96092f2da4fe6ba4d7" +checksum = "680998035259dcfcafe653688bf2aa6d3e2dc05e98be6ab46afb089dc84f1df8" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -1754,9 +1767,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.21.3" +version = "1.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" [[package]] name = "once_cell_polyfill" @@ -1766,15 +1779,14 @@ checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" [[package]] name = "openssl" -version = "0.10.75" +version = "0.10.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08838db121398ad17ab8531ce9de97b244589089e290a384c900cb9ff7434328" +checksum = "bf0b434746ee2832f4f0baf10137e1cabb18cbe6912c69e2e33263c45250f542" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "cfg-if", "foreign-types", "libc", - "once_cell", "openssl-macros", "openssl-sys", ] @@ -1807,9 +1819,9 @@ dependencies = [ [[package]] name = "openssl-sys" -version = "0.9.111" +version = "0.9.115" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82cab2d520aa75e3c58898289429321eb788c3106963d0dc886ec7a5f4adc321" +checksum = "158fe5b292746440aa6e7a7e690e55aeb72d41505e2804c23c6973ad0e9c9781" dependencies = [ "cc", "libc", @@ -1873,9 +1885,9 @@ dependencies = [ [[package]] name = "pem-rfc7468" -version = "0.7.0" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +checksum = "a6305423e0e7738146434843d1694d621cce767262b2a86910beab705e4493d9" dependencies = [ "base64ct", ] @@ -1931,21 +1943,21 @@ dependencies = [ [[package]] name = "pin-project-lite" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" [[package]] -name = "pin-utils" -version = "0.1.0" +name = "pkg-config" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" [[package]] -name = "pkg-config" -version = "0.3.32" +name = "plain" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" +checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" [[package]] name = "portable-atomic" @@ -1955,18 +1967,18 @@ checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" [[package]] name = "portable-atomic-util" -version = "0.2.5" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a9db96d7fa8782dd8c15ce32ffe8680bbd1e978a43bf51a34d39483540495f5" +checksum = "c2a106d1259c23fac8e543272398ae0e3c0b8d33c88ed73d0cc71b0f1d902618" dependencies = [ "portable-atomic", ] [[package]] name = "potential_utf" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" +checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" dependencies = [ "zerovec", ] @@ -2001,9 +2013,9 @@ dependencies = [ [[package]] name = "proc-macro-crate" -version = "3.4.0" +version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" +checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" dependencies = [ "toml_edit", ] @@ -2041,7 +2053,7 @@ dependencies = [ "pin-project-lite", "quinn-proto", "quinn-udp", - "rustc-hash 2.1.1", + "rustc-hash 2.1.2", "rustls", "socket2", "thiserror 2.0.18", @@ -2052,16 +2064,16 @@ dependencies = [ [[package]] name = "quinn-proto" -version = "0.11.13" +version = "0.11.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" +checksum = "434b42fec591c96ef50e21e886936e66d3cc3f737104fdb9b737c40ffb94c098" dependencies = [ "bytes", "getrandom 0.3.4", "lru-slab", - "rand 0.9.2", + "rand 0.9.4", "ring", - "rustc-hash 2.1.1", + "rustc-hash 2.1.2", "rustls", "rustls-pki-types", "slab", @@ -2087,9 +2099,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.44" +version = "1.0.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b2ebcf727b7760c461f091f9f0f539b77b8e87f2fd88131e7f1b433b3cece4" +checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" dependencies = [ "proc-macro2", ] @@ -2100,6 +2112,12 @@ version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + [[package]] name = "rand" version = "0.8.6" @@ -2113,9 +2131,9 @@ dependencies = [ [[package]] name = "rand" -version = "0.9.2" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +checksum = "44c5af06bb1b7d3216d91932aed5265164bf384dc89cd6ba05cf59a35f5f76ea" dependencies = [ "rand_chacha 0.9.0", "rand_core 0.9.5", @@ -2201,16 +2219,16 @@ version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", ] [[package]] name = "redox_syscall" -version = "0.7.1" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35985aa610addc02e24fc232012c86fd11f14111180f902b67e2d5331f8ebf2b" +checksum = "4666a1a60d8412eab19d94f6d13dcc9cea0a5ef4fdf6a5db306537413c661b1b" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", ] [[package]] @@ -2249,9 +2267,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.9" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a96887878f22d7bad8a3b6dc5b7440e0ada9a245242924394987b21cf2210a4c" +checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" [[package]] name = "reqwest" @@ -2330,9 +2348,9 @@ checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" [[package]] name = "rustc-hash" -version = "2.1.1" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" +checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe" [[package]] name = "rustfft" @@ -2354,7 +2372,7 @@ version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "errno", "libc", "linux-raw-sys 0.4.15", @@ -2363,23 +2381,24 @@ dependencies = [ [[package]] name = "rustix" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "146c9e247ccc180c1f61615433868c99f3de3ae256a30a43b49f67c2d9171f34" +checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "errno", "libc", - "linux-raw-sys 0.11.0", + "linux-raw-sys 0.12.1", "windows-sys 0.61.2", ] [[package]] name = "rustls" -version = "0.23.36" +version = "0.23.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c665f33d38cea657d9614f766881e4d510e0eda4239891eea56b4cadcf01801b" +checksum = "ef86cd5876211988985292b91c96a8f2d298df24e75989a43a3c73f2d4d8168b" dependencies = [ + "log", "once_cell", "ring", "rustls-pki-types", @@ -2390,9 +2409,9 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.14.0" +version = "1.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be040f8b0a225e40375822a563fa9524378b9d63112f53e19ffff34df5d33fdd" +checksum = "30a7197ae7eb376e574fe940d068c30fe0462554a3ddbe4eca7838e049c937a9" dependencies = [ "web-time", "zeroize", @@ -2400,9 +2419,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.103.9" +version = "0.103.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7df23109aa6c1567d1c575b9952556388da57401e4ace1d15f79eedad0d8f53" +checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e" dependencies = [ "ring", "rustls-pki-types", @@ -2432,9 +2451,9 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.28" +version = "0.1.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" +checksum = "91c1b7e4904c873ef0710c1f407dde2e6287de2bebc1bbbf7d430bb7cbffd939" dependencies = [ "windows-sys 0.61.2", ] @@ -2447,11 +2466,11 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "security-framework" -version = "3.6.0" +version = "3.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d17b898a6d6948c3a8ee4372c17cb384f90d2e6e912ef00895b14fd7ab54ec38" +checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "core-foundation 0.10.1", "core-foundation-sys", "libc", @@ -2460,9 +2479,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.16.0" +version = "2.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "321c8673b092a9a42605034a9879d73cb79101ed5fd117bc9a597b89b4e9e61a" +checksum = "6ce2691df843ecc5d231c0b14ece2acc3efb62c0a398c7e1d875f3983ce020e3" dependencies = [ "core-foundation-sys", "libc", @@ -2470,9 +2489,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.27" +version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" [[package]] name = "serde" @@ -2590,9 +2609,9 @@ dependencies = [ [[package]] name = "simd-adler32" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2" +checksum = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214" [[package]] name = "slab" @@ -2608,12 +2627,12 @@ checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" [[package]] name = "socket2" -version = "0.6.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86f4aa3ad99f2088c990dfa82d367e19cb29268ed67c574d10d0a4bfe71f07e0" +checksum = "3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e" dependencies = [ "libc", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -2653,9 +2672,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "supersonic2-tts" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e85d39e25d0ece0239e42ac609d79e1b2d6cdbc04e3c7d70c0ea874170c642fb" +checksum = "cb398d23cad5e9d80e3350c5aae17c737c91df9301812f17f6fb24d015078671" dependencies = [ "anyhow", "clap", @@ -2677,9 +2696,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.115" +version = "2.0.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e614ed320ac28113fa64972c4262d5dbc89deacdfd00c34a3e4cea073243c12" +checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" dependencies = [ "proc-macro2", "quote", @@ -2712,7 +2731,7 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a13f3d0daba03132c0aa9767f98351b3488edc2c100cda2d2ec2b04f3d8d3c8b" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "core-foundation 0.9.4", "system-configuration-sys", ] @@ -2729,9 +2748,9 @@ dependencies = [ [[package]] name = "tar" -version = "0.4.44" +version = "0.4.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d863878d212c87a19c1a610eb53bb01fe12951c0501cf5a0d65f724914a667a" +checksum = "22692a6476a21fa75fdfc11d452fda482af402c008cdbaf3476414e122040973" dependencies = [ "filetime", "libc", @@ -2740,14 +2759,14 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.25.0" +version = "3.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0136791f7c95b1f6dd99f9cc786b91bb81c3800b639b3478e561ddb7be95e5f1" +checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" dependencies = [ "fastrand", - "getrandom 0.4.1", + "getrandom 0.4.2", "once_cell", - "rustix 1.1.3", + "rustix 1.1.4", "windows-sys 0.61.2", ] @@ -2793,9 +2812,9 @@ dependencies = [ [[package]] name = "tinystr" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" +checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" dependencies = [ "displaydoc", "zerovec", @@ -2803,9 +2822,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" +checksum = "3e61e67053d25a4e82c844e8424039d9745781b3fc4f32b8d55ed50f5f667ef3" dependencies = [ "tinyvec_macros", ] @@ -2818,13 +2837,13 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.49.0" +version = "1.52.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72a2903cd7736441aac9df9d7688bd0ce48edccaadf181c3b90be801e81d3d86" +checksum = "110a78583f19d5cdb2c5ccf321d1290344e71313c6c37d43520d386027d18386" dependencies = [ "bytes", "libc", - "mio 1.1.1", + "mio 1.2.0", "parking_lot", "pin-project-lite", "signal-hook-registry", @@ -2835,9 +2854,9 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.6.0" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" +checksum = "385a6cb71ab9ab790c5fe8d67f1645e6c450a7ce006a33de03daa956cf70a496" dependencies = [ "proc-macro2", "quote", @@ -2879,18 +2898,18 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.7.5+spec-1.1.0" +version = "1.1.1+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347" +checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" dependencies = [ "serde_core", ] [[package]] name = "toml_edit" -version = "0.23.10+spec-1.0.0" +version = "0.25.11+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84c8b9f757e028cee9fa244aea147aab2a9ec09d5325a9b01e0a49730c2b5269" +checksum = "0b59c4d22ed448339746c59b905d24568fcbb3ab65a500494f7b8c3e97739f2b" dependencies = [ "indexmap", "toml_datetime", @@ -2900,9 +2919,9 @@ dependencies = [ [[package]] name = "toml_parser" -version = "1.0.8+spec-1.1.0" +version = "1.1.2+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0742ff5ff03ea7e67c8ae6c93cac239e0d9784833362da3f9a9c1da8dfefcbdc" +checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526" dependencies = [ "winnow", ] @@ -2924,20 +2943,20 @@ dependencies = [ [[package]] name = "tower-http" -version = "0.6.8" +version = "0.6.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8" +checksum = "68d6fdd9f81c2819c9a8b0e0cd91660e7746a8e6ea2ba7c6b2b057985f6bcb51" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "bytes", "futures-util", "http", "http-body", - "iri-string", "pin-project-lite", "tower", "tower-layer", "tower-service", + "url", ] [[package]] @@ -3001,9 +3020,9 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "typenum" -version = "1.19.0" +version = "1.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" +checksum = "40ce102ab67701b8526c123c1bab5cbe42d7040ccfd0f64af1a385808d2f43de" [[package]] name = "ucd-trie" @@ -3019,9 +3038,9 @@ checksum = "dbc4bc3a9f746d862c45cb89d705aa10f187bb96c76001afab07a0d35ce60142" [[package]] name = "unicode-ident" -version = "1.0.23" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "537dd038a89878be9b64dd4bd1b260315c1bb94f4d784956b81e27a088d9a09e" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" [[package]] name = "unicode-normalization" @@ -3046,27 +3065,29 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "ureq" -version = "3.2.0" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdc97a28575b85cfedf2a7e7d3cc64b3e11bd8ac766666318003abbacc7a21fc" +checksum = "dea7109cdcd5864d4eeb1b58a1648dc9bf520360d7af16ec26d0a9354bafcfc0" dependencies = [ "base64", "der", "log", "native-tls", "percent-encoding", + "rustls", "rustls-pki-types", "socks", "ureq-proto", - "utf-8", + "utf8-zero", "webpki-root-certs", + "webpki-roots", ] [[package]] name = "ureq-proto" -version = "0.5.3" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d81f9efa9df032be5934a46a068815a10a042b494b6a58cb0a1a97bb5467ed6f" +checksum = "e994ba84b0bd1b1b0cf92878b7ef898a5c1760108fe7b6010327e274917a808c" dependencies = [ "base64", "http", @@ -3093,10 +3114,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" [[package]] -name = "utf-8" -version = "0.7.6" +name = "utf8-zero" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" +checksum = "b8c0a043c9540bae7c578c88f91dda8bd82e59ae27c21baca69c8b191aaf5a6e" [[package]] name = "utf8_iter" @@ -3116,7 +3137,7 @@ version = "1.23.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ddd74a9687298c6858e9b88ec8935ec45d22e8fd5e6394fa1bd4e99a87789c76" dependencies = [ - "getrandom 0.4.1", + "getrandom 0.4.2", "js-sys", "wasm-bindgen", ] @@ -3163,6 +3184,7 @@ dependencies = [ "kokoro-micro", "log", "once_cell", + "ort", "reqwest", "serde", "serde_ini", @@ -3204,11 +3226,11 @@ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasip2" -version = "1.0.2+wasi-0.2.9" +version = "1.0.3+wasi-0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" +checksum = "20064672db26d7cdc89c7798c48a0fdfac8213434a1186e5ef29fd560ae223d6" dependencies = [ - "wit-bindgen", + "wit-bindgen 0.57.1", ] [[package]] @@ -3217,14 +3239,14 @@ version = "0.4.0+wasi-0.3.0-rc-2026-01-06" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" dependencies = [ - "wit-bindgen", + "wit-bindgen 0.51.0", ] [[package]] name = "wasm-bindgen" -version = "0.2.108" +version = "0.2.121" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64024a30ec1e37399cf85a7ffefebdb72205ca1c972291c51512360d90bd8566" +checksum = "49ace1d07c165b0864824eee619580c4689389afa9dc9ed3a4c75040d82e6790" dependencies = [ "cfg-if", "once_cell", @@ -3235,23 +3257,19 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.58" +version = "0.4.71" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70a6e77fd0ae8029c9ea0063f87c46fde723e7d887703d74ad2616d792e51e6f" +checksum = "96492d0d3ffba25305a7dc88720d250b1401d7edca02cc3bcd50633b424673b8" dependencies = [ - "cfg-if", - "futures-util", "js-sys", - "once_cell", "wasm-bindgen", - "web-sys", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.108" +version = "0.2.121" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "008b239d9c740232e71bd39e8ef6429d27097518b6b30bdf9086833bd5b6d608" +checksum = "8e68e6f4afd367a562002c05637acb8578ff2dea1943df76afb9e83d177c8578" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -3259,9 +3277,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.108" +version = "0.2.121" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5256bae2d58f54820e6490f9839c49780dff84c65aeab9e772f15d5f0e913a55" +checksum = "d95a9ec35c64b2a7cb35d3fead40c4238d0940c86d107136999567a4703259f2" dependencies = [ "bumpalo", "proc-macro2", @@ -3272,9 +3290,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.108" +version = "0.2.121" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f01b580c9ac74c8d8f0c0e4afb04eeef2acf145458e52c03845ee9cd23e3d12" +checksum = "c4e0100b01e9f0d03189a92b96772a1fb998639d981193d7dbab487302513441" dependencies = [ "unicode-ident", ] @@ -3320,7 +3338,7 @@ version = "0.244.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "hashbrown 0.15.5", "indexmap", "semver", @@ -3328,9 +3346,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.85" +version = "0.3.98" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "312e32e551d92129218ea9a2452120f4aabc03529ef03e4d0d82fb2780608598" +checksum = "4b572dff8bcf38bad0fa19729c89bb5748b2b9b1d8be70cf90df697e3a8f32aa" dependencies = [ "js-sys", "wasm-bindgen", @@ -3348,18 +3366,18 @@ dependencies = [ [[package]] name = "webpki-root-certs" -version = "1.0.6" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "804f18a4ac2676ffb4e8b5b5fa9ae38af06df08162314f96a68d2a363e21a8ca" +checksum = "f31141ce3fc3e300ae89b78c0dd67f9708061d1d2eda54b8209346fd6be9a92c" dependencies = [ "rustls-pki-types", ] [[package]] name = "webpki-roots" -version = "1.0.6" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22cfaf3c063993ff62e73cb4311efde4db1efb31ab78a3e5c457939ad5cc0bed" +checksum = "52f5ee44c96cf55f1b349600768e3ece3a8f26010c05265ab73f945bb1a2eb9d" dependencies = [ "rustls-pki-types", ] @@ -3829,9 +3847,9 @@ checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" [[package]] name = "winnow" -version = "0.7.14" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5364e9d77fcdeeaa6062ced926ee3381faa2ee02d3eb83a5c27a8825540829" +checksum = "2ee1708bef14716a11bae175f579062d4554d95be2c6829f518df847b7b3fdd0" dependencies = [ "memchr", ] @@ -3845,6 +3863,12 @@ dependencies = [ "wit-bindgen-rust-macro", ] +[[package]] +name = "wit-bindgen" +version = "0.57.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" + [[package]] name = "wit-bindgen-core" version = "0.51.0" @@ -3894,7 +3918,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" dependencies = [ "anyhow", - "bitflags 2.11.0", + "bitflags 2.11.1", "indexmap", "log", "serde", @@ -3926,9 +3950,9 @@ dependencies = [ [[package]] name = "writeable" -version = "0.6.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" +checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" [[package]] name = "xattr" @@ -3937,14 +3961,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32e45ad4206f6d2479085147f02bc2ef834ac85886624a23575ae137c8aa8156" dependencies = [ "libc", - "rustix 1.1.3", + "rustix 1.1.4", ] [[package]] name = "yoke" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" +checksum = "abe8c5fda708d9ca3df187cae8bfb9ceda00dd96231bed36e445a1a48e66f9ca" dependencies = [ "stable_deref_trait", "yoke-derive", @@ -3953,9 +3977,9 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" +checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" dependencies = [ "proc-macro2", "quote", @@ -3965,18 +3989,18 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.39" +version = "0.8.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db6d35d663eadb6c932438e763b262fe1a70987f9ae936e60158176d710cae4a" +checksum = "eed437bf9d6692032087e337407a86f04cd8d6a16a37199ed57949d415bd68e9" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.39" +version = "0.8.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4122cd3169e94605190e77839c9a40d40ed048d305bfdc146e7df40ab0f3e517" +checksum = "70e3cd084b1788766f53af483dd21f93881ff30d7320490ec3ef7526d203bad4" dependencies = [ "proc-macro2", "quote", @@ -3985,18 +4009,18 @@ dependencies = [ [[package]] name = "zerofrom" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +checksum = "69faa1f2a1ea75661980b013019ed6687ed0e83d069bc1114e2cc74c6c04c4df" dependencies = [ "zerofrom-derive", ] [[package]] name = "zerofrom-derive" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" dependencies = [ "proc-macro2", "quote", @@ -4012,9 +4036,9 @@ checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" [[package]] name = "zerotrie" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" +checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf" dependencies = [ "displaydoc", "yoke", @@ -4023,9 +4047,9 @@ dependencies = [ [[package]] name = "zerovec" -version = "0.11.5" +version = "0.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" +checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239" dependencies = [ "yoke", "zerofrom", @@ -4034,9 +4058,9 @@ dependencies = [ [[package]] name = "zerovec-derive" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" +checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" dependencies = [ "proc-macro2", "quote", @@ -4059,9 +4083,9 @@ dependencies = [ [[package]] name = "zlib-rs" -version = "0.6.0" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7948af682ccbc3342b6e9420e8c51c1fe5d7bf7756002b4a3c6cabfe96a7e3c" +checksum = "3be3d40e40a133f9c916ee3f9f4fa2d9d63435b5fbe1bfc6d9dae0aa0ada1513" [[package]] name = "zmij" diff --git a/Cargo.toml b/Cargo.toml index e942a5d5..883b6875 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,6 +2,7 @@ name = "vtmate" version = "0.4.3" edition = "2024" +build = "build.rs" authors = ["David Valin "] homepage = "https://github.com/DavidValin/vtmate" @@ -24,6 +25,7 @@ serde_json = "1" urlencoding = "2" url = "2" whisper-rs = { version = "0.15.1", default-features = false } +ort = { version = "2.0.0-rc.11", features = [ "std", "ndarray", "tls-rustls" ] } hound = "3" crossterm = "0.27" tokio = { version = "1", features = ["rt", "macros"] } @@ -50,11 +52,21 @@ once_cell = "1" flate2 = "1" tar = "0.4" - [features] -whisper-openblas = ["whisper-rs/openblas"] -whisper-vulkan = ["whisper-rs/vulkan"] -whisper-cuda = ["whisper-rs/cuda"] -whisper-hipblas = ["whisper-rs/hipblas"] -whisper-metal = ["whisper-rs/metal"] -whisper-logs = ["whisper-rs/log_backend", "whisper-rs/tracing_backend"] +default = [] +whisper-openblas = ["whisper-rs/openblas"] +whisper-vulkan = ["whisper-rs/vulkan"] +whisper-cuda = ["whisper-rs/cuda"] +whisper-hipblas = ["whisper-rs/hipblas"] +whisper-metal = ["whisper-rs/metal"] +whisper-logs = ["whisper-rs/log_backend", "whisper-rs/tracing_backend"] +ort-download-binaries = ["ort/download-binaries"] + +[profile.release] +opt-level = 3 +codegen-units = 1 +lto = "thin" +panic = "abort" +strip = "symbols" +incremental = false + diff --git a/README.md b/README.md index 17653a36..df717fd3 100644 --- a/README.md +++ b/README.md @@ -434,4 +434,4 @@ build_macos.sh build_windows.sh ``` -Have fun o:) +Have fun o:) \ No newline at end of file diff --git a/build.rs b/build.rs index 2b803443..1fa8b10a 100755 --- a/build.rs +++ b/build.rs @@ -181,6 +181,90 @@ fn init_expected_hashes() -> HashMap<&'static str, &'static str> { static EXPECTED_HASHES: Lazy> = Lazy::new(init_expected_hashes); fn main() { + + // ----------------------------- + // Optional: Link prebuilt Whisper/GGML/OpenBLAS if available + // ----------------------------- + if let Ok(lib_dir) = env::var("WHISPER_PREBUILT_LIB") { + println!("cargo:rerun-if-env-changed=WHISPER_PREBUILT_LIB"); + println!("cargo:rustc-link-search=native={}", lib_dir); + println!("cargo:rustc-link-lib=static=whisper"); + println!("cargo:rustc-link-lib=static=ggml"); + println!("cargo:rustc-link-lib=static=openblas"); + println!("cargo:rustc-link-lib=pthread"); + + let include_dir = Path::new(&lib_dir).join("..").join("include"); + println!("cargo:include={}", include_dir.display()); + } else { + println!( + "cargo:warning=WHISPER_PREBUILT_LIB not set, skipping prebuilt Whisper/GGML/OpenBLAS linking" + ); + } + + // ----------------------------- + // Link built eSpeak NG from PowerShell build + // ----------------------------- + if let Ok(espeak_dir) = env::var("ESPEAK_NG_DIR") { + println!("cargo:rerun-if-env-changed=ESPEAK_NG_DIR"); + + let espeak_lib_dir = Path::new(&espeak_dir).join("lib"); + println!( + "cargo:rustc-link-search=native={}", + espeak_lib_dir.display() + ); + println!("cargo:rustc-link-lib=static=espeak-ng"); + + let espeak_include_dir = Path::new(&espeak_dir).join("include"); + println!("cargo:include={}", espeak_include_dir.display()); + } else { + println!("cargo:warning=ESPEAK_NG_DIR not set, skipping prebuilt eSpeak NG linking"); + } + + // ----------------------------- + // Optionally link ONNX Runtime + // ----------------------------- + // Look for ONNX Runtime library location + if let Ok(ort_lib_dir) = env::var("ORT_LIB_LOCATION") { + let lib_path = Path::new(&ort_lib_dir); + + // Tell Cargo where to search for native libraries + println!("cargo:rustc-link-search=native={}", lib_path.display()); + + // Iterate over all library files in the directory + if cfg!(windows) { + // On Windows, link all .lib files statically + // for entry in fs::read_dir(lib_path).expect("Failed to read ORT_LIB_LOCATION") { + // let entry = entry.expect("Failed to read entry in ORT_LIB_LOCATION"); + // let path = entry.path(); + // if let Some(ext) = path.extension() { + // if ext == "lib" { + // let stem = path.file_stem().unwrap().to_string_lossy(); + // println!("cargo:rustc-link-lib=static={}", stem); + // } + // } + // } + } else if cfg!(unix) { + // On Unix/macOS, link all .a (static) or .so/.dylib (dynamic) files + // for entry in fs::read_dir(lib_path).expect("Failed to read ORT_LIB_LOCATION") { + // let entry = entry.expect("Failed to read entry in ORT_LIB_LOCATION"); + // let path = entry.path(); + // if let Some(ext) = path.extension() { + // match ext.to_str() { + // Some("a") => { + // let stem = path.file_stem().unwrap().to_string_lossy(); + // println!("cargo:rustc-link-lib=static={}", stem); + // } + // _ => {} + // } + // } + // } + } + + // Set include path for ONNX Runtime headers + let ort_include_dir = lib_path.join("..").join("include"); + println!("cargo:include={}", ort_include_dir.display()); + } + let out_dir = env::var("OUT_DIR").expect("OUT_DIR not set"); let is_release = env::var("PROFILE").unwrap_or_default() == "release"; let dest = Path::new(&out_dir).join("embedded"); diff --git a/build_linux.sh b/build_linux.sh index 59d12450..0a0a7ede 100755 --- a/build_linux.sh +++ b/build_linux.sh @@ -13,10 +13,9 @@ DOCKER_NO_CACHE=1 SEL_ARCH="all" # amd64,arm64,all # Linux variant toggles -WITH_CUDA="${WITH_CUDA:-1}" # amd64 only +WITH_CUDA="${WITH_CUDA:-0}" # amd64 only WITH_ROCM="${WITH_ROCM:-0}" # amd64 only -LINUX_WITH_OPENBLAS="${LINUX_WITH_OPENBLAS:-1}" -LINUX_WITH_VULKAN="${LINUX_WITH_VULKAN:-1}" +WITH_VULKAN="${WITH_VULKAN:-0}" # Host cache mounts (Linux Docker) HOST_HOME="${HOME}" @@ -25,6 +24,9 @@ HOST_WHISPER_MODELS="${HOST_HOME}/.whisper-models" CONT_K_CACHE="/root/.cache/k" CONT_WHISPER_MODELS="/root/.whisper-models" +# ----------------------------- +# Helper functions (usage, normalize list, etc.) +# ----------------------------- usage() { cat <<'USAGE' Usage: @@ -33,10 +35,9 @@ Usage: --arch comma-separated: amd64,arm64,all Env: - WITH_CUDA=0|1 (amd64) default 1 + WITH_CUDA=0|1 (amd64) default 0 WITH_ROCM=0|1 (amd64) default 0 - LINUX_WITH_OPENBLAS=0|1 default 1 - LINUX_WITH_VULKAN=0|1 default 1 + WITH_VULKAN=0|1 default 0 USAGE } @@ -62,7 +63,10 @@ while [[ $# -gt 0 ]]; do --cache) DOCKER_NO_CACHE=0; shift ;; --no-cache) DOCKER_NO_CACHE=1; shift ;; -h|--help) usage; exit 0 ;; - *) echo "Unknown arg: $1"; usage; exit 1 ;; + *) + echo "⚠ Ignoring unknown arg: $1" + shift + ;; esac done @@ -79,20 +83,20 @@ mkdir -p "${HOST_K_CACHE}" "${HOST_WHISPER_MODELS}" echo "Version: ${VERSION}" echo "Linux: arch=${SEL_ARCH}" echo "Linux amd64: WITH_CUDA=${WITH_CUDA} WITH_ROCM=${WITH_ROCM}" -echo "Linux variants: OPENBLAS=${LINUX_WITH_OPENBLAS} VULKAN=${LINUX_WITH_VULKAN}" echo "Cache mounts:" echo " ${HOST_K_CACHE} -> ${CONT_K_CACHE}" echo " ${HOST_WHISPER_MODELS} -> ${CONT_WHISPER_MODELS}" # Features -FEATURES_COMMON="whisper-logs" +FEATURES_COMMON="whisper-openblas" FEATURES_CPU="${FEATURES_COMMON}" -FEATURES_OPENBLAS="${FEATURES_COMMON},whisper-openblas" FEATURES_VULKAN="${FEATURES_COMMON},whisper-vulkan" FEATURES_CUDA="${FEATURES_COMMON},whisper-cuda" FEATURES_ROCM="${FEATURES_COMMON},whisper-hipblas" +# ----------------------------- # Packaging helpers +# ----------------------------- sha256_file() { local file="$1" out="$2" if command -v shasum >/dev/null 2>&1; then @@ -121,7 +125,9 @@ package_one() { sha256_file "$tgz" "$sha" } +# ----------------------------- # Docker helpers +# ----------------------------- docker_ok=0 command -v docker >/dev/null 2>&1 && docker_ok=1 can_run_amd64() { docker run --rm --platform=linux/amd64 alpine:3.19 uname -m >/dev/null 2>&1; } @@ -141,12 +147,10 @@ ensure_espeak_data_archive() { echo "ERROR: Docker not found and ${ESPEAK_ARCHIVE} is missing." exit 1 fi - local tmp img df tmp="$(mktemp -d)" df="${tmp}/Dockerfile.espeak.asset" - img="local/${BIN_NAME}-espeak-asset:${VERSION}-$$" - + img="local/${BIN_NAME}-espeak-asset:cache" cat > "$df" <<'DOCKERFILE' FROM ubuntu:noble ENV DEBIAN_FRONTEND=noninteractive @@ -158,10 +162,8 @@ DOCKERFILE local build_args=(--pull) [[ "${DOCKER_NO_CACHE}" -eq 1 ]] && build_args+=(--no-cache) - docker build "${build_args[@]}" --platform=linux/amd64 -f "$df" -t "$img" "$tmp" - rm -f "${ESPEAK_ARCHIVE}" docker run --rm --platform=linux/amd64 \ -v "${ASSETS_DIR}:/out" -w /out \ "$img" \ @@ -175,11 +177,13 @@ DOCKERFILE docker image rm -f "$img" >/dev/null 2>&1 || true rm -rf "$tmp" >/dev/null 2>&1 || true - [[ -f "${ESPEAK_ARCHIVE}" ]] || { echo "ERROR: failed to generate ${ESPEAK_ARCHIVE}"; exit 1; } echo "✔ Generated: ${ESPEAK_ARCHIVE}" } +# ----------------------------- +# Linux copy helper +# ----------------------------- ARTIFACTS=() add_artifact() { [[ -f "$1" ]] && ARTIFACTS+=("$1"); } @@ -193,6 +197,9 @@ linux_copy_out() { echo "✔ Built: $out" } +# ----------------------------- +# AMD64 Docker Build +# ----------------------------- build_linux_amd64_docker_variants() { [[ "$docker_ok" -eq 1 ]] || { echo "Skipping linux/amd64: docker not found."; return 0; } [[ "${FORCE_AMD64_DOCKER}" -eq 1 ]] || { echo "Skipping linux/amd64: cannot run linux/amd64 containers."; return 0; } @@ -200,50 +207,400 @@ build_linux_amd64_docker_variants() { local tmp df img CACHE_BUST tmp="$(mktemp -d)" df="${tmp}/Dockerfile.linux.amd64" - img="local/${BIN_NAME}-linux-amd64:${VERSION}-$$" + FIXED_IMG="local/${BIN_NAME}-linux-amd64:cache" + img="$FIXED_IMG" + # img="local/${BIN_NAME}-linux-amd64:${VERSION}" CACHE_BUST="$(date +%s)" - cat > "$df" < "$df" <<'DOCKERFILE' FROM ubuntu:noble ENV DEBIAN_FRONTEND=noninteractive -ARG CACHE_BUST=${CACHE_BUST} +ARG CACHE_BUST +# Variant config +# ---------------------------------------------------------- +ARG WITH_BLAS=1 +ARG WITH_CUDA=0 +ARG WITH_ROCM=0 +ARG WITH_VULKAN=0 + +ENV WITH_BLAS=${WITH_BLAS} +ENV WITH_CUDA=${WITH_CUDA} +ENV WITH_ROCM=${WITH_ROCM} +ENV WITH_VULKAN=${WITH_VULKAN} + +# ---------------------------------------------------------- +# Build dependencies +# ---------------------------------------------------------- RUN apt-get update && apt-get install -y --no-install-recommends \ - ca-certificates curl git xz-utils \ - build-essential pkg-config \ - cmake ninja-build \ - clang libclang-dev llvm-dev \ - perl \ - libssl-dev \ - libasound2-dev \ - libxdo-dev \ - libx11-dev \ - libopenblas-dev \ - libvulkan-dev vulkan-tools vulkan-utility-libraries-dev \ - spirv-tools glslang-tools \ - && rm -rf /var/lib/apt/lists/* + build-essential pkg-config libssl-dev musl-tools gcc-x86-64-linux-gnu g++-x86-64-linux-gnu \ + libclang-dev llvm-dev clang llvm \ + curl wget ca-certificates git \ + gfortran \ + zlib1g-dev libbz2-dev liblzma-dev \ + cmake \ + libasound2-dev \ + protobuf-compiler libprotobuf-dev \ + python3 python3-pip \ + perl \ + glslc \ +&& rm -rf /var/lib/apt/lists/* + +RUN if [ "$WITH_CUDA" = "1" ]; then \ + apt-get update && apt-get install -y --no-install-recommends nvidia-cuda-toolkit && \ + rm -rf /var/lib/apt/lists/* ; \ + fi + +RUN if [ "$WITH_ROCM" = "1" ]; then \ + apt-get update && apt-get install -y --no-install-recommends rocm-hip-sdk hipblas rocblas && \ + rm -rf /var/lib/apt/lists/* ; \ + fi +# install musl g++ linker +# ---------------------------------------------------------- +RUN wget https://musl.cc/x86_64-linux-musl-cross.tgz +RUN tar xvf x86_64-linux-musl-cross.tgz -C /opt/ +ENV PATH=/opt/x86_64-linux-musl-cross/bin:$PATH + +# Install Rust and add MUSL target +# ---------------------------------------------------------- +RUN curl -sSf https://sh.rustup.rs | sh -s -- -y +ENV PKG_CONFIG_ALLOW_CROSS=1 +ENV PKG_CONFIG_PATH=/usr/local/lib/pkgconfig +ENV PATH="/root/.cargo/bin:${PATH}" +RUN rustup target add x86_64-unknown-linux-musl +RUN rustup update stable + +# ---------------------------------------------------------- +# C/C++ Compiler / Linker config +# ---------------------------------------------------------- +ENV CC_x86_64_unknown_linux_musl=x86_64-linux-musl-gcc +ENV CXX_x86_64_unknown_linux_musl=x86_64-linux-musl-g++ +ENV CC=x86_64-linux-musl-gcc +ENV CXX=x86_64-linux-musl-g++ +ENV LD=x86_64-linux-musl-g++ +ENV LDFLAGS="-lgfortran -lm -lpthread -lquadmath" +ENV AR=ar +ENV RANLIB=ranlib +ENV FC=x86_64-linux-musl-gfortran +ENV FFLAGS="-static-libgfortran" +ENV CFLAGS="--sysroot=/opt/x86_64-linux-musl-cross/x86_64-linux-musl" +ENV CXXFLAGS="--sysroot=/opt/x86_64-linux-musl-cross/x86_64-linux-musl" +ENV CMAKE_SYSTEM_NAME=Linux +ENV CMAKE_C_COMPILER=/opt/x86_64-linux-musl-cross/bin/x86_64-linux-musl-gcc +ENV CMAKE_CXX_COMPILER=/opt/x86_64-linux-musl-cross/bin/x86_64-linux-musl-g++ +ENV CMAKE_FIND_LIBRARY_SUFFIXES=".a" +ENV CMAKE_EXE_LINKER_FLAGS=-static +ENV BINDGEN_EXTRA_CLANG_ARGS="-I/opt/x86_64-linux-musl-cross/x86_64-linux-musl/include" + +# ---------------------------------------------------------- +# Build openssl for musl (amd64) +# ---------------------------------------------------------- RUN set -eux; \ - apt-get update; \ - apt-get install -y --no-install-recommends glslc || true; \ - rm -rf /var/lib/apt/lists/*; \ - (command -v glslc >/dev/null 2>&1 && echo "glslc installed") || echo "glslc not available" + curl -LO https://www.openssl.org/source/openssl-3.1.3.tar.gz \ + && tar xvf openssl-3.1.3.tar.gz \ + && cd openssl-3.1.3 \ + && ./Configure linux-x86_64 no-shared no-tests no-async no-secure-memory no-engine --openssldir=/usr/local/ssl --libdir=/usr/local/lib --prefix=/usr/local \ + && make -j$(nproc) \ + && make install + +ENV OPENSSL_STATIC=1 +ENV OPENSSL_DIR=/usr/local +ENV OPENSSL_LIB_DIR=/usr/local/lib +ENV OPENSSL_INCLUDE_DIR=/usr/local/include + +# ---------------------------------------------------------- +# Build OpenMP for musl (amd64) +# ---------------------------------------------------------- +ENV OPENMP_DIR=/openmp +ENV OPENMP_PREFIX=/usr/local + +ENV CFLAGS="--sysroot=/opt/x86_64-linux-musl-cross/x86_64-linux-musl -fopenmp" +ENV CXXFLAGS="--sysroot=/opt/x86_64-linux-musl-cross/x86_64-linux-musl -fopenmp" + +ENV LLVM_SRC_URL="https://github.com/llvm/llvm-project/releases/download/llvmorg-22.1.0/llvm-project-22.1.0.src.tar.xz" + +WORKDIR $OPENMP_DIR +RUN wget -O llvm-project-22.1.0.src.tar.xz "$LLVM_SRC_URL" \ + && tar xf llvm-project-22.1.0.src.tar.xz + +# Set correct OpenMP source paths +WORKDIR $OPENMP_DIR/llvm-project-22.1.0.src/openmp + +RUN mkdir -p /openmp/build + +RUN cmake -S $OPENMP_DIR/llvm-project-22.1.0.src/openmp \ + -B /openmp/build \ + -DCMAKE_INSTALL_PREFIX=$OPENMP_PREFIX \ + -DLIBOMP_ENABLE_SHARED=OFF \ + -DLIBOMP_ENABLE_STATIC=ON \ + -DCMAKE_BUILD_TYPE=Release + +RUN cmake --build /openmp/build --parallel $(nproc) --target install + +RUN echo "✔ OpenMP static library built!" \ + && echo "Library: $OPENMP_PREFIX/lib/libomp.a" \ + && echo "Headers: $OPENMP_PREFIX/include/" + +# ---------------------------------------------------------- +# Build static OpenBLAS for musl (amd64) +# ---------------------------------------------------------- +RUN git clone --depth 1 https://github.com/xianyi/OpenBLAS.git /openblas + + RUN cd /openblas && \ + set -eux; \ + make -j$(nproc) \ + CFLAGS="--sysroot=/opt/x86_64-linux-musl-cross/x86_64-linux-musl" \ + LDFLAGS="-lgfortran -lm -lpthread -lquadmath -lpthread" \ + USE_STATIC=1 \ + STATIC_ONLY=1 \ + NO_SHARED=1 \ + USE_OPENMP=0 \ + USE_THREAD=1 \ + TARGET=GENERIC \ + NO_AVX=1 \ + VERBOSE=1 \ + 2>&1 | tee /tmp/openblas_build.log -ARG WITH_CUDA=1 -RUN if [ "\$WITH_CUDA" = "1" ]; then \ - apt-get update && apt-get install -y --no-install-recommends nvidia-cuda-toolkit && \ - rm -rf /var/lib/apt/lists/* ; \ - fi +RUN set -eux; \ + cd /openblas && \ + make install PREFIX=/usr/local STATIC_ONLY=1 NO_SHARED=1 && \ + cd / && rm -rf /openblas -ARG WITH_ROCM=0 -RUN if [ "\$WITH_ROCM" = "1" ]; then \ - apt-get update && apt-get install -y --no-install-recommends rocm-hip-sdk hipblas rocblas && \ - rm -rf /var/lib/apt/lists/* ; \ - fi +ENV OPENBLAS_PATH=/usr/local +ENV BLAS_LIBRARIES=/usr/local/lib/libopenblas.a +ENV BLAS_INCLUDE_DIRS=/usr/local/include + +# ---------------------------------------------------------- +# Build espeak-ng musl version (AMD64) +# ---------------------------------------------------------- +RUN set -eux; \ + git clone --depth 1 https://github.com/espeak-ng/espeak-ng.git /espeak-ng; \ + cd /espeak-ng; \ + mkdir build && cd build + +RUN set -eux; \ + cmake -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_CXX_FLAGS="-std=c++17" \ + -DCMAKE_EXE_LINKER_FLAGS="-static" \ + -DBUILD_SHARED_LIBS=OFF \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_SKIP_RPATH=ON \ + -DCMAKE_INSTALL_RPATH="" \ + -DCMAKE_INSTALL_RPATH_USE_LINK_PATH=OFF \ + -DCMAKE_FIND_ROOT_PATH_MODE_PROGRAM=NEVER \ + -DCMAKE_FIND_ROOT_PATH_MODE_LIBRARY=ONLY \ + -DCMAKE_FIND_ROOT_PATH_MODE_INCLUDE=ONLY \ + -DCMAKE_FIND_ROOT_PATH_MODE_PACKAGE=ONLY \ + -DCMAKE_INSTALL_PREFIX=/usr/local + +RUN set -eux; \ + make -j$(nproc) && \ + make install + +ENV ESPEAK_NG_DIR="/usr/local/lib" + +# -------------------------------------------------- +# Build static whisper.cpp + ggml (linked to OpenBLAS) +# -------------------------------------------------- + +RUN git clone --depth 1 https://github.com/ggerganov/whisper.cpp.git /whisper.cpp + +RUN set -eux; \ + mkdir -p /whisper.cpp/build; \ + cd /whisper.cpp/build; \ + cmake .. \ + -DBUILD_SHARED_LIBS=OFF \ + -DGGML_OPENMP=ON \ + -DGGML_BLAS=ON \ + -DGGML_BLAS_STATIC=ON \ + -DGGML_BLAS_VENDOR=OpenBLAS \ + -DBLAS_LIBRARIES=$BLAS_LIBRARIES \ + -DBLAS_INCLUDE_DIRS=$BLAS_INCLUDE_DIRS \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_BUILD_TYPE=Release; \ + cmake --build . --config Release; \ + cmake --install . --prefix /usr/local + +ENV WHISPER_PREBUILT_LIB=/usr/local/lib + +# -------------------------------------------------- +# Build protobuf musl version (AMD64 musl) +# -------------------------------------------------- +RUN mkdir -p /protoc +WORKDIR /protoc + +RUN set -eux; \ + git clone -b v3.21.12 https://github.com/protocolbuffers/protobuf.git; \ + cd protobuf; \ + mkdir build && cd build; \ + cmake .. \ + -DBUILD_SHARED_LIBS=OFF \ + -DCMAKE_INSTALL_PREFIX=/usr/local \ + -DCMAKE_EXE_LINKER_FLAGS="-static" \ + -DCMAKE_BUILD_TYPE=Release \ + -Dprotobuf_BUILD_TESTS=OFF; \ + make -j$(nproc); \ + make install + + +# ---------------------------------------------------------- +# musl locale compatibility shim for FlatBuffers (strtoll_l) +# ---------------------------------------------------------- +RUN printf "%s\n" \ +"#pragma once" \ +"" \ +"#include " \ +"#include " \ +"" \ +"// musl compatibility shim for *_l functions used by FlatBuffers" \ +"#if !defined(__GLIBC__)" \ +"" \ +"static inline long long strtoll_l(const char* nptr, char** endptr, int base, locale_t loc) {" \ +" (void)loc;" \ +" return strtoll(nptr, endptr, base);" \ +"}" \ +"" \ +"static inline unsigned long long strtoull_l(const char* nptr, char** endptr, int base, locale_t loc) {" \ +" (void)loc;" \ +" return strtoull(nptr, endptr, base);" \ +"}" \ +"" \ +"#endif" \ +> /usr/local/include/musl_locale_compat.h + + +# ----------------------------- +# Build ONNX Runtime for this variant (AMD64 musl) +# ----------------------------- + +ENV ONNX_DIR=/onnxruntime +ENV ONNX_SRC=/onnxruntime-src + +RUN set -eux; \ + mkdir -p "$ONNX_DIR"; \ + git clone --depth 1 https://github.com/microsoft/onnxruntime.git $ONNX_SRC + +WORKDIR $ONNX_SRC + +# HACK: patch ocurrences of #include since is only used for backtrace and unsupported in musl +RUN set -eux; \ + find . -type f \( -name "*" \) -print0 | xargs -0 -r sed -i "/#include /d" + +RUN mkdir -p build +WORKDIR $ONNX_SRC/build + +RUN set -eux; \ + cmake ../cmake \ + -B $ONNX_DIR \ + -DCMAKE_SYSTEM_PROCESSOR=AMD64 \ + -DCMAKE_CXX_STANDARD=20 \ + -DCMAKE_CXX_STANDARD_REQUIRED=ON \ + -DCMAKE_C_FLAGS="-march=x86-64 -include /usr/local/include/musl_locale_compat.h" \ + -DCMAKE_CXX_FLAGS="-march=x86-64 -std=c++17 -include /usr/local/include/musl_locale_compat.h" \ + -DCMAKE_EXE_LINKER_FLAGS="-static" \ + -DBUILD_SHARED_LIBS=OFF \ + -DCMAKE_C_COMPILER=$CC \ + -DCMAKE_CXX_COMPILER=$CXX \ + -DCMAKE_LINKER=$LD \ + -DCMAKE_LDFLAGS="-lgfortran -lm -lpthread -lquadmath -lgomp -lpthread" \ + -DCMAKE_COMPILE_WARNING_AS_ERROR=OFF \ + -Donnxruntime_BUILD_UNIT_TESTS=OFF \ + -Donnxruntime_ENABLE_EXTERNAL_CUSTOM_OP_SCHEMAS=OFF \ + -Donnxruntime_RUN_ONNX_TESTS=OFF \ + -Donnxruntime_GENERATE_TEST_REPORTS=ON \ + -DPython_EXECUTABLE=/usr/bin/python3 \ + -Donnxruntime_USE_VCPKG=OFF \ + -Donnxruntime_USE_MIMALLOC=OFF \ + -Donnxruntime_ENABLE_PYTHON=OFF \ + -Donnxruntime_BUILD_CSHARP=OFF \ + -Donnxruntime_BUILD_JAVA=OFF \ + -Donnxruntime_BUILD_NODEJS=OFF \ + -Donnxruntime_BUILD_OBJC=OFF \ + -Donnxruntime_BUILD_SHARED_LIB=OFF \ + -Donnxruntime_BUILD_APPLE_FRAMEWORK=OFF \ + -Donnxruntime_USE_DNNL=OFF \ + -Donnxruntime_USE_NNAPI_BUILTIN=OFF \ + -Donnxruntime_USE_VSINPU=OFF \ + -Donnxruntime_USE_RKNPU=OFF \ + -Donnxruntime_ENABLE_MICROSOFT_INTERNAL=OFF \ + -Donnxruntime_USE_VITISAI=OFF \ + -Donnxruntime_USE_TENSORRT=OFF \ + -Donnxruntime_USE_NV=OFF \ + -Donnxruntime_USE_TENSORRT_BUILTIN_PARSER=ON \ + -Donnxruntime_USE_TENSORRT_INTERFACE=OFF \ + -Donnxruntime_USE_CUDA_INTERFACE=OFF \ + -Donnxruntime_USE_NV_INTERFACE=OFF \ + -Donnxruntime_USE_OPENVINO_INTERFACE=OFF \ + -Donnxruntime_USE_VITISAI_INTERFACE=OFF \ + -Donnxruntime_USE_QNN_INTERFACE=OFF \ + -Donnxruntime_USE_MIGRAPHX_INTERFACE=OFF \ + -Donnxruntime_USE_MIGRAPHX=OFF \ + -Donnxruntime_DISABLE_CONTRIB_OPS=OFF \ + -Donnxruntime_DISABLE_ML_OPS=OFF \ + -Donnxruntime_DISABLE_GENERATION_OPS=OFF \ + -Donnxruntime_DISABLE_RTTI=OFF \ + -Donnxruntime_DISABLE_EXCEPTIONS=OFF \ + -Donnxruntime_MINIMAL_BUILD=OFF \ + -Donnxruntime_EXTENDED_MINIMAL_BUILD=OFF \ + -Donnxruntime_MINIMAL_BUILD_CUSTOM_OPS=OFF \ + -Donnxruntime_REDUCED_OPS_BUILD=OFF \ + -Donnxruntime_CLIENT_PACKAGE_BUILD=OFF \ + -Donnxruntime_BUILD_MS_EXPERIMENTAL_OPS=OFF \ + -Donnxruntime_ENABLE_LTO=OFF \ + -Donnxruntime_USE_ACL=OFF \ + -Donnxruntime_USE_ARMNN=OFF \ + -Donnxruntime_ARMNN_RELU_USE_CPU=ON \ + -Donnxruntime_ARMNN_BN_USE_CPU=ON \ + -Donnxruntime_USE_JSEP=OFF \ + -Donnxruntime_USE_WEBGPU=OFF \ + -Donnxruntime_USE_EXTERNAL_DAWN=OFF \ + -Donnxruntime_WGSL_TEMPLATE=static \ + -Donnxruntime_ENABLE_NVTX_PROFILE=OFF \ + -Donnxruntime_ENABLE_TRAINING=OFF \ + -Donnxruntime_ENABLE_TRAINING_OPS=OFF \ + -Donnxruntime_ENABLE_TRAINING_APIS=OFF \ + -Donnxruntime_ENABLE_CPU_FP16_OPS=OFF \ + -Donnxruntime_USE_NCCL=OFF \ + -Donnxruntime_BUILD_BENCHMARKS=OFF \ + -Donnxruntime_GCOV_COVERAGE=OFF \ + -Donnxruntime_ENABLE_MEMORY_PROFILE=OFF \ + -Donnxruntime_ENABLE_CUDA_LINE_NUMBER_INFO=OFF \ + -Donnxruntime_USE_CUDA_NHWC_OPS=OFF \ + -Donnxruntime_BUILD_WEBASSEMBLY_STATIC_LIB=OFF \ + -Donnxruntime_ENABLE_WEBASSEMBLY_EXCEPTION_CATCHING=ON \ + -Donnxruntime_ENABLE_WEBASSEMBLY_API_EXCEPTION_CATCHING=OFF \ + -Donnxruntime_ENABLE_WEBASSEMBLY_EXCEPTION_THROWING=ON \ + -Donnxruntime_WEBASSEMBLY_RUN_TESTS_IN_BROWSER=OFF \ + -Donnxruntime_ENABLE_WEBASSEMBLY_JSPI=OFF \ + -Donnxruntime_ENABLE_WEBASSEMBLY_THREADS=OFF \ + -Donnxruntime_ENABLE_WEBASSEMBLY_DEBUG_INFO=OFF \ + -Donnxruntime_ENABLE_WEBASSEMBLY_PROFILING=OFF \ + -Donnxruntime_ENABLE_LAZY_TENSOR=OFF \ + -Donnxruntime_ENABLE_CUDA_PROFILING=OFF \ + -Donnxruntime_USE_XNNPACK=OFF \ + -Donnxruntime_USE_WEBNN=OFF \ + -Donnxruntime_USE_CANN=OFF \ + -Donnxruntime_DISABLE_FLOAT8_TYPES=OFF \ + -Donnxruntime_DISABLE_FLOAT4_TYPES=OFF \ + -Donnxruntime_DISABLE_SPARSE_TENSORS=OFF \ + -Donnxruntime_DISABLE_OPTIONAL_TYPE=OFF \ + -Donnxruntime_DISABLE_STRING_TYPE=OFF \ + -Donnxruntime_CUDA_MINIMAL=OFF \ + -Donnxruntime_USE_CUDA=$WITH_CUDA \ + -Donnxruntime_USE_KLEIDIAI=ON \ + -DCMAKE_INSTALL_PREFIX=$ONNX_DIR \ + -DCMAKE_BUILD_TYPE=Release \ + -Donnxruntime_USE_SYSTEM_PROTOBUF=ON \ + -DProtobuf_INCLUDE_DIR=/usr/local/include \ + -DProtobuf_LIBRARIES=/usr/local/lib/libprotobuf.a \ + -DProtobuf_PROTOC_EXECUTABLE=/usr/local/bin/protoc; \ + cmake --build $ONNX_DIR --config Release + +ENV ORT_STRATEGY=system +ENV ORT_LIB_LOCATION=$ONNX_DIR +ENV ORT_DEBUG=1 -RUN curl -sSf https://sh.rustup.rs | sh -s -- -y -ENV PATH="/root/.cargo/bin:\${PATH}" -RUN rustup target add x86_64-unknown-linux-gnu WORKDIR /work DOCKERFILE @@ -251,55 +608,151 @@ DOCKERFILE [[ "${DOCKER_NO_CACHE}" -eq 1 ]] && build_args+=(--no-cache) echo "== Linux amd64 build (Docker image) ==" - docker build "${build_args[@]}" --platform=linux/amd64 \ - --build-arg WITH_CUDA="${WITH_CUDA}" \ - --build-arg WITH_ROCM="${WITH_ROCM}" \ - --build-arg CACHE_BUST="${CACHE_BUST}" \ - -f "$df" -t "$img" "$tmp" + + if docker image inspect "$img" >/dev/null 2>&1; then + echo "Docker image '$img' already exists. Skipping build." + else + local build_args=(--pull) + [[ "${DOCKER_NO_CACHE}" -eq 1 ]] && build_args+=(--no-cache) + + echo "== Linux amd64 build (Docker image) ==" + docker build "${build_args[@]}" --platform=linux/amd64 \ + --build-arg WITH_CUDA="${WITH_CUDA}" \ + --build-arg WITH_ROCM="${WITH_ROCM}" \ + --build-arg CACHE_BUST="${CACHE_BUST}" \ + -f "$df" -t "$img" "$tmp" + fi echo "== Linux amd64 cargo builds (cpu + optional variants) ==" docker run --rm --platform=linux/amd64 \ -v "${PROJECT_ROOT}:/work" -w /work \ -v "${HOST_K_CACHE}:${CONT_K_CACHE}" \ -v "${HOST_WHISPER_MODELS}:${CONT_WHISPER_MODELS}" \ - -e LINUX_WITH_OPENBLAS="${LINUX_WITH_OPENBLAS}" \ - -e LINUX_WITH_VULKAN="${LINUX_WITH_VULKAN}" \ + -e WITH_VULKAN="${WITH_VULKAN}" \ -e WITH_CUDA="${WITH_CUDA}" \ -e WITH_ROCM="${WITH_ROCM}" \ + -e CMAKE_SKIP_RPATH=ON \ + -e CMAKE_INSTALL_RPATH_USE_LINK_PATH=OFF \ "$img" \ bash -lc ' - set -euo pipefail - target=x86_64-unknown-linux-gnu + # set -euo pipefail + + ARCH=amd64 + target=x86_64-unknown-linux-musl build_variant() { local variant="$1" local feats="$2" - local ctd="/work/target-cross/linux-amd64-${variant}" - echo "---- Building linux/amd64 [$variant] features: $feats" - CARGO_TARGET_DIR="$ctd" cargo build --release --target "$target" --no-default-features --features "$feats" + local ctd="/work/target-cross/linux-${ARCH}-${variant}" + + echo "---- Building linux/${ARCH} [$variant] features: $feats" + export CARGO_PROFILE_RELEASE_CODEGEN_UNITS=1 + export CARGO_PROFILE_RELEASE_DEBUG=false + export CARGO_PROFILE_RELEASE_STRIP=symbols + export CARGO_PROFILE_RELEASE_INCREMENTAL=false + export CARGO_TARGET_X86_64_UNKNOWN_LINUX_MUSL_LINKER=x86_64-linux-musl-g++ + + export RUSTC_LINKER=x86_64-linux-musl-g++ + export LIB_DIR=/usr/local/lib + + # Collect all abseil static libraries (ort-sys needs these for re2). + ABSL_LIBS="" + for f in /usr/local/lib/libabsl_*.a; do + ABSL_LIBS="$ABSL_LIBS -C link-arg=$f" + done + + # Collect all application static libraries into a single group. + # System libraries (-lm, -lc) must come AFTER all application libs. + export RUSTFLAGS="-C target-feature=+crt-static -C target-cpu=native -C codegen-units=1 -C opt-level=3 -C link-arg=-L/opt/x86_64-linux-musl-cross/x86_64-linux-musl/lib -C link-arg=-Wl,--start-group -C link-arg=/usr/local/lib/libopenblas.a -C link-arg=/usr/local/lib/libprotobuf.a -C link-arg=/usr/local/lib/libomp.a ${ABSL_LIBS} -C link-arg=-Wl,--end-group -C link-arg=-lm -C link-arg=-lc -C link-arg=-lgfortran -C link-arg=-lpthread" + + echo "--- Libs: ------------------------------------------------------- " + ls -ltha $LIB_DIR/*.a + echo "------------------------------------------------------------------ " + + cd /work + CARGO_TARGET_DIR="$ctd" \ + cargo build --release --target "$target" --features "$feats" -v } - build_variant cpu "'"${FEATURES_CPU}"'" + # Build ALSA as a static library for musl (needed by cpal) + echo "--- Building ALSA static library for musl ---" + if [ ! -f /usr/local/lib/libasound.a ]; then + set -eux + apt-get update -qq && apt-get install -y --no-install-recommends autoconf automake libtool + curl -sL -o /tmp/alsa.tar.gz \ + "https://github.com/alsa-project/alsa-lib/archive/refs/tags/v1.2.12.tar.gz" + tar xzf /tmp/alsa.tar.gz -C /tmp + mv /tmp/alsa-lib-1.2.12 /tmp/alsa-lib + + # ALSA uses autotools - need to generate configure first + cd /tmp/alsa-lib + autoreconf -fi + ./configure \ + --host=x86_64-linux-musl \ + --build=x86_64-linux-gnu \ + --prefix=/usr/local \ + --enable-shared=no \ + --enable-static=yes \ + --with-pkg-config-plugindir=/usr/local/lib/pkgconfig \ + CC=x86_64-linux-musl-gcc \ + CFLAGS="--sysroot=/opt/x86_64-linux-musl-cross/x86_64-linux-musl -O3" \ + LDFLAGS="-L/opt/x86_64-linux-musl-cross/x86_64-linux-musl/lib" + make -j$(nproc) + make install + cd / + echo "--- ALSA static library built and installed ---" + else + echo "--- ALSA already built, skipping ---" + fi - if [ "${LINUX_WITH_OPENBLAS}" = "1" ]; then - if [ -d /usr/include/x86_64-linux-gnu/openblas-pthread ]; then - export BLAS_INCLUDE_DIRS=/usr/include/x86_64-linux-gnu/openblas-pthread - elif [ -d /usr/include/x86_64-linux-gnu/openblas ]; then - export BLAS_INCLUDE_DIRS=/usr/include/x86_64-linux-gnu/openblas - elif [ -d /usr/include/openblas ]; then - export BLAS_INCLUDE_DIRS=/usr/include/openblas - else - export BLAS_INCLUDE_DIRS=/usr/include - fi - build_variant openblas "'"${FEATURES_OPENBLAS}"'" + # Build re2 static library for musl (needed by ort-sys) + echo "--- Building re2 static library for musl ---" + if [ ! -f /usr/local/lib/libre2.a ]; then + set -eux + curl -sL -o /tmp/re2.tar.gz \ + "https://github.com/google/re2/archive/refs/tags/2024-07-02.tar.gz" + tar xzf /tmp/re2.tar.gz -C /tmp + mv /tmp/re2-2024-07-02 /tmp/re2 + + # Build absl first (re2 depends on it) + curl -sL -o /tmp/absl.tar.gz \ + "https://github.com/abseil/abseil-cpp/archive/refs/tags/20240722.0.tar.gz" + tar xzf /tmp/absl.tar.gz -C /tmp + mv /tmp/abseil-cpp-20240722.0 /tmp/absl + cmake -S /tmp/absl -B /tmp/absl-build \ + -DCMAKE_INSTALL_PREFIX=/usr/local \ + -DCMAKE_BUILD_TYPE=Release \ + -DBUILD_SHARED_LIBS=OFF \ + -DCMAKE_C_COMPILER=x86_64-linux-musl-gcc \ + -DCMAKE_CXX_COMPILER=x86_64-linux-musl-g++ \ + -DCMAKE_CXX_FLAGS="--sysroot=/opt/x86_64-linux-musl-cross/x86_64-linux-musl" \ + -DCMAKE_C_FLAGS="--sysroot=/opt/x86_64-linux-musl-cross/x86_64-linux-musl" \ + -DCMAKE_SYSTEM_NAME=Linux \ + -DABSL_BUILD_TESTING=OFF + cmake --build /tmp/absl-build --parallel $(nproc) --verbose + cmake --install /tmp/absl-build --prefix /usr/local + + # Now build re2 against the installed absl + make -C /tmp/re2 -j$(nproc) \ + CXX=x86_64-linux-musl-g++ \ + CXXFLAGS="--sysroot=/opt/x86_64-linux-musl-cross/x86_64-linux-musl -O3 -static -I/usr/local/include" \ + LDFLAGS="-static -L/usr/local/lib" \ + AR=x86_64-linux-musl-ar \ + static + cp /tmp/re2/obj/libre2.a /usr/local/lib/ + + # Also place where ort-sys expects it + mkdir -p $ONNX_DIR/_deps/re2-build/ + cp /usr/local/lib/libre2.a $ONNX_DIR/_deps/re2-build/ + echo "--- re2 static library built and installed ---" + else + echo "--- re2 already built, skipping ---" fi - if [ "${LINUX_WITH_VULKAN}" = "1" ]; then - if command -v glslc >/dev/null 2>&1; then - build_variant vulkan "'"${FEATURES_VULKAN}"'" - else - echo "WARN: glslc missing; skipping linux/amd64 vulkan variant" - fi + build_variant cpu "'"${FEATURES_CPU}"'" + + if [ "${WITH_VULKAN}" = "1" ] && command -v glslc >/dev/null 2>&1; then + build_variant vulkan "'"${FEATURES_VULKAN}"'" fi if [ "${WITH_CUDA}" = "1" ]; then @@ -311,56 +764,159 @@ DOCKERFILE fi ' - linux_copy_out "amd64" "x86_64-unknown-linux-gnu" "cpu" - [[ "${LINUX_WITH_OPENBLAS}" == "1" ]] && linux_copy_out "amd64" "x86_64-unknown-linux-gnu" "openblas" - if [[ "${LINUX_WITH_VULKAN}" == "1" ]] && [[ -f "${PROJECT_ROOT}/target-cross/linux-amd64-vulkan/x86_64-unknown-linux-gnu/release/${BIN_NAME}" ]]; then - linux_copy_out "amd64" "x86_64-unknown-linux-gnu" "vulkan" + linux_copy_out "amd64" "x86_64-unknown-linux-musl" "cpu" + if [[ "${WITH_VULKAN}" == "1" ]] && [[ -f "${PROJECT_ROOT}/target-cross/linux-amd64-vulkan/x86_64-unknown-linux-musl/release/${BIN_NAME}" ]]; then + linux_copy_out "amd64" "x86_64-unknown-linux-musl" "vulkan" fi - [[ "${WITH_CUDA}" == "1" ]] && linux_copy_out "amd64" "x86_64-unknown-linux-gnu" "cuda" - [[ "${WITH_ROCM}" == "1" ]] && linux_copy_out "amd64" "x86_64-unknown-linux-gnu" "rocm" + [[ "${WITH_CUDA}" == "1" ]] && linux_copy_out "amd64" "x86_64-unknown-linux-musl" "cuda" + [[ "${WITH_ROCM}" == "1" ]] && linux_copy_out "amd64" "x86_64-unknown-linux-musl" "rocm" docker image rm -f "$img" >/dev/null 2>&1 || true rm -rf "$tmp" >/dev/null 2>&1 || true } +# ----------------------------- +# ARM64 Docker Build +# ----------------------------- build_linux_arm64_docker_variants() { [[ "$docker_ok" -eq 1 ]] || { echo "Skipping linux/arm64: docker not found."; return 0; } + build_static_espeak_ng arm64 linux/arm64 + local tmp df img CACHE_BUST tmp="$(mktemp -d)" df="${tmp}/Dockerfile.linux.arm64" - img="local/${BIN_NAME}-linux-arm64:${VERSION}-$$" + img="local/${BIN_NAME}-linux-arm64:${VERSION}" CACHE_BUST="$(date +%s)" - cat > "$df" < "$df" <<'DOCKERFILE' FROM ubuntu:noble ENV DEBIAN_FRONTEND=noninteractive -ARG CACHE_BUST=${CACHE_BUST} - -RUN apt-get update && apt-get install -y --no-install-recommends \ - ca-certificates curl git xz-utils \ - build-essential pkg-config \ - cmake ninja-build \ - clang libclang-dev llvm-dev \ - perl \ - libssl-dev \ +ARG CACHE_BUST + +# System deps + Vulkan + RUN apt-get update && apt-get install -y --no-install-recommends \ + build-essential \ + pkg-config \ + libssl-dev:arm64 \ + musl-dev \ + musl-tools \ + gcc-aarch64-linux-gnu \ + g++-aarch64-linux-gnu \ + curl \ + wget \ + ca-certificates \ + git \ + clang-20 \ + llvm-20-dev \ + libclang-20-dev \ + zlib1g-dev \ + libbz2-dev \ + liblzma-dev \ + cmake \ libasound2-dev \ - libxdo-dev \ - libx11-dev \ - libopenblas-dev \ - libvulkan-dev vulkan-tools vulkan-utility-libraries-dev \ - spirv-tools glslang-tools \ && rm -rf /var/lib/apt/lists/* +# Make espeak-ng find clib +ENV LIBCLANG_PATH=/usr/lib/llvm-20/lib +ENV LD_LIBRARY_PATH=/usr/lib/llvm-20/lib + +# Install Rust and add MUSL target +RUN curl -sSf https://sh.rustup.rs | sh -s -- -y +ENV PKG_CONFIG_ALLOW_CROSS=1 +ENV PKG_CONFIG_PATH=/usr/local/lib/pkgconfig +ENV PATH="/root/.cargo/bin:${PATH}" +RUN rustup update stable +RUN rustup target add aarch64-unknown-linux-musl + +# Optional: tell cc-rs where the MUSL compiler is +ENV CC_aarch64_unknown_linux_musl=/usr/bin/aarch64-linux-musl-gcc +ENV CXX=/usr/bin/aarch64-linux-musl-g++ +ENV CC=/usr/bin/aarch64-linux-musl-gcc +ENV CARGO_TARGET_AARCH64_UNKNOWN_LINUX_MUSL_LINKER=/usr/bin/aarch64-linux-musl-gcc + +# Install glslc RUN set -eux; \ apt-get update; \ apt-get install -y --no-install-recommends glslc || true; \ rm -rf /var/lib/apt/lists/*; \ (command -v glslc >/dev/null 2>&1 && echo "glslc installed") || echo "glslc not available" + +# ----------------------------- +# Build static OpenBLAS (arm64) +# ----------------------------- +RUN git clone --depth 1 https://github.com/xianyi/OpenBLAS.git /tmp/openblas + +# Build OpenBLAS +RUN cd /tmp/openblas && \ + set -eux; \ + make -j$(nproc) \ + STATIC_ONLY=1 \ + NO_SHARED=1 \ + USE_OPENMP=1 \ + USE_THREAD=1 \ + TARGET=ARMV8 \ + VERBOSE=1 \ + 2>&1 | tee /tmp/openblas_build.log + +# Install OpenBLAS +RUN cd /tmp/openblas && \ + make install PREFIX=/usr/local STATIC_ONLY=1 NO_SHARED=1 && \ + cd / && rm -rf /tmp/openblas + + +# ----------------------------- +# Build ONNX Runtime for this variant (ARM64 musl) +# ----------------------------- +ENV ONNX_DIR=/work/deps/onnxruntime +RUN set -eux; \ + mkdir -p "$ONNX_DIR"; \ + git clone --depth 1 https://github.com/microsoft/onnxruntime.git /tmp/onnxruntime; \ + cd /tmp/onnxruntime; \ + mkdir -p build && cd build + + +ENV USE_BLAS=ON +ENV USE_CUDA=OFF +ENV USE_VULKAN=OFF +ENV USE_ROCM=OFF + +RUN set -eux; \ + cmake ../cmake \ + -D CMAKE_BUILD_TYPE=Release \ + -D CMAKE_POSITION_INDEPENDENT_CODE=ON \ + -D CMAKE_INSTALL_PREFIX="$ONNX_DIR" \ + -D USE_SHARED_LIBS=OFF \ + -D BUILD_SHARED_LIBS=OFF \ + -D USE_OPENMP=OFF \ + -D ORT_CPU_ENABLE_AVX=OFF \ + -D ORT_CPU_ENABLE_AVX2=OFF \ + -D ORT_CPU_ENABLE_AVX512=OFF \ + -D ORT_CPU_ENABLE_FMA=OFF \ + -D ORT_CPU_ENABLE_MF16C=OFF \ + -D ORT_CPU_ENABLE_BFLOAT16=OFF \ + -D ORT_CPU_ENABLE_VNNI=OFF \ + -D ORT_CPU_ENABLE_AMX=OFF \ + -D USE_MKL=OFF \ + -D onnxruntime_USE_CUDA=${USE_CUDA} \ + -D USE_ROCM=$USE_ROCM \ + -D USE_VULKAN=$USE_VULKAN \ + -D USE_TENSORRT=OFF \ + -D USE_EIGEN=ON \ + -D USE_BLAS=$USE_BLAS \ + -D CMAKE_C_COMPILER=/usr/bin/aarch64-linux-musl-gcc \ + -D CMAKE_CXX_COMPILER=/usr/bin/aarch64-linux-musl-g++ \ + -D BLAS_LIBRARIES=/usr/local/lib/libopenblas.a \ + -D BLAS_INCLUDE_DIRS=/usr/local/include \ + -D OPENSSL_ROOT_DIR=/usr/local/musl-openssl; \ + cmake --build $ONNX_BUILD --config Release + +# Rust + musl target RUN curl -sSf https://sh.rustup.rs | sh -s -- -y -ENV PATH="/root/.cargo/bin:\${PATH}" -RUN rustup target add aarch64-unknown-linux-gnu +ENV PATH="/root/.cargo/bin:${PATH}" +RUN rustup update stable +RUN rustup target add aarch64-unknown-linux-musl WORKDIR /work DOCKERFILE @@ -377,62 +933,112 @@ DOCKERFILE -v "${PROJECT_ROOT}:/work" -w /work \ -v "${HOST_K_CACHE}:${CONT_K_CACHE}" \ -v "${HOST_WHISPER_MODELS}:${CONT_WHISPER_MODELS}" \ - -e LINUX_WITH_OPENBLAS="${LINUX_WITH_OPENBLAS}" \ - -e LINUX_WITH_VULKAN="${LINUX_WITH_VULKAN}" \ + -e WITH_VULKAN="${WITH_VULKAN}" \ + -e CMAKE_SKIP_RPATH=ON \ + -e CMAKE_INSTALL_RPATH_USE_LINK_PATH=OFF \ "$img" \ bash -lc ' set -euo pipefail - target=aarch64-unknown-linux-gnu + + ARCH=arm64 + target=aarch64-unknown-linux-musl build_variant() { local variant="$1" local feats="$2" - local ctd="/work/target-cross/linux-arm64-${variant}" - echo "---- Building linux/arm64 [$variant] features: $feats" - CARGO_TARGET_DIR="$ctd" cargo build --release --target "$target" --no-default-features --features "$feats" + local ctd="/work/target-cross/linux-${ARCH}-${variant}" + + echo "---- Building linux/${ARCH} [$variant] features: $feats" + + export OPENBLAS_STATIC=1 + export GGML_BLAS=ON + export GGML_BLAS_VENDOR=OpenBLAS + export BLAS_INCLUDE_DIRS=/usr/local/include + export BLAS_LIBRARIES=/usr/local/lib/libopenblas.a + + export RUSTFLAGS="-C target-feature=+crt-static -C link-arg=-static -C link-arg=-lstdc++ -C link-arg=-lsupc++ -C link-arg=-lm -C link-arg=-lpthread -C link-arg=/usr/local/lib/libopenblas.a -C target-cpu=native -C codegen-units=1 -C opt-level=3" + + export CARGO_PROFILE_RELEASE_LTO=false + export CARGO_PROFILE_RELEASE_CODEGEN_UNITS=1 + export CARGO_PROFILE_RELEASE_DEBUG=false + export CARGO_PROFILE_RELEASE_STRIP=symbols + export CARGO_PROFILE_RELEASE_INCREMENTAL=false + export OPENSSL_DIR=/usr/local + export OPENSSL_LIB_DIR=/usr/local/lib + export OPENSSL_INCLUDE_DIR=/usr/local/include + export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig + + export ESPEAK_NG_DIR="/work/deps/espeak-ng-install" + + + + # Export for Rust build + export ORT_DIR="$ONNX_DIR" + export GGML_BLAS_VENDOR="OpenBLAS" + + GGML_CMAKE_ARGS="-DGGML_BLAS=ON \ + -DGGML_BLAS_VENDOR=OpenBLAS \ + -DOPENBLAS_STATIC=ON \ + -DBLAS_LIBRARIES=/usr/local/lib/libopenblas.a \ + -DBLAS_INCLUDE_DIRS=/usr/local/include \ + -DCMAKE_PREFIX_PATH=/usr/include:/usr/lib/aarch64-linux-gnu" \ + CARGO_TARGET_DIR="$ctd" \ + cargo build --release --target "$target" --features "$feats" } + # Always build CPU variant statically build_variant cpu "'"${FEATURES_CPU}"'" - if [ "${LINUX_WITH_OPENBLAS}" = "1" ]; then - if [ -d /usr/include/aarch64-linux-gnu/openblas-pthread ]; then - export BLAS_INCLUDE_DIRS=/usr/include/aarch64-linux-gnu/openblas-pthread - elif [ -d /usr/include/aarch64-linux-gnu/openblas ]; then - export BLAS_INCLUDE_DIRS=/usr/include/aarch64-linux-gnu/openblas - elif [ -d /usr/include/openblas ]; then - export BLAS_INCLUDE_DIRS=/usr/include/openblas - else - export BLAS_INCLUDE_DIRS=/usr/include - fi - build_variant openblas "'"${FEATURES_OPENBLAS}"'" - fi - - if [ "${LINUX_WITH_VULKAN}" = "1" ]; then - if command -v glslc >/dev/null 2>&1; then - build_variant vulkan "'"${FEATURES_VULKAN}"'" - else - echo "WARN: glslc missing; skipping linux/arm64 vulkan variant" - fi + # Vulkan dynamic variant + if [ "${WITH_VULKAN}" = "1" ] && command -v glslc >/dev/null 2>&1; then + build_variant vulkan "'"${FEATURES_VULKAN}"'" fi ' - linux_copy_out "arm64" "aarch64-unknown-linux-gnu" "cpu" - [[ "${LINUX_WITH_OPENBLAS}" == "1" ]] && linux_copy_out "arm64" "aarch64-unknown-linux-gnu" "openblas" - if [[ "${LINUX_WITH_VULKAN}" == "1" ]] && [[ -f "${PROJECT_ROOT}/target-cross/linux-arm64-vulkan/aarch64-unknown-linux-gnu/release/${BIN_NAME}" ]]; then - linux_copy_out "arm64" "aarch64-unknown-linux-gnu" "vulkan" + # Copy out artifacts + linux_copy_out "arm64" "aarch64-unknown-linux-musl" "cpu" + if [[ "${WITH_VULKAN}" == "1" ]] && [[ -f "${PROJECT_ROOT}/target-cross/linux-arm64-vulkan/aarch64-unknown-linux-musl/release/${BIN_NAME}" ]]; then + linux_copy_out "arm64" "aarch64-unknown-linux-musl" "vulkan" fi docker image rm -f "$img" >/dev/null 2>&1 || true rm -rf "$tmp" >/dev/null 2>&1 || true } -# Run +# ----------------------------- +# Run builds +# ----------------------------- ensure_espeak_data_archive if want_arch amd64; then build_linux_amd64_docker_variants; fi if want_arch arm64; then build_linux_arm64_docker_variants; fi -# Package +# ----------------------------- +# Check static build +# ----------------------------- +for f in dist/vtmate-*-linux-*/vtmate; do + echo "Checking $f" + + if ldd "$f" 2>&1 | grep -q "not a dynamic"; then + echo "✔ Statically linked (ldd says not a dynamic ELF)" + else + echo "ldd output:" + ldd "$f" || true + fi + + # Fallback: check for OpenBLAS symbols + if nm "$f" 2>/dev/null | grep -q "openblas"; then + echo "✔ OpenBLAS symbols found (static link confirmed)" + else + echo "⚠ No OpenBLAS symbols found in $f" + fi + + echo "---------------------------------" +done + +# ----------------------------- +# Packaging +# ----------------------------- if [[ "${DO_PACKAGE}" -eq 1 ]]; then echo "== Packaging tar.gz + SHA256 ==" for f in "${ARTIFACTS[@]}"; do diff --git a/build_macos.sh b/build_macos.sh index dbb70561..22d9a785 100755 --- a/build_macos.sh +++ b/build_macos.sh @@ -4,30 +4,24 @@ set -euo pipefail BIN_NAME="vtmate" PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" DIST_DIR="${PROJECT_ROOT}/dist" -PKG_DIR="${DIST_DIR}/packages" ASSETS_DIR="${PROJECT_ROOT}/assets" ESPEAK_ARCHIVE="${ASSETS_DIR}/espeak-ng-data.tar.gz" -DO_PACKAGE=1 - -# macOS optional -MAC_WITH_OPENBLAS="${MAC_WITH_OPENBLAS:-0}" - usage() { cat <<'USAGE' Usage: - ./build_macos.sh [--skip-package] + ./build_macos.sh -Env: - MAC_WITH_OPENBLAS=0|1 (macos) default 0 Notes: - - macOS builds always enable Metal. + - macOS build + - Metal enabled + - No OpenBLAS + - Produces a single binary USAGE } while [[ $# -gt 0 ]]; do case "$1" in - --skip-package) DO_PACKAGE=0; shift ;; -h|--help) usage; exit 0 ;; *) echo "Unknown arg: $1"; usage; exit 1 ;; esac @@ -46,52 +40,26 @@ VERSION="$( )" [[ -n "${VERSION}" ]] || { echo "Failed to read version from Cargo.toml"; exit 1; } -mkdir -p "${DIST_DIR}" "${PKG_DIR}" "${PROJECT_ROOT}/target-cross" "${ASSETS_DIR}" +mkdir -p "${DIST_DIR}" "${ASSETS_DIR}" echo "Version: ${VERSION}" -echo "macOS: Metal always, MAC_WITH_OPENBLAS=${MAC_WITH_OPENBLAS}" +echo "macOS build: whisper-metal only" -FEATURES_COMMON="whisper-logs" -FEATURES_MACOS_METAL="${FEATURES_COMMON},whisper-metal" -FEATURES_MACOS_METAL_OPENBLAS="${FEATURES_COMMON},whisper-metal,whisper-openblas" +FEATURES="whisper-metal" -sha256_file() { - local file="$1" out="$2" - if command -v shasum >/dev/null 2>&1; then - (cd "$(dirname "$file")" && shasum -a 256 "$(basename "$file")") > "$out" - return 0 - fi - if command -v openssl >/dev/null 2>&1; then - local line hash - line="$(openssl dgst -sha256 "$file")" - hash="${line##* }" - echo "${hash} $(basename "$file")" > "$out" - return 0 - fi - echo "ERROR: No SHA256 tool found." - exit 1 -} -make_tgz() { local src="$1" tgz="$2"; tar -C "$(dirname "$src")" -czf "$tgz" "$(basename "$src")"; } -package_one() { - local src="$1" - [[ -f "$src" ]] || return 0 - local base tgz sha - base="$(basename "$src")" - tgz="${PKG_DIR}/${base}.tar.gz" - sha="${PKG_DIR}/${base}.tar.gz.sha256" - make_tgz "$src" "$tgz" - sha256_file "$tgz" "$sha" -} +# --- Embedded eSpeak asset generation --- -# Embedded eSpeak asset generation (via Docker if missing) docker_ok=0 command -v docker >/dev/null 2>&1 && docker_ok=1 + ensure_espeak_data_archive() { if [[ -f "${ESPEAK_ARCHIVE}" ]]; then echo "✔ Found embedded asset: ${ESPEAK_ARCHIVE}" return 0 fi + echo "== Generating embedded asset: ${ESPEAK_ARCHIVE} ==" + if [[ "$docker_ok" -ne 1 ]]; then echo "ERROR: Docker not found and ${ESPEAK_ARCHIVE} is missing." exit 1 @@ -136,37 +104,28 @@ ensure_espeak_data_archive command -v cargo >/dev/null 2>&1 || { echo "ERROR: cargo not found"; exit 1; } -ARTIFACTS=() -add_artifact() { [[ -f "$1" ]] && ARTIFACTS+=("$1"); } - arch="$(uname -m)" -echo "== macOS build [metal] features: ${FEATURES_MACOS_METAL} ==" -cargo build --release --no-default-features --features "${FEATURES_MACOS_METAL}" -out="${DIST_DIR}/${BIN_NAME}-${VERSION}-macos-${arch}-metal" -cp "${PROJECT_ROOT}/target/release/${BIN_NAME}" "$out" -chmod +x "$out" || true -add_artifact "$out" -echo "✔ Built: $out" +export MACOSX_DEPLOYMENT_TARGET=11.0 -if [[ "${MAC_WITH_OPENBLAS}" == "1" ]]; then - echo "== macOS build [metal-openblas] features: ${FEATURES_MACOS_METAL_OPENBLAS} ==" - CARGO_TARGET_DIR="${PROJECT_ROOT}/target-cross/macos-${arch}-metal-openblas" \ - cargo build --release --no-default-features --features "${FEATURES_MACOS_METAL_OPENBLAS}" - out="${DIST_DIR}/${BIN_NAME}-${VERSION}-macos-${arch}-metal-openblas" - cp "${PROJECT_ROOT}/target-cross/macos-${arch}-metal-openblas/release/${BIN_NAME}" "$out" - chmod +x "$out" || true - add_artifact "$out" - echo "✔ Built: $out" -fi +export CARGO_PROFILE_RELEASE_LTO=false +export CARGO_PROFILE_RELEASE_CODEGEN_UNITS=1 +export CARGO_PROFILE_RELEASE_DEBUG=false +export CARGO_PROFILE_RELEASE_STRIP=symbols +export CARGO_PROFILE_RELEASE_INCREMENTAL=false -if [[ "${DO_PACKAGE}" -eq 1 ]]; then - echo "== Packaging tar.gz + SHA256 ==" - for f in "${ARTIFACTS[@]}"; do - package_one "$f" - done -else - echo "Skipping packaging (--skip-package)" -fi +echo "== Building macOS (${arch}) with whisper-metal ==" +export MACOSX_DEPLOYMENT_TARGET=11.0 +export RUSTFLAGS="-C link-args=-mmacosx-version-min=10.13" + +CARGO_TARGET_DIR="${PROJECT_ROOT}/target-cross/macos-${arch}" \ +cargo build --release \ + --features "${FEATURES}" + +out="${DIST_DIR}/${BIN_NAME}-${VERSION}-macos-${arch}" +cp "${PROJECT_ROOT}/target-cross/macos-${arch}/release/${BIN_NAME}" "$out" +chmod +x "$out" || true + +echo "✔ Built: $out" echo "✔ macOS build complete" diff --git a/build_windows.ps1 b/build_windows.ps1 new file mode 100755 index 00000000..cafed8be --- /dev/null +++ b/build_windows.ps1 @@ -0,0 +1,1316 @@ +# ========================================================== +# PowerShell Build Script (MSVC) +# ========================================================== +param( + [string]$VARIANT = "cpu" +) + +Set-StrictMode -Version Latest +$ErrorActionPreference = "Stop" + +# ========================================================== +# CONFIG +# ========================================================== +$BIN_BASE = "vtmate" +$PROJECT_ROOT = Split-Path -Parent $MyInvocation.MyCommand.Path +$DIST_DIR = Join-Path $PROJECT_ROOT "dist" +$TARGET_DIR = Join-Path $PROJECT_ROOT "target-cross" +$VENDOR_DIR = Join-Path $PROJECT_ROOT "vendor" + +$ESPEAK_SRC = Join-Path $VENDOR_DIR "espeak-ng" +$ESPEAK_BUILD = Join-Path $ESPEAK_SRC "build-msvc" +$ESPEAK_INSTALL = Join-Path $ESPEAK_BUILD "install" + +$PROTOC_SRC = Join-Path $PROJECT_ROOT "protobuf" +$PROTOC_BUILD = Join-Path $PROJECT_ROOT "protobuf\build" +$PROTOC_INSTALL = Join-Path $PROJECT_ROOT "protobuf\install" + +$OPENBLAS_DIR = Join-Path $VENDOR_DIR "openblas" + +$ONNX_SRC = Join-Path $VENDOR_DIR "onnxruntime" +$ONNX_BUILD = Join-Path $ONNX_SRC "build-static" +$UPLOAD_ENABLED = $true + +# ========================================================== +# CLEAN OLD BUILDS +# ========================================================== +Remove-Item -Recurse -Force -ErrorAction SilentlyContinue $OPENBLAS_DIR, $ONNX_SRC, $ONNX_BUILD, "$PROJECT_ROOT\target", $TARGET_DIR, $DIST_DIR + +# ========================================================== +# CHECK REQUIRED TOOLS +# ========================================================== +foreach ($tool in "cl.exe","cmake","git","cargo","powershell") { + if (-not (Get-Command $tool -ErrorAction SilentlyContinue)) { + Write-Error "ERROR: Required tool $tool not found. Launch PowerShell from 'x64 Native Tools Command Prompt for VS'." + exit 1 + } +} + +$env:CARGO_BUILD_JOBS = 1 + +# ========================================================== +# DETERMINE VARIANT +# ========================================================== +switch ($VARIANT) { + "cpu" { + $WITH_OPENBLAS = $true + $WITH_CUDA = $false + $WITH_VULKAN = $false + } + "vulkan" { + $WITH_OPENBLAS = $true + $WITH_CUDA = $false + $WITH_VULKAN = $true + } + "cuda" { + $WITH_OPENBLAS = $true + $WITH_CUDA = $true + $WITH_VULKAN = $false + } + default { + Write-Error "ERROR: Unknown variant $VARIANT" + exit 1 + } +} + +Write-Host "`n============================================" +Write-Host "Building variant: $VARIANT" +if ($WITH_OPENBLAS) { Write-Host "OpenBLAS: ENABLED" } +if ($WITH_CUDA) { Write-Host "CUDA: ENABLED" } +if ($WITH_VULKAN) { Write-Host "Vulkan: ENABLED" } +Write-Host "============================================`n" + +# ========================================================== +# CREATE REQUIRED DIRECTORIES +# ========================================================== +foreach ($dir in $TARGET_DIR, $DIST_DIR, $VENDOR_DIR) { + if (-not (Test-Path $dir)) { New-Item -ItemType Directory -Force -Path $dir | Out-Null } +} + +# ========================================================== +# ENSURE CUDA TOOLKIT IF REQUIRED (BUILD-TIME) +# ========================================================== +if ($WITH_CUDA) { + $nvcc = Get-Command nvcc -ErrorAction SilentlyContinue + if (-not $nvcc) { + Write-Host "CUDA not detected. Installing CUDA Toolkit for build..." + $CUDA_VERSION = "12.3.2" + $cuda_root = "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v$CUDA_VERSION" + $CUDA_INSTALLER = "$env:TEMP\cuda_installer.exe" + $CUDA_URL = "https://developer.download.nvidia.com/compute/cuda/$CUDA_VERSION/network_installers/cuda_${CUDA_VERSION}_windows_network.exe" + + Invoke-WebRequest -Uri $CUDA_URL -OutFile $CUDA_INSTALLER -UseBasicParsing + + if (-not (Test-Path $CUDA_INSTALLER)) { + Write-Error "Failed to download CUDA installer." + exit 1 + } + + $arguments = "--silent --toolkit --installpath `"$cuda_root`"" + $proc = Start-Process -FilePath $CUDA_INSTALLER -ArgumentList $arguments -Wait -PassThru + if ($proc.ExitCode -ne 0) { + Write-Error "CUDA installation failed with exit code $($proc.ExitCode)" + exit 1 + } + + # Set environment variables + $env:CUDA_PATH = $cuda_root + $env:CUDAToolkit_ROOT = $cuda_root + $env:Path = "$cuda_root\bin;$env:Path" + + # Verify nvcc + if (-not (Get-Command nvcc -ErrorAction SilentlyContinue)) { + Write-Error "CUDA installed but nvcc not found in PATH." + exit 1 + } + + Write-Host "CUDA successfully installed for build." + } + else { + Write-Host "CUDA already present." + $cuda_root = Split-Path -Parent (Split-Path -Parent $nvcc.Source) + $env:CUDA_PATH = $cuda_root + $env:CUDAToolkit_ROOT = $cuda_root + $env:Path = "$cuda_root\bin;$env:Path" + Write-Host "CUDA_PATH = $env:CUDA_PATH" + } +} +else { + Remove-Item Env:CUDAToolkit_ROOT -ErrorAction SilentlyContinue + Remove-Item Env:CUDA_PATH -ErrorAction SilentlyContinue + Remove-Item Env:CUDA_HOME -ErrorAction SilentlyContinue + Remove-Item Env:CUDA_ROOT -ErrorAction SilentlyContinue +} + +# ========================================================== +# BUILD ESPEAK-NG STATIC +# ========================================================== +$ESPEAK_LIB = Join-Path $ESPEAK_INSTALL "lib" "espeak-ng.lib" + +if (-not (Test-Path $ESPEAK_LIB)) { + + Write-Host "" + Write-Host "=== Building eSpeak NG (MSVC) ===" + + # Clone repository if source doesn't exist + if (-not (Test-Path $ESPEAK_SRC)) { + New-Item -ItemType Directory -Force -Path $VENDOR_DIR | Out-Null + git clone https://github.com/espeak-ng/espeak-ng $ESPEAK_SRC + if ($LASTEXITCODE -ne 0) { exit 1 } + } + + # Change directory to source + Push-Location $ESPEAK_SRC + + # Configure with CMake + cmake -S . ` + -B $ESPEAK_BUILD ` + -G "Visual Studio 17 2022" ` + -A x64 ` + -DCMAKE_BUILD_TYPE=Release ` + -DCMAKE_CXX_STANDARD=17 ` + -DCMAKE_CXX_STANDARD_REQUIRED=ON ` + -DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreaded ` + -DCMAKE_C_FLAGS="/MT /D_CRT_NONSTDC_NO_DEPRECATE /D_CRT_SECURE_NO_WARNINGS" ` + -DCMAKE_CXX_FLAGS="/MT /D_CRT_NONSTDC_NO_DEPRECATE /D_CRT_SECURE_NO_WARNINGS" ` + -DCMAKE_C_FLAGS_RELEASE="/MT /D_CRT_NONSTDC_NO_DEPRECATE /D_CRT_SECURE_NO_WARNINGS" ` + -DCMAKE_CXX_FLAGS_RELEASE="/MT /D_CRT_NONSTDC_NO_DEPRECATE /D_CRT_SECURE_NO_WARNINGS" ` + -DCMAKE_C_FLAGS_RELWITHDEBINFO="/MT /D_CRT_NONSTDC_NO_DEPRECATE /D_CRT_SECURE_NO_WARNINGS" ` + -DCMAKE_CXX_FLAGS_RELWITHDEBINFO="/MT /D_CRT_NONSTDC_NO_DEPRECATE /D_CRT_SECURE_NO_WARNINGS" ` + -DCMAKE_C_FLAGS_DEBUG="/MTd /D_CRT_NONSTDC_NO_DEPRECATE /D_CRT_SECURE_NO_WARNINGS" ` + -DCMAKE_CXX_FLAGS_DEBUG="/MTd /D_CRT_NONSTDC_NO_DEPRECATE /D_CRT_SECURE_NO_WARNINGS" ` + -DCMAKE_INSTALL_PREFIX="$ESPEAK_INSTALL" ` + -DBUILD_SHARED_LIBS=OFF ` + -DESPEAKNG_BUILD_TESTS=OFF ` + -DESPEAKNG_BUILD_EXAMPLES=OFF ` + -DCMAKE_EXE_LINKER_FLAGS="/DEFAULTLIB:legacy_stdio_definitions.lib /DEFAULTLIB:OLDNAMES.lib" ` + -DCMAKE_STATIC_LINKER_FLAGS="/DEFAULTLIB:legacy_stdio_definitions.lib /DEFAULTLIB:OLDNAMES.lib" + if ($LASTEXITCODE -ne 0) { exit 1 } + + # Build and install + cmake --build $ESPEAK_BUILD --config Release --target INSTALL + if ($LASTEXITCODE -ne 0) { exit 1 } + + Pop-Location +} + +# ========================================================== +# BUILD OPENBLAS STATIC AND LINK +# ========================================================== +if ($WITH_OPENBLAS) { + Write-Host "=== Windows build [OpenBLAS] variant ===" + $PREBUILT_OPENBLAS_DIR = Join-Path $PROJECT_ROOT "assets\openblas-windows-portable" + $LIB_DIR = Join-Path $PREBUILT_OPENBLAS_DIR "lib" + $INCLUDE_DIR = Join-Path $PREBUILT_OPENBLAS_DIR "include\openblas" + $FINAL_LIB = Join-Path $LIB_DIR "openblas.lib" + $RENAMED_LIB = Join-Path $LIB_DIR "libopenblas.lib" + + Write-Host "OpenBLAS library not found — building from source..." + + $tmp_build = Join-Path $env:TEMP "openblas_build" + Remove-Item -Recurse -Force -ErrorAction SilentlyContinue $tmp_build + New-Item -ItemType Directory -Force -Path $tmp_build | Out-Null + + $src_dir = Join-Path $tmp_build "OpenBLAS" + git clone --depth 1 --branch v0.3.30 https://github.com/xianyi/OpenBLAS $src_dir + $build_dir = Join-Path $src_dir "build" + New-Item -ItemType Directory -Force -Path $build_dir | Out-Null + + Push-Location $src_dir + cmake -S . -B build -G "Visual Studio 17 2022" -A x64 ` + -DBUILD_SHARED_LIBS=OFF ` + -DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreaded ` + -DCMAKE_CXX_STANDARD=17 ` + -DCMAKE_CXX_STANDARD_REQUIRED=ON ` + -DCMAKE_C_FLAGS="/MT /D_CRT_NONSTDC_NO_DEPRECATE /D_CRT_SECURE_NO_WARNINGS" ` + -DCMAKE_CXX_FLAGS="/MT /D_CRT_NONSTDC_NO_DEPRECATE /D_CRT_SECURE_NO_WARNINGS" ` + -DCMAKE_C_FLAGS_RELEASE="/MT /D_CRT_NONSTDC_NO_DEPRECATE /D_CRT_SECURE_NO_WARNINGS" ` + -DCMAKE_CXX_FLAGS_RELEASE="/MT /D_CRT_NONSTDC_NO_DEPRECATE /D_CRT_SECURE_NO_WARNINGS" ` + -DCMAKE_C_FLAGS_RELWITHDEBINFO="/MT /D_CRT_NONSTDC_NO_DEPRECATE /D_CRT_SECURE_NO_WARNINGS" ` + -DCMAKE_CXX_FLAGS_RELWITHDEBINFO="/MT /D_CRT_NONSTDC_NO_DEPRECATE /D_CRT_SECURE_NO_WARNINGS" ` + -DCMAKE_C_FLAGS_DEBUG="/MTd /D_CRT_NONSTDC_NO_DEPRECATE /D_CRT_SECURE_NO_WARNINGS" ` + -DCMAKE_CXX_FLAGS_DEBUG="/MTd /D_CRT_NONSTDC_NO_DEPRECATE /D_CRT_SECURE_NO_WARNINGS" ` + -DCMAKE_EXE_LINKER_FLAGS="/DEFAULTLIB:legacy_stdio_definitions.lib /DEFAULTLIB:OLDNAMES.lib" ` + -DCMAKE_STATIC_LINKER_FLAGS="/DEFAULTLIB:legacy_stdio_definitions.lib /DEFAULTLIB:OLDNAMES.lib" ` + -DNO_LAPACK=ON ` + -DUSE_OPENMP=ON ` + -DCMAKE_INSTALL_PREFIX="$PREBUILT_OPENBLAS_DIR" + + cmake --build build --config Release --target INSTALL + Pop-Location + + # Rename openblas.lib to libopenblas.lib + if (Test-Path $FINAL_LIB) { + Rename-Item -Path $FINAL_LIB -NewName "libopenblas.lib" -Force + Write-Host "Renamed openblas.lib to libopenblas.lib" + } + + Remove-Item -Recurse -Force $tmp_build + Write-Host "OpenBLAS build completed" + + # Ensure the variable points to the renamed library + $OPENBLAS_LIB = $RENAMED_LIB + + # Set environment variables + $env:OpenBLAS_DIR = $PREBUILT_OPENBLAS_DIR + $env:OpenBLAS_LIBRARIES = $OPENBLAS_LIB + $env:OpenBLAS_INCLUDE_DIR = $INCLUDE_DIR +} + +# ========================================================== +# BUILD ABSL AND RE2 BEFORE ONNX RUNTIME CONFIGURE +# ========================================================== +Write-Host "=== Building Abseil (absl) and RE2 static libraries ===" + +# ----------------------------------------------------------- +# Step 1: Build abseil-cpp (absl) from source +# ----------------------------------------------------------- +$AbslVersion = "20250512.0" +$AbslUrl = "https://github.com/abseil/abseil-cpp/archive/refs/tags/$AbslVersion.zip" +$AbslDownloadDir = "$env:TEMP\absl_download" +$AbslSourceDir = "$AbslDownloadDir\abseil-cpp-$AbslVersion" +$AbslBuildDir = "$AbslSourceDir\build" +$AbslInstallDir = "$ONNX_BUILD/_deps/abseil_cpp-build" + +Write-Host "Downloading Abseil (absl) $AbslVersion..." +New-Item -ItemType Directory -Force -Path $AbslDownloadDir | Out-Null +$AbslZipFile = Join-Path $AbslDownloadDir "abseil-cpp-$AbslVersion.zip" +Invoke-WebRequest -Uri $AbslUrl -OutFile $AbslZipFile -UseBasicParsing +Expand-Archive -Path $AbslZipFile -DestinationPath $AbslDownloadDir -Force + +# Use forward-slash paths for cmake to avoid escape sequence issues with backslashes +$AbslInstallDirFS = $AbslInstallDir -replace '\\', '/' + +Write-Host "Configuring Abseil (absl) with CMake..." +New-Item -ItemType Directory -Force -Path $AbslBuildDir | Out-Null +cmake -S "$AbslSourceDir" -B "$AbslBuildDir" ` + -G "Visual Studio 17 2022" ` + -A x64 ` + -DCMAKE_BUILD_TYPE=Release ` + -DCMAKE_INSTALL_PREFIX="$AbslInstallDirFS" ` + -DBUILD_SHARED_LIBS=OFF ` + -DABSL_BUILD_TESTING=OFF ` + -DABSL_PROPAGATE_CXX_STD=ON ` + -DABSL_MSVC_STATIC_RUNTIME=ON ` + -DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreaded ` + -DCMAKE_CXX_STANDARD=17 ` + -DCMAKE_CXX_STANDARD_REQUIRED=ON ` + -DCMAKE_C_FLAGS="/MT /D_CRT_NONSTDC_NO_DEPRECATE /D_CRT_SECURE_NO_WARNINGS" ` + -DCMAKE_CXX_FLAGS="/MT /D_CRT_NONSTDC_NO_DEPRECATE /D_CRT_SECURE_NO_WARNINGS" ` + -DCMAKE_C_FLAGS_RELEASE="/MT /D_CRT_NONSTDC_NO_DEPRECATE /D_CRT_SECURE_NO_WARNINGS" ` + -DCMAKE_CXX_FLAGS_RELEASE="/MT /D_CRT_NONSTDC_NO_DEPRECATE /D_CRT_SECURE_NO_WARNINGS" ` + -DCMAKE_EXE_LINKER_FLAGS="/DEFAULTLIB:legacy_stdio_definitions.lib /DEFAULTLIB:OLDNAMES.lib" ` + -DCMAKE_STATIC_LINKER_FLAGS="/DEFAULTLIB:legacy_stdio_definitions.lib /DEFAULTLIB:OLDNAMES.lib" ` + -DABSL_ENABLE_INSTALL=ON + if ($LASTEXITCODE -ne 0) { exit 1 } + + Write-Host "Building Abseil (absl)..." + cmake --build "$AbslBuildDir" --config Release --verbose + if ($LASTEXITCODE -ne 0) { exit 1 } + + Write-Host "Installing Abseil (absl) to $AbslInstallDirFS..." + cmake --build "$AbslBuildDir" --config Release --target INSTALL + if ($LASTEXITCODE -ne 0) { exit 1 } + +# ----------------------------------------------------------- +# Step 2: Create Findabsl.cmake for RE2 to locate abseil +# ----------------------------------------------------------- +$AbslCMakePath = "$AbslInstallDir/Findabsl.cmake" +# Use forward slashes to avoid CMake escape sequence interpretation of backslashes +$AbslInclude = ("$AbslInstallDir") -replace '\\', '/' + +Set-Content -Path $AbslCMakePath -Value @" +# UseAbsl.cmake - Imported Abseil targets for RE2 +# Set AbslInclude to your abseil build folder +set(AbslInclude "$AbslInclude") + +# -------------------- +# Base +# -------------------- +if(NOT TARGET absl::base) +add_library(absl::base STATIC IMPORTED) +set_target_properties(absl::base PROPERTIES + IMPORTED_LOCATION "${AbslInclude}/absl/base/Release/absl_base.lib" + INTERFACE_INCLUDE_DIRECTORIES "${AbslInclude}" +) +endif() + +if(NOT TARGET absl::absl_log) +add_library(absl::absl_log STATIC IMPORTED) +set_target_properties(absl::absl_log PROPERTIES + IMPORTED_LOCATION "${AbslInclude}/absl/base/Release/absl_log_severity.lib" + INTERFACE_INCLUDE_DIRECTORIES "${AbslInclude}" + +) +endif() + +if(NOT TARGET absl::malloc_internal) +add_library(absl::malloc_internal STATIC IMPORTED) +set_target_properties(absl::malloc_internal PROPERTIES + IMPORTED_LOCATION "${AbslInclude}/absl/base/Release/absl_malloc_internal.lib" + INTERFACE_INCLUDE_DIRECTORIES "${AbslInclude}" +) +endif() + +if(NOT TARGET absl::raw_logging_internal) +add_library(absl::raw_logging_internal STATIC IMPORTED) +set_target_properties(absl::raw_logging_internal PROPERTIES + IMPORTED_LOCATION "${AbslInclude}/absl/base/Release/absl_raw_logging_internal.lib" + INTERFACE_INCLUDE_DIRECTORIES "${AbslInclude}" +) +endif() + +if(NOT TARGET absl::spinlock_wait) +add_library(absl::spinlock_wait STATIC IMPORTED) +set_target_properties(absl::spinlock_wait PROPERTIES + IMPORTED_LOCATION "${AbslInclude}/absl/base/Release/absl_spinlock_wait.lib" + INTERFACE_INCLUDE_DIRECTORIES "${AbslInclude}" +) +endif() + +if(NOT TARGET absl::strerror) +add_library(absl::strerror STATIC IMPORTED) +set_target_properties(absl::strerror PROPERTIES + IMPORTED_LOCATION "${AbslInclude}/absl/base/Release/absl_strerror.lib" + INTERFACE_INCLUDE_DIRECTORIES "${AbslInclude}" +) +endif() + +if(NOT TARGET absl::throw_delegate) +add_library(absl::throw_delegate STATIC IMPORTED) +set_target_properties(absl::throw_delegate PROPERTIES + IMPORTED_LOCATION "${AbslInclude}/absl/base/Release/absl_throw_delegate.lib" + INTERFACE_INCLUDE_DIRECTORIES "${AbslInclude}" +) +endif() + +if(NOT TARGET absl::tracing_internal) +add_library(absl::tracing_internal STATIC IMPORTED) +set_target_properties(absl::tracing_internal PROPERTIES + IMPORTED_LOCATION "${AbslInclude}/absl/base/Release/absl_tracing_internal.lib" + INTERFACE_INCLUDE_DIRECTORIES "${AbslInclude}" +) +endif() + +if(NOT TARGET absl::hashtablez_sampler) +add_library(absl::hashtablez_sampler STATIC IMPORTED) +set_target_properties(absl::hashtablez_sampler PROPERTIES + IMPORTED_LOCATION "${AbslInclude}/absl/container/Release/absl_hashtablez_sampler.lib" + INTERFACE_INCLUDE_DIRECTORIES "${AbslInclude}" +) +endif() + +if(NOT TARGET absl::raw_hash_set) +add_library(absl::raw_hash_set STATIC IMPORTED) +set_target_properties(absl::raw_hash_set PROPERTIES + IMPORTED_LOCATION "${AbslInclude}/absl/container/Release/absl_raw_hash_set.lib" + INTERFACE_INCLUDE_DIRECTORIES "${AbslInclude}" +) +endif() + +if(NOT TARGET absl::crc_cord_state) +add_library(absl::crc_cord_state STATIC IMPORTED) +set_target_properties(absl::crc_cord_state PROPERTIES + IMPORTED_LOCATION "${AbslInclude}/absl/crc/Release/absl_crc_cord_state.lib" + INTERFACE_INCLUDE_DIRECTORIES "${AbslInclude}" +) +endif() + +if(NOT TARGET absl::crc_cpu_detect) +add_library(absl::crc_cpu_detect STATIC IMPORTED) +set_target_properties(absl::crc_cpu_detect PROPERTIES + IMPORTED_LOCATION "${AbslInclude}/absl/crc/Release/absl_crc_cpu_detect.lib" + INTERFACE_INCLUDE_DIRECTORIES "${AbslInclude}" +) +endif() + +if(NOT TARGET absl::crc_internal) +add_library(absl::crc_internal STATIC IMPORTED) +set_target_properties(absl::crc_internal PROPERTIES + IMPORTED_LOCATION "${AbslInclude}/absl/crc/Release/absl_crc_internal.lib" + INTERFACE_INCLUDE_DIRECTORIES "${AbslInclude}" +) +endif() + +if(NOT TARGET absl::crc32c) +add_library(absl::crc32c STATIC IMPORTED) +set_target_properties(absl::crc32c PROPERTIES + IMPORTED_LOCATION "${AbslInclude}/absl/crc/Release/absl_crc32c.lib" + INTERFACE_INCLUDE_DIRECTORIES "${AbslInclude}" +) +endif() + +if(NOT TARGET absl::debugging_internal) +add_library(absl::debugging_internal STATIC IMPORTED) +set_target_properties(absl::debugging_internal PROPERTIES + IMPORTED_LOCATION "${AbslInclude}/absl/debugging/Release/absl_debugging_internal.lib" + INTERFACE_INCLUDE_DIRECTORIES "${AbslInclude}" +) +endif() + +if(NOT TARGET absl::decode_rust_punycode) +add_library(absl::decode_rust_punycode STATIC IMPORTED) +set_target_properties(absl::decode_rust_punycode PROPERTIES + IMPORTED_LOCATION "${AbslInclude}/absl/debugging/Release/absl_decode_rust_punycode.lib" + INTERFACE_INCLUDE_DIRECTORIES "${AbslInclude}" +) +endif() + +if(NOT TARGET absl::demangle_internal) +add_library(absl::demangle_internal STATIC IMPORTED) +set_target_properties(absl::demangle_internal PROPERTIES + IMPORTED_LOCATION "${AbslInclude}/absl/debugging/Release/absl_demangle_internal.lib" + INTERFACE_INCLUDE_DIRECTORIES "${AbslInclude}" +) +endif() + +if(NOT TARGET absl::demangle_rust) +add_library(absl::demangle_rust STATIC IMPORTED) +set_target_properties(absl::demangle_rust PROPERTIES + IMPORTED_LOCATION "${AbslInclude}/absl/debugging/Release/absl_demangle_rust.lib" + INTERFACE_INCLUDE_DIRECTORIES "${AbslInclude}" +) +endif() + +if(NOT TARGET absl::examine_stack) +add_library(absl::examine_stack STATIC IMPORTED) +set_target_properties(absl::examine_stack PROPERTIES + IMPORTED_LOCATION "${AbslInclude}/absl/debugging/Release/absl_examine_stack.lib" + INTERFACE_INCLUDE_DIRECTORIES "${AbslInclude}" +) +endif() + +if(NOT TARGET absl::leak_check) +add_library(absl::leak_check STATIC IMPORTED) +set_target_properties(absl::leak_check PROPERTIES + IMPORTED_LOCATION "${AbslInclude}/absl/debugging/Release/absl_leak_check.lib" + INTERFACE_INCLUDE_DIRECTORIES "${AbslInclude}" +) +endif() + +if(NOT TARGET absl::stacktrace) +add_library(absl::stacktrace STATIC IMPORTED) +set_target_properties(absl::stacktrace PROPERTIES + IMPORTED_LOCATION "${AbslInclude}/absl/debugging/Release/absl_stacktrace.lib" + INTERFACE_INCLUDE_DIRECTORIES "${AbslInclude}" +) +endif() + +if(NOT TARGET absl::symbolize) +add_library(absl::symbolize STATIC IMPORTED) +set_target_properties(absl::symbolize PROPERTIES + IMPORTED_LOCATION "${AbslInclude}/absl/debugging/Release/absl_symbolize.lib" + INTERFACE_INCLUDE_DIRECTORIES "${AbslInclude}" +) +endif() + +if(NOT TARGET absl::utf8_for_code_point) +add_library(absl::utf8_for_code_point STATIC IMPORTED) +set_target_properties(absl::utf8_for_code_point PROPERTIES + IMPORTED_LOCATION "${AbslInclude}/absl/debugging/Release/absl_utf8_for_code_point.lib" + INTERFACE_INCLUDE_DIRECTORIES "${AbslInclude}" +) +endif() + +if(NOT TARGET absl::flags_commandlineflag_internal) +add_library(absl::flags_commandlineflag_internal STATIC IMPORTED) +set_target_properties(absl::flags_commandlineflag_internal PROPERTIES + IMPORTED_LOCATION "${AbslInclude}/absl/flags/Release/absl_flags_commandlineflag_internal.lib" + INTERFACE_INCLUDE_DIRECTORIES "${AbslInclude}" +) +endif() + +if(NOT TARGET absl::flags_commandlineflag) +add_library(absl::flags_commandlineflag STATIC IMPORTED) +set_target_properties(absl::flags_commandlineflag PROPERTIES + IMPORTED_LOCATION "${AbslInclude}/absl/flags/Release/absl_flags_commandlineflag.lib" + INTERFACE_INCLUDE_DIRECTORIES "${AbslInclude}" +) +endif() + +if(NOT TARGET absl::flags_config) +add_library(absl::flags_config STATIC IMPORTED) +set_target_properties(absl::flags_config PROPERTIES + IMPORTED_LOCATION "${AbslInclude}/absl/flags/Release/absl_flags_config.lib" + INTERFACE_INCLUDE_DIRECTORIES "${AbslInclude}" +) +endif() + +if(NOT TARGET absl::flags_internal) +add_library(absl::flags_internal STATIC IMPORTED) +set_target_properties(absl::flags_internal PROPERTIES + IMPORTED_LOCATION "${AbslInclude}/absl/flags/Release/absl_flags_internal.lib" + INTERFACE_INCLUDE_DIRECTORIES "${AbslInclude}" +) +endif() + +if(NOT TARGET absl::flags_marshalling) +add_library(absl::flags_marshalling STATIC IMPORTED) +set_target_properties(absl::flags_marshalling PROPERTIES + IMPORTED_LOCATION "${AbslInclude}/absl/flags/Release/absl_flags_marshalling.lib" + INTERFACE_INCLUDE_DIRECTORIES "${AbslInclude}" +) +endif() + +if(NOT TARGET absl::flags_private_handle_accessor) +add_library(absl::flags_private_handle_accessor STATIC IMPORTED) +set_target_properties(absl::flags_private_handle_accessor PROPERTIES + IMPORTED_LOCATION "${AbslInclude}/absl/flags/Release/absl_flags_private_handle_accessor.lib" + INTERFACE_INCLUDE_DIRECTORIES "${AbslInclude}" +) +endif() + +if(NOT TARGET absl::flags_program_name) +add_library(absl::flags_program_name STATIC IMPORTED) +set_target_properties(absl::flags_program_name PROPERTIES + IMPORTED_LOCATION "${AbslInclude}/absl/flags/Release/absl_flags_program_name.lib" + INTERFACE_INCLUDE_DIRECTORIES "${AbslInclude}" +) +endif() + +if(NOT TARGET absl::flags_reflection) +add_library(absl::flags_reflection STATIC IMPORTED) +set_target_properties(absl::flags_reflection PROPERTIES + IMPORTED_LOCATION "${AbslInclude}/absl/flags/Release/absl_flags_reflection.lib" + INTERFACE_INCLUDE_DIRECTORIES "${AbslInclude}" +) +endif() + +if(NOT TARGET absl::city) +add_library(absl::city STATIC IMPORTED) +set_target_properties(absl::city PROPERTIES + IMPORTED_LOCATION "${AbslInclude}/absl/hash/Release/absl_city.lib" + INTERFACE_INCLUDE_DIRECTORIES "${AbslInclude}" +) +endif() + +if(NOT TARGET absl::hash) +add_library(absl::hash STATIC IMPORTED) +set_target_properties(absl::hash PROPERTIES + IMPORTED_LOCATION "${AbslInclude}/absl/hash/Release/absl_hash.lib" + INTERFACE_INCLUDE_DIRECTORIES "${AbslInclude}" +) +endif() + +if(NOT TARGET absl::low_level_hash) +add_library(absl::low_level_hash STATIC IMPORTED) +set_target_properties(absl::low_level_hash PROPERTIES + IMPORTED_LOCATION "${AbslInclude}/absl/hash/Release/absl_low_level_hash.lib" + INTERFACE_INCLUDE_DIRECTORIES "${AbslInclude}" +) +endif() + +if(NOT TARGET absl::log_globals) +add_library(absl::log_globals STATIC IMPORTED) +set_target_properties(absl::log_globals PROPERTIES + IMPORTED_LOCATION "${AbslInclude}/absl/log/Release/absl_log_globals.lib" + INTERFACE_INCLUDE_DIRECTORIES "${AbslInclude}" +) +endif() + +if(NOT TARGET absl::log_internal_check_op) +add_library(absl::log_internal_check_op STATIC IMPORTED) +set_target_properties(absl::log_internal_check_op PROPERTIES + IMPORTED_LOCATION "${AbslInclude}/absl/log/Release/absl_log_internal_check_op.lib" + INTERFACE_INCLUDE_DIRECTORIES "${AbslInclude}" +) +endif() + +if(NOT TARGET absl::log_internal_conditions) +add_library(absl::log_internal_conditions STATIC IMPORTED) +set_target_properties(absl::log_internal_conditions PROPERTIES + IMPORTED_LOCATION "${AbslInclude}/absl/log/Release/absl_log_internal_conditions.lib" + INTERFACE_INCLUDE_DIRECTORIES "${AbslInclude}" +) +endif() + +if(NOT TARGET absl::log_internal_fnmatch) +add_library(absl::log_internal_fnmatch STATIC IMPORTED) +set_target_properties(absl::log_internal_fnmatch PROPERTIES + IMPORTED_LOCATION "${AbslInclude}/absl/log/Release/absl_log_internal_fnmatch.lib" + INTERFACE_INCLUDE_DIRECTORIES "${AbslInclude}" +) +endif() + +if(NOT TARGET absl::log_internal_format) +add_library(absl::log_internal_format STATIC IMPORTED) +set_target_properties(absl::log_internal_format PROPERTIES + IMPORTED_LOCATION "${AbslInclude}/absl/log/Release/absl_log_internal_format.lib" + INTERFACE_INCLUDE_DIRECTORIES "${AbslInclude}" +) +endif() + +if(NOT TARGET absl::log_internal_globals) +add_library(absl::log_internal_globals STATIC IMPORTED) +set_target_properties(absl::log_internal_globals PROPERTIES + IMPORTED_LOCATION "${AbslInclude}/absl/log/Release/absl_log_internal_globals.lib" + INTERFACE_INCLUDE_DIRECTORIES "${AbslInclude}" +) +endif() + +if(NOT TARGET absl::log_internal_log_sink_set) +add_library(absl::log_internal_log_sink_set STATIC IMPORTED) +set_target_properties(absl::log_internal_log_sink_set PROPERTIES + IMPORTED_LOCATION "${AbslInclude}/absl/log/Release/absl_log_internal_log_sink_set.lib" + INTERFACE_INCLUDE_DIRECTORIES "${AbslInclude}" +) +endif() + +if(NOT TARGET absl::log_internal_message) +add_library(absl::log_internal_message STATIC IMPORTED) +set_target_properties(absl::log_internal_message PROPERTIES + IMPORTED_LOCATION "${AbslInclude}/absl/log/Release/absl_log_internal_message.lib" + INTERFACE_INCLUDE_DIRECTORIES "${AbslInclude}" +) +endif() + +if(NOT TARGET absl::log_internal_nullguard) +add_library(absl::log_internal_nullguard STATIC IMPORTED) +set_target_properties(absl::log_internal_nullguard PROPERTIES + IMPORTED_LOCATION "${AbslInclude}/absl/log/Release/absl_log_internal_nullguard.lib" + INTERFACE_INCLUDE_DIRECTORIES "${AbslInclude}" +) +endif() + +if(NOT TARGET absl::log_internal_proto) +add_library(absl::log_internal_proto STATIC IMPORTED) +set_target_properties(absl::log_internal_proto PROPERTIES + IMPORTED_LOCATION "${AbslInclude}/absl/log/Release/absl_log_internal_proto.lib" + INTERFACE_INCLUDE_DIRECTORIES "${AbslInclude}" +) +endif() + +if(NOT TARGET absl::log_internal_structured_proto) +add_library(absl::log_internal_structured_proto STATIC IMPORTED) +set_target_properties(absl::log_internal_structured_proto PROPERTIES + IMPORTED_LOCATION "${AbslInclude}/absl/log/Release/absl_log_internal_structured_proto.lib" + INTERFACE_INCLUDE_DIRECTORIES "${AbslInclude}" +) +endif() + +if(NOT TARGET absl::log_sink) +add_library(absl::log_sink STATIC IMPORTED) +set_target_properties(absl::log_sink PROPERTIES + IMPORTED_LOCATION "${AbslInclude}/absl/log/Release/absl_log_sink.lib" + INTERFACE_INCLUDE_DIRECTORIES "${AbslInclude}" +) +endif() + +if(NOT TARGET absl::vlog_config_internal) +add_library(absl::vlog_config_internal STATIC IMPORTED) +set_target_properties(absl::vlog_config_internal PROPERTIES + IMPORTED_LOCATION "${AbslInclude}/absl/log/Release/absl_vlog_config_internal.lib" + INTERFACE_INCLUDE_DIRECTORIES "${AbslInclude}" +) +endif() + +if(NOT TARGET absl::int128) +add_library(absl::int128 STATIC IMPORTED) +set_target_properties(absl::int128 PROPERTIES + IMPORTED_LOCATION "${AbslInclude}/absl/numeric/Release/absl_int128.lib" + INTERFACE_INCLUDE_DIRECTORIES "${AbslInclude}" +) +endif() + +if(NOT TARGET absl::exponential_biased) +add_library(absl::exponential_biased STATIC IMPORTED) +set_target_properties(absl::exponential_biased PROPERTIES + IMPORTED_LOCATION "${AbslInclude}/absl/profiling/Release/absl_exponential_biased.lib" + INTERFACE_INCLUDE_DIRECTORIES "${AbslInclude}" +) +endif() + +if(NOT TARGET absl::cord_internal) +add_library(absl::cord_internal STATIC IMPORTED) +set_target_properties(absl::cord_internal PROPERTIES + IMPORTED_LOCATION "${AbslInclude}/absl/strings/Release/absl_cord_internal.lib" + INTERFACE_INCLUDE_DIRECTORIES "${AbslInclude}" +) +endif() + +if(NOT TARGET absl::cord) +add_library(absl::cord STATIC IMPORTED) +set_target_properties(absl::cord PROPERTIES + IMPORTED_LOCATION "${AbslInclude}/absl/strings/Release/absl_cord.lib" + INTERFACE_INCLUDE_DIRECTORIES "${AbslInclude}" +) +endif() + +if(NOT TARGET absl::cordz_functions) +add_library(absl::cordz_functions STATIC IMPORTED) +set_target_properties(absl::cordz_functions PROPERTIES + IMPORTED_LOCATION "${AbslInclude}/absl/strings/Release/absl_cordz_functions.lib" + INTERFACE_INCLUDE_DIRECTORIES "${AbslInclude}" +) +endif() + +if(NOT TARGET absl::cordz_handle) +add_library(absl::cordz_handle STATIC IMPORTED) +set_target_properties(absl::cordz_handle PROPERTIES + IMPORTED_LOCATION "${AbslInclude}/absl/strings/Release/absl_cordz_handle.lib" + INTERFACE_INCLUDE_DIRECTORIES "${AbslInclude}" +) +endif() + +if(NOT TARGET absl::cordz_info) +add_library(absl::cordz_info STATIC IMPORTED) +set_target_properties(absl::cordz_info PROPERTIES + IMPORTED_LOCATION "${AbslInclude}/absl/strings/Release/absl_cordz_info.lib" + INTERFACE_INCLUDE_DIRECTORIES "${AbslInclude}" +) +endif() + +if(NOT TARGET absl::str_format_internal) +add_library(absl::str_format_internal STATIC IMPORTED) +set_target_properties(absl::str_format_internal PROPERTIES + IMPORTED_LOCATION "${AbslInclude}/absl/strings/Release/absl_str_format_internal.lib" + INTERFACE_INCLUDE_DIRECTORIES "${AbslInclude}" +) +endif() + +if(NOT TARGET absl::string_view) +add_library(absl::string_view STATIC IMPORTED) +set_target_properties(absl::string_view PROPERTIES + IMPORTED_LOCATION "${AbslInclude}/absl/strings/Release/absl_string_view.lib" + INTERFACE_INCLUDE_DIRECTORIES "${AbslInclude}" +) +endif() + +if(NOT TARGET absl::strings_internal) +add_library(absl::strings_internal STATIC IMPORTED) +set_target_properties(absl::strings_internal PROPERTIES + IMPORTED_LOCATION "${AbslInclude}/absl/strings/Release/absl_strings_internal.lib" + INTERFACE_INCLUDE_DIRECTORIES "${AbslInclude}" +) +endif() + +if(NOT TARGET absl::strings) +add_library(absl::strings STATIC IMPORTED) +set_target_properties(absl::strings PROPERTIES + IMPORTED_LOCATION "${AbslInclude}/absl/strings/Release/absl_strings.lib" + INTERFACE_INCLUDE_DIRECTORIES "${AbslInclude}" +) +endif() + +if(NOT TARGET absl::graphcycles_internal) +add_library(absl::graphcycles_internal STATIC IMPORTED) +set_target_properties(absl::graphcycles_internal PROPERTIES + IMPORTED_LOCATION "${AbslInclude}/absl/synchronization/Release/absl_graphcycles_internal.lib" + INTERFACE_INCLUDE_DIRECTORIES "${AbslInclude}" +) +endif() + +if(NOT TARGET absl::kernel_timeout_internal) +add_library(absl::kernel_timeout_internal STATIC IMPORTED) +set_target_properties(absl::kernel_timeout_internal PROPERTIES + IMPORTED_LOCATION "${AbslInclude}/absl/synchronization/Release/absl_kernel_timeout_internal.lib" + INTERFACE_INCLUDE_DIRECTORIES "${AbslInclude}" +) +endif() + +if(NOT TARGET absl::synchronization) +add_library(absl::synchronization STATIC IMPORTED) +set_target_properties(absl::synchronization PROPERTIES + IMPORTED_LOCATION "${AbslInclude}/absl/synchronization/Release/absl_synchronization.lib" + INTERFACE_INCLUDE_DIRECTORIES "${AbslInclude}" +) +endif() + +if(NOT TARGET absl::civil_time) +add_library(absl::civil_time STATIC IMPORTED) +set_target_properties(absl::civil_time PROPERTIES + IMPORTED_LOCATION "${AbslInclude}/absl/time/Release/absl_civil_time.lib" + INTERFACE_INCLUDE_DIRECTORIES "${AbslInclude}" +) +endif() + +if(NOT TARGET absl::time_zone) +add_library(absl::time_zone STATIC IMPORTED) +set_target_properties(absl::time_zone PROPERTIES + IMPORTED_LOCATION "${AbslInclude}/absl/time/Release/absl_time_zone.lib" + INTERFACE_INCLUDE_DIRECTORIES "${AbslInclude}" +) +endif() + +if(NOT TARGET absl::time) +add_library(absl::time STATIC IMPORTED) +set_target_properties(absl::time PROPERTIES + IMPORTED_LOCATION "${AbslInclude}/absl/time/Release/absl_time.lib" + INTERFACE_INCLUDE_DIRECTORIES "${AbslInclude}" +) +endif() + +# -------------------- +# RE2 requires these additional absl targets +# -------------------- +if(NOT TARGET absl::absl_check) +add_library(absl::absl_check STATIC IMPORTED) +set_target_properties(absl::absl_check PROPERTIES + IMPORTED_LOCATION "${AbslInclude}/absl/log/Release/absl_check.lib" + INTERFACE_INCLUDE_DIRECTORIES "${AbslInclude}" +) +endif() + +if(NOT TARGET absl::absl_log) +add_library(absl::absl_log STATIC IMPORTED) +set_target_properties(absl::absl_log PROPERTIES + IMPORTED_LOCATION "${AbslInclude}/absl/log/Release/absl_log.lib" + INTERFACE_INCLUDE_DIRECTORIES "${AbslInclude}" +) +endif() + +if(NOT TARGET absl::flags) +add_library(absl::flags STATIC IMPORTED) +set_target_properties(absl::flags PROPERTIES + IMPORTED_LOCATION "${AbslInclude}/absl/flags/Release/absl_flags.lib" + INTERFACE_INCLUDE_DIRECTORIES "${AbslInclude}" +) +endif() + +if(NOT TARGET absl::str_format) +add_library(absl::str_format STATIC IMPORTED) +set_target_properties(absl::str_format PROPERTIES + IMPORTED_LOCATION "${AbslInclude}/absl/strings/Release/absl_str_format.lib" + INTERFACE_INCLUDE_DIRECTORIES "${AbslInclude}" +) +endif() + +# Header-only targets (no .lib) +if(NOT TARGET absl::core_headers) +add_library(absl::core_headers INTERFACE IMPORTED) +set_target_properties(absl::core_headers PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${AbslInclude}" +) +endif() + +if(NOT TARGET absl::fixed_array) +add_library(absl::fixed_array INTERFACE IMPORTED) +set_target_properties(absl::fixed_array PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${AbslInclude}" +) +endif() + +if(NOT TARGET absl::flat_hash_map) +add_library(absl::flat_hash_map INTERFACE IMPORTED) +set_target_properties(absl::flat_hash_map PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${AbslInclude}" +) +endif() + +if(NOT TARGET absl::flat_hash_set) +add_library(absl::flat_hash_set INTERFACE IMPORTED) +set_target_properties(absl::flat_hash_set PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${AbslInclude}" +) +endif() + +if(NOT TARGET absl::inlined_vector) +add_library(absl::inlined_vector INTERFACE IMPORTED) +set_target_properties(absl::inlined_vector PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${AbslInclude}" +) +endif() + +if(NOT TARGET absl::optional) +add_library(absl::optional INTERFACE IMPORTED) +set_target_properties(absl::optional PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${AbslInclude}" +) +endif() + +if(NOT TARGET absl::span) +add_library(absl::span INTERFACE IMPORTED) +set_target_properties(absl::span PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${AbslInclude}" +) +endif() +"@ + +# ----------------------------------------------------------- +# Step 3: Build RE2 from source, linking against pre-built abseil +# ----------------------------------------------------------- +$Re2Version = "2024-07-02" +$Re2Url = "https://github.com/google/re2/archive/refs/tags/$Re2Version.zip" +$Re2DownloadDir = "$env:TEMP\re2_download" +$Re2SourceDir = "$Re2DownloadDir\re2-$Re2Version" +$Re2BuildDir = "$Re2SourceDir\build" +$Re2InstallDir = "$ONNX_BUILD/_deps/onnx-build/Release" + +Write-Host "Downloading RE2 $Re2Version..." +New-Item -ItemType Directory -Force -Path $Re2DownloadDir | Out-Null +$Re2ZipFile = Join-Path $Re2DownloadDir "re2-$Re2Version.zip" +Invoke-WebRequest -Uri $Re2Url -OutFile $Re2ZipFile -UseBasicParsing +Expand-Archive -Path $Re2ZipFile -DestinationPath $Re2DownloadDir -Force + +# Use forward-slash paths for cmake to avoid escape sequence issues with backslashes +$Re2InstallDirFS = $Re2InstallDir -replace '\\', '/' +$AbslModulePath = $AbslInstallDir -replace '\\', '/' + +Write-Host "Configuring RE2 with CMake..." +New-Item -ItemType Directory -Force -Path $Re2BuildDir | Out-Null +cmake -S "$Re2SourceDir" -B "$Re2BuildDir" ` + -G "Visual Studio 17 2022" ` + -A x64 ` + -DCMAKE_BUILD_TYPE=Release ` + -DCMAKE_INSTALL_PREFIX="$Re2InstallDirFS" ` + -DBUILD_SHARED_LIBS=OFF ` + -DRE2_BUILD_TESTING=OFF ` + -DRE2_USE_EXTERNAL_ABSL=ON ` + -DCMAKE_MODULE_PATH="$AbslModulePath" ` + -DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreaded ` + -DCMAKE_CXX_STANDARD=17 ` + -DCMAKE_CXX_STANDARD_REQUIRED=ON ` + -DCMAKE_C_FLAGS="/MT /D_CRT_NONSTDC_NO_DEPRECATE /D_CRT_SECURE_NO_WARNINGS /I$AbslInstallDirFS/include" ` + -DCMAKE_CXX_FLAGS="/MT /D_CRT_NONSTDC_NO_DEPRECATE /D_CRT_SECURE_NO_WARNINGS /I$AbslInstallDirFS/include" ` + -DCMAKE_C_FLAGS_RELEASE="/MT /D_CRT_NONSTDC_NO_DEPRECATE /D_CRT_SECURE_NO_WARNINGS /I$AbslInstallDirFS/include" ` + -DCMAKE_CXX_FLAGS_RELEASE="/MT /D_CRT_NONSTDC_NO_DEPRECATE /D_CRT_SECURE_NO_WARNINGS /I$AbslInstallDirFS/include" ` + -DCMAKE_EXE_LINKER_FLAGS="/DEFAULTLIB:legacy_stdio_definitions.lib /DEFAULTLIB:OLDNAMES.lib" ` + -DCMAKE_STATIC_LINKER_FLAGS="/DEFAULTLIB:legacy_stdio_definitions.lib /DEFAULTLIB:OLDNAMES.lib" +if ($LASTEXITCODE -ne 0) { exit 1 } + +Write-Host "Building RE2..." +cmake --build "$Re2BuildDir" --config Release --verbose +if ($LASTEXITCODE -ne 0) { exit 1 } + +Write-Host "Installing RE2 to $Re2InstallDirFS..." +cmake --build "$Re2BuildDir" --config Release --target INSTALL +if ($LASTEXITCODE -ne 0) { exit 1 } + +Write-Host "Done installing re2.lib!" +Write-Host "Static library: $Re2InstallDir\lib" +Write-Host "Headers: $Re2InstallDir\include" + +# Copy re2.lib to where ort-sys expects it +$Re2SysDir = "$ONNX_BUILD/_deps/re2-build" +New-Item -ItemType Directory -Path $Re2SysDir -Force +Copy-Item -Path "$Re2InstallDir/lib/re2.lib" -Destination "$Re2SysDir/re2.lib" -Force +New-Item -ItemType Directory -Path "$Re2SysDir/Release" -Force +Copy-Item -Path "$Re2InstallDir/lib/re2.lib" -Destination "$Re2SysDir/Release/re2.lib" -Force +Write-Host "Copied re2.lib to $Re2SysDir/re2.lib and $Re2SysDir/Release/re2.lib" + +# Clean up download artifacts +Remove-Item -Recurse -Force -ErrorAction SilentlyContinue $Re2DownloadDir +Remove-Item -Recurse -Force -ErrorAction SilentlyContinue $AbslDownloadDir + +Write-Host "=== Abseil (absl) and RE2 static libraries built successfully ===" + +# ========================================================== +# BUILD ONNX RUNTIME (Single Block, No Duplicates) +# ========================================================== +Write-Host "=== Building ONNX Runtime ===" + +# Clone ONNX Runtime if not present +if (Test-Path $ONNX_SRC) { + Remove-Item -Recurse -Force -ErrorAction SilentlyContinue $ONNX_SRC +} +git clone --recursive https://github.com/microsoft/onnxruntime $ONNX_SRC +if ($LASTEXITCODE -ne 0) { exit 1 } + +# Update submodules +Push-Location $ONNX_SRC +git fetch --tags +if ($LASTEXITCODE -ne 0) { exit 1 } +git checkout tags/v1.23.2 -b build-v1.23.2 +if ($LASTEXITCODE -ne 0) { exit 1 } +git submodule update --init --recursive --force +if ($LASTEXITCODE -ne 0) { exit 1 } +Pop-Location + +# ----------------------------- +# Set ONNX flags depending on variant +# ----------------------------- +switch ($VARIANT) { + "cpu" { + $ONNX_CUDA_FLAG = "OFF" + $ONNX_VULKAN_FLAG = "OFF" + $ONNX_USE_BLAS = "ON" + + $ORT_EXTRA_CMAKE_ARGS = @( + "-DORT_MINIMAL_BUILD=ON" + ) + } + "vulkan" { + $ONNX_CUDA_FLAG = "OFF" + $ONNX_VULKAN_FLAG = "ON" + $ONNX_USE_BLAS = "ON" + } + "cuda" { + $ONNX_CUDA_FLAG = "ON" + $ONNX_VULKAN_FLAG = "OFF" + $ONNX_USE_BLAS = "ON" + } +} + +# Make sure the build directory exists +if (-not (Test-Path $ONNX_BUILD)) { + New-Item -ItemType Directory -Path $ONNX_BUILD | Out-Null +} + +# ----------------------------- +# Configure ONNX Runtime using CMake +# ----------------------------- + +$ONNX_CMAKE_ARGS = @( + "-S", "$ONNX_SRC/cmake", + "-B", "$ONNX_BUILD", + "-G", "Visual Studio 17 2022", + "-A", "x64", + "-DCMAKE_CXX_STANDARD=17", + "-DCMAKE_CXX_STANDARD_REQUIRED=ON", + "-DCMAKE_BUILD_TYPE=Release", + "-Dabsl_DIR=$AbslInstallDirFS", + "-DBUILD_SHARED_LIBS=OFF", + "-DCMAKE_COMPILE_WARNING_AS_ERROR=OFF", + "-DCMAKE_POSITION_INDEPENDENT_CODE=OFF", + "-Donnxruntime_BUILD_SHARED_LIB=OFF", + "-Donnxruntime_ENABLE_STATIC_ANALYSIS=OFF", + "-DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreaded", + "-DCMAKE_POLICY_DEFAULT_CMP0091=NEW", + "-DCMAKE_C_FLAGS=/MT /D_CRT_NONSTDC_NO_DEPRECATE /D_CRT_SECURE_NO_WARNINGS", + "-DCMAKE_CXX_FLAGS=/MT /D_CRT_NONSTDC_NO_DEPRECATE /D_CRT_SECURE_NO_WARNINGS", + "-DCMAKE_C_FLAGS_RELEASE=/MT /D_CRT_NONSTDC_NO_DEPRECATE /D_CRT_SECURE_NO_WARNINGS", + "-DCMAKE_CXX_FLAGS_RELEASE=/MT /D_CRT_NONSTDC_NO_DEPRECATE /D_CRT_SECURE_NO_WARNINGS", + "-DCMAKE_C_FLAGS_RELWITHDEBINFO=/MT /D_CRT_NONSTDC_NO_DEPRECATE /D_CRT_SECURE_NO_WARNINGS", + "-DCMAKE_CXX_FLAGS_RELWITHDEBINFO=/MT /D_CRT_NONSTDC_NO_DEPRECATE /D_CRT_SECURE_NO_WARNINGS", + "-DCMAKE_C_FLAGS_DEBUG=/MTd /D_CRT_NONSTDC_NO_DEPRECATE /D_CRT_SECURE_NO_WARNINGS", + "-DCMAKE_CXX_FLAGS_DEBUG=/MTd /D_CRT_NONSTDC_NO_DEPRECATE /D_CRT_SECURE_NO_WARNINGS", + "-DCMAKE_EXE_LINKER_FLAGS=/DEFAULTLIB:legacy_stdio_definitions.lib /DEFAULTLIB:OLDNAMES.lib", + "-DCMAKE_STATIC_LINKER_FLAGS=/DEFAULTLIB:legacy_stdio_definitions.lib /DEFAULTLIB:OLDNAMES.lib", + "-Donnxruntime_BUILD_UNIT_TESTS=OFF", + "-Donnxruntime_USE_AVX=OFF", + "-Donnxruntime_USE_AVX2=OFF", + "-Donnxruntime_USE_AVX512=OFF", + "-Donnxruntime_RUN_ONNX_TESTS=OFF", + "-Donnxruntime_USE_XNNPACK=OFF", + "-Donnxruntime_USE_DML=OFF", + "-DBUILD_TESTING=OFF", + "-DONNX_USE_MSVC_STATIC_RUNTIME=ON", + "-DONNX_USE_PROTOBUF_SHARED_LIBS=OFF", + "-Donnxruntime_USE_FULL_PROTOBUF=OFF", + "-Donnxruntime_MSVC_STATIC_RUNTIME=ON", + "-DABSL_ENABLE_INSTALL=ON", + "-DABSL_MSVC_STATIC_RUNTIME=ON", + "-Donnxruntime_USE_CUDA=$ONNX_CUDA_FLAG" +) + +if ($ORT_EXTRA_CMAKE_ARGS) { + $ONNX_CMAKE_ARGS += $ORT_EXTRA_CMAKE_ARGS +} + +# Conditionally add CUDA-specific options only if CUDA is ON +if ($ONNX_CUDA_FLAG -eq "ON") { + $cuda_root = $env:CUDAToolkit_ROOT + $ONNX_CMAKE_ARGS += @( + "-DCUDAToolkit_ROOT=$cuda_root" + # Add other CUDA-related flags here if needed + ) +} + +# Run CMake with the assembled arguments +cmake @ONNX_CMAKE_ARGS + +# ----------------------------- +# Build ONNX Runtime +# ----------------------------- +cmake --build $ONNX_BUILD --config Release + +# Combine all onnxruntime .lib files into a single onnxruntime.lib +# so ort-sys can find it (avoids complex directory matching in its build script) +Write-Host "Combining onnxruntime .lib files into single onnxruntime.lib..." +$onnxLibFiles = Get-ChildItem -Path "$ONNX_BUILD\Release" -Filter "onnxruntime_*.lib" | Select-Object -ExpandProperty FullName +& "lib.exe" /out:"$ONNX_BUILD\Release\onnxruntime.lib" -nologo $onnxLibFiles +# Copy to base directory where ort-sys's static_link() checks for it +Copy-Item -Path "$ONNX_BUILD\Release\onnxruntime.lib" -Destination "$ONNX_BUILD\onnxruntime.lib" -Force + +# ========================================================== +# EXPORT ENVIRONMENT +# ========================================================== + + +# ========================================================== +# EXPORT ENVIRONMENT +# ========================================================== +$env:ONNXRUNTIME_INCLUDE_DIR = Join-Path $ONNX_SRC "include" +$env:ORT_STRATEGY = "system" +$env:ORT_LIB_LOCATION = $ONNX_BUILD +$env:ORT_PREFER_DYNAMIC_LINK = "0" +$env:ONNXRUNTIME_LIB_DIR = Join-Path $ONNX_BUILD "Release" +# ----------------------------------------------------------- +$env:GGML_BLAS = "ON" +$env:BLAS_STATIC = "ON" +$env:GGML_BLAS_STATIC = "ON" +$env:BLAS_VENDOR = "OpenBLAS" +$env:BLA_VENDOR = "OpenBLAS" +$env:GGML_BLAS_VENDOR = "OpenBLAS" +$env:BLAS_INCLUDE_DIRS = $INCLUDE_DIR +$env:BLAS_LIBRARIES = $OPENBLAS_LIB +$env:OPENBLAS_PATH = $PREBUILT_OPENBLAS_DIR +$env:OPENBLAS_DIR = $PREBUILT_OPENBLAS_DIR +$env:CMAKE_PREFIX_PATH = "${PREBUILT_OPENBLAS_DIR};${ONNX_BUILD}" +$env:CMAKE_ARGS = "-DGGML_BLAS=ON -DGGML_BLAS_STATIC=ON -DGGML_BLAS_VENDOR=OpenBLAS -DBLAS_VENDOR=OpenBLAS -DOPENBLAS_PATH=$PREBUILT_OPENBLAS_DIR -DBLAS_INCLUDE_DIRS=$INCLUDE_DIR -DBLAS_LIBRARIES=$OPENBLAS_LIB -DBLA_VENDOR=OpenBLAS -DBLAS_ROOT=$PREBUILT_OPENBLAS_DIR -DBLAS_DIR=$PREBUILT_OPENBLAS_DIR -DBLAS_LIBDIR=$LIB_DIR -DBLA_STATIC=ON" +$env:WHISPER_RS_STATIC_CRT = "1" +$env:ORT_SYS_STATIC_CRT = "1" +$env:ESPEAK_RS_STATIC_CRT = "1" +$env:ESPEAK_NG_DIR = $ESPEAK_INSTALL + + +Write-Host "`n=== FINAL .lib files in $ONNX_BUILD ===" +Get-ChildItem -Path $ONNX_BUILD -Filter *.lib -Recurse -File | + ForEach-Object { Write-Host $_.FullName } + +Write-Host "`n=== VCPKG .lib files in $env:VCPKG_ROOT ===" +Get-ChildItem -Path "$env:VCPKG_ROOT" -Recurse -File -Filter *.lib | + ForEach-Object { Write-Host $_.FullName } + +# Set ORT crate feature flags +if ($WITH_CUDA) { $env:ORT_USE_CUDA = "1" } else { Remove-Item Env:ORT_USE_CUDA -ErrorAction SilentlyContinue } +if ($WITH_OPENBLAS){ $env:ORT_USE_OPENMP = "1" } else { Remove-Item Env:ORT_USE_OPENMP -ErrorAction SilentlyContinue } + +Write-Host "ORT_USE_CUDA = $env:ORT_USE_CUDA" +Write-Host "ORT_USE_OPENMP = $env:ORT_USE_OPENMP" + +# ========================================================== +# BUILD RUST BINARY WITH FEATURES +# ========================================================== +$TARGET = "x86_64-pc-windows-msvc" + +$CARGO_FEATURES = @() +if ($WITH_OPENBLAS) { $CARGO_FEATURES += "whisper-openblas" } +if ($WITH_VULKAN) { $CARGO_FEATURES += "whisper-vulkan" } +if ($WITH_CUDA) { $CARGO_FEATURES += "whisper-cuda" } + + +# Move vcpkg re2.lib dep to target folder so ort-sys can find it +# NOTE: (for some reason onnx runtime doesnt build re2.lib) +# Copy-Item -Path "C:\vcpkg\installed\x64-windows-static\lib\re2.lib" -Destination "$ONNX_BUILD\_deps\onnx-build\Release\re2.lib" -Force +# Remove-Item -Path "C:\vcpkg\installed\*" -Recurse -Force +# Remove-Item -Path "C:\vcpkg\buildtrees\*" -Recurse -Force +# Remove-Item -Path "C:\vcpkg\packages\*" -Recurse -Force + +# Before cargo build +$env:RUSTFLAGS = "-C target-feature=+crt-static ` + -C codegen-units=1 ` + -C opt-level=3 ` + -C link-arg=$ONNX_BUILD/_deps/re2-build/Release/re2.lib ` + -C link-arg=$ONNX_BUILD/_deps/abseil_cpp-build/absl/base/Release/absl_base.lib ` + -C link-arg=$ONNX_BUILD/_deps/abseil_cpp-build/absl/base/Release/absl_log_severity.lib ` + -C link-arg=$ONNX_BUILD/_deps/abseil_cpp-build/absl/base/Release/absl_malloc_internal.lib ` + -C link-arg=$ONNX_BUILD/_deps/abseil_cpp-build/absl/base/Release/absl_raw_logging_internal.lib ` + -C link-arg=$ONNX_BUILD/_deps/abseil_cpp-build/absl/base/Release/absl_spinlock_wait.lib ` + -C link-arg=$ONNX_BUILD/_deps/abseil_cpp-build/absl/base/Release/absl_strerror.lib ` + -C link-arg=$ONNX_BUILD/_deps/abseil_cpp-build/absl/base/Release/absl_throw_delegate.lib ` + -C link-arg=$ONNX_BUILD/_deps/abseil_cpp-build/absl/base/Release/absl_tracing_internal.lib ` + -C link-arg=$ONNX_BUILD/_deps/abseil_cpp-build/absl/container/Release/absl_hashtablez_sampler.lib ` + -C link-arg=$ONNX_BUILD/_deps/abseil_cpp-build/absl/container/Release/absl_raw_hash_set.lib ` + -C link-arg=$ONNX_BUILD/_deps/abseil_cpp-build/absl/crc/Release/absl_crc_cord_state.lib ` + -C link-arg=$ONNX_BUILD/_deps/abseil_cpp-build/absl/crc/Release/absl_crc_cpu_detect.lib ` + -C link-arg=$ONNX_BUILD/_deps/abseil_cpp-build/absl/crc/Release/absl_crc_internal.lib ` + -C link-arg=$ONNX_BUILD/_deps/abseil_cpp-build/absl/crc/Release/absl_crc32c.lib ` + -C link-arg=$ONNX_BUILD/_deps/abseil_cpp-build/absl/debugging/Release/absl_debugging_internal.lib ` + -C link-arg=$ONNX_BUILD/_deps/abseil_cpp-build/absl/debugging/Release/absl_decode_rust_punycode.lib ` + -C link-arg=$ONNX_BUILD/_deps/abseil_cpp-build/absl/debugging/Release/absl_demangle_internal.lib ` + -C link-arg=$ONNX_BUILD/_deps/abseil_cpp-build/absl/debugging/Release/absl_demangle_rust.lib ` + -C link-arg=$ONNX_BUILD/_deps/abseil_cpp-build/absl/debugging/Release/absl_examine_stack.lib ` + -C link-arg=$ONNX_BUILD/_deps/abseil_cpp-build/absl/debugging/Release/absl_leak_check.lib ` + -C link-arg=$ONNX_BUILD/_deps/abseil_cpp-build/absl/debugging/Release/absl_stacktrace.lib ` + -C link-arg=$ONNX_BUILD/_deps/abseil_cpp-build/absl/debugging/Release/absl_symbolize.lib ` + -C link-arg=$ONNX_BUILD/_deps/abseil_cpp-build/absl/debugging/Release/absl_utf8_for_code_point.lib ` + -C link-arg=$ONNX_BUILD/_deps/abseil_cpp-build/absl/flags/Release/absl_flags_commandlineflag_internal.lib ` + -C link-arg=$ONNX_BUILD/_deps/abseil_cpp-build/absl/flags/Release/absl_flags_commandlineflag.lib ` + -C link-arg=$ONNX_BUILD/_deps/abseil_cpp-build/absl/flags/Release/absl_flags_config.lib ` + -C link-arg=$ONNX_BUILD/_deps/abseil_cpp-build/absl/flags/Release/absl_flags_internal.lib ` + -C link-arg=$ONNX_BUILD/_deps/abseil_cpp-build/absl/flags/Release/absl_flags_marshalling.lib ` + -C link-arg=$ONNX_BUILD/_deps/abseil_cpp-build/absl/flags/Release/absl_flags_private_handle_accessor.lib ` + -C link-arg=$ONNX_BUILD/_deps/abseil_cpp-build/absl/flags/Release/absl_flags_program_name.lib ` + -C link-arg=$ONNX_BUILD/_deps/abseil_cpp-build/absl/flags/Release/absl_flags_reflection.lib ` + -C link-arg=$ONNX_BUILD/_deps/abseil_cpp-build/absl/hash/Release/absl_city.lib ` + -C link-arg=$ONNX_BUILD/_deps/abseil_cpp-build/absl/hash/Release/absl_hash.lib ` + -C link-arg=$ONNX_BUILD/_deps/abseil_cpp-build/absl/hash/Release/absl_low_level_hash.lib ` + -C link-arg=$ONNX_BUILD/_deps/abseil_cpp-build/absl/log/Release/absl_log_globals.lib ` + -C link-arg=$ONNX_BUILD/_deps/abseil_cpp-build/absl/log/Release/absl_log_internal_check_op.lib ` + -C link-arg=$ONNX_BUILD/_deps/abseil_cpp-build/absl/log/Release/absl_log_internal_conditions.lib ` + -C link-arg=$ONNX_BUILD/_deps/abseil_cpp-build/absl/log/Release/absl_log_internal_fnmatch.lib ` + -C link-arg=$ONNX_BUILD/_deps/abseil_cpp-build/absl/log/Release/absl_log_internal_format.lib ` + -C link-arg=$ONNX_BUILD/_deps/abseil_cpp-build/absl/log/Release/absl_log_internal_globals.lib ` + -C link-arg=$ONNX_BUILD/_deps/abseil_cpp-build/absl/log/Release/absl_log_internal_log_sink_set.lib ` + -C link-arg=$ONNX_BUILD/_deps/abseil_cpp-build/absl/log/Release/absl_log_internal_message.lib ` + -C link-arg=$ONNX_BUILD/_deps/abseil_cpp-build/absl/log/Release/absl_log_internal_nullguard.lib ` + -C link-arg=$ONNX_BUILD/_deps/abseil_cpp-build/absl/log/Release/absl_log_internal_proto.lib ` + -C link-arg=$ONNX_BUILD/_deps/abseil_cpp-build/absl/log/Release/absl_log_internal_structured_proto.lib ` + -C link-arg=$ONNX_BUILD/_deps/abseil_cpp-build/absl/log/Release/absl_log_sink.lib ` + -C link-arg=$ONNX_BUILD/_deps/abseil_cpp-build/absl/log/Release/absl_vlog_config_internal.lib ` + -C link-arg=$ONNX_BUILD/_deps/abseil_cpp-build/absl/numeric/Release/absl_int128.lib ` + -C link-arg=$ONNX_BUILD/_deps/abseil_cpp-build/absl/profiling/Release/absl_exponential_biased.lib ` + -C link-arg=$ONNX_BUILD/_deps/abseil_cpp-build/absl/strings/Release/absl_cord_internal.lib ` + -C link-arg=$ONNX_BUILD/_deps/abseil_cpp-build/absl/strings/Release/absl_cord.lib ` + -C link-arg=$ONNX_BUILD/_deps/abseil_cpp-build/absl/strings/Release/absl_cordz_functions.lib ` + -C link-arg=$ONNX_BUILD/_deps/abseil_cpp-build/absl/strings/Release/absl_cordz_handle.lib ` + -C link-arg=$ONNX_BUILD/_deps/abseil_cpp-build/absl/strings/Release/absl_cordz_info.lib ` + -C link-arg=$ONNX_BUILD/_deps/abseil_cpp-build/absl/strings/Release/absl_str_format_internal.lib ` + -C link-arg=$ONNX_BUILD/_deps/abseil_cpp-build/absl/strings/Release/absl_string_view.lib ` + -C link-arg=$ONNX_BUILD/_deps/abseil_cpp-build/absl/strings/Release/absl_strings_internal.lib ` + -C link-arg=$ONNX_BUILD/_deps/abseil_cpp-build/absl/strings/Release/absl_strings.lib ` + -C link-arg=$ONNX_BUILD/_deps/abseil_cpp-build/absl/synchronization/Release/absl_graphcycles_internal.lib ` + -C link-arg=$ONNX_BUILD/_deps/abseil_cpp-build/absl/synchronization/Release/absl_kernel_timeout_internal.lib ` + -C link-arg=$ONNX_BUILD/_deps/abseil_cpp-build/absl/synchronization/Release/absl_synchronization.lib ` + -C link-arg=$ONNX_BUILD/_deps/abseil_cpp-build/absl/time/Release/absl_civil_time.lib ` + -C link-arg=$ONNX_BUILD/_deps/abseil_cpp-build/absl/time/Release/absl_time_zone.lib ` + -C link-arg=$ONNX_BUILD/_deps/abseil_cpp-build/absl/time/Release/absl_time.lib ` + -C link-arg=$ONNX_BUILD/_deps/abseil_cpp-build/absl/log/Release/absl_check.lib ` + -C link-arg=$ONNX_BUILD/_deps/abseil_cpp-build/absl/log/Release/absl_log.lib ` + -C link-arg=$ONNX_BUILD/_deps/abseil_cpp-build/absl/flags/Release/absl_flags.lib ` + -C link-arg=$ONNX_BUILD/_deps/abseil_cpp-build/absl/strings/Release/absl_str_format.lib ` + -C link-arg=$ONNX_BUILD/_deps/protobuf-build/Release/libprotobuf-lite.lib ` + -C link-arg=$ONNX_BUILD/_deps/protobuf-build/Release/libprotobuf.lib ` + -C link-arg=$ONNX_BUILD/_deps/protobuf-build/Release/libprotoc.lib ` + -C link-arg=$ONNX_BUILD/_deps/pytorch_cpuinfo-build/Release/cpuinfo.lib ` + -C link-arg=$ONNX_BUILD/_deps/flatbuffers-build/Release/flatbuffers.lib ` + -C link-arg=$ONNX_BUILD/Release/onnxruntime_common.lib ` + -C link-arg=$ONNX_BUILD/Release/onnxruntime_flatbuffers.lib ` + -C link-arg=$ONNX_BUILD/Release/onnxruntime_framework.lib ` + -C link-arg=$ONNX_BUILD/Release/onnxruntime_graph.lib ` + -C link-arg=$ONNX_BUILD/Release/onnxruntime_lora.lib ` + -C link-arg=$ONNX_BUILD/Release/onnxruntime_mlas.lib ` + -C link-arg=$ONNX_BUILD/Release/onnxruntime_optimizer.lib ` + -C link-arg=$ONNX_BUILD/Release/onnxruntime_providers_shared.lib ` + -C link-arg=$ONNX_BUILD/Release/onnxruntime_providers.lib ` + -C link-arg=$ONNX_BUILD/Release/onnxruntime_session.lib ` + -C link-arg=$ONNX_BUILD/Release/onnxruntime_util.lib ` + -C link-arg=$ONNX_BUILD/_deps/onnx-build/Release/onnx_proto.lib ` + -C link-arg=$ONNX_BUILD/_deps/onnx-build/Release/onnx.lib ` + -C link-arg=/DEFAULTLIB:legacy_stdio_definitions.lib ` + -C link-arg=/DEFAULTLIB:OLDNAMES.lib " + +$env:CXXFLAGS="/std:c++17 /MT /D_CRT_SECURE_NO_WARNINGS /D_CRT_NONSTDC_NO_DEPRECATE" + +Set-Location $PROJECT_ROOT + +Write-Host "Ensuring Rust target $TARGET is installed..." +rustup target add $TARGET + +Write-Host "Building Rust binary..." +cargo build --release --target $TARGET --features ($CARGO_FEATURES -join ",") -vv + +$SRC_BIN = Join-Path $PROJECT_ROOT "target\$TARGET\release\$BIN_BASE.exe" +# Fallback: try plain release folder if cross-target folder does not exist +if (-not (Test-Path $SRC_BIN)) { + $SRC_BIN = Join-Path $PROJECT_ROOT "target\release\$BIN_BASE.exe" +} + +$DST_BIN = Join-Path $TARGET_DIR "$VARIANT\$BIN_BASE-$VARIANT.exe" + +if (-not (Test-Path $SRC_BIN)) { + Write-Error "ERROR: Built binary not found." + exit 1 +} + +Copy-Item -Force $SRC_BIN $DST_BIN +Write-Host "Built $DST_BIN" + +if ($UPLOAD_ENABLED) { + Write-Host "Uploading artifact for $VARIANT..." + gh run upload-artifact "$BIN_BASE-$VARIANT" $DST_BIN +} + +Write-Host "`nSUCCESS: $DST_BIN" +exit 0 \ No newline at end of file diff --git a/spec/acceleration.txt b/spec/acceleration.txt new file mode 100644 index 00000000..70722b16 --- /dev/null +++ b/spec/acceleration.txt @@ -0,0 +1,4 @@ +macOS: metal (optionally add openblas if you want) +Linux amd64: openblas vulkan + optional cuda / hipblas +Linux arm64: openblas vulkan +Windows: openblas vulkan cuda (requires toolchains) \ No newline at end of file diff --git a/spec/messaging.txt b/spec/messaging.txt new file mode 100644 index 00000000..a353d6bf --- /dev/null +++ b/spec/messaging.txt @@ -0,0 +1,55 @@ +Threads and the channels they use + +------------------------------------------------------------------------------------ + Main (src/main.rs) +------------------------------------------------------------------------------------ +- Sends the global stop signal through stop_all_tx. +- Sends raw microphone audio to the recording thread via tx_rec. +- Sends recognized utterances to the conversation thread via tx_utt. +- Sends raw microphone audio to the conversation thread via conv_tx (for synchronous processing). +- Sends playback audio to the playback thread through tx_play. +- Sends playback‑stop requests to the recording and playback threads via stop_play_tx. +- Sends the playback‑stop receiver to the playback thread via stop_play_rx. + +------------------------------------------------------------------------------------ + UI thread (src/ui.rs) +------------------------------------------------------------------------------------ +- Receives the global stop signal on stop_all_rx. +- Reads the shared status_line, print_lock, and peak to update the terminal. + +------------------------------------------------------------------------------------ + Playback thread (src/playback.rs) +------------------------------------------------------------------------------------ +- Receives the global stop signal on stop_all_rx. +- Receives playback audio chunks on rx_play. +- Receives a playback‑stop signal on stop_play_rx. +- Reads control flags: playback_active, gate_until_ms, paused. +- Reads UI state (ui) and updates it. +- Reads and updates the shared volume. + +------------------------------------------------------------------------------------ + Record thread (src/record.rs) +------------------------------------------------------------------------------------ +- Receives the global stop signal on stop_all_rx. +- Reads the interrupt counter via interrupt_counter. +- Reads and updates shared state: volume, recording_paused, and peak. +- Sends microphone audio to the conversation thread via conv_tx. +- Sends recognized utterance audio to the conversation thread via tx_utt. +- Sends a playback‑stop request on stop_play_tx. + +------------------------------------------------------------------------------------ + Conversation thread (src/conversation.rs) +------------------------------------------------------------------------------------ +- Receives the global stop signal on stop_all_rx. +- Receives utterance chunks from the record thread on rx_utt. +- Sends processed speech audio to the playback thread via tx_play. +- Sends a global stop signal on stop_all_tx when needed. + +------------------------------------------------------------------------------------ + Keyboard thread (src/keyword.rs) +------------------------------------------------------------------------------------ +- Receives the global stop signal on stop_all_rx. +- Sends the global stop signal via stop_all_tx. +- Reads control flags: paused, playback_active. +- Reads the recording‑paused flag via recording_paused. +- Reads configuration: voice, args.tts, args.language. diff --git a/src/conversation.rs b/src/conversation.rs index ebfa443a..1ae274d0 100644 --- a/src/conversation.rs +++ b/src/conversation.rs @@ -1280,4 +1280,4 @@ pub fn save_conversation( fs::write(filepath, content)?; Ok(()) -} +} \ No newline at end of file diff --git a/src/keyboard.rs b/src/keyboard.rs index 3842ecf9..9ac8ee33 100644 --- a/src/keyboard.rs +++ b/src/keyboard.rs @@ -484,4 +484,4 @@ pub fn keyboard_thread( // Always restore terminal state. let _ = terminal::disable_raw_mode(); -} +} \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index 81c41945..19abc179 100644 --- a/src/main.rs +++ b/src/main.rs @@ -930,4 +930,4 @@ fn main() -> Result<(), Box> { // drop(tx_tts); Ok(()) -} +} \ No newline at end of file diff --git a/src/record.rs b/src/record.rs index b5970881..5bc2c670 100644 --- a/src/record.rs +++ b/src/record.rs @@ -635,4 +635,4 @@ fn peak_abs(x: &[f32]) -> f32 { } } m -} +} \ No newline at end of file diff --git a/src/ui.rs b/src/ui.rs index 47b2b69c..3fea8a84 100644 --- a/src/ui.rs +++ b/src/ui.rs @@ -20,7 +20,6 @@ use std::thread; use std::time::Duration; // API -// ------------------------------------------------------------------ pub static STOP_STREAM: AtomicBool = AtomicBool::new(false); @@ -43,6 +42,7 @@ pub fn spawn_ui_thread( rx_ui: Receiver, conversation_history: crate::conversation::ConversationHistory, ) -> thread::JoinHandle<()> { + // separate thread for bottom bar update + render thread::spawn(move || { let conversation_history = conversation_history; let mut ui_state = ui_state;