Ninja not found by CMake
I'm trying to build some code I got from GitHub using CMake, but keep getting the followings errors:
CMake Error: CMake was unable to find a build program corresponding to "Ninja". CMAKE_MAKE_PROGRAM is not set. You probably need to select a different build tool. CMake Error: Error required internal CMake variable not set, cmake may be not be built correctly. Missing variable is: CMAKE_C_COMPILER_ENV_VAR CMake Error: Error required internal CMake variable not set, cmake may be not be built correctly. Missing variable is: CMAKE_C_COMPILER CMake Error: Could not find cmake module file:/golang/project/src/github.com/devsisters/goquic/libquic/build/debug/CMakeFiles/2.8.11/CMakeCCompiler.cmake CMake Error: Error required internal CMake variable not set, cmake may be not be built correctly. Missing variable is: CMAKE_CXX_COMPILER_ENV_VAR CMake Error: Error required internal CMake variable not set, cmake may be not be built correctly. Missing variable is: CMAKE_CXX_COMPILER CMake Error: Could not find cmake module file:/golang/project/src/github.com/devsisters/goquic/libquic/build/debug/CMakeFiles/2.8.11/CMakeCXXCompiler.cmake -- Configuring incomplete, errors occurred!
How do I set these variables correctly?
I used a ./build_libs.sh
file that came with the GitHub code to build this.
7 Answers
The script you are executing uses the CMake Ninja generator. For that to work you need Ninja on the path. On most Linux distributions you can install it from a package.
Ubuntu: ninja-build
openSUSE: ninja
If you can't find it for your distribution, you have to download it and add its location to the path
environment variable.
My solution: symlink "ninja-build" to "ninja".
# ln -s /usr/bin/ninja /usr/bin/ninja-build
This only works on very old versions of CMake, which I will explain below.
I had already dropped my fresh "ninja" binary into /usr/bin and checked it had 0755 permissions. I was stumped until I ran an strace on the generator command.
# strace cmake -GNinja .. | grep -i ninja access("ninja-build", R_OK) = -1 ENOENT (No such file or directory) access("/usr/local/sbin/ninja-build", R_OK) = -1 ENOENT (No such file or directory) access("/usr/local/bin/ninja-build", R_OK) = -1 ENOENT (No such file or directory) access("/sbin/ninja-build", R_OK) = -1 ENOENT (No such file or directory) access("/bin/ninja-build", R_OK) = -1 ENOENT (No such file or directory) access("/usr/sbin/ninja-build", R_OK) = -1 ENOENT (No such file or directory) access("/usr/bin/ninja-build", R_OK) = -1 ENOENT (No such file or directory) access("/opt/texlive/2016/bin/i386-linux/ninja-build", R_OK) = -1 ENOENT (No such file or directory) access("/root/bin/ninja-build", R_OK) = -1 ENOENT (No such file or directory)
It was looking for "ninja-build", not "ninja"!
I use CMake with Ninja extensively at work and at home, on Windows and Linux. So why haven't I seen this bug before?
Well... in this instance I'm using a very old version of CMake, version 2.8.12. It's so old it's almost fossilised. So presumably it's either a CMake bug which was fixed later, or the Ninja project changed the name of the binary at some point.
2If ninja
really exists in $PATH and it still does not work, you should check the permission of the executable file via ls -l /PATH/TO/NINJA
. Make sure others have read and execute permissions (like '-rwxr-xr-x').
See also: 0013910: Ninja generator initialization fails if /usr/bin/ninja is not world-readable
1You may still suffer
CMake Error: CMake was unable to find a build program corresponding to "Ninja". CMAKE_MAKE_PROGRAM is not set. You probably need to select a different build tool.
even you already have::
- put
ninja
in your PATH ninja
executable with proper privilege- newer version of cmake**
Then it might because -D CMAKE_MAKE_PROGRAM
and -G Ninja
are specified at the same time but CMAKE_MAKE_PROGRAM
with invalid value (such as empty).
For example
Android Studio with gradle plugin version :
classpath 'com.android.tools.build:gradle:7.0.0-alpha03'
and not using SDK Manager provided cmake, by:
- put cmake executable in
PATH
environment variable - put ninja executable in
PATH
environment variable - specify cmake version equal to the one in
PATH
, in modules'sbuild.gradle
, like:
externalNativeBuild { cmake { path "src/main/cpp/CMakeLists.txt" version "3.19.1" // this line } }
Then actually gradle calling cmake like this:
cmake ^ -HD:\dev\android_cv_examples\HelloNDK7\app\src\main\cpp ^ -DCMAKE_SYSTEM_NAME=Android ^ -DCMAKE_EXPORT_COMPILE_COMMANDS=ON ^ -DCMAKE_SYSTEM_VERSION=26 ^ -DANDROID_ABI=arm64-v8a ^ -DCMAKE_ANDROID_ARCH_ABI=arm64-v8a ^ -DANDROID_NDK=D:\soft\Android\ndk-r21b ^ -DCMAKE_ANDROID_NDK=D:\soft\Android\ndk-r21b ^ -DCMAKE_TOOLCHAIN_FILE=D:\soft\Android\ndk-r21b\build\cmake\android.toolchain.cmake ^ -DCMAKE_MAKE_PROGRAM= ^ -DCMAKE_C_FLAGS= ^ -DCMAKE_CXX_FLAGS=-std=c++11 ^ -DCMAKE_LIBRARY_OUTPUT_DIRECTORY=D:\dev\android_cv_examples\HelloNDK7\app\build\intermediates\cmake\debug\obj\arm64-v8a ^ -DCMAKE_RUNTIME_OUTPUT_DIRECTORY=D:\dev\android_cv_examples\HelloNDK7\app\build\intermediates\cmake\debug\obj\arm64-v8a ^ -DCMAKE_BUILD_TYPE=Debug ^ -BD:\dev\android_cv_examples\HelloNDK7\app\.cxx\cmake\debug\arm64-v8a ^ -GNinja ^ -DANDROID_PLATFORM=android-24
Note: If removing previous cmake build cache, and modify that calling script by deleting -DCMAKE_MAKE_PROGRAM
then problem will be solved.
My issue was fixed by upgrading CMake to the latest version as specified in this answer: https://askubuntu.com/a/865294/924090
This was apparently an issue in CMake that is now fixed in the latest version. More information here: https://gitlab.kitware.com/cmake/cmake/-/issues/21486
1In Debian/Ubuntu systems, go ahead and install it
apt install ninja-build
Then rerun CMake.
I am using Mac Monterey. I put ninja into /Applications
and /Users/USER/Applications
and made sure $PATH
was pointing to these directories, but no luck.
I only made CMake discover Ninja by installing it via homebrew:
brew install ninja
ncG1vNJzZmirpJawrLvVnqmfpJ%2Bse6S7zGiorp2jqbawutJoanFuZW19coCOp6CnopFiu7DAjJ%2BmrqaUYq%2B6ecKmmKSd