cmake-rs icon indicating copy to clipboard operation
cmake-rs copied to clipboard

is `cmake` not installed?

Open joseph-henry opened this issue 3 years ago • 11 comments

Hello, I've tried to use the cmake crate as a dependency in my crate and while it works locally it fails when I add my crate as a dependency (pulled from crates.io) in a test program:

Updating crates.io index
   Compiling my_lib v0.1.0
error: failed to run custom build command for `my_lib v0.1.0`

Caused by:
  process didn't exit successfully: `./hello_world/target/debug/build/my_lib-8352397569f3c080/build-script-build` (exit code: 101)
  --- stdout
  running: "cmake" "/Users/user/.cargo/registry/src/github.com-1ecc6299db9ec823/my_lib-0.1.0/src/native" "-DENABLE_RUST=1" "-DCMAKE_INSTALL_PREFIX=target" "-DCMAKE_C_FLAGS= -ffunction-sections -fdata-sections -fPIC -m64 -arch x86_64" "-DCMAKE_C_COMPILER=/usr/bin/cc" "-DCMAKE_CXX_FLAGS= -ffunction-sections -fdata-sections -fPIC -m64 -arch x86_64" "-DCMAKE_CXX_COMPILER=/usr/bin/c++" "-DCMAKE_ASM_FLAGS= -ffunction-sections -fdata-sections -fPIC -m64 -arch x86_64" "-DCMAKE_ASM_COMPILER=/usr/bin/cc" "-DCMAKE_BUILD_TYPE=Debug"

  --- stderr
  thread 'main' panicked at '
  failed to execute command: No such file or directory (os error 2)
  is `cmake` not installed?

  build script failed, must exit now', /Users/user/.cargo/registry/src/github.com-1ecc6299db9ec823/cmake-0.1.45/src/lib.rs:894:5
  note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

With RUST_BACKTRACE=full:

     0:        0x10aa098fe - <std::sys_common::backtrace::_print::DisplayBacktrace as core::fmt::Display>::fmt::h04abbaabf148650a
   1:        0x10aa44f4e - core::fmt::write::h14dac7cadec1cc70
   2:        0x10aa08e1a - std::io::Write::write_fmt::hfaf2e10dfdcc61d8
   3:        0x10aa25339 - std::panicking::default_hook::{{closure}}::h350fee0bf60f2674
   4:        0x10aa24eab - std::panicking::default_hook::h0b4e3bc46e6dcb8d
   5:        0x10aa258ca - std::panicking::rust_panic_with_hook::h8cdc0a575f4a5a7b
   6:        0x10aa0a0c5 - std::panicking::begin_panic_handler::{{closure}}::h7a7b30fd1c313876
   7:        0x10aa09a48 - std::sys_common::backtrace::__rust_end_short_backtrace::h2e099be83c81509d
   8:        0x10aa25443 - _rust_begin_unwind
   9:        0x10aa4e37b - std::panicking::begin_panic_fmt::h170f888f0234d849
  10:        0x10a4ab797 - cmake::fail::hcc02c6703578abbb
                               at /Users/user/.cargo/registry/src/github.com-1ecc6299db9ec823/cmake-0.1.45/src/lib.rs:894:5
  11:        0x10a4ab01e - cmake::run::hbff0b8ae6b19dbe5
                               at /Users/user/.cargo/registry/src/github.com-1ecc6299db9ec823/cmake-0.1.45/src/lib.rs:864:13
  12:        0x10a4a7b12 - cmake::Config::build::h0f5bbc869444f990
                               at /Users/user/.cargo/registry/src/github.com-1ecc6299db9ec823/cmake-0.1.45/src/lib.rs:707:13
  13:        0x10a4a2333 - build_script_build::main::h2b88eca7a261b7c1
                               at /Users/user/.cargo/registry/src/github.com-1ecc6299db9ec823/my_lib-0.1.0/build.rs:8:5
  14:        0x10a4a333e - core::ops::function::FnOnce::call_once::h12e0ebb75b1fb6b6
                               at /private/tmp/rust-20210325-88347-hh2ixd/rustc-1.51.0-src/library/core/src/ops/function.rs:227:5
  15:        0x10a4a3231 - std::sys_common::backtrace::__rust_begin_short_backtrace::h47609506cf3640de
                               at /private/tmp/rust-20210325-88347-hh2ixd/rustc-1.51.0-src/library/std/src/sys_common/backtrace.rs:125:18
  16:        0x10a4a4b24 - std::rt::lang_start::{{closure}}::h0ceb54217ca0fbdd
                               at /private/tmp/rust-20210325-88347-hh2ixd/rustc-1.51.0-src/library/std/src/rt.rs:66:18
  17:        0x10aa28a00 - std::rt::lang_start_internal::hf4b96bfc8c02c8b0
  18:        0x10a4a4b01 - std::rt::lang_start::h454b772cdebf3322
                               at /private/tmp/rust-20210325-88347-hh2ixd/rustc-1.51.0-src/library/std/src/rt.rs:65:5
  19:        0x10a4a27a2 - _main

