34

I'm facing the error failed to run custom build command for openssl-sys v0.9.60 while trying to build my rust program. Here are the main.rs and the Cargo.toml files.

main.rs

extern crate reqwest;

fn main() {
    let mut resp = reqwest::get("http://www.governo.mg.gov.br/Institucional/Equipe").unwrap();
    assert!(resp.status().is_success());
}

Cargo.toml

[package]
name = "get_sct"
version = "0.1.0"
authors = ["myname <myemail>"]
edition = "2018"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
reqwest = "0.10.10"

I installed openssl locally (as suggested in this question), using:

git clone git://git.openssl.org/openssl.git
cd openssl
./config --openssldir=/usr/local/ssl
make
make test
sudo make install

Finally, I ran export OPENSSL_DIR="/usr/local/ssl"

I noted I already had a anaconda instalation of openssl which was in my default path. To change the default path of openssl to the github instalation I ran chmod -x MYPATH/anaconda3/bin/openssl and now which openssl returns /usr/local/bin/openssl.

I also have pkg-config installed (as suggested in this question). Running which pkg-config returns /usr/bin/pkg-config

However, when I run cargo run again the program print the same error message. Here is the entire error message:

> cargo run
   Compiling openssl-sys v0.9.60
   Compiling tokio v0.2.24
   Compiling pin-project-internal v0.4.27
   Compiling pin-project-internal v1.0.2
   Compiling mime_guess v2.0.3
   Compiling url v2.2.0
error: failed to run custom build command for `openssl-sys v0.9.60`

Caused by:
  process didn't exit successfully: `/PACKAGEPATH/target/debug/build/openssl-sys-db18d493257de4f7/build-script-main` (exit code: 101)
  --- stdout
  cargo:rustc-cfg=const_fn
  cargo:rerun-if-env-changed=X86_64_UNKNOWN_LINUX_GNU_OPENSSL_LIB_DIR
  X86_64_UNKNOWN_LINUX_GNU_OPENSSL_LIB_DIR unset
  cargo:rerun-if-env-changed=OPENSSL_LIB_DIR
  OPENSSL_LIB_DIR unset
  cargo:rerun-if-env-changed=X86_64_UNKNOWN_LINUX_GNU_OPENSSL_INCLUDE_DIR
  X86_64_UNKNOWN_LINUX_GNU_OPENSSL_INCLUDE_DIR unset
  cargo:rerun-if-env-changed=OPENSSL_INCLUDE_DIR
  OPENSSL_INCLUDE_DIR unset
  cargo:rerun-if-env-changed=X86_64_UNKNOWN_LINUX_GNU_OPENSSL_DIR
  X86_64_UNKNOWN_LINUX_GNU_OPENSSL_DIR unset
  cargo:rerun-if-env-changed=OPENSSL_DIR
  OPENSSL_DIR = /usr/local/ssl

  --- stderr
  thread 'main' panicked at 'OpenSSL library directory does not exist: /usr/local/ssl/lib', /home/lucas/.cargo/registry/src/github.com-1ecc6299db9ec823/openssl-sys-0.9.60/build/main.rs:66:9
  note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
warning: build failed, waiting for other jobs to finish...
error: build faile

It looks like that rust is searching for ssl in /usr/local/ssl/lib. In fact, there is a /usr/local/ssl folder in my PC, but there is no lib there.

What am I doing wrong here? How can make my local installation of openssl work with rust correctly?

Lucas
  • 1,166
  • 2
  • 14
  • 34
  • 2
    https://stackoverflow.com/a/70635680/14009899 sudo apt install libssl-dev worked for me – packirisamy karan Aug 08 '22 at 06:27
  • I wrote up an issue for this here https://github.com/sfackler/rust-openssl/issues/1865 - my workaround was to use the "feature=vendored" mentioned in comments to answers below. – Tim Abell Mar 30 '23 at 23:04

10 Answers10

35

This solved the issue for me in Ubuntu:

sudo apt install libssl-dev
Julian Espinel
  • 2,586
  • 5
  • 26
  • 20
  • 7
    for fedora/cantos it's ```yum install openssl openssl-devel -y ``` – koolwithk Jan 18 '22 at 21:23
  • This is the most specific correct answer for debian and derivative distros. Crate `openssl-sys` should document their dependency on the *developer* bindings for openssl. See https://github.com/sfackler/rust-openssl/issues/1759. – BobHy Dec 18 '22 at 06:34
  • 1
    can confirm it works on debian 12 (bullseye) as of jul 2023. – Ayush Jul 14 '23 at 07:34
12

I have no experience with installing this myself but may be able to give some pointers.

First of all about your effort to install OpenSSL. After cloning the repository, you do not select any particular branch before configuring and making. This means that you are building the master branch, which is an evolving version of OpenSSL 3.0.0. This is not a supported version according to the crate's documentation. In order to build a supported version of OpenSSL, you will have to switch to some 1.1.1 branch or tag. Alternatively, you can download the 1.1.1 version from OpenSSL's download page.

