alexcrichton / ssh2-rs

Rust bindings for libssh2
https://docs.rs/ssh2
Apache License 2.0
482 stars 147 forks source link

Building expects `openssl/engine.h` despite engine API being deprecated? #328

Open polarathene opened 1 week ago

polarathene commented 1 week ago

Fedora 41 fails to build libssh as openssl/engine.h is no longer included with the openssl-devel package. For the time being compatibility is offered via a separate openssl-devel-engine package.

Broader failures will occur once a future OpenSSL 4.0 release arrives. For context the engine API has been deprecated for a while AFAIK and will be dropped in the next major OpenSSL release.


Build error output ``` cargo:warning=In file included from libssh2/src/agent.c:40: cargo:warning=In file included from libssh2/src/libssh2_priv.h:57: cargo:warning=In file included from /usr/include/stdio.h:28: cargo:warning=In file included from /usr/include/bits/libc-header-start.h:33: cargo:warning=/usr/include/features.h:503:9: warning: '__GLIBC_MINOR__' macro redefined [-Wmacro-redefined] cargo:warning= 503 | #define __GLIBC_MINOR__ 40 cargo:warning= | ^ cargo:warning=:1:9: note: previous definition is here cargo:warning= 1 | #define __GLIBC_MINOR__ 17 cargo:warning= | ^ cargo:warning=In file included from libssh2/src/bcrypt_pbkdf.c:21: cargo:warning=In file included from libssh2/src/libssh2_priv.h:57: cargo:warning=In file included from /usr/include/stdio.h:28: cargo:warning=In file included from /usr/include/bits/libc-header-start.h:33: cargo:warning=/usr/include/features.h:503:9: warning: '__GLIBC_MINOR__' macro redefined [-Wmacro-redefined] cargo:warning= 503 | #define __GLIBC_MINOR__ 40 cargo:warning= | ^ cargo:warning=:1:9: note: previous definition is here cargo:warning= 1 | #define __GLIBC_MINOR__ 17 cargo:warning= | ^ cargo:warning=In file included from libssh2/src/blowfish.c:49: cargo:warning=In file included from /usr/include/sys/types.h:25: cargo:warning=/usr/include/features.h:503:9: warning: '__GLIBC_MINOR__' macro redefined [-Wmacro-redefined] cargo:warning= 503 | #define __GLIBC_MINOR__ 40 cargo:warning= | ^ cargo:warning=:1:9: note: previous definition is here cargo:warning= 1 | #define __GLIBC_MINOR__ 17 cargo:warning= | ^ cargo:warning=In file included from libssh2/src/agent.c:40: cargo:warning=In file included from libssh2/src/libssh2_priv.h:141: cargo:warning=In file included from libssh2/src/crypto.h:42: cargo:warning=libssh2/src/openssl.h:83:10: fatal error: 'openssl/engine.h' file not found cargo:warning= 83 | #include cargo:warning= | ^~~~~~~~~~~~~~~~~~ cargo:warning=1 warning and 1 error generated. exit status: 1 ```

Most of that can be ignored, I just wanted to draw attention to the failure cause:

libssh2/src/openssl.h:83:10: fatal error: 'openssl/engine.h' file not found

So that line is upstream at: https://github.com/libssh2/libssh2/blob/libssh2-1.11.0/src/openssl.h#L84

I'm not sure if an issue needs to be raised there as they seem to have support for no engine, thus perhaps it's something required to be detected / handled here instead?

mjgarton commented 3 days ago

I don't know if this is the right fix, but this fixed it locally for me.

diff --git a/libssh2-sys/build.rs b/libssh2-sys/build.rs
index 5c9944d..2d37e4b 100644
--- a/libssh2-sys/build.rs
+++ b/libssh2-sys/build.rs
@@ -143,6 +143,8 @@ fn main() {

     cfg.define("LIBSSH2_HAVE_ZLIB", None);

+    cfg.define("OPENSSL_NO_ENGINE", None);
+
     if profile.contains("debug") {
         cfg.define("LIBSSH2DEBUG", None);
     }