Skip to content

Latest commit

 

History

History
124 lines (98 loc) · 5.15 KB

INSTALL-cross-windows-arm64.md

File metadata and controls

124 lines (98 loc) · 5.15 KB

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:

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. 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\.

Create a CMake toolchain file

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)

Build ClamAV

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

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:

❯ 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.