clamav/INSTALL-cross-windows-arm64.md

124 lines
5.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Cross-compiling ClamAV on Windows for ARM64
These are instructions to cross-compile ClamAV on Windows x64 (`x86_64-pc-windows-msvc`) with GCC for Linux arm64 (`aarch64-pc-windows-msvc`).
## Install build tools, if missing
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:
```powershell
rustup target add aarch64-pc-windows-msvc
```
## Use Mussels to build ARM64 C-based library dependencies
See the [online documentation regarding building dependencies with Mussels](https://docs.clamav.net/manual/Development/build-installer-packages.html#windows). To build for ARM64, change the commands to build like this:
```powershell
msl build -t arm64 clamav_deps
```
Once the build is complete, you'll find the ARM64 compiled libraries under `~\.mussels\install\arm64\`.
## Create a CMake toolchain file
A CMake toolchain file specifies some toolchain specific variables.
`CMAKE_TOOLCHAIN_ARM64.cmake`:
```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)
```
## Build ClamAV
You may need to adjust the paths in the command below to suit your needs.
```powershell
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
```
## Verify it built for right platform
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:
```powershell
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.