Restore Windows support with MSVC (#108)

* switch to MSVC, fixes to support it

* fix linking errors

* document how to patch zcash source

* update hash due to nightly breakage; don't use deprecated bindgen function

* update patch with str4d's upstream suggestion

---------

Co-authored-by: Alfredo Garcia <oxarbitrage@gmail.com>
This commit is contained in:
Conrado Gouvea 2024-04-11 07:56:54 -03:00 committed by GitHub
parent 6c2eb13d9f
commit cf9e0d26cf
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 93 additions and 29 deletions

View File

@ -74,7 +74,7 @@ jobs:
strategy:
matrix:
# "windows-latest" was removed; see https://github.com/ZcashFoundation/zcash_script/issues/38
os: [ubuntu-latest, macOS-latest]
os: [ubuntu-latest, macOS-latest, windows-latest]
steps:
- uses: actions/checkout@v4
with:
@ -85,16 +85,10 @@ jobs:
# - name: install LLVM on Mac
# if: matrix.os == 'macOS-latest'
# run: brew install llvm
- name: install LLVM on Windows
if: matrix.os == 'windows-latest'
run: |
choco install llvm -y
echo "C:\Program Files\LLVM\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
echo "LIBCLANG_PATH=C:\Program Files\LLVM\bin" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
- uses: actions-rs/toolchain@v1
if: matrix.os == 'windows-latest'
with:
target: x86_64-pc-windows-gnu
target: x86_64-pc-windows-msvc
toolchain: stable
profile: minimal
override: true
@ -108,7 +102,7 @@ jobs:
if: matrix.os == 'windows-latest'
with:
command: test
args: --target x86_64-pc-windows-gnu
args: --target x86_64-pc-windows-msvc
- uses: actions-rs/cargo@v1
if: matrix.os != 'windows-latest'
with:

46
Cargo.lock generated
View File

@ -25,13 +25,14 @@ dependencies = [
[[package]]
name = "ahash"
version = "0.8.3"
version = "0.8.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f"
checksum = "8b79b82693f705137f8fb9b37871d99e4f9a7df12b917eed79c3d3954830a60b"
dependencies = [
"cfg-if",
"once_cell",
"version_check",
"zerocopy",
]
[[package]]
@ -96,17 +97,17 @@ dependencies = [
[[package]]
name = "bindgen"
version = "0.68.1"
version = "0.69.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "726e4313eb6ec35d2730258ad4e15b547ee75d6afaa1361a922e78e59b7d8078"
checksum = "a00dc851838a2120612785d195287475a3ac45514741da670b735818822129a0"
dependencies = [
"bitflags 2.4.0",
"cexpr",
"clang-sys",
"itertools",
"lazy_static",
"lazycell",
"log",
"peeking_take_while",
"prettyplease",
"proc-macro2",
"quote",
@ -691,6 +692,15 @@ dependencies = [
"generic-array",
]
[[package]]
name = "itertools"
version = "0.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569"
dependencies = [
"either",
]
[[package]]
name = "jobserver"
version = "0.1.26"
@ -995,12 +1005,6 @@ dependencies = [
"password-hash",
]
[[package]]
name = "peeking_take_while"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099"
[[package]]
name = "pin-project-lite"
version = "0.2.13"
@ -1877,6 +1881,26 @@ dependencies = [
"zcash_proofs",
]
[[package]]
name = "zerocopy"
version = "0.7.32"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be"
dependencies = [
"zerocopy-derive",
]
[[package]]
name = "zerocopy-derive"
version = "0.7.32"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.35",
]
[[package]]
name = "zeroize"
version = "1.6.0"

View File

@ -47,6 +47,11 @@ work correctly. Since we don't allow those in our repository, we start over
every time, basically using it as a glorified `git clone`. This issue is being
tracked in https://github.com/ZcashFoundation/zcash_script/issues/35.
We also need to patch the zcash source to enable Windows compatibility. This
is done by applying a patch file as described below. If the patch application
fails, check the patch file for reference on what needs to be changed (and
update the patch file).
If you need to update the zcash source, run:
```console
@ -54,6 +59,7 @@ git rm -r depend/zcash
(commit changes)
git subtree add -P depend/zcash https://github.com/zcash/zcash.git <ref> --squash
git rm depend/zcash/Cargo.toml
git apply zcash.patch
(commit changes)
```

View File

@ -32,7 +32,7 @@ fn bindgen_headers() -> Result<()> {
.header("depend/zcash/src/script/zcash_script.h")
// Tell cargo to invalidate the built crate whenever any of the
// included header files changed.
.parse_callbacks(Box::new(bindgen::CargoCallbacks))
.parse_callbacks(Box::new(bindgen::CargoCallbacks::new()))
// Finish the builder and generate the bindings.
.generate()
.map_err(|_| Error::GenerateBindings)?;
@ -115,7 +115,7 @@ fn gen_cxxbridge() -> Result<()> {
fs::create_dir_all(header_path.parent().unwrap()).unwrap();
fs::write(header_path, output.header).unwrap();
let src_path = src_out_path.join(format!("{}.c", filename));
let src_path = src_out_path.join(format!("{}.cpp", filename));
// Create output dir if does not exist (since `filename` can have a subdir)
fs::create_dir_all(src_path.parent().unwrap()).unwrap();
fs::write(src_path, output.implementation).unwrap();
@ -203,10 +203,12 @@ fn main() -> Result<()> {
base_config
.file("depend/zcash/src/script/zcash_script.cpp")
.file("depend/zcash/src/util/strencodings.cpp")
.file("depend/zcash/src/amount.cpp")
.file("depend/zcash/src/uint256.cpp")
.file("depend/zcash/src/pubkey.cpp")
.file("depend/zcash/src/hash.cpp")
.file("depend/zcash/src/streams_rust.cpp")
.file("depend/zcash/src/zip317.cpp")
.file("depend/zcash/src/primitives/transaction.cpp")
.file("depend/zcash/src/crypto/ripemd160.cpp")
.file("depend/zcash/src/crypto/sha1.cpp")
@ -217,11 +219,12 @@ fn main() -> Result<()> {
.file("depend/zcash/src/script/script.cpp")
.file("depend/zcash/src/script/script_error.cpp")
.file("depend/zcash/src/support/cleanse.cpp")
.file("depend/zcash/src/zcash/cache.cpp")
// A subset of the files generated by gen_cxxbridge
// which are required by zcash_script.
.file(gen_path.join("src/blake2b.c"))
.file(gen_path.join("src/bridge.c"))
.file(gen_path.join("src/streams.c"))
.file(gen_path.join("src/blake2b.cpp"))
.file(gen_path.join("src/bridge.cpp"))
.file(gen_path.join("src/streams.cpp"))
.compile("libzcash_script.a");
Ok(())

View File

@ -3,7 +3,7 @@
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include "zcash/cache.h"
#include "util/system.h"
// #include "util/system.h"
namespace libzcash
{
@ -11,8 +11,8 @@ std::unique_ptr<BundleValidityCache> NewBundleValidityCache(rust::Str kind, size
{
auto cache = std::unique_ptr<BundleValidityCache>(new BundleValidityCache());
size_t nElems = cache->setup_bytes(nMaxCacheSize);
LogPrintf("Using %zu MiB out of %zu requested for %s bundle cache, able to store %zu elements\n",
(nElems * sizeof(BundleCacheEntry)) >> 20, nMaxCacheSize >> 20, kind, nElems);
// LogPrintf("Using %zu MiB out of %zu requested for %s bundle cache, able to store %zu elements\n",
// (nElems * sizeof(BundleCacheEntry)) >> 20, nMaxCacheSize >> 20, kind, nElems);
return cache;
}
} // namespace libzcash

View File

@ -31,7 +31,7 @@ public:
{
static_assert(hash_select < 8, "BundleCacheHasher only has 8 hashes available.");
uint32_t u;
std::memcpy(&u, key.begin() + 4 * hash_select, 4);
std::memcpy(&u, key.data() + 4 * hash_select, 4);
return u;
}
};

37
zcash.patch Normal file
View File

@ -0,0 +1,37 @@
diff --git a/depend/zcash/src/zcash/cache.cpp b/depend/zcash/src/zcash/cache.cpp
index c5cd6b173c..1da334b377 100644
--- a/depend/zcash/src/zcash/cache.cpp
+++ b/depend/zcash/src/zcash/cache.cpp
@@ -3,7 +3,7 @@
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include "zcash/cache.h"
-#include "util/system.h"
+// #include "util/system.h"
namespace libzcash
{
@@ -11,8 +11,8 @@ std::unique_ptr<BundleValidityCache> NewBundleValidityCache(rust::Str kind, size
{
auto cache = std::unique_ptr<BundleValidityCache>(new BundleValidityCache());
size_t nElems = cache->setup_bytes(nMaxCacheSize);
- LogPrintf("Using %zu MiB out of %zu requested for %s bundle cache, able to store %zu elements\n",
- (nElems * sizeof(BundleCacheEntry)) >> 20, nMaxCacheSize >> 20, kind, nElems);
+ // LogPrintf("Using %zu MiB out of %zu requested for %s bundle cache, able to store %zu elements\n",
+ // (nElems * sizeof(BundleCacheEntry)) >> 20, nMaxCacheSize >> 20, kind, nElems);
return cache;
}
} // namespace libzcash
diff --git a/depend/zcash/src/zcash/cache.h b/depend/zcash/src/zcash/cache.h
index 9bef1e43b5..283123bec9 100644
--- a/depend/zcash/src/zcash/cache.h
+++ b/depend/zcash/src/zcash/cache.h
@@ -31,7 +31,7 @@ public:
{
static_assert(hash_select < 8, "BundleCacheHasher only has 8 hashes available.");
uint32_t u;
- std::memcpy(&u, key.begin() + 4 * hash_select, 4);
+ std::memcpy(&u, key.data() + 4 * hash_select, 4);
return u;
}
};