Git Product home page Git Product logo

xwin's Introduction

xwin

A utility for downloading and packaging the Microsoft CRT headers and libraries, and Windows SDK headers and libraries needed for compiling and linking programs targeting Windows.

Crates.io Docs dependency status Build status

Introduction

The goal of this project is to create a root directory for both the CRT and Windows SDK that each contain all of the necessary includes and libraries needed for an application to compile and link from a non-Windows platform, using a native cross compiling toolchain like clang/LLVM. This includes adding symlinks to correct numerous casing issues in the Windows SDK so that the files generated by this program can function on a case-sensitive file system.

See this blog post for an in depth walk-through of how xwin can be used.

Installation

From source

cargo install xwin --locked

Features

xwin provides two feature toggles used to decide which TLS implementation to use

  • rustls (default) - Uses rustls for TLS
  • native-tls - Uses native-tls for TLS. Note that on platforms where OpenSSL is used it is always built from source.

From tarball

You can download a prebuilt binary from the Releases.

  • x86_64-unknown-linux-musl
  • x86_64-apple-darwin
  • aarch64-apple-darwin

Usage

Common

  • --accept-license - Doesn't display the prompt to accept the license. You can also set the XWIN_ACCEPT_LICENSE=1 environment variable
  • --arch <arch> - The architectures to include [default: x86_64] [possible values: x86, x86_64, aarch, aarch64]. Note that I haven't fully tested aarch/64 nor x86 so there might be issues with them, please file an issue if you encounter problems with them.
  • --cache-dir <cache-dir> - Specifies the cache directory used to persist downloaded items to disk. Defaults to ./.xwin-cache if not specified.
  • -L, --log-level <level> - The log level for messages, only log messages at or above the level will be emitted [default: info] [possible values: off, error, warn, info, debug, trace].
  • --variant <variant>... - The variants to include [default: desktop] [possible values: desktop, onecore, spectre]. Note that I haven't fully tested any variant except desktop, please file an issue if you try to use one of the others and run into issues. Note that there is another store variant that hasn't even been implemented due to it being weird and me not having a real project targeting it.
  • --channel <channel> - The product channel to use [default: release]
  • --manifest-version <version> - The manifest version to retrieve [default: 16].
  • --manifest - Specifies a top level manifest to use, rather than downloading it from Microsoft. This can be used to ensure the output is reproducible.
  • --sdk-version - The specific SDK version to use. If not specified the latest SDK version in the manifest is used.
  • --crt-version - The specific CRT version to use. If not specified the latest CRT version in the manifest is used.
  • --timeout - Specifies a timeout for long a single HTTP get request is allowed to take. The default is 60s.

Env vars

  • https_proxy - Environment variable that specifies the HTTPS proxy to use.

xwin download

This downloads the top level manifest and any vsix, msi, or cab files that are needed that aren't already in the download cache.

xwin unpack

Decompresses all of the downloaded package contents to disk. download is run automatically.

xwin splat

Fixes the packages to prune unneeded files and adds symlinks to address file casing issues and then spalts the final artifacts into directories. This is the main command you will want to run as it also downloads and unpacks automatically, providing the desired headers at the path specified to --output (./.xwin-cache/splat).

Splat options

  • --copy - Copies files from the unpack directory to the splat directory instead of moving them, which preserves the original unpack directories but increases overall execution time and disk usage.
  • --disable-symlinks - By default, symlinks are added to both the CRT and WindowsSDK to address casing issues in general usage. For example, if you are compiling C/C++ code that does #include <windows.h>, it will break on a case-sensitive file system, as the actual path in the WindowsSDK is Windows.h. This also applies even if the C/C++ you are compiling uses correct casing for all CRT/SDK includes, as the internal headers also use incorrect casing in most cases
  • --include-debug-libs - The MSVCRT includes (non-redistributable) debug versions of the various libs that are generally uninteresting to keep for most usage
  • --include-debug-symbols - The MSVCRT includes PDB (debug symbols) files for several of the libraries that are generally uninteresting to keep for most usage
  • --preserve-ms-arch-notation - By default, we convert the MS specific x64, arm, and arm64 target architectures to the more canonical x86_64, aarch, and aarch64 of LLVM etc when creating directories/names. Passing this flag will preserve the MS names for those targets
  • --output - The root output directory. Defaults to ./.xwin-cache/splat if not specified
  • --map - An optional map file used to configure what files are splatted, and any additional symlinks to create.

This moves all of the unpacked files which aren't pruned to their canonical locations under a root directory, for example here is what an x86_64 Desktop splat looks like. unpack is run automatically as needed.

.xwin-cache/splat
├── crt
│  ├── include
│  │  ├── cliext
│  │  ├── CodeAnalysis
│  │  ├── cvt
│  │  ├── experimental
│  │  ├── Manifest
│  │  └── msclr
│  │     └── com
│  └── lib
│     └── x86_64
└── sdk
   ├── include
   │  ├── cppwinrt
   │  │  └── winrt
   │  │     └── impl
   │  ├── shared
   │  │  ├── ndis
   │  │  └── netcx
   │  │     └── shared
   │  │        └── net
   │  │           └── wifi
   │  ├── ucrt
   │  │  └── sys
   │  ├── um
   │  │  ├── alljoyn_c
   │  │  ├── gl
   │  │  ├── qcc
   │  │  │  └── windows
   │  │  └── winsqlite
   │  └── winrt
   │     └── wrl
   │        └── wrappers
   └── lib
      ├── ucrt
      │  └── x86_64
      └── um
         └── x86_64

xwin minimize

This is an advanced command that performs a splat before performing a build on a cargo manifest using strace to capture all of the headers and libraries that are used throughout the build and dumping them to a map. This command can also output the final splat to disk, or the map file can be used with splat to only splat the files and symlinks described in it.

Note that currently the build is always done with the /vctoolsdir and /winsdkdir options, so it is expected these are the same options used when compiling C/C++ code in your normal environment. If that is not the case please open an issue.

At the end of the command, a printout of the amount and size of the original versus minimized files is done, eg.

  crt headers: 73(2.6MiB) / 384(18.4MiB) => 14.00%
  crt libs: 5(28.0MiB) / 26(81.1MiB) => 34.58%
  sdk headers: 180(9.6MiB) / 4435(304.7MiB) => 3.15%
  sdk libs: 29(69.8MiB) / 456(169.9MiB) => 41.06%

Requirements

  • Linux host - This might work on other platforms, but it's not guaranteed, nor tested
  • cargo - This is the singular supported build tool.
  • <arch>-pc-windows-msvc - The target you are building for needs to be installed (eg. via rustup target add)
  • clang-cl - This is used as the C/C++ compiler
  • llvm-lib - This is used as the archiver
  • lld-link - This is used as the linker
  • strace - This is used to capture the syscalls made by the lld and clang compiler

Minimize options

Note all of the splat options also apply to minimize.

  • --map - The path to the map to output the minimized results to. Default to ./.xwin-cache/xwin-map.toml if not specified.
  • --minimize-output - The root directory where only the minimized files are splatted to. If not specified only the --map file is written in addition to the normal splat
  • --preserve-strace - By default the strace output is written to disk in a temporary location that is deleted once the build is finished, passing this option allows it to be persisted. The path is written out before the build starts.

Map file

As noted in minimize, there are many restrictions on it to make my life easier, but that make it unsuitable for those who don't use cargo/rust. It's possible for others to come up with their own versions of minimize that can output the same format that splat understands to still get the benefits of xwin without cargo/rust.

The format is extremely simple

├── crt
│  ├── headers
│  │  ├── filter - Array of relative paths to keep
│  │  └── symlinks
│  │     └── <path> - The same path as one of the filters
│  │        └── <names> - Array of symlinks to create in the same directory as the parent path
│  ├── libs *
└── sdk *

Example

See docs/example-map.toml for a real world example.

Container

xwin.dockerfile is an example Dockerfile that can be used a container image capable of building and testing Rust crates targeting x86_64-pc-windows-msvc.

Thanks

Special thanks to https://github.com/mstorsjo/msvc-wine for the inspiration and @mdsteele for publishing several Rust crates around msi/cab files that were needed in this project

License

This contribution is dual licensed under EITHER OF

at your option.

xwin's People

Contributors

cspiegel avatar dragonmux avatar fosskers avatar j-raccoon avatar jake-shadle avatar jelmansouri avatar jemc avatar kianmeng avatar marijns95 avatar messense avatar mite-user avatar owen-ch-leung avatar pascalkuthe avatar qyriad avatar rjaegers avatar tristandebrunner avatar twistedfall avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

xwin's Issues

clang doesnt compile hello world

Hi, I built the image in xwin.dockerfile and inside the container I created a simple c file tmp.c:

#include <stdlib.h>
#include <stdio.h>

int main(){
printf("Hello world!\n");
return 0;
}

I try and compile this file with: /usr/bin/clang-13 --target=x86_64_pc_windows_msvc -Wall -std=c99 -o tmp tmp.c

and I get the output: error: unknown target triple 'x86_64_pc_windows_msvc', please use -triple or -arch

Is this supposed to work? Am I missing something? Thanks!

unable to find latest CRT version

anon@anon-MacBook-Pro /tmp % ./xwin --accept-license --manifest-version 15 splat --output xwin15
Manifest [1s] ██████████████████████████████████████████████████████████████████████████████████████████████████████████████████ 8.09 MiB/8.09 MiB 📥 downloadedError: unable to find latest CRT version

"unpack" fails when used with "--cache_dir" option

unpack.rs tries to write a bunch of .xwin-cache/unpack/{}/tree.txt relative to the current folder.
If the current folder doesn't contain .xwin-cache with the same directory structure, the program fails to unpack.

How to reproduce on Linux.

Create 2 empty folders and cd into one of them.

mkdir "${HOME}/cd" "${HOME}/dest"
cd "${HOME}/cd"

Run xwin unpack with --cache-dir pointing to another empty folder.

RUST_BACKTRACE=1 xwin --accept-license="yes" --cache-dir="${HOME}/dest" unpack

It fails after each unpack.

thread '<unnamed>' panicked at 'called `Result::unwrap()` on an `Err` value: Os { code: 2, kind: NotFound, message: "No such file or directory" }', /home/user/.cargo/registry/src/github.com-1ecc6299db9ec823/xwin-0.1.2/src/unpack.rs:577:6

lld-link error could not open USER32.lib No such file or directory

Using your Dockerfile recommended for use with xwin:
https://gist.github.com/omac777/1f231073f4b313e20376c386f48c6dc3

I ran the following to attempt to build windows samples rs' message box sample:

sudo service docker restart
docker build --network host -t playxwinimg .

git clone https://github.com/microsoft/windows-samples-rs.git
sudo chmod -R 777 windows-samples-rs
docker run --rm --network host -v /home/loongson/tryredox/playxwin/windows-samples-rs:/srv/windows-samples-rs -i -t playxwinimg:latest /bin/bash
cd /srv/windows-samples-rs/message_box
cargo build --target x86_64-pc-windows-msvc --release

here is the output:

$ docker run --rm --network host -v /home/loongson/tryredox/playxwin/windows-samples-rs:/srv/windows-samples-rs -i -t playxwinimg:latest /bin/bash
WARNING: Support for the legacy ~/.dockercfg configuration file and file-format is deprecated and will be removed in an upcoming release
root@righteous:/# cd /srv/windows-samples-rs/message_box
cd /srv/windows-samples-rs/message_box
root@righteous:/srv/windows-samples-rs/message_box# cargo build --target x86_64-pc-windows-msvc --release
se
    Updating crates.io index
  Downloaded proc-macro2 v1.0.28
  Downloaded quote v1.0.9
  Downloaded unicode-xid v0.2.2
  Downloaded const-sha1 v0.2.0
  Downloaded syn v1.0.74
  Downloaded windows v0.19.0
  Downloaded windows_gen v0.19.0
  Downloaded windows_quote v0.19.0
  Downloaded windows_macros v0.19.0
  Downloaded windows_reader v0.19.0
  Downloaded 10 crates (7.4 MB) in 0.55s (largest was `windows_reader` at 6.1 MB)
   Compiling proc-macro2 v1.0.28
   Compiling unicode-xid v0.2.2
   Compiling syn v1.0.74
   Compiling windows_quote v0.19.0
   Compiling windows_reader v0.19.0
   Compiling const-sha1 v0.2.0
   Compiling quote v1.0.9
   Compiling windows_gen v0.19.0
   Compiling windows_macros v0.19.0
   Compiling windows v0.19.0
   Compiling bindings v0.0.0 (/srv/windows-samples-rs/message_box/bindings)
   Compiling sample v0.0.0 (/srv/windows-samples-rs/message_box)
error: linking with `lld-link` failed: exit status: 1
  |
  = note: "lld-link" "/NOLOGO" "/srv/windows-samples-rs/message_box/target/x86_64-pc-windows-msvc/release/deps/sample.sample.btbz376a-cgu.0.rcgu.o" "/srv/windows-samples-rs/message_box/target/x86_64-pc-windows-msvc/release/deps/sample.sample.btbz376a-cgu.1.rcgu.o" "/srv/windows-samples-rs/message_box/target/x86_64-pc-windows-msvc/release/deps/sample.sample.btbz376a-cgu.2.rcgu.o" "/srv/windows-samples-rs/message_box/target/x86_64-pc-windows-msvc/release/deps/sample.sample.btbz376a-cgu.3.rcgu.o" "/srv/windows-samples-rs/message_box/target/x86_64-pc-windows-msvc/release/deps/sample.sample.btbz376a-cgu.4.rcgu.o" "/srv/windows-samples-rs/message_box/target/x86_64-pc-windows-msvc/release/deps/sample.sample.btbz376a-cgu.5.rcgu.o" "/srv/windows-samples-rs/message_box/target/x86_64-pc-windows-msvc/release/deps/sample.sample.btbz376a-cgu.6.rcgu.o" "/srv/windows-samples-rs/message_box/target/x86_64-pc-windows-msvc/release/deps/sample.1ply0khv4hpz03zo.rcgu.o" "/LIBPATH:/srv/windows-samples-rs/message_box/target/x86_64-pc-windows-msvc/release/deps" "/LIBPATH:/srv/windows-samples-rs/message_box/target/release/deps" "/LIBPATH:/xwin/crt/lib/x86_64" "/LIBPATH:/xwin/sdk/lib/um/x86_64" "/LIBPATH:/xwin/sdk/lib/ucrt/x86_64" "/LIBPATH:/usr/local/rustup/toolchains/1.54.0-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-pc-windows-msvc/lib" "/srv/windows-samples-rs/message_box/target/x86_64-pc-windows-msvc/release/deps/libbindings-d522218b93e33381.rlib" "/srv/windows-samples-rs/message_box/target/x86_64-pc-windows-msvc/release/deps/libwindows-a4a1543edf041f6e.rlib" "/srv/windows-samples-rs/message_box/target/x86_64-pc-windows-msvc/release/deps/libconst_sha1-57b2725c5a650a77.rlib" "/usr/local/rustup/toolchains/1.54.0-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-pc-windows-msvc/lib/libstd-3d786a338e3fbd3c.rlib" "/usr/local/rustup/toolchains/1.54.0-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-pc-windows-msvc/lib/libpanic_unwind-c7722f94ca812e0f.rlib" "/usr/local/rustup/toolchains/1.54.0-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-pc-windows-msvc/lib/libstd_detect-f6ac1aae8e3d5b95.rlib" "/usr/local/rustup/toolchains/1.54.0-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-pc-windows-msvc/lib/librustc_demangle-8244d5c29082f380.rlib" "/usr/local/rustup/toolchains/1.54.0-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-pc-windows-msvc/lib/libhashbrown-c29ed8b388a545d6.rlib" "/usr/local/rustup/toolchains/1.54.0-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-pc-windows-msvc/lib/librustc_std_workspace_alloc-daec0207219073db.rlib" "/usr/local/rustup/toolchains/1.54.0-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-pc-windows-msvc/lib/libunwind-e1164c8529217a2a.rlib" "/usr/local/rustup/toolchains/1.54.0-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-pc-windows-msvc/lib/libcfg_if-78991d36592dccee.rlib" "/usr/local/rustup/toolchains/1.54.0-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-pc-windows-msvc/lib/liblibc-3e2bb97c5be118b7.rlib" "/usr/local/rustup/toolchains/1.54.0-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-pc-windows-msvc/lib/liballoc-d5bd6400adb9fa95.rlib" "/usr/local/rustup/toolchains/1.54.0-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-pc-windows-msvc/lib/librustc_std_workspace_core-07dcecfd1f459221.rlib" "/usr/local/rustup/toolchains/1.54.0-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-pc-windows-msvc/lib/libcore-f0c150dc0abba70a.rlib" "/usr/local/rustup/toolchains/1.54.0-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-pc-windows-msvc/lib/libcompiler_builtins-0f3806ca1d72c7be.rlib" "USER32.lib" "KERNEL32.lib" "OLEAUT32.lib" "OLE32.lib" "KERNEL32.lib" "OLEAUT32.lib" "KERNEL32.lib" "kernel32.lib" "ws2_32.lib" "advapi32.lib" "userenv.lib" "kernel32.lib" "msvcrt.lib" "/NXCOMPAT" "/LIBPATH:/usr/local/rustup/toolchains/1.54.0-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-pc-windows-msvc/lib" "/OUT:/srv/windows-samples-rs/message_box/target/x86_64-pc-windows-msvc/release/deps/sample.exe" "/OPT:REF,ICF" "/DEBUG"
  = note: lld-link: error: could not open 'USER32.lib': No such file or directory
          lld-link: error: could not open 'KERNEL32.lib': No such file or directory
          lld-link: error: could not open 'OLEAUT32.lib': No such file or directory
          lld-link: error: could not open 'OLE32.lib': No such file or directory
          lld-link: error: could not open 'KERNEL32.lib': No such file or directory
          lld-link: error: could not open 'OLEAUT32.lib': No such file or directory
          lld-link: error: could not open 'KERNEL32.lib': No such file or directory
          

