diff --git a/boring-sys/build.rs b/boring-sys/build.rs
index 9bccf945..5a9e1d5f 100644
--- a/boring-sys/build.rs
+++ b/boring-sys/build.rs
@@ -141,72 +141,91 @@ const BORING_SSL_PATH: &str = "deps/boringssl";
 fn get_boringssl_cmake_config() -> cmake::Config {
     let arch = std::env::var("CARGO_CFG_TARGET_ARCH").unwrap();
     let os = std::env::var("CARGO_CFG_TARGET_OS").unwrap();
+    let host = std::env::var("HOST").unwrap();
+    let target = std::env::var("TARGET").unwrap();
     let pwd = std::env::current_dir().unwrap();
 
     let mut boringssl_cmake = cmake::Config::new(BORING_SSL_PATH);
-
-    // Add platform-specific parameters.
-    match os.as_ref() {
-        "android" => {
-            // We need ANDROID_NDK_HOME to be set properly.
-            println!("cargo:rerun-if-env-changed=ANDROID_NDK_HOME");
-            let android_ndk_home = std::env::var("ANDROID_NDK_HOME")
-                .expect("Please set ANDROID_NDK_HOME for Android build");
-            let android_ndk_home = std::path::Path::new(&android_ndk_home);
-            for (name, value) in cmake_params_android() {
-                eprintln!("android arch={} add {}={}", arch, name, value);
-                boringssl_cmake.define(name, value);
-            }
-            let toolchain_file = android_ndk_home.join("build/cmake/android.toolchain.cmake");
-            let toolchain_file = toolchain_file.to_str().unwrap();
-            eprintln!("android toolchain={}", toolchain_file);
-            boringssl_cmake.define("CMAKE_TOOLCHAIN_FILE", toolchain_file);
-
-            // 21 is the minimum level tested. You can give higher value.
-            boringssl_cmake.define("ANDROID_NATIVE_API_LEVEL", "21");
-            boringssl_cmake.define("ANDROID_STL", "c++_shared");
-
-            boringssl_cmake
-        }
-
-        "ios" => {
-            for (name, value) in cmake_params_ios() {
-                eprintln!("ios arch={} add {}={}", arch, name, value);
-                boringssl_cmake.define(name, value);
+    if host != target {
+        // Add platform-specific parameters for cross-compilation.
+        match os.as_ref() {
+            "android" => {
+                // We need ANDROID_NDK_HOME to be set properly.
+                println!("cargo:rerun-if-env-changed=ANDROID_NDK_HOME");
+                let android_ndk_home = std::env::var("ANDROID_NDK_HOME")
+                    .expect("Please set ANDROID_NDK_HOME for Android build");
+                let android_ndk_home = std::path::Path::new(&android_ndk_home);
+                for (name, value) in cmake_params_android() {
+                    eprintln!("android arch={} add {}={}", arch, name, value);
+                    boringssl_cmake.define(name, value);
+                }
+                let toolchain_file = android_ndk_home.join("build/cmake/android.toolchain.cmake");
+                let toolchain_file = toolchain_file.to_str().unwrap();
+                eprintln!("android toolchain={}", toolchain_file);
+                boringssl_cmake.define("CMAKE_TOOLCHAIN_FILE", toolchain_file);
+
+                // 21 is the minimum level tested. You can give higher value.
+                boringssl_cmake.define("ANDROID_NATIVE_API_LEVEL", "21");
+                boringssl_cmake.define("ANDROID_STL", "c++_shared");
             }
 
-            // Bitcode is always on.
-            let bitcode_cflag = "-fembed-bitcode";
-
-            // Hack for Xcode 10.1.
-            let target_cflag = if arch == "x86_64" {
-                "-target x86_64-apple-ios-simulator"
-            } else {
-                ""
-            };
+            "ios" => {
+                for (name, value) in cmake_params_ios() {
+                    eprintln!("ios arch={} add {}={}", arch, name, value);
+                    boringssl_cmake.define(name, value);
+                }
 
-            let cflag = format!("{} {}", bitcode_cflag, target_cflag);
+                // Bitcode is always on.
+                let bitcode_cflag = "-fembed-bitcode";
 
-            boringssl_cmake.define("CMAKE_ASM_FLAGS", &cflag);
-            boringssl_cmake.cflag(&cflag);
+                // Hack for Xcode 10.1.
+                let target_cflag = if arch == "x86_64" {
+                    "-target x86_64-apple-ios-simulator"
+                } else {
+                    ""
+                };
 
-            boringssl_cmake
-        }
+                let cflag = format!("{} {}", bitcode_cflag, target_cflag);
+                boringssl_cmake.define("CMAKE_ASM_FLAGS", &cflag);
+                boringssl_cmake.cflag(&cflag);
+            }
 
-        _ => {
-            // Configure BoringSSL for building on 32-bit non-windows platforms.
-            if arch == "x86" && os != "windows" {
-                boringssl_cmake.define(
-                    "CMAKE_TOOLCHAIN_FILE",
-                    pwd.join(BORING_SSL_PATH)
-                        .join("src/util/32-bit-toolchain.cmake")
-                        .as_os_str(),
-                );
+            "windows" => {
+                if host.contains("windows") {
+                    // BoringSSL's CMakeLists.txt isn't set up for cross-compiling using Visual Studio.
+                    // Disable assembly support so that it at least builds.
+                    boringssl_cmake.define("OPENSSL_NO_ASM", "YES");
+                }
             }
 
-            boringssl_cmake
+            "linux" => match arch.as_str() {
+                "x86" => {
+                    boringssl_cmake.define(
+                        "CMAKE_TOOLCHAIN_FILE",
+                        pwd.join(BORING_SSL_PATH)
+                            .join("src/util/32-bit-toolchain.cmake")
+                            .as_os_str(),
+                    );
+                }
+                "aarch64" => {
+                    boringssl_cmake.define(
+                        "CMAKE_TOOLCHAIN_FILE",
+                        pwd.join("cmake/aarch64-linux.cmake").as_os_str(),
+                    );
+                }
+                _ => {
+                    eprintln!(
+                        "warning: no toolchain file configured by boring-sys for {}",
+                        target
+                    );
+                }
+            },
+
+            _ => {}
         }
     }
+
+    boringssl_cmake
 }
 
 /// Verify that the toolchains match https://csrc.nist.gov/CSRC/media/projects/cryptographic-module-validation-program/documents/security-policies/140sp3678.pdf
diff --git a/boring-sys/cmake/aarch64-linux.cmake b/boring-sys/cmake/aarch64-linux.cmake
new file mode 100644
index 00000000..2ee68f5c
--- /dev/null
+++ b/boring-sys/cmake/aarch64-linux.cmake
@@ -0,0 +1,3 @@
+set(CMAKE_SYSTEM_NAME Linux)
+set(CMAKE_SYSTEM_PROCESSOR aarch64)
+# Rely on environment variables to set the compiler and include paths.