My crate's build.rs:

extern crate bindgen;

use cmake::Config;
use std::env;
use std::path::PathBuf;

fn main() {
 Config::new("src/native").build_target("my_lib-static").define("ENABLE_RUST", "1").out_dir("target").build();

 println!("cargo:rustc-link-search=target/build/lib");
 println!("cargo:rustc-link-lib=static=my_lib");

 // See here for reasoning: https://flames-of-code.netlify.app/blog/rust-and-cmake-cplusplus/

 let target = env::var("TARGET").unwrap();
 if target.contains("apple") {
     println!("cargo:rustc-link-lib=dylib=c++");
 } else if target.contains("linux") {
     println!("cargo:rustc-link-lib=dylib=stdc++");
 } else {
     unimplemented!();
 }

 let bindings = bindgen::Builder::default()
     .header("src/native/include/my_lib.h")
     .parse_callbacks(Box::new(bindgen::CargoCallbacks))
     .generate()
     .expect("Unable to generate bindings");

 let out_path = PathBuf::from(env::var("OUT_DIR").unwrap());
 bindings
     .write_to_file(out_path.join("my_lib.rs"))
     .expect("Couldn't write bindings!");
}
  • [x] I have CMake installed
  • [x] CMake is in my path
  • [x] I have tested this on macOS and Ubuntu. Same result for both.

Any advice on how I should proceed?

joseph-henry avatar May 30 '21 23:05 joseph-henry

A clue:

If I replace the dependency on my published crate in the test app from:

[dependencies]
my_lib = "0.1.0"

to

[dependencies]
my_lib = { path = "/my/local/crate/path" }

Everything works, compiling my crate will no longer complain about a missing cmake.

If this didn't work at all it would make more sense, but somehow pulling a crate and building it is different than building the original local copy?

joseph-henry avatar May 30 '21 23:05 joseph-henry

Are you sure cmake is in your PATH when the build script is executed? That's basically what that error message is saying.

alexcrichton avatar Jun 01 '21 14:06 alexcrichton

Also encountered this. cmake is in /usr/bin, and the directory is in PATH

NOBLES5E avatar Jun 22 '21 08:06 NOBLES5E

It turns out some files in the cmake argument are missing. The "is cmake not installed?" error message is actually misleading in this case.

NOBLES5E avatar Jun 22 '21 12:06 NOBLES5E

Same problem here. And I found that if comment out Config::out_dir() then everything would be OK.

fubupc avatar May 07 '22 12:05 fubupc

So I have found that using out_dir works, if the directory passed to out_dir exists, and fails with the "is cmake not installed" error message otherwise.

So for the OP, in the build script change "target", passed to out_dir, to an absolute path, and use std::fs::create_dir_all to make sure the directory exists.


Oh, rereading what https://github.com/rust-lang/cmake-rs/issues/118#issuecomment-865958965 this comment says, I am echoing @NOBLES5E, but providing more information.

boydjohnson avatar Aug 03 '22 16:08 boydjohnson

Providing more information, and a fix. https://github.com/rust-lang/cmake-rs/blob/00e6b220342a8b0ec4548071928ade38fd5f691b/src/lib.rs#L498 silently ignores an Err, Result if OUT_DIR or parents do not exist.

https://github.com/rust-lang/cmake-rs/blob/00e6b220342a8b0ec4548071928ade38fd5f691b/src/lib.rs#L524 a non-existent directory is passed to Command current_dir, which finally errors in run https://github.com/rust-lang/cmake-rs/blob/00e6b220342a8b0ec4548071928ade38fd5f691b/src/lib.rs#L1019 printing "is cmake not installed".

I think the thing to do is use create_dir_all to make sure the OUT_DIR parents exists. I'll have a PR up shortly.

boydjohnson avatar Aug 03 '22 17:08 boydjohnson

I just got this error in GitHub Actions on Windows:

error: failed to run custom build command for `hwlocality-sys v0.2.0 (https://github.com/HadrienG2/hwlocality?rev=3141847b0a463f38adcf623a2d720931757a38ae#3141847b)`