error: aborting due to previous error

error: could not compile `sample`

To learn more, run the command again with --verbose.
root@righteous:/srv/windows-samples-rs/message_box# 

What do you recommend for this? Thank you.

Error: already have `appnotify.h` [manifest-version 17]

Default manifest-version 16, no issue.

$> xwin --manifest-version 17 --accept-license splat --output $PWD/.xwin
  Manifest [3s] ██████████████████████████████████████████████████████████████████████████████████████████████ 12.09 MiB/12.09 MiB 📥 downloaded
CRT.headers [0s] █████████████████████████████████████████████████████████████████████████████████████████████ 18.29 MiB/18.29 MiB 📦 splatted
  CRT.libs.x86_64.desktop [0s] ███████████████████████████████████████████████████████████████████████████████ 189.61 MiB/189.61 MiB 📦 splatted
  CRT.libs.x86_64.store [0s] ███████████████████████████████████████████████████████████████████████████████████ 76.30 MiB/76.30 MiB 📦 splatted
  SDK.headers.all.none [0s] ████████████████████████████████████████████████████████████████████████████████████ 90.01 MiB/90.01 MiB 📦 splatted
  SDK.headers.all.store [0s] █████████████████████████████████████████████████████████████████████████████████ 224.35 MiB/224.35 MiB 📦 splatted
  SDK.headers.x86_64.none [0s] █████████████████████████████████████████████████████████████████████████████████ 45.36 KiB/45.36 KiB 📦 splatted
  SDK.libs.x86_64 [0s] █████████████████████████████████████████████████████████████████████████████████████████ 73.50 MiB/73.50 MiB 📦 splatted
  SDK.libs.store.all [0s] ██████████████████████████████████████████████████████████████████████████████████████ 37.97 MiB/37.97 MiB 📦 splatted
  SDK.ucrt.all [0s] ██████████████████████████████████████████████████████████████████████████████████████████ 121.88 MiB/121.88 MiB 📦 splatted
thread '<unnamed>' panicked at 'already have /home/kassane/Documentos/.xwin/sdk/include/um/appnotify.h matching /home/kassane/Documentos/.xwin/sdk/include/um/appnotify.h', /home/kassane/.cargo/registry/src/index.crates.io-6f17d22bba15001f/xwin-0.2.14/src/splat.rs:641:17
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: Any { .. }', /home/kassane/.cargo/registry/src/index.crates.io-6f17d22bba15001f/xwin-0.2.14/src/main.rs:285:9

manifest_17.tar.gz

Error: failed to splat Microsoft.VC.14.29.16.10.CRT.x64.Desktop.base.vsix

I am using MacOS Ventura 13.4.1 on M1 processor.

When splatting, I received a message:

CRT.headers [0s] █████████████████████████████████ 17.50 MiB/17.50 MiB 📦 splatted
CRT.libs.x86_64.desktop [0s] █████████████████████████183.89 MiB/183.89 MiB 📦 splatted
CRT.libs.x86_64.store [0s] ███████████████████████████65.38 MiB/65.38 MiB 📦 splatted
SDK.headers.all.none [0s] ████████████████████████████89.79 MiB/89.79 MiB 📦 splatted
SDK.headers.all.store [0s] ███████████████████████████ 219.85 MiB/219.85 MiB 📦 splatted
SDK.headers.x86_64.none [0s] ██████████████████████████45.17 KiB/45.17 KiB 📦 splatted
SDK.libs.x86_64 [0s] ███████████████████████████████71.15 MiB/71.15 MiB 📦 splatted
SDK.libs.store.all [0s] █████████████████████████████ 36.54 MiB/36.54 MiB 📦 splatted
SDK.ucrt.all [0s] ███████████████████████████████ 121.88 MiB/121.88 MiB 📦 splatted

**Error: failed to splat Microsoft.VC.14.29.16.10.CRT.x64.Desktop.base.vsix

Caused by:
0: unable to symlink from /Users/tareg/xwin/.xwin-cache/splat/crt/lib/x86_64/LIBCMT.lib to libcmt.lib
1: File exists (os error 17)**

Failed to splat Microsoft.VC.14.29.16.10.CRT.x64.Desktop.base.vsix: The system cannot find the file specified. (os error 2)

Further to the release of 0.4.0, I tried to bump the dependency version in the cargo-xwin project as per the PR below:

https://github.com/rust-cross/cargo-xwin/pull/80/files

Version 0.4.0 introduce a few backward-incompatible API so I've made a few tiny changes in the project source code. They are:

  • when calling xwin::prune_pkg_list, I passed in None for sdk_version and crt_version.
  • Insidexwin::Ops::Splat, when trying to construct SplatConfig, I pass in None for the map parameter
  • when calling ctx.execute, I passed in an empty string "".to_string() into the sdk_version argument

All these changes seem fine to me, since I pass the CI test that runs on ubuntu machine (FYI the CI test runs the command target/release/cargo-xwin xwin build --target x86_64-pc-windows-msvc --manifest-path tests/hello-tls/Cargo.toml) . But when it's running on a window machine, I got the captioned error.

So I tried to run it on my local window machine and I'm able to reproduce the error. But when I inspect my local xwin directory (i.e. C:\Users\user\AppData\Local\cargo-xwin\xwin, I did see this file is present at C:\Users\user\AppData\Local\cargo-xwin\xwin\dl\Microsoft.VC.14.29.16.10.CRT.x64.Desktop.base.vsix.

I did some debugging on my end and can confirm that ctx.work_dir was already set as C:\Users\user\AppData\Local\cargo-xwin\xwin

FYI here's the full error msg : https://github.com/rust-cross/cargo-xwin/actions/runs/6798447381/job/18482619447?pr=80

Can I ask for your help to see if it's a bug from xwin itself ? Appreciate any insights from you. Thanks

Getting Windows SDK from NuGet

Not really an issue per-se; I tried to set up an environment for cross-compiling Rust programs for x86_64-pc-windows-msvc without using your tool to see how far I'd get because I recently discovered that it's possible to obtain the Windows SDK via NuGet.

There's a base package and architecture-specific packages on top of that.

After fixing the weird casing inside some SDK libs I'm stuck with these 2 errors now:

lld-link: error: could not open 'msvcrt.lib': No such file or directory
lld-link: error: could not open 'legacy_stdio_definitions.lib': No such file or directory

Unfortunately, there's no NuGet package that includes those, so I'd need either a copy of Visual Studio Build Tools (huge, impossible to install on Linux via official means) or use your tool.

Anyway, I guess I just wanted to share my experience and maybe the NuGet download support is useful for you. It's an easy way to try out preview Windows SDKs that are not part of VS (yet) and it works on Linux too.

fatal error: 'BaseTsd.h' file not found

Hello @Jake-Shadle

Attempting to build a project but currently getting the following error,

fatal error: 'BaseTsd.h' file not found

Was wondering if in your opinion this is a bug on our docker image or if this is a known issue when compiling to windows

