These are instructions to cross-compile ClamAV on Windows x64 (x86_64-pc-windows-msvc
) with GCC for Linux arm64 (aarch64-pc-windows-msvc
).
Use the Visual Studio Installer tools to add the ARM64 components. E.g. this stuff:
- MSVC v143 - VS 2022 C++ ARM build tools (Latest)
- MSVC v143 - VS 2022 C++ ARM Spectre-mitigated libs (Latest)
- MSVC v143 - VS 2022 C++ ARM64/ARM64EC build tools (Latest)
- MSVC v143 - VS 2022 C++ ARM64/ARM64EC Spectre-mitigated libs (Latest)
- C++ ATL for latest v143 build tools (ARM)
- C++ ATL for latest v143 build tools (ARM64/ARM64EC)
- C++ ATL for latest v143 build tools with Spectre-Mitigations (ARM)
- C++ ATL for latest v143 build tools with Spectre-Mitigations (ARM64/ARM64EC)
- C++ MFC for latest v143 build tools (ARM)
- C++ MFC for latest v143 build tools (ARM64/ARM64EC)
- C++ MFC for latest v143 build tools with Spectre-Mitigations (ARM)
- C++ MFC for latest v143 build tools with Spectre-Mitigations (ARM64/ARM64EC)
Install the Rust toolchains needed to cross-compile to arm64:
rustup target add aarch64-pc-windows-msvc
See the online documentation regarding building dependencies with Mussels. To build for ARM64, change the commands to build like this:
msl build -t arm64 clamav_deps
Once the build is complete, you'll find the ARM64 compiled libraries under ~\.mussels\install\arm64\
.
A CMake toolchain file specifies some toolchain specific variables.
CMAKE_TOOLCHAIN_ARM64.cmake
:
# Platform
set(CMAKE_SYSTEM_NAME Windows)
set(CMAKE_SYSTEM_PROCESSOR arm64)
set(RUST_COMPILER_TARGET "aarch64-pc-windows-msvc")
# Project Variables needed to cross compile
set(HAVE_PRAGMA_PACK 1)
set(HAVE_SAR 1)
set(MMAP_FOR_CROSSCOMPILING OFF)
set(ENABLE_SYSTEMD OFF)
set( test_run_result
"PLEASE_FILL_OUT-FAILED_TO_RUN"
CACHE STRING "Result from try_run" FORCE)
set( test_run_result__TRYRUN_OUTPUT
"PLEASE_FILL_OUT-NOTFOUND"
CACHE STRING "Output from try_run" FORCE)
You may need to adjust the paths in the command below to suit your needs.
mkdir build-arm64
cd build-arm64
cmake .. -G "Visual Studio 17 2022" -A arm64 `
-D JSONC_INCLUDE_DIR="$HOME\\.mussels\\install\\arm64\\include\\json-c" `
-D JSONC_LIBRARY="$HOME\\.mussels\\install\\arm64\\lib\\json-c.lib" `
-D BZIP2_INCLUDE_DIR="$HOME\\.mussels\\install\\arm64\\include" `
-D BZIP2_LIBRARY_RELEASE="$HOME\\.mussels\\install\\arm64\\lib\\libbz2.lib" `
-D CURL_INCLUDE_DIR="$HOME\\.mussels\\install\\arm64\\include" `
-D CURL_LIBRARY="$HOME\\.mussels\\install\\arm64\\lib\\libcurl_imp.lib" `
-D OPENSSL_ROOT_DIR="$HOME\\.mussels\\install\\arm64\\" `
-D OPENSSL_INCLUDE_DIR="$HOME\\.mussels\\install\\arm64\\include" `
-D LIB_EAY_DEBUG="$HOME\\.mussels\\install\\arm64\\lib\\libcrypto.lib" `
-D SSL_EAY_DEBUG="$HOME\\.mussels\\install\\arm64\\lib\\libssl.lib" `
-D ZLIB_LIBRARY="$HOME\\.mussels\\install\\arm64\\lib\\libssl.lib" `
-D LIBXML2_INCLUDE_DIR="$HOME\\.mussels\\install\\arm64\\include\\libxml" `
-D LIBXML2_LIBRARY="$HOME\\.mussels\\install\\arm64\\lib\\libxml2.lib" `
-D PCRE2_INCLUDE_DIR="$HOME\\.mussels\\install\\arm64\\include" `
-D PCRE2_LIBRARY="$HOME\\.mussels\\install\\arm64\\lib\\pcre2-8.lib" `
-D PDCURSES_INCLUDE_DIR="$HOME\\.mussels\\install\\arm64\\include" `
-D CURSES_LIBRARY="$HOME\\.mussels\\install\\arm64\\lib\\pdcurses.lib" `
-D PThreadW32_INCLUDE_DIR="$HOME\\.mussels\\install\\arm64\\include" `
-D PThreadW32_LIBRARY="$HOME\\.mussels\\install\\arm64\\lib\\pthreadVC3.lib" `
-D ZLIB_INCLUDE_DIR="$HOME\\.mussels\\install\\arm64\\include" `
-D ZLIB_LIBRARY="$HOME\\.mussels\\install\\arm64\\lib\\zlibstatic.lib" `
-D LIBCHECK_INCLUDE_DIR="$HOME\\.mussels\\install\\arm64\\include" `
-D LIBCHECK_LIBRARY="$HOME\\.mussels\\install\\arm64\\lib\\checkDynamic.lib" `
-D CMAKE_TOOLCHAIN_FILE=$pwd\\..\\CMAKE_TOOLCHAIN_ARM64.cmake `
-D ENABLE_STATIC_LIB=OFF `
-D ENABLE_SHARED_LIB=ON `
-D MAINTAINER_MODE=OFF `
-D ENABLE_EXAMPLES=OFF `
-D BYTECODE_RUNTIME=interpreter `
-D HAVE_PRAGMA_PACK=1 `
-D HAVE_SAR=1 `
-D CMAKE_INSTALL_PREFIX="install"
cmake --build . --config Release --target install
We cannot run the ClamAV unit test suite, because we're cross compiling and can't run the programs we build. But we can do a very small test to see that it built for the right platform.
Pop into WSL2 (Windows Subsystem for Linux 2) to make use of the file
utility:
❯ wsl
Welcome to fish, the friendly interactive shell
Type `help` for instructions on how to use fish
clamav-micah-2/build-arm64 on main [$] via C v9.4.0-gcc via △ v3.27.2
❯ file install/clamscan.exe
install/clamscan.exe: PE32+ executable (console) Aarch64, for MS Windows
If everything looks good, you can probably copy the install files to your system and run it.