That said, it does not seem necessary to install OpenSSL from source. Under the section Automatic, the documentation explains that the crate can deal with all kinds of typical OpenSSL installations. It may be easier for you to follow that, if possible in your case. If so, then you should unset the OPENSSL_DIR environment variable otherwise that will (continue to) override the crate's automatic mechanisms to find the OpenSSL installation.

If you still want to stick with the Manual configuration, then indeed you should use environment variables, and OPENSSL_DIR seems a convenient one. However, it does not mean the same thing as the openssldir parameter that you used in your configure command ./config --openssldir=/usr/local/ssl. To get the details, check out the meaning of that configuration parameter. In fact, the crate's meaning of OPENSSL_DIR corresponds to the --prefix setting (which you did not configure).

The problem you are running into now is that your OPENSSL_DIR variable points to your directory for OpenSSL configuration files, whereas the crate expects it to point to the top of the actual OpenSSL installation directory tree (which in your case seems to reside at /usr/local).

Reinier Torenbeek
  • 16,669
  • 7
  • 46
  • 69
  • 8
    I didn't realize at the time the full implication of what you said. But for automatic installation it is sufficient add `openssl = { version = "0.10", features = ["vendored"] }` to Cargo.toml. – Lucas Apr 08 '21 at 02:49
  • 1
    This might not be sufficient. In my case, I already had `libssl-dev` installed, but, for reasons unknown, in a different laptop (with a *fresh* Ubuntu 22.04 LTS install) it'd still run into a similar issue. Here, the `reqwest` crate was the culprit and you have to set `default-features = false` and add `rustls-tls-native-roots` to the `features` list in the Cargo.toml file to get it to use a pure Rust TLS implementation and avoid other system library-specific issues. – code_dredd Jun 17 '22 at 17:48
  • @Lucas was a lifesaver. The most useful answer here was a comment. I was hitting this issue with rust-bert's convert-tensor script, that executes a cargo-built binary. Needed to slip that into the Cargo.toml so it'd load an openssl version that wouldn't fail. – Josh from Qaribou Sep 11 '22 at 01:37
  • @Lucas your comment worked for me, it might be good to turn this into a proper answer so I can upvote it. Finally got a green build: https://github.com/timabell/gitopolis/actions/runs/4552699507/jobs/8028367202 Thank you! – Tim Abell Mar 29 '23 at 14:48
  • ... the reason "features = vendored" works is because it toggles a "feature" of the openssl crate that causes it to build openssl from the C source instead of looking for the shared library (which for some reason isn't being found) - https://docs.rs/openssl/latest/openssl/#vendored – Tim Abell Mar 30 '23 at 22:13
12

I used the following set of commands

 sudo apt install pkg-config
 sudo apt-get install libudev-dev
Sadaf Shafi
  • 1,016
  • 11
  • 27
7

On fedora 36 I was getting error: failed to run custom build command for openssl-sys v0.9.77 when trying to install cargo-generate using cargo install cargo-generate

openssl-devel and pkg-config were already installed.

There was another complain below the main one:

Can't locate FindBin.pm in @INC (you may need to install the FindBin module) (@INC contains: /usr/local/lib64/perl5/5.34 /usr/local/share/perl5/5.34 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5) at ./Configure line 15.

The solution was:

sudo dnf install perl

Surprisingly, perl was already installed but by running sudo dnf install perl "some additional perl stuff" got installed which resolved the issue!

Mamad
  • 121
  • 1
  • 8
3

run :

sudo apt install pkg-config
Ruli
  • 2,592
  • 12
  • 30
  • 40
3

I ran rust on Windows Subsystem for Linux (Ubuntu). The following commands have worked for me.

sudo apt install libssl-dev

sudo apt install pkg-config
1

this worked for me:

sudo apt install librust-openssl-sys-dev

Navid Farahzadi
  • 681
  • 7
  • 14
0

I used the following commands on Ubuntu on Windows:

 sudo apt install libudev-dev
 sudo apt install libssl-dev
EhsanS
  • 1
0

On Ubuntu 22.04 I had a different issue associated with this error:

run pkg_config fail: "\"pkg-config\" \"--libs\" \"--cflags\" \"openssl\" did not exit successfully: exit status: 1

error: could not find system library 'openssl' required by the 'openssl-sys' crate

--- stderr

Package openssl was not found in the pkg-config search path. Perhaps you should add the directory containing `openssl.pc' to the PKG_CONFIG_PATH environment variable

No package 'openssl' found"

I had already installed libssl-devel and pkg-config.

I solved this by searching for openssl.pc, which was located in /usr/lib/x86_64-linux-gnu/pkgconfig/openssl.pc.

I could solve it by setting PKG_CONFIG_PATH to /usr/lib/x86_64-linux-gnu/pkgconfig/ manually.

vauhochzett
  • 2,732
  • 2
  • 17
  • 40
-4

Set variable openssl_dir to suitable PATH

andydy
  • 3
  • 3