Been following your blog [article]{https://jake-shadle.github.io/xwin/} with a few changes as we are required to use jenkins/inbound-agent

We have a wrapper around the coinor/CoinUtils library using the crate CC

Is it possible to cross compile ring?

When targeting x86_64-pc-windows-msvc on M1 macOS (aarch64-apple-darwin), with xwin setup, it fails with the following error message:

The following warnings were emitted during compilation:

warning: /Users/messense/Projects/hello/target/x86_64-pc-windows-msvc/debug/build/ring-ce352717ea69a391/out/aes_nohw.obj: file machine type arm64 conflicts with library machine type x64 (inferred from earlier file '/Users/messense/.cargo/registry/src/github.com-1ecc6299db9ec823/ring-0.16.20/pregenerated/aesni-x86_64-nasm.obj')

error: failed to run custom build command for `ring v0.16.20`

Caused by:
  process didn't exit successfully: `/Users/messense/Projects/hello/target/debug/build/ring-a688e71124313554/build-script-build` (exit status: 1)
  --- stdout
  running: "llvm-lib" "-out:/Users/messense/Projects/hello/target/x86_64-pc-windows-msvc/debug/build/ring-ce352717ea69a391/out/libring-core.a" "-nologo" "/Users/messense/.cargo/registry/src/github.com-1ecc6299db9ec823/ring-0.16.20/pregenerated/aesni-x86_64-nasm.obj" "/Users/messense/.cargo/registry/src/github.com-1ecc6299db9ec823/ring-0.16.20/pregenerated/vpaes-x86_64-nasm.obj" "/Users/messense/.cargo/registry/src/github.com-1ecc6299db9ec823/ring-0.16.20/pregenerated/x86_64-mont-nasm.obj" "/Users/messense/.cargo/registry/src/github.com-1ecc6299db9ec823/ring-0.16.20/pregenerated/x86_64-mont5-nasm.obj" "/Users/messense/.cargo/registry/src/github.com-1ecc6299db9ec823/ring-0.16.20/pregenerated/chacha-x86_64-nasm.obj" "/Users/messense/.cargo/registry/src/github.com-1ecc6299db9ec823/ring-0.16.20/pregenerated/p256-x86_64-asm-nasm.obj" "/Users/messense/.cargo/registry/src/github.com-1ecc6299db9ec823/ring-0.16.20/pregenerated/aesni-gcm-x86_64-nasm.obj" "/Users/messense/.cargo/registry/src/github.com-1ecc6299db9ec823/ring-0.16.20/pregenerated/ghash-x86_64-nasm.obj" "/Users/messense/.cargo/registry/src/github.com-1ecc6299db9ec823/ring-0.16.20/pregenerated/sha512-x86_64-nasm.obj" "/Users/messense/.cargo/registry/src/github.com-1ecc6299db9ec823/ring-0.16.20/pregenerated/chacha20_poly1305_x86_64-nasm.obj" "/Users/messense/.cargo/registry/src/github.com-1ecc6299db9ec823/ring-0.16.20/pregenerated/sha256-x86_64-nasm.obj" "/Users/messense/Projects/hello/target/x86_64-pc-windows-msvc/debug/build/ring-ce352717ea69a391/out/aes_nohw.obj" "/Users/messense/Projects/hello/target/x86_64-pc-windows-msvc/debug/build/ring-ce352717ea69a391/out/montgomery.obj" "/Users/messense/Projects/hello/target/x86_64-pc-windows-msvc/debug/build/ring-ce352717ea69a391/out/montgomery_inv.obj" "/Users/messense/Projects/hello/target/x86_64-pc-windows-msvc/debug/build/ring-ce352717ea69a391/out/limbs.obj" "/Users/messense/Projects/hello/target/x86_64-pc-windows-msvc/debug/build/ring-ce352717ea69a391/out/mem.obj" "/Users/messense/Projects/hello/target/x86_64-pc-windows-msvc/debug/build/ring-ce352717ea69a391/out/poly1305.obj" "/Users/messense/Projects/hello/target/x86_64-pc-windows-msvc/debug/build/ring-ce352717ea69a391/out/crypto.obj" "/Users/messense/Projects/hello/target/x86_64-pc-windows-msvc/debug/build/ring-ce352717ea69a391/out/curve25519.obj" "/Users/messense/Projects/hello/target/x86_64-pc-windows-msvc/debug/build/ring-ce352717ea69a391/out/ecp_nistz.obj" "/Users/messense/Projects/hello/target/x86_64-pc-windows-msvc/debug/build/ring-ce352717ea69a391/out/ecp_nistz256.obj" "/Users/messense/Projects/hello/target/x86_64-pc-windows-msvc/debug/build/ring-ce352717ea69a391/out/gfp_p256.obj" "/Users/messense/Projects/hello/target/x86_64-pc-windows-msvc/debug/build/ring-ce352717ea69a391/out/gfp_p384.obj" "/Users/messense/Projects/hello/target/x86_64-pc-windows-msvc/debug/build/ring-ce352717ea69a391/out/cpu-intel.obj" "/Users/messense/Projects/hello/target/x86_64-pc-windows-msvc/debug/build/ring-ce352717ea69a391/out/poly1305_vec.obj"
  cargo:warning=/Users/messense/Projects/hello/target/x86_64-pc-windows-msvc/debug/build/ring-ce352717ea69a391/out/aes_nohw.obj: file machine type arm64 conflicts with library machine type x64 (inferred from earlier file '/Users/messense/.cargo/registry/src/github.com-1ecc6299db9ec823/ring-0.16.20/pregenerated/aesni-x86_64-nasm.obj')
  exit status: 1

I wonder if it's possible to cross compile ring? file machine type arm64 conflicts with library machine type x64 is odd.

BTW, this project is awesome, thank you for creating it!

undefined symbol __declspec(dllimport)

I'm working on trying to cross compile a wrapper library that I made, and i worked my way through things, but I don't understand how to resolve an error like this.

[malek@malek-box test-project]$  CARGO_TARGET_X86_64_PC_WINDOWS_MSVC_RUSTFLAGS="-Lnative=/xwin/crt/lib/x86_64 -Lnative=/xwin/sdk/lib/um/x86_64 -Lnative=/xwin/sdk/lib/ucrt/x86_64" RC=x86_64-w64-mingw32-windres RUSTFLAGS="-C target-feature=+crt-static" cargo xwin build --target=x86_64-pc-windows-msvc
warning: output filename collision.
The bin target `test-project` in package `test-project v0.1.0 (/home/malek/IdeaProjects/test-project)` has the same output filename as the lib target `test-project` in package `test-project v0.1.0 (/home/malek/IdeaProjects/test-project)`.
Colliding filename is: /home/malek/IdeaProjects/test-project/target/x86_64-pc-windows-msvc/debug/deps/test_project.pdb
The targets should have unique names.
Consider changing their names to be unique or compiling them separately.
This may become a hard error in the future; see <https://github.com/rust-lang/cargo/issues/6313>.
warning: output filename collision.
The bin target `test-project` in package `test-project v0.1.0 (/home/malek/IdeaProjects/test-project)` has the same output filename as the lib target `test-project` in package `test-project v0.1.0 (/home/malek/IdeaProjects/test-project)`.
Colliding filename is: /home/malek/IdeaProjects/test-project/target/x86_64-pc-windows-msvc/debug/test_project.pdb
The targets should have unique names.
Consider changing their names to be unique or compiling them separately.
This may become a hard error in the future; see <https://github.com/rust-lang/cargo/issues/6313>.
   Compiling stereokit-sys v2.5.4 (/home/malek/IdeaProjects/stereokit-sys)
   Compiling stereokit v0.16.7 (/home/malek/IdeaProjects/stereokit-rs)
   Compiling test-project v0.1.0 (/home/malek/IdeaProjects/test-project)
error: linking with `lld-link` failed: exit status: 1
  |
  = note: LC_ALL="C" PATH="/home/malek/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/bin:/home/malek/.cargo/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/opt/android-ndk:/opt/android-sdk/cmdline-tools/latest/bin:/usr/lib/jvm/default/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl:/home/malek/.local/share/JetBrains/Toolbox/scripts:/home/malek/.cache/cargo-xwin" VSLANG="1033" "lld-link" "-flavor" "link" "/DEF:/tmp/rustcFrmAQJ/lib.def" "/NOLOGO" "/tmp/rustcFrmAQJ/symbols.o" "/home/malek/IdeaProjects/test-project/target/x86_64-pc-windows-msvc/debug/deps/test_project.15kv1cje7mhs942l.rcgu.o" "/home/malek/IdeaProjects/test-project/target/x86_64-pc-windows-msvc/debug/deps/test_project.1jwrjgxpnaom5y7m.rcgu.o" "/home/malek/IdeaProjects/test-project/target/x86_64-pc-windows-msvc/debug/deps/test_project.1ruexwppsuhzzsic.rcgu.o" "/home/malek/IdeaProjects/test-project/target/x86_64-pc-windows-msvc/debug/deps/test_project.1yw3qqakl5tmdyfl.rcgu.o" "/home/malek/IdeaProjects/test-project/target/x86_64-pc-windows-msvc/debug/deps/test_project.1zikuynjmnqgezkp.rcgu.o" "/home/malek/IdeaProjects/test-project/target/x86_64-pc-windows-msvc/debug/deps/test_project.29mddud38is134rs.rcgu.o" "/home/malek/IdeaProjects/test-project/target/x86_64-pc-windows-msvc/debug/deps/test_project.2gxvlqol1qvji9gb.rcgu.o" "/home/malek/IdeaProjects/test-project/target/x86_64-pc-windows-msvc/debug/deps/test_project.2pr9n1dl5oc1j4ey.rcgu.o" "/home/malek/IdeaProjects/test-project/target/x86_64-pc-windows-msvc/debug/deps/test_project.2r75yvuogwqofp5j.rcgu.o" "/home/malek/IdeaProjects/test-project/target/x86_64-pc-windows-msvc/debug/deps/test_project.30wm4hkpv8uewrdc.rcgu.o" "/home/malek/IdeaProjects/test-project/target/x86_64-pc-windows-msvc/debug/deps/test_project.372ievazwwaxt6yu.rcgu.o" "/home/malek/IdeaProjects/test-project/target/x86_64-pc-windows-msvc/debug/deps/test_project.3f6xdlg0g73uquha.rcgu.o" "/home/malek/IdeaProjects/test-project/target/x86_64-pc-windows-msvc/debug/deps/test_project.3oxp6x2hwokddnyd.rcgu.o" "/home/malek/IdeaProjects/test-project/target/x86_64-pc-windows-msvc/debug/deps/test_project.42fqp6a2ujjtcbye.rcgu.o" "/home/malek/IdeaProjects/test-project/target/x86_64-pc-windows-msvc/debug/deps/test_project.442z9ega2z3q0af0.rcgu.o" "/home/malek/IdeaProjects/test-project/target/x86_64-pc-windows-msvc/debug/deps/test_project.4v788bd80byqmxnh.rcgu.o" "/home/malek/IdeaProjects/test-project/target/x86_64-pc-windows-msvc/debug/deps/test_project.eb9y3fxeg320pq9.rcgu.o" "/home/malek/IdeaProjects/test-project/target/x86_64-pc-windows-msvc/debug/deps/test_project.vagrbb8f7iiuw67.rcgu.o" "/home/malek/IdeaProjects/test-project/target/x86_64-pc-windows-msvc/debug/deps/test_project.167flh38dohz33b0.rcgu.o" "/LIBPATH:/home/malek/IdeaProjects/test-project/target/x86_64-pc-windows-msvc/debug/deps" "/LIBPATH:/home/malek/IdeaProjects/test-project/target/debug/deps" "/LIBPATH:/home/malek/.cache/cargo-xwin/xwin/crt/lib/x86_64" "/LIBPATH:/home/malek/.cache/cargo-xwin/xwin/sdk/lib/um/x86_64" "/LIBPATH:/home/malek/.cache/cargo-xwin/xwin/sdk/lib/ucrt/x86_64" "/LIBPATH:/home/malek/IdeaProjects/test-project/target/x86_64-pc-windows-msvc/debug/build/stereokit-sys-fe51121b3b8b0ad3/out/lib" "/LIBPATH:/home/malek/IdeaProjects/test-project/target/x86_64-pc-windows-msvc/debug/build/stereokit-sys-fe51121b3b8b0ad3/out/lib64" "/LIBPATH:/home/malek/IdeaProjects/test-project/target/x86_64-pc-windows-msvc/debug/build/stereokit-sys-fe51121b3b8b0ad3/out" "/LIBPATH:/home/malek/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-pc-windows-msvc/lib" "/home/malek/IdeaProjects/test-project/target/x86_64-pc-windows-msvc/debug/deps/libstereokit-8b72e645573c46d7.rlib" "/home/malek/IdeaProjects/test-project/target/x86_64-pc-windows-msvc/debug/deps/libbitflags-ce9cf91ea312dedf.rlib" "/home/malek/IdeaProjects/test-project/target/x86_64-pc-windows-msvc/debug/deps/libthiserror-a76061409c31d039.rlib" "/home/malek/IdeaProjects/test-project/target/x86_64-pc-windows-msvc/debug/deps/libstereokit_sys-c987d49c9fcf03cd.rlib" "/home/malek/IdeaProjects/test-project/target/x86_64-pc-windows-msvc/debug/deps/libnum_enum-958f9d3b02aae723.rlib" "/home/malek/IdeaProjects/test-project/target/x86_64-pc-windows-msvc/debug/deps/libglam-291ae4fcabf779d3.rlib" "/home/malek/IdeaProjects/test-project/target/x86_64-pc-windows-msvc/debug/deps/libserde-a25734b0b49b5b33.rlib" "/home/malek/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-pc-windows-msvc/lib/libstd-29fb9c73329fcd27.rlib" "/home/malek/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-pc-windows-msvc/lib/libpanic_unwind-1f2e411ca628cd6a.rlib" "/home/malek/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-pc-windows-msvc/lib/librustc_demangle-4ee9a16c10dec862.rlib" "/home/malek/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-pc-windows-msvc/lib/libstd_detect-cb508fe8539dcc15.rlib" "/home/malek/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-pc-windows-msvc/lib/libhashbrown-a3b05fbe0520312d.rlib" "/home/malek/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-pc-windows-msvc/lib/libminiz_oxide-f05cf6350dcd6a22.rlib" "/home/malek/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-pc-windows-msvc/lib/libadler-b092cec796df4927.rlib" "/home/malek/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-pc-windows-msvc/lib/librustc_std_workspace_alloc-c8bf20bf49bad3b5.rlib" "/home/malek/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-pc-windows-msvc/lib/libunwind-ec9e9e3723b4fe5e.rlib" "/home/malek/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-pc-windows-msvc/lib/libcfg_if-56146bb647877fe7.rlib" "/home/malek/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-pc-windows-msvc/lib/liblibc-ab0d37bafe4ab3ae.rlib" "/home/malek/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-pc-windows-msvc/lib/liballoc-4e31fac262ef8330.rlib" "/home/malek/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-pc-windows-msvc/lib/librustc_std_workspace_core-69892fa511d5a698.rlib" "/home/malek/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-pc-windows-msvc/lib/libcore-798bc7c2d986ac97.rlib" "/home/malek/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-pc-windows-msvc/lib/libcompiler_builtins-8f90c56c12de841c.rlib" "windowsapp.lib" "user32.lib" "comdlg32.lib" "kernel32.lib" "advapi32.lib" "userenv.lib" "kernel32.lib" "ws2_32.lib" "bcrypt.lib" "libcmt.lib" "legacy_stdio_definitions.lib" "/NXCOMPAT" "/LIBPATH:/home/malek/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-pc-windows-msvc/lib" "/OUT:/home/malek/IdeaProjects/test-project/target/x86_64-pc-windows-msvc/debug/deps/test_project.dll" "/OPT:REF,NOICF" "/DLL" "/IMPLIB:/home/malek/IdeaProjects/test-project/target/x86_64-pc-windows-msvc/debug/deps/test_project.dll.lib" "/DEBUG"
  = note: lld-link: error: could not open 'msvcrtd.lib': No such file or directory
          lld-link: error: could not open 'msvcprtd.lib': No such file or directory
          

error: could not compile `test-project` due to previous error
[malek@malek-box test-project]$  CARGO_TARGET_X86_64_PC_WINDOWS_MSVC_RUSTFLAGS="-Lnative=/xwin/crt/lib/x86_64 -Lnative=/xwin/sdk/lib/um/x86_64 -Lnative=/xwin/sdk/lib/ucrt/x86_64" RC=x86_64-w64-mingw32-windres RUSTFLAGS="-C target-feature=+crt-static" cargo xwin build --target=x86_64-pc-windows-msvc --release
warning: output filename collision.
The bin target `test-project` in package `test-project v0.1.0 (/home/malek/IdeaProjects/test-project)` has the same output filename as the lib target `test-project` in package `test-project v0.1.0 (/home/malek/IdeaProjects/test-project)`.
Colliding filename is: /home/malek/IdeaProjects/test-project/target/x86_64-pc-windows-msvc/release/deps/test_project.pdb
The targets should have unique names.
Consider changing their names to be unique or compiling them separately.
This may become a hard error in the future; see <https://github.com/rust-lang/cargo/issues/6313>.
warning: output filename collision.
The bin target `test-project` in package `test-project v0.1.0 (/home/malek/IdeaProjects/test-project)` has the same output filename as the lib target `test-project` in package `test-project v0.1.0 (/home/malek/IdeaProjects/test-project)`.
Colliding filename is: /home/malek/IdeaProjects/test-project/target/x86_64-pc-windows-msvc/release/test_project.pdb
The targets should have unique names.
Consider changing their names to be unique or compiling them separately.
This may become a hard error in the future; see <https://github.com/rust-lang/cargo/issues/6313>.
   Compiling test-project v0.1.0 (/home/malek/IdeaProjects/test-project)
error: linking with `lld-link` failed: exit status: 1
  |
  = note: LC_ALL="C" PATH="/home/malek/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/bin:/home/malek/.cargo/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/opt/android-ndk:/opt/android-sdk/cmdline-tools/latest/bin:/usr/lib/jvm/default/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl:/home/malek/.local/share/JetBrains/Toolbox/scripts:/home/malek/.cache/cargo-xwin" VSLANG="1033" "lld-link" "-flavor" "link" "/DEF:/tmp/rustcESCKQK/lib.def" "/NOLOGO" "/tmp/rustcESCKQK/symbols.o" "/home/malek/IdeaProjects/test-project/target/x86_64-pc-windows-msvc/release/deps/test_project.test_project.aa2a4a95-cgu.0.rcgu.o" "/home/malek/IdeaProjects/test-project/target/x86_64-pc-windows-msvc/release/deps/test_project.test_project.aa2a4a95-cgu.1.rcgu.o" "/home/malek/IdeaProjects/test-project/target/x86_64-pc-windows-msvc/release/deps/test_project.test_project.aa2a4a95-cgu.2.rcgu.o" "/home/malek/IdeaProjects/test-project/target/x86_64-pc-windows-msvc/release/deps/test_project.test_project.aa2a4a95-cgu.3.rcgu.o" "/home/malek/IdeaProjects/test-project/target/x86_64-pc-windows-msvc/release/deps/test_project.test_project.aa2a4a95-cgu.4.rcgu.o" "/home/malek/IdeaProjects/test-project/target/x86_64-pc-windows-msvc/release/deps/test_project.test_project.aa2a4a95-cgu.5.rcgu.o" "/home/malek/IdeaProjects/test-project/target/x86_64-pc-windows-msvc/release/deps/test_project.test_project.aa2a4a95-cgu.6.rcgu.o" "/home/malek/IdeaProjects/test-project/target/x86_64-pc-windows-msvc/release/deps/test_project.test_project.aa2a4a95-cgu.7.rcgu.o" "/home/malek/IdeaProjects/test-project/target/x86_64-pc-windows-msvc/release/deps/test_project.test_project.aa2a4a95-cgu.8.rcgu.o" "/home/malek/IdeaProjects/test-project/target/x86_64-pc-windows-msvc/release/deps/test_project.test_project.aa2a4a95-cgu.9.rcgu.o" "/home/malek/IdeaProjects/test-project/target/x86_64-pc-windows-msvc/release/deps/test_project.1pb6k99ppmd69o5a.rcgu.o" "/LIBPATH:/home/malek/IdeaProjects/test-project/target/x86_64-pc-windows-msvc/release/deps" "/LIBPATH:/home/malek/IdeaProjects/test-project/target/release/deps" "/LIBPATH:/home/malek/.cache/cargo-xwin/xwin/crt/lib/x86_64" "/LIBPATH:/home/malek/.cache/cargo-xwin/xwin/sdk/lib/um/x86_64" "/LIBPATH:/home/malek/.cache/cargo-xwin/xwin/sdk/lib/ucrt/x86_64" "/LIBPATH:/home/malek/IdeaProjects/test-project/target/x86_64-pc-windows-msvc/release/build/stereokit-sys-441fa8d63d70bb69/out/lib" "/LIBPATH:/home/malek/IdeaProjects/test-project/target/x86_64-pc-windows-msvc/release/build/stereokit-sys-441fa8d63d70bb69/out/lib64" "/LIBPATH:/home/malek/IdeaProjects/test-project/target/x86_64-pc-windows-msvc/release/build/stereokit-sys-441fa8d63d70bb69/out" "/LIBPATH:/home/malek/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-pc-windows-msvc/lib" "/home/malek/IdeaProjects/test-project/target/x86_64-pc-windows-msvc/release/deps/libstereokit-12d63f76abdf375a.rlib" "/home/malek/IdeaProjects/test-project/target/x86_64-pc-windows-msvc/release/deps/libbitflags-162ccef7681bb45e.rlib" "/home/malek/IdeaProjects/test-project/target/x86_64-pc-windows-msvc/release/deps/libthiserror-5e07301c304eb9e8.rlib" "/home/malek/IdeaProjects/test-project/target/x86_64-pc-windows-msvc/release/deps/libstereokit_sys-219fd5c334ee8ce9.rlib" "/home/malek/IdeaProjects/test-project/target/x86_64-pc-windows-msvc/release/deps/libnum_enum-6f5e11f016362629.rlib" "/home/malek/IdeaProjects/test-project/target/x86_64-pc-windows-msvc/release/deps/libglam-76db3294768a20d0.rlib" "/home/malek/IdeaProjects/test-project/target/x86_64-pc-windows-msvc/release/deps/libserde-48fc5349913c5d45.rlib" "/home/malek/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-pc-windows-msvc/lib/libstd-29fb9c73329fcd27.rlib" "/home/malek/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-pc-windows-msvc/lib/libpanic_unwind-1f2e411ca628cd6a.rlib" "/home/malek/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-pc-windows-msvc/lib/librustc_demangle-4ee9a16c10dec862.rlib" "/home/malek/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-pc-windows-msvc/lib/libstd_detect-cb508fe8539dcc15.rlib" "/home/malek/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-pc-windows-msvc/lib/libhashbrown-a3b05fbe0520312d.rlib" "/home/malek/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-pc-windows-msvc/lib/libminiz_oxide-f05cf6350dcd6a22.rlib" "/home/malek/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-pc-windows-msvc/lib/libadler-b092cec796df4927.rlib" "/home/malek/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-pc-windows-msvc/lib/librustc_std_workspace_alloc-c8bf20bf49bad3b5.rlib" "/home/malek/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-pc-windows-msvc/lib/libunwind-ec9e9e3723b4fe5e.rlib" "/home/malek/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-pc-windows-msvc/lib/libcfg_if-56146bb647877fe7.rlib" "/home/malek/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-pc-windows-msvc/lib/liblibc-ab0d37bafe4ab3ae.rlib" "/home/malek/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-pc-windows-msvc/lib/liballoc-4e31fac262ef8330.rlib" "/home/malek/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-pc-windows-msvc/lib/librustc_std_workspace_core-69892fa511d5a698.rlib" "/home/malek/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-pc-windows-msvc/lib/libcore-798bc7c2d986ac97.rlib" "/home/malek/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-pc-windows-msvc/lib/libcompiler_builtins-8f90c56c12de841c.rlib" "windowsapp.lib" "user32.lib" "comdlg32.lib" "kernel32.lib" "advapi32.lib" "userenv.lib" "kernel32.lib" "ws2_32.lib" "bcrypt.lib" "libcmt.lib" "legacy_stdio_definitions.lib" "/NXCOMPAT" "/LIBPATH:/home/malek/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-pc-windows-msvc/lib" "/OUT:/home/malek/IdeaProjects/test-project/target/x86_64-pc-windows-msvc/release/deps/test_project.dll" "/OPT:REF,ICF" "/DLL" "/IMPLIB:/home/malek/IdeaProjects/test-project/target/x86_64-pc-windows-msvc/release/deps/test_project.dll.lib" "/DEBUG"
  = note: lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(stereokit.cpp.obj): locally defined symbol imported: abort (defined in libucrt.lib(abort.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(model.cpp.obj): locally defined symbol imported: __stdio_common_vsprintf (defined in libucrt.lib(output.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(font.cpp.obj): locally defined symbol imported: __stdio_common_vsprintf (defined in libucrt.lib(output.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(mesh.cpp.obj): locally defined symbol imported: sqrtf (defined in libucrt.lib(sqrtf.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(mesh.cpp.obj): locally defined symbol imported: free (defined in libucrt.lib(free.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(sprite.cpp.obj): locally defined symbol imported: __stdio_common_vsprintf (defined in libucrt.lib(output.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(sk_math.cpp.obj): locally defined symbol imported: sqrtf (defined in libucrt.lib(sqrtf.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(intersect.cpp.obj): locally defined symbol imported: sqrtf (defined in libucrt.lib(sqrtf.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(spherical_harmonics.cpp.obj): locally defined symbol imported: sqrtf (defined in libucrt.lib(sqrtf.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(stereokit_ui.cpp.obj): locally defined symbol imported: sqrtf (defined in libucrt.lib(sqrtf.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(texture.cpp.obj): locally defined symbol imported: __stdio_common_vsprintf (defined in libucrt.lib(output.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(texture.cpp.obj): locally defined symbol imported: sqrtf (defined in libucrt.lib(sqrtf.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(tinycthread.cpp.obj): locally defined symbol imported: free (defined in libucrt.lib(free.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(tinycthread.cpp.obj): locally defined symbol imported: malloc (defined in libucrt.lib(malloc.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(log.cpp.obj): locally defined symbol imported: __stdio_common_vsprintf (defined in libucrt.lib(output.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(log.cpp.obj): locally defined symbol imported: __acrt_iob_func (defined in libucrt.lib(_file.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(log.cpp.obj): locally defined symbol imported: __stdio_common_vfprintf (defined in libucrt.lib(output.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(render.cpp.obj): locally defined symbol imported: fclose (defined in libucrt.lib(fclose.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(render.cpp.obj): locally defined symbol imported: malloc (defined in libucrt.lib(malloc.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(render.cpp.obj): locally defined symbol imported: free (defined in libucrt.lib(free.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(render.cpp.obj): locally defined symbol imported: fwrite (defined in libucrt.lib(fwrite.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(render.cpp.obj): locally defined symbol imported: __stdio_common_vsprintf_s (defined in libucrt.lib(output.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(system.cpp.obj): locally defined symbol imported: __stdio_common_vsprintf (defined in libucrt.lib(output.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(assets.cpp.obj): locally defined symbol imported: __stdio_common_vsprintf (defined in libucrt.lib(output.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(assets.cpp.obj): locally defined symbol imported: abort (defined in libucrt.lib(abort.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(audio.cpp.obj): locally defined symbol imported: wcscpy_s (defined in libucrt.lib(wcscpy_s.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(audio.cpp.obj): locally defined symbol imported: sqrtf (defined in libucrt.lib(sqrtf.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(sprite_drawer.cpp.obj): locally defined symbol imported: sqrtf (defined in libucrt.lib(sqrtf.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(line_drawer.cpp.obj): locally defined symbol imported: sqrtf (defined in libucrt.lib(sqrtf.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(sk_memory.cpp.obj): locally defined symbol imported: malloc (defined in libucrt.lib(malloc.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(sk_memory.cpp.obj): locally defined symbol imported: __acrt_iob_func (defined in libucrt.lib(_file.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(sk_memory.cpp.obj): locally defined symbol imported: abort (defined in libucrt.lib(abort.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(sk_memory.cpp.obj): locally defined symbol imported: calloc (defined in libucrt.lib(calloc.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(sk_memory.cpp.obj): locally defined symbol imported: free (defined in libucrt.lib(free.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(platform_utils.cpp.obj): locally defined symbol imported: fclose (defined in libucrt.lib(fclose.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(platform_utils.cpp.obj): locally defined symbol imported: fwrite (defined in libucrt.lib(fwrite.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(platform_utils.cpp.obj): locally defined symbol imported: wcslen (defined in libucrt.lib(wcslen.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(platform_utils.cpp.obj): locally defined symbol imported: free (defined in libucrt.lib(free.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(stref.cpp.obj): locally defined symbol imported: tolower (defined in libucrt.lib(tolower_toupper.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(stref.cpp.obj): locally defined symbol imported: atoi (defined in libucrt.lib(atox.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(model_gltf.cpp.obj): locally defined symbol imported: __stdio_common_vsprintf (defined in libucrt.lib(output.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(model_gltf.cpp.obj): locally defined symbol imported: strncmp (defined in libucrt.lib(strncmp.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(model_obj.cpp.obj): locally defined symbol imported: __stdio_common_vsprintf (defined in libucrt.lib(output.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(model_stl.cpp.obj): locally defined symbol imported: sqrtf (defined in libucrt.lib(sqrtf.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(model_stl.cpp.obj): locally defined symbol imported: __stdio_common_vsprintf (defined in libucrt.lib(output.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(model_ply.cpp.obj): locally defined symbol imported: atoi (defined in libucrt.lib(atox.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(model_ply.cpp.obj): locally defined symbol imported: malloc (defined in libucrt.lib(malloc.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(model_ply.cpp.obj): locally defined symbol imported: atol (defined in libucrt.lib(atox.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(model_ply.cpp.obj): locally defined symbol imported: free (defined in libucrt.lib(free.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(model_ply.cpp.obj): locally defined symbol imported: __stdio_common_vsprintf (defined in libucrt.lib(output.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(sk_gpu.cpp.obj): locally defined symbol imported: malloc (defined in libucrt.lib(malloc.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(sk_gpu.cpp.obj): locally defined symbol imported: __stdio_common_vsprintf (defined in libucrt.lib(output.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(sk_gpu.cpp.obj): locally defined symbol imported: free (defined in libucrt.lib(free.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(sk_gpu.cpp.obj): locally defined symbol imported: fclose (defined in libucrt.lib(fclose.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(bvh.cpp.obj): locally defined symbol imported: free (defined in libucrt.lib(free.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(miniaudio.cpp.obj): locally defined symbol imported: wcslen (defined in libucrt.lib(wcslen.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(miniaudio.cpp.obj): locally defined symbol imported: __stdio_common_vsprintf (defined in libucrt.lib(output.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(miniaudio.cpp.obj): locally defined symbol imported: fclose (defined in libucrt.lib(fclose.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(miniaudio.cpp.obj): locally defined symbol imported: _wcsicmp (defined in libucrt.lib(wcsicmp.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(miniaudio.cpp.obj): locally defined symbol imported: fwrite (defined in libucrt.lib(fwrite.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(miniaudio.cpp.obj): locally defined symbol imported: free (defined in libucrt.lib(free.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(miniaudio.cpp.obj): locally defined symbol imported: malloc (defined in libucrt.lib(malloc.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(miniaudio.cpp.obj): locally defined symbol imported: wcscmp (defined in libucrt.lib(wcscmp.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(input_hand.cpp.obj): locally defined symbol imported: sqrtf (defined in libucrt.lib(sqrtf.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(stb_image.cpp.obj): locally defined symbol imported: strtol (defined in libucrt.lib(strtox.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(stb_image.cpp.obj): locally defined symbol imported: strncmp (defined in libucrt.lib(strncmp.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(qoi.cpp.obj): locally defined symbol imported: malloc (defined in libucrt.lib(malloc.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(qoi.cpp.obj): locally defined symbol imported: fwrite (defined in libucrt.lib(fwrite.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(qoi.cpp.obj): locally defined symbol imported: fclose (defined in libucrt.lib(fclose.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(qoi.cpp.obj): locally defined symbol imported: free (defined in libucrt.lib(free.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(flatscreen_input.cpp.obj): locally defined symbol imported: sqrtf (defined in libucrt.lib(sqrtf.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(openxr.cpp.obj): locally defined symbol imported: __stdio_common_vsprintf (defined in libucrt.lib(output.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(isac_spatial_sound.cpp.obj): locally defined symbol imported: terminate (defined in libucrt.lib(terminate.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(isac_spatial_sound.cpp.obj): locally defined symbol imported: sqrtf (defined in libucrt.lib(sqrtf.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(isac_spatial_sound.cpp.obj): locally defined symbol imported: iswspace (defined in libucrt.lib(_wctype.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(isac_spatial_sound.cpp.obj): locally defined symbol imported: _errno (defined in libucrt.lib(errno.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(isac_spatial_sound.cpp.obj): locally defined symbol imported: _invalid_parameter_noinfo (defined in libucrt.lib(invalid_parameter.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(isac_spatial_sound.cpp.obj): locally defined symbol imported: _invalid_parameter_noinfo_noreturn (defined in libucrt.lib(invalid_parameter.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(openxr_view.cpp.obj): locally defined symbol imported: __stdio_common_vsprintf (defined in libucrt.lib(output.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(file_picker.cpp.obj): locally defined symbol imported: qsort (defined in libucrt.lib(qsort.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(file_picker.cpp.obj): locally defined symbol imported: free (defined in libucrt.lib(free.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(file_picker.cpp.obj): locally defined symbol imported: __stdio_common_vsprintf (defined in libucrt.lib(output.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(cgltf.cpp.obj): locally defined symbol imported: fclose (defined in libucrt.lib(fclose.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(cgltf.cpp.obj): locally defined symbol imported: strncmp (defined in libucrt.lib(strncmp.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(cgltf.cpp.obj): locally defined symbol imported: atoi (defined in libucrt.lib(atox.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(hand_oxr_articulated.cpp.obj): locally defined symbol imported: sqrtf (defined in libucrt.lib(sqrtf.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(hand_oxr_articulated.cpp.obj): locally defined symbol imported: qsort (defined in libucrt.lib(qsort.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(xr_generated_loader.cpp.obj): locally defined symbol imported: _invalid_parameter_noinfo_noreturn (defined in libucrt.lib(invalid_parameter.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(loader_core.cpp.obj): locally defined symbol imported: _invalid_parameter_noinfo_noreturn (defined in libucrt.lib(invalid_parameter.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(loader_instance.cpp.obj): locally defined symbol imported: _invalid_parameter_noinfo_noreturn (defined in libucrt.lib(invalid_parameter.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(loader_logger.cpp.obj): locally defined symbol imported: _invalid_parameter_noinfo_noreturn (defined in libucrt.lib(invalid_parameter.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(api_layer_interface.cpp.obj): locally defined symbol imported: _invalid_parameter_noinfo_noreturn (defined in libucrt.lib(invalid_parameter.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(api_layer_interface.cpp.obj): locally defined symbol imported: __stdio_common_vsprintf (defined in libucrt.lib(output.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(runtime_interface.cpp.obj): locally defined symbol imported: _invalid_parameter_noinfo_noreturn (defined in libucrt.lib(invalid_parameter.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(runtime_interface.cpp.obj): locally defined symbol imported: __stdio_common_vsprintf (defined in libucrt.lib(output.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(loader_logger_recorders.cpp.obj): locally defined symbol imported: _invalid_parameter_noinfo_noreturn (defined in libucrt.lib(invalid_parameter.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(object_info.cpp.obj): locally defined symbol imported: _invalid_parameter_noinfo_noreturn (defined in libucrt.lib(invalid_parameter.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(manifest_file.cpp.obj): locally defined symbol imported: _invalid_parameter_noinfo_noreturn (defined in libucrt.lib(invalid_parameter.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(manifest_file.cpp.obj): locally defined symbol imported: atoi (defined in libucrt.lib(atox.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(manifest_file.cpp.obj): locally defined symbol imported: fclose (defined in libucrt.lib(fclose.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(manifest_file.cpp.obj): locally defined symbol imported: _lock_file (defined in libucrt.lib(_file.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(manifest_file.cpp.obj): locally defined symbol imported: _unlock_file (defined in libucrt.lib(_file.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(manifest_file.cpp.obj): locally defined symbol imported: fwrite (defined in libucrt.lib(fwrite.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(manifest_file.cpp.obj): locally defined symbol imported: fputc (defined in libucrt.lib(fputc.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(manifest_file.cpp.obj): locally defined symbol imported: _get_stream_buffer_pointers (defined in libucrt.lib(_file.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(manifest_file.cpp.obj): locally defined symbol imported: fflush (defined in libucrt.lib(fflush.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(json_value.cpp.obj): locally defined symbol imported: free (defined in libucrt.lib(free.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(json_value.cpp.obj): locally defined symbol imported: malloc (defined in libucrt.lib(malloc.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(json_value.cpp.obj): locally defined symbol imported: _invalid_parameter_noinfo_noreturn (defined in libucrt.lib(invalid_parameter.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(json_reader.cpp.obj): locally defined symbol imported: _invalid_parameter_noinfo_noreturn (defined in libucrt.lib(invalid_parameter.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(json_reader.cpp.obj): locally defined symbol imported: __stdio_common_vsprintf (defined in libucrt.lib(output.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(json_reader.cpp.obj): locally defined symbol imported: strncmp (defined in libucrt.lib(strncmp.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(filesystem_utils.cpp.obj): locally defined symbol imported: _invalid_parameter_noinfo_noreturn (defined in libucrt.lib(invalid_parameter.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(filesystem_utils.cpp.obj): locally defined symbol imported: free (defined in libucrt.lib(free.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(filesystem_utils.cpp.obj): locally defined symbol imported: calloc (defined in libucrt.lib(calloc.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(json_writer.cpp.obj): locally defined symbol imported: _invalid_parameter_noinfo_noreturn (defined in libucrt.lib(invalid_parameter.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(json_writer.cpp.obj): locally defined symbol imported: free (defined in libucrt.lib(free.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(json_writer.cpp.obj): locally defined symbol imported: wcslen (defined in libucrt.lib(wcslen.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(json_writer.cpp.obj): locally defined symbol imported: calloc (defined in libucrt.lib(calloc.obj)) [LNK4217]
          lld-link: warning: libstereokit_sys-219fd5c334ee8ce9.rlib(json_writer.cpp.obj): locally defined symbol imported: __stdio_common_vsprintf (defined in libucrt.lib(output.obj)) [LNK4217]
          lld-link: warning: msvcprt.lib(filesystem.obj): locally defined symbol imported: ___lc_codepage_func (defined in libucrt.lib(initctype.obj)) [LNK4217]
          lld-link: warning: msvcprt.lib(filesystem.obj): locally defined symbol imported: terminate (defined in libucrt.lib(terminate.obj)) [LNK4217]
          lld-link: warning: msvcprt.lib(filesystem.obj): locally defined symbol imported: free (defined in libucrt.lib(free.obj)) [LNK4217]
          lld-link: warning: msvcprt.lib(filesystem.obj): locally defined symbol imported: malloc (defined in libucrt.lib(malloc.obj)) [LNK4217]
          lld-link: error: undefined symbol: __declspec(dllimport) fmodf
          >>> referenced by libstereokit_sys-219fd5c334ee8ce9.rlib(model.cpp.obj):(model_anim_active_time)
          >>> referenced by libstereokit_sys-219fd5c334ee8ce9.rlib(model.cpp.obj):(model_anim_active_completion)
          
          lld-link: error: undefined symbol: __declspec(dllimport) cosf
          >>> referenced by libstereokit_sys-219fd5c334ee8ce9.rlib(mesh.cpp.obj):(mesh_gen_circle)
          >>> referenced by libstereokit_sys-219fd5c334ee8ce9.rlib(mesh.cpp.obj):(mesh_gen_cylinder)
          >>> referenced by libstereokit_sys-219fd5c334ee8ce9.rlib(mesh.cpp.obj):(mesh_gen_cone)
          >>> referenced 9 more times
          
          lld-link: error: undefined symbol: __declspec(dllimport) sinf
          >>> referenced by libstereokit_sys-219fd5c334ee8ce9.rlib(mesh.cpp.obj):(mesh_gen_circle)
          >>> referenced by libstereokit_sys-219fd5c334ee8ce9.rlib(mesh.cpp.obj):(mesh_gen_cylinder)
          >>> referenced by libstereokit_sys-219fd5c334ee8ce9.rlib(mesh.cpp.obj):(mesh_gen_cone)
          >>> referenced 13 more times
          
          lld-link: error: undefined symbol: __declspec(dllimport) log2
          >>> referenced by libstereokit_sys-219fd5c334ee8ce9.rlib(material.cpp.obj):(void __cdecl sk::material_check_tex_changes(struct sk::_material_t *))
          
          lld-link: error: undefined symbol: __declspec(dllimport) powf
          >>> referenced by libstereokit_sys-219fd5c334ee8ce9.rlib(color.cpp.obj):(color_lab)
          >>> referenced by libstereokit_sys-219fd5c334ee8ce9.rlib(color.cpp.obj):(color_lab)
          >>> referenced by libstereokit_sys-219fd5c334ee8ce9.rlib(color.cpp.obj):(color_lab)
          >>> referenced 53 more times
          
          lld-link: error: undefined symbol: __declspec(dllimport) asinf
          >>> referenced by libstereokit_sys-219fd5c334ee8ce9.rlib(sk_math.cpp.obj):(matrix_to_angles)
          
          lld-link: error: undefined symbol: __declspec(dllimport) atan2f
          >>> referenced by libstereokit_sys-219fd5c334ee8ce9.rlib(sk_math.cpp.obj):(matrix_to_angles)
          >>> referenced by libstereokit_sys-219fd5c334ee8ce9.rlib(sk_math.cpp.obj):(matrix_to_angles)
          >>> referenced by libstereokit_sys-219fd5c334ee8ce9.rlib(hand_oxr_articulated.cpp.obj):(void __cdecl sk::hand_oxra_update_system_meshes(void))
          
          lld-link: error: undefined symbol: __declspec(dllimport) logf
          >>> referenced by libstereokit_sys-219fd5c334ee8ce9.rlib(texture.cpp.obj):(tex_gen_cubemap)
          >>> referenced by libstereokit_sys-219fd5c334ee8ce9.rlib(texture.cpp.obj):(tex_gen_cubemap_sh)
          
          lld-link: error: undefined symbol: __declspec(dllimport) _timespec64_get
          >>> referenced by libstereokit_sys-219fd5c334ee8ce9.rlib(tinycthread.cpp.obj):(mtx_timedlock)
          >>> referenced by libstereokit_sys-219fd5c334ee8ce9.rlib(tinycthread.cpp.obj):(cnd_timedwait)
          >>> referenced by libstereokit_sys-219fd5c334ee8ce9.rlib(tinycthread.cpp.obj):(thrd_sleep)
          >>> referenced 1 more times
          
          lld-link: error: undefined symbol: __declspec(dllimport) fopen_s
          >>> referenced by libstereokit_sys-219fd5c334ee8ce9.rlib(render.cpp.obj):(stbi_write_bmp)
          >>> referenced by libstereokit_sys-219fd5c334ee8ce9.rlib(render.cpp.obj):(stbi_write_tga)
          >>> referenced by libstereokit_sys-219fd5c334ee8ce9.rlib(render.cpp.obj):(stbi_write_hdr)
          >>> referenced 11 more times
          
          lld-link: error: undefined symbol: __declspec(dllimport) frexp
          >>> referenced by libstereokit_sys-219fd5c334ee8ce9.rlib(render.cpp.obj):(int __cdecl stbi_write_hdr_core(struct stbi__write_context *, int, int, int, float *))
          >>> referenced by libstereokit_sys-219fd5c334ee8ce9.rlib(render.cpp.obj):(int __cdecl stbi_write_hdr_core(struct stbi__write_context *, int, int, int, float *))
          
          lld-link: error: undefined symbol: __declspec(dllimport) realloc
          >>> referenced by libstereokit_sys-219fd5c334ee8ce9.rlib(render.cpp.obj):(stbi_zlib_compress)
          >>> referenced by libstereokit_sys-219fd5c334ee8ce9.rlib(render.cpp.obj):(stbi_zlib_compress)
          >>> referenced by libstereokit_sys-219fd5c334ee8ce9.rlib(render.cpp.obj):(stbi_zlib_compress)
          >>> referenced 18 more times
          
          lld-link: error: undefined symbol: __declspec(dllimport) log2f
          >>> referenced by libstereokit_sys-219fd5c334ee8ce9.rlib(render.cpp.obj):(void __cdecl sk::render_draw_queue(union sk::matrix const *, union sk::matrix const *, enum sk::render_layer_, int))
          >>> referenced by libstereokit_sys-219fd5c334ee8ce9.rlib(sk_gpu.cpp.obj):(void __cdecl skg_tex_set_contents_arr(struct skg_tex_t *, void const **, int, int, int, int))
          >>> referenced by libstereokit_sys-219fd5c334ee8ce9.rlib(sk_gpu.cpp.obj):(unsigned int __cdecl skg_mip_count(int, int))
          >>> referenced 1 more times
          
          lld-link: error: undefined symbol: _m_prefetchw
          >>> referenced by libstereokit_sys-219fd5c334ee8ce9.rlib(render.cpp.obj):(void __cdecl sk::radix_sort7(struct sk::render_item_t *, unsigned __int64))
          
          lld-link: error: undefined symbol: __declspec(dllimport) _wfopen
          >>> referenced by libstereokit_sys-219fd5c334ee8ce9.rlib(platform_utils.cpp.obj):(platform_read_file)
          >>> referenced by libstereokit_sys-219fd5c334ee8ce9.rlib(platform_utils.cpp.obj):(platform_read_file)
          >>> referenced by libstereokit_sys-219fd5c334ee8ce9.rlib(platform_utils.cpp.obj):(int __cdecl sk::_platform_write_file(char const *, void *, unsigned __int64, int))
          
          lld-link: error: undefined symbol: __declspec(dllimport) fseek
          >>> referenced by libstereokit_sys-219fd5c334ee8ce9.rlib(platform_utils.cpp.obj):(platform_read_file)
          >>> referenced by libstereokit_sys-219fd5c334ee8ce9.rlib(sk_gpu.cpp.obj):(bool __cdecl skg_read_file(char const *, void **, unsigned __int64 *))
          >>> referenced by libstereokit_sys-219fd5c334ee8ce9.rlib(miniaudio.cpp.obj):(unsigned int __cdecl drmp3__on_seek_stdio(void *, int, enum drmp3_seek_origin))
          >>> referenced 5 more times
          
          lld-link: error: undefined symbol: __declspec(dllimport) ftell
          >>> referenced by libstereokit_sys-219fd5c334ee8ce9.rlib(platform_utils.cpp.obj):(platform_read_file)
          >>> referenced by libstereokit_sys-219fd5c334ee8ce9.rlib(sk_gpu.cpp.obj):(bool __cdecl skg_read_file(char const *, void **, unsigned __int64 *))
          >>> referenced by libstereokit_sys-219fd5c334ee8ce9.rlib(qoi.cpp.obj):(qoi_read)
          >>> referenced 1 more times
          
          lld-link: error: undefined symbol: __declspec(dllimport) fread
          >>> referenced by libstereokit_sys-219fd5c334ee8ce9.rlib(platform_utils.cpp.obj):(platform_read_file)
          >>> referenced by libstereokit_sys-219fd5c334ee8ce9.rlib(sk_gpu.cpp.obj):(bool __cdecl skg_read_file(char const *, void **, unsigned __int64 *))
          >>> referenced by libstereokit_sys-219fd5c334ee8ce9.rlib(miniaudio.cpp.obj):(unsigned __int64 __cdecl drwav__on_read_stdio(void *, void *, unsigned __int64))
          >>> referenced 5 more times
          
          lld-link: error: undefined symbol: __declspec(dllimport) _wsplitpath
          >>> referenced by libstereokit_sys-219fd5c334ee8ce9.rlib(platform_utils.cpp.obj):(platform_read_file)
          >>> referenced by libstereokit_sys-219fd5c334ee8ce9.rlib(platform_utils.cpp.obj):(platform_read_file)
          
          lld-link: error: undefined symbol: __declspec(dllimport) wcscpy
          >>> referenced by libstereokit_sys-219fd5c334ee8ce9.rlib(platform_utils.cpp.obj):(platform_read_file)
          
          lld-link: error: too many errors emitted, stopping now (use /errorlimit:0 to see all errors)
          

error: could not compile `test-project` due to previous error

Debug fails. "Cannot drop a runtime in a context where blocking is not allowed."

When running debug version of xwin, it fails with the following message

thread 'main' panicked at 'Cannot drop a runtime in a context where blocking is not allowed. This happens when a runtime is dropped from within an asynchronous context.', /home/user/.cargo/registry/src/github.com-1ecc6299db9ec823/tokio-1.10.0/src/runtime/blocking/shutdown.rs:51:21

cross-compiling minesweeper-rs within xwin from linux gave error Path not ending in ;

I followed your blog article about xwin to the best of my abilities:
https://jake-shadle.github.io/xwin/

Ok so I used this Dockerfile you made on Debian unstable
https://gist.github.com/omac777/1f231073f4b313e20376c386f48c6dc3
and ran the following:

docker build --network host -t playxwinimg .

Here is the build output for that docker image:
https://gist.github.com/omac777/dbf1547c47ffbb24453f4aafa2e567e2

git clone https://github.com/robmikh/minesweeper-rs.git
sudo chmod -R 777 minesweeper-rs
docker run --rm --network host -v /home/loongson/tryredox/playxwin/minesweeper-rs:/srv/minesweeper-rs -i -t playxwinimg:latest /bin/bash
cd /srv/minesweeper-rs
cargo build --target x86_64-pc-windows-msvc --release

I get a "Path not ending in ;" error.

I also attempted to cross-compile dua-cli in the same fashion and got a different "missing windows.rs" error for that.

Any hints pointers for these? Thank you.

Windows libraries lowercase

On linux it happens that LLD doesn't get the kernel32.Lib and Uuid.Lib (case-sensitive error?).

Build Summary: 2/7 steps succeeded; 2 failed
install transitive failure
+- install hello-c transitive failure
|  +- zig build-exe hello-c Debug x86_64-windows-msvc 2 errors
+- install hello-cpp transitive failure
|  +- zig build-exe hello-cpp Debug x86_64-windows-msvc 2 errors
+- install hello-zig success
   +- zig build-exe hello-zig Debug x86_64-windows-msvc success 4s MaxRSS:172M
error: lld-link: could not open 'kernel32.lib': No such file or directory
error: lld-link: could not open 'uuid.lib': No such file or directory
error: lld-link: could not open 'kernel32.lib': No such file or directory
error: lld-link: could not open 'uuid.lib': No such file or directory

Reference:

Add simple config for symlink creation

Right now one needs to manually change the code to address issues where the casing of a library or header used by external code doesn't match the file or symlink(s) created by xwin, which is...tedious. I still think using symlinks to transparently fixup these issues is the best approach, rather than requiring users to install the CRT/SDK within a case-insensitive filesystem/directory, but this issue will keep coming up since there is nothing stopping natively compiled Windows code from linking/including all kinds of crazily cased filenames, so it makes sense to make this more easily configurable. It would also be a way for users to supply their own configuration file at runtime to immediately fix issues until their fixup can be included in the main xwin release so that others get it for free.

Make output reproducible

The SDK headers for the Desktop and Store variants contain many of the exact same files between them, so we only write one, but since this is running in parallel it's non-determinstic which one will get written, so we need to make it deterministic. It would also be a good idea to go ahead and actually verify that the files also have the same exact content as well. See this post for the original issue.

Panic on xwin download

When executing xwin download, the application panics. As indicated by the stack trace this seems to be related to the printing of the progress bars, as doing xwin download > /dev/null seems to resolve the problem.

$ uname -a
Linux tritium 5.10.0-8-amd64 #1 SMP Debian 5.10.46-4 (2021-08-03) x86_64 GNU/Linux
$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 11 (bullseye)
Release:        11
Codename:       bullseye
$ xwin --version
xwin 0.1.9

USAGE:
[snip]
$ RUST_BACKTRACE=1 xwin download
Do you accept the license at https://go.microsoft.com/fwlink/?LinkId=2086102 (yes | no)?
yes
license accepted!
  Manifest [0s] ███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ 11.52 MiB/11.52 MiB 📥 downloaded   [0s] ████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ 3.26 MiB/3.26 MiB downloaded
⠒  [11s] ███████████████████████████████████████████████████████████▃                                                                                                                                                12.27 MiB/41.90 MiB 📥 downloading..
⠲  [11s] ███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▆                                                                12.52 MiB/18.18 MiB 📥 downloading..
⠓  [11s] ████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▄       10.32 MiB/10.65 MiB 📥 downloading..
⠁  [11s] ████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▁                       12.02 MiB/13.54 MiB 📥 downloading..
⠲  [11s] ████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████                                                        12.73 MiB/17.46 MiB 📥 downloading..
⠐  [11s] ██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████                      12.98 MiB/14.47 MiB 📥 downloading..
⠂  [11s] ██████████████████████████████████████████████████████████████████████████▁                                                                                                                                 25.17 MiB/68.82 MiB 📥 downloading..thread '<unnamed>' panicked at 'supplied instant is later than self', library/std/src/time.rs:311:48
stack backtrace:
   0: rust_begin_unwind
             at /rustc/91b931926fd49fc97d1e39f2b8206abf1d77ce7d/library/std/src/panicking.rs:495:5
   1: core::panicking::panic_fmt
             at /rustc/91b931926fd49fc97d1e39f2b8206abf1d77ce7d/library/core/src/panicking.rs:107:14
   2: core::panicking::panic_display
             at /rustc/91b931926fd49fc97d1e39f2b8206abf1d77ce7d/library/core/src/panicking.rs:64:5
   3: core::option::expect_failed
             at /rustc/91b931926fd49fc97d1e39f2b8206abf1d77ce7d/library/core/src/option.rs:1638:5
   4: core::option::Option<T>::expect
             at /rustc/91b931926fd49fc97d1e39f2b8206abf1d77ce7d/library/core/src/option.rs:709:21
   5: std::time::Instant::duration_since
             at /rustc/91b931926fd49fc97d1e39f2b8206abf1d77ce7d/library/std/src/time.rs:311:9
   6: <std::time::Instant as core::ops::arith::Sub>::sub
             at /rustc/91b931926fd49fc97d1e39f2b8206abf1d77ce7d/library/std/src/time.rs:436:9
   7: indicatif::draw_target::ProgressDrawTarget::drawable
   8: indicatif::multi::MultiState::draw
   9: indicatif::draw_target::Drawable::draw
  10: indicatif::state::BarState::draw
  11: indicatif::state::BarState::inc
  12: indicatif::progress_bar::ProgressBar::inc
  13: std::io::copy::stack_buffer_copy
  14: xwin::ctx::Ctx::get_and_validate
  15: core::ops::function::impls::<impl core::ops::function::FnMut<A> for &F>::call_mut
  16: <core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::try_fold
  17: <rayon::iter::fold::FoldFolder<C,ID,F> as rayon::iter::plumbing::Folder<T>>::consume_iter
  18: <rayon::iter::map::MapFolder<C,F> as rayon::iter::plumbing::Folder<T>>::consume_iter
  19: rayon::iter::plumbing::bridge_producer_consumer::helper
  20: <rayon::vec::IntoIter<T> as rayon::iter::IndexedParallelIterator>::with_producer
  21: <rayon::iter::while_some::WhileSome<I> as rayon::iter::ParallelIterator>::drive_unindexed
  22: rayon::iter::collect::<impl rayon::iter::ParallelExtend<T> for alloc::vec::Vec<T>>::par_extend
  23: rayon::result::<impl rayon::iter::FromParallelIterator<core::result::Result<T,E>> for core::result::Result<C,E>>::from_par_iter
  24: xwin::download::download
  25: core::ops::function::impls::<impl core::ops::function::FnOnce<A> for &mut F>::call_once
  26: rayon::iter::plumbing::Folder::consume_iter
  27: rayon::iter::plumbing::bridge_producer_consumer::helper
  28: rayon_core::registry::in_worker
  29: rayon::iter::plumbing::bridge_producer_consumer::helper
  30: std::panicking::try
  31: <rayon_core::job::StackJob<L,F,R> as rayon_core::job::Job>::execute
  32: rayon_core::registry::WorkerThread::wait_until_cold
  33: rayon_core::registry::ThreadBuilder::run
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.
thread 'thread 'thread '<unnamed><unnamed><unnamed>' panicked at '' panicked at '' panicked at 'called `Result::unwrap()` on an `Err` value: PoisonError { .. }called `Result::unwrap()` on an `Err` value: PoisonError { .. }called `Result::unwrap()` on an `Err` value: PoisonError { .. }', ', ', /home/pb/.cargo/registry/src/github.com-1ecc6299db9ec823/indicatif-0.17.0-rc.5/src/draw_target.rs/home/pb/.cargo/registry/src/github.com-1ecc6299db9ec823/indicatif-0.17.0-rc.5/src/draw_target.rs/home/pb/.cargo/registry/src/github.com-1ecc6299db9ec823/indicatif-0.17.0-rc.5/src/draw_target.rs::112:112:112::656565


stack backtrace:
   0: rust_begin_unwind
             at /rustc/91b931926fd49fc97d1e39f2b8206abf1d77ce7d/library/std/src/panicking.rs:495:5
   1: core::panicking::panic_fmt
             at /rustc/91b931926fd49fc97d1e39f2b8206abf1d77ce7d/library/core/src/panicking.rs:107:14
   2: core::result::unwrap_failed
             at /rustc/91b931926fd49fc97d1e39f2b8206abf1d77ce7d/library/core/src/result.rs:1617:5
   3: indicatif::draw_target::ProgressDrawTarget::width
 thread ' <unnamed> ' panicked at '4called `Result::unwrap()` on an `Err` value: PoisonError { .. }: ', indicatif/home/pb/.cargo/registry/src/github.com-1ecc6299db9ec823/indicatif-0.17.0-rc.5/src/draw_target.rs:::state112:::BarState65::
draw
   5: indicatif::state::BarState::inc
   6: indicatif::progress_bar::ProgressBar::inc
   7: std::io::copy::stack_buffer_copy
   8: xwin::ctx::Ctx::get_and_validate
   9: core::ops::function::impls::<impl core::ops::function::FnMut<A> for &F>::call_mut
  10: <core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::try_fold
  11: <rayon::iter::fold::FoldFolder<C,ID,F> as rayon::iter::plumbing::Folder<T>>::consume_iter
  12: <rayon::iter::map::MapFolder<C,F> as rayon::iter::plumbing::Folder<T>>::consume_iter
  13: rayon::iter::plumbing::bridge_producer_consumer::helper
  14: rayon_core::job::StackJob<L,F,R>::run_inline
  15: rayon_core::registry::in_worker
  16: rayon::iter::plumbing::bridge_producer_consumer::helper
  17: rayon_core::job::StackJob<L,F,R>::run_inline
  18: rayon_core::registry::in_worker
  19: rayon::iter::plumbing::bridge_producer_consumer::helper
  20: <rayon::vec::IntoIter<T> as rayon::iter::IndexedParallelIterator>::with_producer
  21: <rayon::iter::while_some::WhileSome<I> as rayon::iter::ParallelIterator>::drive_unindexed
  22: rayon::iter::collect::<impl rayon::iter::ParallelExtend<T> for alloc::vec::Vec<T>>::par_extend
  23: rayon::result::<impl rayon::iter::FromParallelIterator<core::result::Result<T,E>> for core::result::Result<C,E>>::from_par_iter
  24: xwin::download::download
  25: core::ops::function::impls::<impl core::ops::function::FnOnce<A> for &mut F>::call_once
  26: rayon::iter::plumbing::Folder::consume_iter
  27: rayon::iter::plumbing::bridge_producer_consumer::helper
  28: std::panicking::try
  29: <rayon_core::job::StackJob<L,F,R> as rayon_core::job::Job>::execute
  30: rayon_core::registry::WorkerThread::wait_until_cold
  31: rayon_core::registry::ThreadBuilder::run
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.
stack backtrace:
   0: rust_begin_unwind
             at /rustc/91b931926fd49fc97d1e39f2b8206abf1d77ce7d/library/std/src/panicking.rs:495:5
   1: core::panicking::panic_fmt
             at /rustc/91b931926fd49fc97d1e39f2b8206abf1d77ce7d/library/core/src/panicking.rs:107:14
   2: core::result::unwrap_failed
             at /rustc/91b931926fd49fc97d1e39f2b8206abf1d77ce7d/library/core/src/result.rs:1617:5
   3: indicatif::draw_target::ProgressDrawTarget::width
   4: indicatif::state::BarState::draw
  thread ' <unnamed>5' panicked at ': called `Result::unwrap()` on an `Err` value: PoisonError { .. }indicatif', ::/home/pb/.cargo/registry/src/github.com-1ecc6299db9ec823/indicatif-0.17.0-rc.5/src/draw_target.rsstate:::112BarState:::65inc

   6: indicatif::progress_bar::ProgressBar::inc
   7: std::io::copy::stack_buffer_copy
   8: xwin::ctx::Ctx::get_and_validate
   9: core::ops::function::impls::<impl core::ops::function::FnMut<A> for &F>::call_mut
  10: <core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::try_fold
  11: <rayon::iter::fold::FoldFolder<C,ID,F> as rayon::iter::plumbing::Folder<T>>::consume_iter
  12: <rayon::iter::map::MapFolder<C,F> as rayon::iter::plumbing::Folder<T>>::consume_iter
  13: rayon::iter::plumbing::bridge_producer_consumer::helper
  14: rayon_core::job::StackJob<L,F,R>::run_inline
  15: rayon_core::registry::in_worker
  16: rayon::iter::plumbing::bridge_producer_consumer::helper
  17: rayon_core::registry::in_worker
  18: rayon::iter::plumbing::bridge_producer_consumer::helper
  19: rayon_core::job::StackJob<L,F,R>::run_inline
  20: rayon_core::registry::in_worker
  21: rayon::iter::plumbing::bridge_producer_consumer::helper
  22: <rayon::vec::IntoIter<T> as rayon::iter::IndexedParallelIterator>::with_producer
  23: <rayon::iter::while_some::WhileSome<I> as rayon::iter::ParallelIterator>::drive_unindexed
  24: rayon::iter::collect::<impl rayon::iter::ParallelExtend<T> for alloc::vec::Vec<T>>::par_extend
  25: rayon::result::<impl rayon::iter::FromParallelIterator<core::result::Result<T,E>> for core::result::Result<C,E>>::from_par_iter
  26: xwin::download::download
  27: core::ops::function::impls::<impl core::ops::function::FnOnce<A> for &mut F>::call_once
  28: rayon::iter::plumbing::Folder::consume_iter
  29: rayon::iter::plumbing::bridge_producer_consumer::helper
  30: rayon_core::registry::in_worker
  31: rayon::iter::plumbing::bridge_producer_consumer::helper
  32: std::panicking::try
  33: <rayon_core::job::StackJob<L,F,R> as rayon_core::job::Job>::execute
  34: rayon_core::registry::WorkerThread::wait_until_cold
  35: rayon_core::registry::ThreadBuilder::run
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.
stack backtrace:
   0: rust_begin_unwind
             at /rustc/91b931926fd49fc97d1e39f2b8206abf1d77ce7d/library/std/src/panicking.rs:495:5
   1: core::panicking::panic_fmt
             at /rustc/91b931926fd49fc97d1e39f2b8206abf1d77ce7d/library/core/src/panicking.rs:107:14
   2: core::result::unwrap_failed
             at /rustc/91b931926fd49fc97d1e39f2b8206abf1d77ce7d/library/core/src/result.rs:1617:5
   3: indicatif::draw_target::ProgressDrawTarget::width
   4: indicatif::state::BarState::draw
   5: indicatif::state::BarState::inc
   6: indicatif::progress_bar::ProgressBar::inc
   7: std::io::copy::stack_buffer_copy
   8: xwin::ctx::Ctx::get_and_validate
   9: core::ops::function::impls::<impl core::ops::function::FnMut<A> for &F>::call_mut
  10: <core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::try_fold
  11: <rayon::iter::fold::FoldFolder<C,ID,F> as rayon::iter::plumbing::Folder<T>>::consume_iter
  12: <rayon::iter::map::MapFolder<C,F> as rayon::iter::plumbing::Folder<T>>::consume_iter
  13: rayon::iter::plumbing::bridge_producer_consumer::helper
  14: rayon_core::job::StackJob<L,F,R>::run_inline
  15: rayon_core::registry::in_worker
  16: rayon::iter::plumbing::bridge_producer_consumer::helper
  17: rayon_core::registry::in_worker
  18: rayon::iter::plumbing::bridge_producer_consumer::helper
  19: <rayon::vec::IntoIter<T> as rayon::iter::IndexedParallelIterator>::with_producer
  20: <rayon::iter::while_some::WhileSome<I> as rayon::iter::ParallelIterator>::drive_unindexed
  21: rayon::iter::collect::<impl rayon::iter::ParallelExtend<T> for alloc::vec::Vec<T>>::par_extend
  22: rayon::result::<impl rayon::iter::FromParallelIterator<core::result::Result<T,E>> for core::result::Result<C,E>>::from_par_iter
  23: xwin::download::download
  24: core::ops::function::impls::<impl core::ops::function::FnOnce<A> for &mut F>::call_once
  25: rayon::iter::plumbing::Folder::consume_iter
  26: rayon::iter::plumbing::bridge_producer_consumer::helper
  27: rayon_core::registry::in_worker
  28: rayon::iter::plumbing::bridge_producer_consumer::helper
  29: rayon_core::registry::in_worker
  30: rayon::iter::plumbing::bridge_producer_consumer::helper
  31: std::panicking::try
  32: <rayon_core::job::StackJob<L,F,R> as rayon_core::job::Job>::execute
  33: rayon_core::registry::WorkerThread::wait_until_cold
  34: rayon_core::registry::ThreadBuilder::run
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.
stack backtrace:
   0:     0x55931b51055c - std::backtrace_rs::backtrace::libunwind::trace::hc6c3491277866fea
                               at /rustc/91b931926fd49fc97d1e39f2b8206abf1d77ce7d/library/std/src/../../backtrace/src/backtrace/libunwind.rs:93:5
   1:     0x55931b51055c - std::backtrace_rs::backtrace::trace_unsynchronized::h4524f073368a5b13
                               at /rustc/91b931926fd49fc97d1e39f2b8206abf1d77ce7d/library/std/src/../../backtrace/src/backtrace/mod.rs:66:5
   2:     0x55931b51055c - std::sys_common::backtrace::_print_fmt::h0d0cace6159902af
                               at /rustc/91b931926fd49fc97d1e39f2b8206abf1d77ce7d/library/std/src/sys_common/backtrace.rs:67:5
   3:     0x55931b51055c - <std::sys_common::backtrace::_print::DisplayBacktrace as core::fmt::Display>::fmt::h3e6af6f05919a7fc
                               at /rustc/91b931926fd49fc97d1e39f2b8206abf1d77ce7d/library/std/src/sys_common/backtrace.rs:46:22
   4:     0x55931b534ebc - core::fmt::write::h72801a82c94e6ff1
                               at /rustc/91b931926fd49fc97d1e39f2b8206abf1d77ce7d/library/core/src/fmt/mod.rs:1163:17
   5:     0x55931b509835 - std::io::Write::write_fmt::ha4f5d34aaccbac84
                               at /rustc/91b931926fd49fc97d1e39f2b8206abf1d77ce7d/library/std/src/io/mod.rs:1696:15
   6:     0x55931b512330 - std::sys_common::backtrace::_print::heed69f5ce9a8e189
                               at /rustc/91b931926fd49fc97d1e39f2b8206abf1d77ce7d/library/std/src/sys_common/backtrace.rs:49:5
   7:     0x55931b512330 - std::sys_common::backtrace::print::h5f3918bd80c09252
                               at /rustc/91b931926fd49fc97d1e39f2b8206abf1d77ce7d/library/std/src/sys_common/backtrace.rs:36:9
   8:     0x55931b512330 - std::panicking::default_hook::{{closure}}::h5af30648530eb3d0
                               at /rustc/91b931926fd49fc97d1e39f2b8206abf1d77ce7d/library/std/src/panicking.rs:210:50
   9:     0x55931b511edb - std::panicking::default_hook::he88d5fb1ba1b4c19
                               at /rustc/91b931926fd49fc97d1e39f2b8206abf1d77ce7d/library/std/src/panicking.rs:227:9
  10:     0x55931b5129e4 - std::panicking::rust_panic_with_hook::h01febc308b2b313b
                               at /rustc/91b931926fd49fc97d1e39f2b8206abf1d77ce7d/library/std/src/panicking.rs:602:17
  11:     0x55931b5124c0 - std::panicking::begin_panic_handler::{{closure}}::h24a6d13f5560b71f
                               at /rustc/91b931926fd49fc97d1e39f2b8206abf1d77ce7d/library/std/src/panicking.rs:499:13
  12:     0x55931b510a04 - std::sys_common::backtrace::__rust_end_short_backtrace::h3e2917f0da9fbc5c
                               at /rustc/91b931926fd49fc97d1e39f2b8206abf1d77ce7d/library/std/src/sys_common/backtrace.rs:139:18
  13:     0x55931b512429 - rust_begin_unwind
                               at /rustc/91b931926fd49fc97d1e39f2b8206abf1d77ce7d/library/std/src/panicking.rs:495:5
  14:     0x55931b0f8141 - core::panicking::panic_fmt::h7b8580d81fcbbacd
                               at /rustc/91b931926fd49fc97d1e39f2b8206abf1d77ce7d/library/core/src/panicking.rs:107:14
  15:     0x55931b0f8233 - core::result::unwrap_failed::h885d3f7beb571353
                               at /rustc/91b931926fd49fc97d1e39f2b8206abf1d77ce7d/library/core/src/result.rs:1617:5
  16:     0x55931b4638b6 - indicatif::draw_target::ProgressDrawTarget::width::he07ed5e4c5da6d67
  17:     0x55931b46b401 - indicatif::state::BarState::draw::h1e9df6ed5ce36431
  18:     0x55931b46ad0a - indicatif::state::BarState::finish_using_style::hca76e05b01938acf
  19:     0x55931b46b76e - <indicatif::state::BarState as core::ops::drop::Drop>::drop::h62cbcdadc060c84c
  20:     0x55931b1336bd - core::ptr::drop_in_place<core::cell::UnsafeCell<indicatif::state::BarState>>::hd7017fd7062061cf
  21:     0x55931b134812 - alloc::sync::Arc<T>::drop_slow::h5f49d123e63163cd
  22:     0x55931b181cb9 - core::ptr::drop_in_place<xwin::WorkItem>::he7eef3b15fa6820a
  23:     0x55931b18101b - core::ops::function::impls::<impl core::ops::function::FnOnce<A> for &mut F>::call_once::h771ab4a814c7a355
  24:     0x55931b1a13d2 - rayon::iter::plumbing::Folder::consume_iter::h8292e70508411c6a
  25:     0x55931b1584bd - rayon::iter::plumbing::bridge_producer_consumer::helper::hfab6c09c5b373053
  26:     0x55931b16e614 - rayon_core::registry::in_worker::h88d06e25adcc6b36
  27:     0x55931b1585f9 - rayon::iter::plumbing::bridge_producer_consumer::helper::hfab6c09c5b373053
  28:     0x55931b130e92 - std::panicking::try::h0e635cbd1f44e2cf
  29:     0x55931b1a7db1 - <rayon_core::job::StackJob<L,F,R> as rayon_core::job::Job>::execute::hee7342ec3bd56e04
  30:     0x55931b0ebee1 - rayon_core::registry::WorkerThread::wait_until_cold::h6675ffd310fe01d0
  31:     0x55931b3c97f3 - rayon_core::registry::ThreadBuilder::run::h6d34f9fb0e14b198
  32:     0x55931b3cb861 - std::sys_common::backtrace::__rust_begin_short_backtrace::h13d8c317eccff66a
  33:     0x55931b3cd4fb - core::ops::function::FnOnce::call_once{{vtable.shim}}::h48557bc39203906b
  34:     0x55931b517633 - <alloc::boxed::Box<F,A> as core::ops::function::FnOnce<Args>>::call_once::hd81bd86213781012
                               at /rustc/91b931926fd49fc97d1e39f2b8206abf1d77ce7d/library/alloc/src/boxed.rs:1691:9
  35:     0x55931b517633 - <alloc::boxed::Box<F,A> as core::ops::function::FnOnce<Args>>::call_once::h7b3e346f5d8f6d6a
                               at /rustc/91b931926fd49fc97d1e39f2b8206abf1d77ce7d/library/alloc/src/boxed.rs:1691:9
  36:     0x55931b517633 - std::sys::unix::thread::Thread::new::thread_start::ha575792f17151d60
                               at /rustc/91b931926fd49fc97d1e39f2b8206abf1d77ce7d/library/std/src/sys/unix/thread.rs:106:17
  37:     0x7fa0ccd29ea7 - start_thread
                               at ./nptl/./nptl/pthread_create.c:477:8
  38:     0x7fa0ccb0fdef - clone
                               at ./misc/../sysdeps/unix/sysv/linux/x86_64/clone.S:95
  39:                0x0 - <unknown>
thread panicked while panicking. aborting.
Illegal instruction

Newest release does not follow semantic versioning, breaks cargo-xwin

Hello everyone :) The newest release of xwin breaks cargo install cargo-xwin and potentially other packages depending on xwin, since there were breaking changes to the API which are not reflected in the semantic version of this crate. cargo assumes that crates follow semantic versioning and upgrades to the newest version implicitly, since it assumes no breaking changes were made. It would be greatly appreciated if you can roll back the release and re-release it as a new minor version so that cargo does not upgrade it.

Only major manifest version can be specified?

Readme and help message says that --manifest-version can be a "<major>.<minor>" version.
--manifest-version is used only to construct a link.

xwin/src/main.rs

Lines 363 to 368 in 8519e95

None => xwin::manifest::get_manifest(
ctx,
&args.manifest_version,
&args.channel,
manifest_pb.clone(),
)?,

xwin/src/manifest.rs

Lines 110 to 128 in 8519e95

/// Retrieves the top-level manifest which contains license links as well as the
/// link to the actual package manifest which describes all of the contents
pub fn get_manifest(
ctx: &Ctx,
version: &str,
channel: &str,
progress: indicatif::ProgressBar,
) -> Result<Manifest, anyhow::Error> {
let manifest_bytes = ctx.get_and_validate(
format!("https://aka.ms/vs/{version}/{channel}/channel"),
&format!("manifest_{version}.json"),
None,
progress,
)?;
let manifest: Manifest = serde_json::from_slice(&manifest_bytes)?;
Ok(manifest)
}

Only 15, 16, 17 major versions return a valid manifest.
https://aka.ms/vs/15/release/channel
https://aka.ms/vs/15/pre/channel
https://aka.ms/vs/16/release/channel
https://aka.ms/vs/16/pre/channel
https://aka.ms/vs/17/release/channel
https://aka.ms/vs/17/pre/channel

Any other version just redirects to https://www.bing.com
e.g.
https://aka.ms/vs/16.11/release/channel

Were minor version links available at some point?

Either some handling of minor version should be added or that part of the help text should be removed.

error: could not open 'kernel32.lib': No such file or directory

Hi, thanks for this project. I followed your blog post instruction but failed with this error. I'm very newbie with build systems so this is probably a trivial problem.

The output of cargo build --target=x86_64-pc-windows-msvc is here:

   Compiling ra-run v0.1.0 (/home/hamid/oss/ra-run)
error: linking with `lld-link` failed: exit status: 1
  |
  = note: LC_ALL="C" PATH="/home/hamid/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/bin:/home/hamid/.wasmer/bin:/home/hamid/.wasmtime/bin:/home/hamid/.deno/bin:/home/hamid/.wasmer/bin:/home/hamid/.wasmtime/bin:/home/hamid/.deno/bin:/home/hamid/.nvm/versions/node/v16.14.2/bin:/home/hamid/.cargo/bin:/home/hamid/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin:/home/hamid/.dotnet/tools:/home/hamid/.wasmer/globals/wapm_packages/.bin:/home/hamid/.wasmer/globals/wapm_packages/.bin" VSLANG="1033" "lld-link" "-flavor" "link" "/NOLOGO" "/tmp/rustcPF02Um/symbols.o" "/home/hamid/oss/ra-run/target/x86_64-pc-windows-msvc/debug/deps/ra_run.370mowunmskngb40.rcgu.o" "/home/hamid/oss/ra-run/target/x86_64-pc-windows-msvc/debug/deps/ra_run.3m4vdmlolq0fnnoe.rcgu.o" "/home/hamid/oss/ra-run/target/x86_64-pc-windows-msvc/debug/deps/ra_run.43wqbv6cmxezo5iu.rcgu.o" "/home/hamid/oss/ra-run/target/x86_64-pc-windows-msvc/debug/deps/ra_run.4mo8zh2mfgx2kezh.rcgu.o" "/home/hamid/oss/ra-run/target/x86_64-pc-windows-msvc/debug/deps/ra_run.564mgay8mqaonrg9.rcgu.o" "/home/hamid/oss/ra-run/target/x86_64-pc-windows-msvc/debug/deps/ra_run.5g9lvrbiowshlvia.rcgu.o" "/home/hamid/oss/ra-run/target/x86_64-pc-windows-msvc/debug/deps/ra_run.sxm4i7jjh3bxiyh.rcgu.o" "/LIBPATH:/home/hamid/oss/ra-run/target/x86_64-pc-windows-msvc/debug/deps" "/LIBPATH:/home/hamid/oss/ra-run/target/debug/deps" "/LIBPATH:/home/hamid/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-pc-windows-msvc/lib" "/home/hamid/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-pc-windows-msvc/lib/libstd-def8e53046de335b.rlib" "/home/hamid/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-pc-windows-msvc/lib/libpanic_unwind-62d160d4fb1f3e35.rlib" "/home/hamid/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-pc-windows-msvc/lib/librustc_demangle-13ad55cee4080447.rlib" "/home/hamid/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-pc-windows-msvc/lib/libstd_detect-1735606bdcca0248.rlib" "/home/hamid/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-pc-windows-msvc/lib/libhashbrown-ed3da6b061bf16b2.rlib" "/home/hamid/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-pc-windows-msvc/lib/libminiz_oxide-798a382c9e175c85.rlib" "/home/hamid/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-pc-windows-msvc/lib/libadler-f40bb6e991434635.rlib" "/home/hamid/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-pc-windows-msvc/lib/librustc_std_workspace_alloc-e0d1795fe60da182.rlib" "/home/hamid/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-pc-windows-msvc/lib/libunwind-05143401f2cd6cbf.rlib" "/home/hamid/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-pc-windows-msvc/lib/libcfg_if-d0fa84d9f351cf16.rlib" "/home/hamid/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-pc-windows-msvc/lib/liblibc-c00d1f51981f09f6.rlib" "/home/hamid/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-pc-windows-msvc/lib/liballoc-6231dd8f826d6fe5.rlib" "/home/hamid/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-pc-windows-msvc/lib/librustc_std_workspace_core-b7b22741583360f1.rlib" "/home/hamid/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-pc-windows-msvc/lib/libcore-a8962116ce00a4da.rlib" "/home/hamid/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-pc-windows-msvc/lib/libcompiler_builtins-58e2de43e9b1a814.rlib" "kernel32.lib" "advapi32.lib" "userenv.lib" "kernel32.lib" "ws2_32.lib" "bcrypt.lib" "msvcrt.lib" "legacy_stdio_definitions.lib" "/NXCOMPAT" "/LIBPATH:/home/hamid/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-pc-windows-msvc/lib" "/OUT:/home/hamid/oss/ra-run/target/x86_64-pc-windows-msvc/debug/deps/ra_run.exe" "/OPT:REF,NOICF" "/DEBUG"

My guess is that these paths "kernel32.lib" "advapi32.lib" "userenv.lib" "kernel32.lib" "ws2_32.lib" "bcrypt.lib" "msvcrt.lib" should be absolute. I have these file in my disk on /xwin/sdk/lib/um/x86_64.

I tried to carefully follow your blog post, but I'm not in a docker image. I can provide additional information if needed.

Add support for CA info

I have a machine that lives behind an SSL/TLS proxy. Applications that communicate over HTTPS need to have access to a local CA certificate in order to validate the connection (e.g., for Cargo, the CA file is specified via http.cainfo configuration option or the CARGO_HTTP_CAINFO environment variable). It looks like there isn't a way to specify a CA file path for xwin, which blocks downloads of the Microsoft CRT and Windows SDK headers and libraries over the proxy. Specifically, running

xwin --accept-license splat

while behind the proxy results in

Error: https://aka.ms/vs/16/release/channel: Connection Failed: tls connection init failed: invalid peer certificate encoding

Caused by:
    invalid peer certificate encoding

xwin ignores Win11SDK

Newer Windows SDK installer names, such as available from manifest version 17, start with prefix Win11SDK_ instead of Win10SDK_, and xwin always assumes the latter prefix.

It also might be worthwhile to update the default manifest to 17 while at it.

error couldn't read trash-3399c06387deef86/out/windows.rs No such file or directory

Using the newly updated Dockerfile and respective built image I got an error while cross-compiling dua-cli.

Here is the Dockerfile:
https://gist.github.com/omac777/1f231073f4b313e20376c386f48c6dc3#file-dockerfile-L49

Here are the steps to cross-compile dua-cli:

sudo service docker restart
sudo service docker status
docker image ls
docker rmi -f 2089c03a47ca
docker build --network host -t playxwinimg .
docker container ls --all

git clone https://github.com/Byron/dua-cli
sudo chmod -R 777 dua-cli
docker run --rm --network host -v /home/loongson/tryredox/playxwin/dua-cli:/srv/dua-cli -i -t playxwinimg:latest /bin/bash
cd /srv/dua-cli
cargo build --target x86_64-pc-windows-msvc --release

Here is the build error output:

loongson@righteous 2021-08-26_08:16:51_EDT : ~/tryredox/playxwin
$ docker run --rm --network host -v /home/loongson/tryredox/playxwin/dua-cli:/srv/dua-cli -i -t playxwinimg:latest /bin/bash
WARNING: Support for the legacy ~/.dockercfg configuration file and file-format is deprecated and will be removed in an upcoming release
root@righteous:/# cd /srv/dua-cli
cd /srv/dua-cli
root@righteous:/srv/dua-cli# cargo build --target x86_64-pc-windows-msvc --release
cargo build --target x86_64-pc-windows-msvc --release
    Updating crates.io index
  Downloaded trash v2.0.1
  Downloaded anyhow v1.0.42
  Downloaded unicode-width v0.1.8
  Downloaded atty v0.2.14
  Downloaded cfg-if v1.0.0
  Downloaded crossbeam-utils v0.8.5
  Downloaded bitflags v1.2.1
  Downloaded percent-encoding v2.1.0
  Downloaded log v0.4.14
  Downloaded clap_derive v3.0.0-beta.4
  Downloaded crossbeam v0.8.1
  Downloaded heck v0.3.3
  Downloaded form_urlencoded v1.0.1
  Downloaded crossbeam-deque v0.8.1
  Downloaded fixedbitset v0.4.0
  Downloaded filesize v0.2.0
  Downloaded crossterm_winapi v0.8.0
  Downloaded byte-unit v4.0.12
  Downloaded const-sha1 v0.2.0
  Downloaded chrono v0.4.19
  Downloaded lock_api v0.4.4
  Downloaded jwalk v0.6.0
  Downloaded lazy_static v1.4.0
  Downloaded instant v0.1.10
  Downloaded clap v3.0.0-beta.4
  Downloaded vec_map v0.8.2
  Downloaded num-integer v0.1.44
  Downloaded mio v0.7.13
  Downloaded quote v1.0.9
  Downloaded proc-macro-error v1.0.4
  Downloaded strsim v0.10.0
  Downloaded smallvec v1.6.1
  Downloaded tinyvec_macros v0.1.0
  Downloaded winapi-util v0.1.5
  Downloaded url v2.2.2
  Downloaded unicode-normalization v0.1.19
  Downloaded either v1.6.1
  Downloaded unicode-segmentation v1.8.0
  Downloaded tui-react v0.16.0
  Downloaded windows_macros v0.8.0
  Downloaded num-traits v0.2.14
  Downloaded indexmap v1.7.0
  Downloaded hashbrown v0.11.2
  Downloaded num_cpus v1.13.0
  Downloaded miow v0.3.7
  Downloaded signal-hook-registry v1.4.0
  Downloaded signal-hook-mio v0.2.1
  Downloaded pathdiff v0.2.0
  Downloaded rayon v1.5.1
  Downloaded parking_lot v0.11.1
  Downloaded scopeguard v1.1.0
  Downloaded os_str_bytes v3.1.0
  Downloaded crossterm v0.20.0
  Downloaded glob v0.3.0
  Downloaded itertools v0.10.1
  Downloaded crosstermion v0.8.1
  Downloaded crossbeam-queue v0.3.2
  Downloaded cassowary v0.3.0
  Downloaded windows v0.8.0
  Downloaded wild v2.0.4
  Downloaded utf8-width v0.1.5
  Downloaded unicode-bidi v0.3.5
  Downloaded tui v0.16.0
  Downloaded tinyvec v1.3.1
  Downloaded textwrap v0.14.2
  Downloaded syn v1.0.74
  Downloaded rayon-core v1.9.1
  Downloaded petgraph v0.6.0
  Downloaded open v2.0.0
  Downloaded ntapi v0.3.6
  Downloaded colored v2.0.0
  Downloaded memoffset v0.6.4
  Downloaded matches v0.1.8
  Downloaded crossbeam-channel v0.5.1
  Downloaded crossbeam-epoch v0.9.5
  Downloaded autocfg v1.0.1
  Downloaded version_check v0.9.3
  Downloaded unicode-xid v0.2.2
  Downloaded time v0.1.44
  Downloaded termcolor v1.1.2
  Downloaded signal-hook v0.3.9
  Downloaded proc-macro2 v1.0.28
  Downloaded parking_lot_core v0.8.3
  Downloaded proc-macro-error-attr v1.0.4
  Downloaded idna v0.2.3
  Downloaded winapi v0.3.9
  Downloaded libc v0.2.98
  Downloaded windows_gen v0.8.0
  Downloaded 88 crates (11.1 MB) in 1.60s (largest was `windows_gen` at 5.8 MB)
   Compiling trash v2.0.1
error: couldn't read /srv/dua-cli/target/x86_64-pc-windows-msvc/release/build/trash-3399c06387deef86/out/windows.rs: No such file or directory (os error 2)
  --> /usr/local/cargo/registry/src/github.com-1ecc6299db9ec823/trash-2.0.1/src/windows.rs:18:5
   |
18 |     ::windows::include_bindings!();
   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   |
   = note: this error originates in the macro `::std::include` (in Nightly builds, run with -Z macro-backtrace for more info)

error: aborting due to previous error

error: could not compile `trash`

To learn more, run the command again with --verbose.

I did notice something of windows_gen v0.8.0, but I didn't see a location to change windows crate to 0.19.0.

Thank you in advance.

symlink sdk/lib/<sdkversion> to sdk/lib and sdk/include/<sdkversion> to sdk/include

clang-cl supports /winsdkdir <dir> and /vctoolsdir <dir> in lieu of passing all of the various /imsvc <dir> and /libpath: <dir> options to get all of the nested directories for the correct architecture. However, clang's detection of this assumes that sdk/lib and sdk/dir include directories for all of the various Windows SDK versions one could have installed (i.e. sdk/lib/10.0.20348/um/x64), as this is the layout that Visual Studio uses.

Would it be possible to add two additional symlinks in the sdk directory for the Windows SDK version, which just points back to that sdk directory? This would allow compilation command lines to be as simple as clang-cl --target=x86_64-pc-windows-msvc -fuse-ld=lld-link /winsdkdir /xwin/sdk /vctoolsdir /xwin/crt, which I think would be a huge convenience win.

Confusingly, these symlinks should probably be created even with --disable-symlinks so this functionality can still be used on case insensitive file systems.

If you're open to adding this functionality, I'm willing to implement and PR it myself.

Certain directories aren't included that need to be to compile some packages.

I had to add these cxx and c flags in order to get cmake to compile my library, is this something that should be added directly to xwin or is there some reason why /include and /include/winrt and /include/winrt/wrl aren't a part of it?

cmake_config.cxxflag("/imsvc/home/malek/.cache/cargo-xwin/xwin/sdk/include/cppwinrt");
cmake_config.cflag("/imsvc/home/malek/.cache/cargo-xwin/xwin/sdk/include/cppwinrt");
cmake_config.cxxflag("/imsvc/home/malek/.cache/cargo-xwin/xwin/sdk/include/winrt");
cmake_config.cflag("/imsvc/home/malek/.cache/cargo-xwin/xwin/sdk/include/winrt");
cmake_config.cxxflag("/imsvc/home/malek/.cache/cargo-xwin/xwin/sdk/include");
cmake_config.cflag("/imsvc/home/malek/.cache/cargo-xwin/xwin/sdk/include");
cmake_config.cxxflag("/imsvc/home/malek/.cache/cargo-xwin/xwin/sdk/include/winrt/wrl");
cmake_config.cflag("/imsvc/home/malek/.cache/cargo-xwin/xwin/sdk/include/winrt/wrl");

Thoughts? Recommendations? There is probably a better way to do this that I don't know about and I would prefer to do it that way.

Retrieve license text

The top level manifest includes the link to the license at https://go.microsoft.com/fwlink/?LinkId=2086102, so I just hardcoded instead of needing to do a network request first and parse it out of the manifest, but this is obviously bad if the link goes away or is just different in a different version of VS, so yah, should fix this.

[Feature Request] Support the use of custom CA cert via the env variable `REQUESTS_CA_BUNDLE` or `CURL_CA_BUNDLE` or `CARGO_HTTP_CAINFO`

I was trying to build a rust project and compile it into a python window wheel using maturin and I encountered the issue as described below:

PyO3/maturin#1836

From the erroneous output, I notice that there's an error whenever it tried to reach the domain https://aka.ms to download the microsoft CRT files. As described in the above issue, even though the env variables such as MATURIN_CA_BUNDLE, REQUESTS_CA_BUNDLE, CURL_CA_BUNDLE, CARGO_HTTP_CAINFO, SSL_CERT_FILE have been set, there're still the error tls connection init failed: invalid peer certificate: UnknownIssuer. But network-wise, it's able to reach the domain, proven by the valid output from the command curl --ca-cert [path-to-ca-cert] https://aka.ms

Since maturin uses this crate as part of their dependency, I have looked at the source code of this repo to understand how the http request is fired out. From what I understand, it doesn't seem to support the use of custom cert:

https://github.com/Jake-Shadle/xwin/blob/main/src/manifest.rs#L118
https://github.com/Jake-Shadle/xwin/blob/main/src/ctx.rs#L136

I'm not sure if I read it correctly, so feel free to correct me if I'm wrong. Meanwhile, can I ask if we can add the feature to support the use of custom CA cert (possibly by respecting the presence of env variable such as REQUESTS_CA_BUNDLE, CURL_CA_BUNDLE, CARGO_HTTP_CAINFO, SSL_CERT_FILE ? )

Thanks

[Feature request]Supporting /winsysroot in clang-cl?

Hi:
clang-cl has this option called /winsysroot, which simplifies the arguments if my understanding is correct, it's described below:

/winsysroot <dir>       Same as /vctoolsdir <dir>/VC/Tools/MSVC/<vctoolsversion> /winsdkdir <dir>/Windows Kits/10

Can xwin layout it's directories in this format so one could just use /winsysroot to setup everything? I'm not an Win expert so I could be very wrong here

Support Store (UWP) variant

I initially added support for the store variant, but going to take it out for now since we don't really target it and it's only a tier 3 target for Rust anyhow.

Add lib pruning

Currently xwin just splats all of the SDKs import libraries for the selected arch/variant, but this is a vast amount of overkill as even the most heavy users of the SDK will use only a couple of dozen libraries at most, so providing a way for users to only keep the ones they actually use would help with disk (container) sizes by a large amount.

Add header pruning

The Windows SDK has ~315MiB of headers (and other junk) under include, and similarly to #84, only a small fraction will ever be used by a project. Header pruning will probably be a little more involved if one wants to remove headers transitively, but with a little effort one should be able to remove massive swathes of includes that any single project never uses, potentially reducing disk (container) usage quite a lot.

Also, the winrt directory is 121MiB alone, and most C/C++ code that is using Windows is ancient and thus doesn't know nor care about WinRT, so that should at least be an easy win for most projects.

Compile error: "error: undefined symbol: __cpuid" when cross compiling zstd in Rust

I have followed the instructions in xwin.dockerfile and make cross-compile tool chain works for simple project. But failed to compile project with zstd.

So I've cloned the zstd-rs and do some build steps.

cargo build --lib works well.

cargo build --example benchmark failed with following errors:

  = note: lld: error: undefined symbol: __cpuid
          >>> referenced by /home/huolinhe/Projects/rust/zstd-rs/zstd-safe/zstd-sys/zstd/lib/common/cpu.h:39
          >>>               libzstd_sys-2402a47df61deea5.rlib(zstd_compress.o):(ZSTD_cpuid)
          >>> referenced by /home/huolinhe/Projects/rust/zstd-rs/zstd-safe/zstd-sys/zstd/lib/common/cpu.h:43
          >>>               libzstd_sys-2402a47df61deea5.rlib(zstd_compress.o):(ZSTD_cpuid)
          >>> referenced by /home/huolinhe/Projects/rust/zstd-rs/zstd-safe/zstd-sys/zstd/lib/common/cpu.h:39
          >>>               libzstd_sys-2402a47df61deea5.rlib(zstd_decompress.o):(ZSTD_cpuid)
          >>> referenced 1 more times
          
          lld: error: undefined symbol: __cpuidex
          >>> referenced by /home/huolinhe/Projects/rust/zstd-rs/zstd-safe/zstd-sys/zstd/lib/common/cpu.h:48
          >>>               libzstd_sys-2402a47df61deea5.rlib(zstd_compress.o):(ZSTD_cpuid)
          >>> referenced by /home/huolinhe/Projects/rust/zstd-rs/zstd-safe/zstd-sys/zstd/lib/common/cpu.h:48
          >>>               libzstd_sys-2402a47df61deea5.rlib(zstd_decompress.o):(ZSTD_cpuid)
          
          lld: error: undefined symbol: _mm_loadu_si128
          >>> referenced by /home/huolinhe/Projects/rust/zstd-rs/zstd-safe/zstd-sys/zstd/lib/compress/../common/zstd_internal.h:191
          >>>               libzstd_sys-2402a47df61deea5.rlib(zstd_compress.o):(ZSTD_copy16)
          >>> referenced by /home/huolinhe/Projects/rust/zstd-rs/zstd-safe/zstd-sys/zstd/lib/compress/../common/zstd_internal.h:191
          >>>               libzstd_sys-2402a47df61deea5.rlib(zstd_ldm.o):(ZSTD_copy16)
          >>> referenced by /home/huolinhe/Projects/rust/zstd-rs/zstd-safe/zstd-sys/zstd/lib/compress/../common/zstd_internal.h:191
          >>>               libzstd_sys-2402a47df61deea5.rlib(zstd_fast.o):(ZSTD_copy16)
          >>> referenced 76 more times
          
          lld: error: undefined symbol: _mm_storeu_si128
          >>> referenced by /home/huolinhe/Projects/rust/zstd-rs/zstd-safe/zstd-sys/zstd/lib/compress/../common/zstd_internal.h:191
          >>>               libzstd_sys-2402a47df61deea5.rlib(zstd_compress.o):(ZSTD_copy16)
          >>> referenced by /home/huolinhe/Projects/rust/zstd-rs/zstd-safe/zstd-sys/zstd/lib/compress/../common/zstd_internal.h:191
          >>>               libzstd_sys-2402a47df61deea5.rlib(zstd_ldm.o):(ZSTD_copy16)
          >>> referenced by /home/huolinhe/Projects/rust/zstd-rs/zstd-safe/zstd-sys/zstd/lib/compress/../common/zstd_internal.h:191
          >>>               libzstd_sys-2402a47df61deea5.rlib(zstd_fast.o):(ZSTD_copy16)
          >>> referenced 4 more times

          lld: error: undefined symbol: _mm_set1_epi8
          >>> referenced by /home/huolinhe/Projects/rust/zstd-rs/zstd-safe/zstd-sys/zstd/lib/compress/zstd_lazy.c:1396
          >>>               libzstd_sys-2402a47df61deea5.rlib(zstd_lazy.o):(ZSTD_RowFindBestMatch_noDict_4_4)
          >>> referenced by /home/huolinhe/Projects/rust/zstd-rs/zstd-safe/zstd-sys/zstd/lib/compress/zstd_lazy.c:1396
          >>>               libzstd_sys-2402a47df61deea5.rlib(zstd_lazy.o):(ZSTD_RowFindBestMatch_noDict_4_4)
          >>> referenced by /home/huolinhe/Projects/rust/zstd-rs/zstd-safe/zstd-sys/zstd/lib/compress/zstd_lazy.c:1396
          >>>               libzstd_sys-2402a47df61deea5.rlib(zstd_lazy.o):(ZSTD_RowFindBestMatch_noDict_4_5)
          >>> referenced 69 more times

I guess there're some missing libs that are not linked. Will you give me some suggestions to help figure it out?

Thanks a lot!

Allow specifying msvc manifest file to use

Hello, I'd like to integrate this tool in my nix-based msvc toolchain, replacing vsdownload.py from msvc-wine. But in order to do this, I need to ensure I can reproducibly download the source files from Microsoft.

To do so, vsdownload.py provides the ability to specify a manifest file, which is then used as-is instead of fetching the file from microsoft. See this. Downloading files from this pinned manifest is fully reproducible, as it pins the hash of all its sub-resources.

Having a similar ability in xwin would be great.

option to download compiler

I think the current invocations only download libraries and/or headers, it would be nice if an option was available to also download the Microsoft compiler. this would obviate the need for users to have to also install the Zig C compiler or similar

Add testing for multiple arches, non-desktop variants

Currently testing only really covers a x86_64 Desktop which means we sometimes miss stuff when adding features/fixing bugs (eg #48), so should test when using multiple arches and/or variants. More variants would hopefully be addressed in #2

Couple of casing issues

crt/include/comdef.h has the include
#include <Ole2.h>
#include <OleCtl.h>

crt/include/atliface.h
has the lines
#include "OAIdl.h"
#include "OCIdl.h"

the actual files are in sdk/include/um and have all lowercase names. Creating the symlinks for these out of the box would be nice. Thanks.

Missing symlink

I have symlinks enabled but when compiling I get:

/xwin/crt/include/comdef.h(35,10): fatal error: 'Ole2.h' file not found
#include <Ole2.h>

ls -al /xwin/sdk/include/um/

...
-rw-r--r-- 1 root root 10001 Mar 4 18:46 oemupgex.h
-rw-r--r-- 1 root root 25997 Mar 4 18:46 ole.h
-rw-r--r-- 1 root root 13963 Mar 4 18:46 ole2.h
lrwxrwxrwx 1 root root 9 Mar 4 18:46 ole2ver.h -> Ole2Ver.h
-rw-r--r-- 1 root root 20063 Mar 4 18:46 oleTx2xa.h
...

The file is there, it just isnt symlinked like the other ones are

Also OleCtl.h

clang-cl expects x64, not x86_64

Having run:

xwin splat --output vendor

I want to compile a program with clang-cl on Linux, but lld-link can't find the required libraries on the expected library path:

clang-cl -vctoolsdir vendor/crt/ -winsdkdir vendor/sdk -fuse-ld=lld -v test.c
...
"/usr/bin/lld-link" -out:test.exe -libpath:vendor/crt/lib/x64 -libpath:vendor/crt/atlmfc/lib/x64 -libpath:vendor/sdk/Lib/10.0.20348/ucrt/x64 -libpath:vendor/sdk/Lib/10.0.20348/um/x64 -nologo /tmp/test-eb99a8.obj
lld-link: error: could not open 'libcmt.lib': No such file or directory
lld-link: error: could not open 'oldnames.lib': No such file or directory
lld-link: error: could not open 'uuid.lib': No such file or directory
clang-15: error: linker command failed with exit code 1 (use -v to see invocation)

If I manually symlink the nested x86_64 subdirectories to x64, the above clang-cl command completes successfully.

[Feature Request] Download debug vc dlls

Firstly thanks for this project, it solves the exact issue I had, x86_64-pc-windows-gnu has a different c++ exception handling abi to x86_64-pc-windows-msvc.

I am actively developing for a windows target, so I want to be able to debug my code. Downloading with --include-debug-libs --include-debug-symbols makes compiling a debug build work perfectly. The issue is, this build links against vcruntime140d.dll + related, dlls which wine obviously doesn't have. It would be nice if there was an option to also download these dlls to a folder somewhere, so you don't need to grab them from a full VS install. I don't think there's any reasonable generic way to install them, better to just leave copying them to the user.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.