Caused by:
  process didn't exit successfully: `C:\actions-runner\_work\subspace\subspace\target\debug\build\hwlocality-sys-a6c49baecb681a6b\build-script-build` (exit code: 101)
  --- stdout
  CMAKE_TOOLCHAIN_FILE_x86_64-pc-windows-msvc = None
  CMAKE_TOOLCHAIN_FILE_x86_64_pc_windows_msvc = None
  HOST_CMAKE_TOOLCHAIN_FILE = None
  CMAKE_TOOLCHAIN_FILE = None
  CMAKE_GENERATOR_x86_64-pc-windows-msvc = None
  CMAKE_GENERATOR_x86_64_pc_windows_msvc = None
  HOST_CMAKE_GENERATOR = None
  CMAKE_GENERATOR = None
  CMAKE_PREFIX_PATH_x86_64-pc-windows-msvc = None
  CMAKE_PREFIX_PATH_x86_64_pc_windows_msvc = None
  HOST_CMAKE_PREFIX_PATH = None
  CMAKE_PREFIX_PATH = None
  CMAKE_x86_64-pc-windows-msvc = None
  CMAKE_x86_64_pc_windows_msvc = None
  HOST_CMAKE = None
  CMAKE = None
  running: "cmake" "C:\\actions-runner\\_work\\subspace\\subspace\\target\\debug\\build\\hwlocality-sys-8b8a577ac3eb1c10\\out\\hwloc\\contrib\\windows-cmake" "-G" "Visual Studio 17 2022" "-Thost=x64" "-Ax64" "-DCMAKE_INSTALL_PREFIX=C:\\actions-runner\\_work\\subspace\\subspace\\target\\debug\\build\\hwlocality-sys-8b8a577ac3eb1c10\\out" "-DCMAKE_C_FLAGS= -nologo -MD -Brepro" "-DCMAKE_C_FLAGS_DEBUG= -nologo -MD -Brepro" "-DCMAKE_CXX_FLAGS= -nologo -MD -Brepro" "-DCMAKE_CXX_FLAGS_DEBUG= -nologo -MD -Brepro" "-DCMAKE_ASM_FLAGS= -nologo -MD -Brepro" "-DCMAKE_ASM_FLAGS_DEBUG= -nologo -MD -Brepro" "-DCMAKE_BUILD_TYPE=Debug"

  --- stderr
  thread 'main' panicked at C:\Users\Administrator\.cargo\registry\src\index.crates.io-6f17d22bba15001f\cmake-0.1.50\src\lib.rs:1098:5:

  failed to execute command: program not found
  is `cmake` not installed?

The strange thing is that according to https://github.com/actions/runner-images/blob/main/images/windows/Windows2022-Readme.md official Windows server 2022 runners do have CMake installed on them.

UPD: My apologies, it was a custom GitHub Actions runner.

nazar-pc avatar Dec 26 '23 05:12 nazar-pc

UPD: My apologies, it was a custom GitHub Actions runner. @nazar-pc did you have success with the windows-2022 runner?

boydjohnson avatar Jan 01 '24 17:01 boydjohnson

@nazar-pc did you have success with the windows-2022 runner?

Yes, with both official GitHub runner and self-hosted

nazar-pc avatar Jan 01 '24 17:01 nazar-pc

Encountered the same issue. My workaround is:

// build.rs
use std::env;

// irrelevant - for better error message
extern crate miette;

fn main() -> miette::Result<()> {
  env::set_var("CMAKE_aarch64_apple_darwin", "/opt/homebrew/bin/cmake");  // <-- add this line
  // ...
}

Basically, this workaround allows cmake::Config::cmake_executable to use a user-defined executable as cmake, and by specifying the full path to cmake, I managed to get rid of the is cmake not installed? error. The source code tells us to use a format of CMAKE_{target.replace('-', "_")}, so one can run this shell command to get a target triplet for cmake:

# see-also: https://wiki.archlinux.org/title/Rust_package_guidelines
echo CMAKE_$(rustc -vV | sed -n 's/host: //p' | sed -e 's/-/_/g')

Side note:

  • macOS, cmake installed globally by homebrew
  • I'm sure my OUT_DIR exists. Also tried create_dir_all which doesn't work
  • this error only happens in my VSCode's rust-analyzer plugin. Running cargo clippy manually in any shell (bash, zsh, sh) cannot trigger this error
  • Modifying ~/.zshrc, /etc/profile or /etc/paths does not help

XieJiSS avatar Apr 23 '24 11:04 XieJiSS