132

I want to generate a Makefile with an install target, making installation to /usr instead of default /usr/local. Assuming that the build directory is a subdirectory of the source directory, I execute:

cmake -DCMAKE_INSTALL_PREFIX:PATH=/usr ..

CMakeCache.txt contains: CMAKE_INSTALL_PREFIX:PATH=/usr (OK?)

Now I execute:

make
make install

All files are still installed to usr/local. What is wrong?

Edit: There is no CMAKE_INSTALL_PREFIX in any of the CMakeLists.txt project files. Before running cmake, I delete everything from the output directory. install directives in CMakeLists.txt look like:

install(TARGETS mylibrary DESTINATION lib)
starball
  • 20,030
  • 7
  • 43
  • 238
Alex F
  • 42,307
  • 41
  • 144
  • 212
  • I can't reproduce this issue on CMake v3.24.2 and Make v4.3 (the latest versions at the time of this comment). Can you try to reproduce it with the tools you are using now? Do you remember what versions of CMake and Make you were using when you wrote the question? – starball Sep 29 '22 at 02:05

6 Answers6

159

That should be (see the docs):

cmake -DCMAKE_INSTALL_PREFIX=/usr ..
starball
  • 20,030
  • 7
  • 43
  • 238
mtvec
  • 17,846
  • 5
  • 52
  • 83
  • Just to save people some time: Use single 'quote' NOT "double" when passing strings with possible spaces. The double results in CMake creating folders named ; from the source. It will do so without erroring. – Kalen May 16 '23 at 20:31
44

There are two ways to use this variable:

  • passing it as a command line argument just like Job mentioned:

    cmake -DCMAKE_INSTALL_PREFIX=< install_path > ..

  • assigning value to it in CMakeLists.txt:

    SET(CMAKE_INSTALL_PREFIX < install_path >)

    But do remember to place it BEFORE PROJECT(< project_name>) command, otherwise it will not work!

plaes
  • 31,788
  • 11
  • 91
  • 89
ryan_tu
  • 576
  • 4
  • 6
  • 4
    Strange, the SET() statement works for me only if I place it AFTER the PROJECT() statement (CMake 2.8). – AstroFloyd May 04 '15 at 19:00
  • 3
    [This answer](http://stackoverflow.com/a/39485990/1938798) and the reference it links to more directly discusses the before/after the project() command issue. – Craig Scott Nov 19 '16 at 11:04
  • What is this `PROJECT` command and how to have this `cmake` option before it ? You would have an example ? – Stephane Feb 09 '19 at 14:33
  • `set(CMAKE_INSTALL_PREFIX "/usr" CACHE STRING " " FORCE )` , it's ok even if place it after `project()`. – kgbook Mar 05 '21 at 08:44
11

But do remember to place it BEFORE PROJECT(< project_name>) command, otherwise it will not work!

My first week of using cmake - after some years of GNU autotools - so I am still learning (better then writing m4 macros), but I think modifying CMAKE_INSTALL_PREFIX after setting project is the better place.

CMakeLists.txt

cmake_minimum_required (VERSION 2.8)

set (CMAKE_INSTALL_PREFIX /foo/bar/bubba)
message("CIP = ${CMAKE_INSTALL_PREFIX} (should be /foo/bar/bubba")
project (BarkBark)
message("CIP = ${CMAKE_INSTALL_PREFIX} (should be /foo/bar/bubba")
set (CMAKE_INSTALL_PREFIX /foo/bar/bubba)
message("CIP = ${CMAKE_INSTALL_PREFIX} (should be /foo/bar/bubba")

First run (no cache)

CIP = /foo/bar/bubba (should be /foo/bar/bubba
-- The C compiler identification is GNU 4.4.7
-- etc, etc,...
CIP = /usr/local (should be /foo/bar/bubba
CIP = /foo/bar/bubba (should be /foo/bar/bubba
-- Configuring done
-- Generating done

Second run

CIP = /foo/bar/bubba (should be /foo/bar/bubba
CIP = /foo/bar/bubba (should be /foo/bar/bubba
CIP = /foo/bar/bubba (should be /foo/bar/bubba
-- Configuring done
-- Generating done

Let me know if I am mistaken, I have a lot of learning to do. It's fun.

Jim
  • 463
  • 4
  • 7
  • 1
    Try to use FORCE when you do SET: set (CMAKE_INSTALL_PREFIX /foo/bar/bubba CACHE PATH "Cmake prefix" FORCE) – Jav_Rock Dec 22 '16 at 15:57
3

In modern CMake CLI, it's even easier. The last command installs the targets in build folder to myInstallationDirectory using the prefix option.

cmake -S . -B build
cmake --build build
cmake --install build --prefix myInstallationDirectory

Reference: https://cmake.org/cmake/help/latest/manual/cmake.1.html?highlight=install#cmdoption-cmake--install-0

Ryan Friedman
  • 115
  • 1
  • 9
2

This worked for me:

Place this code to the cmakelist.txt at the very top:

SET(CMAKE_INSTALL_PREFIX < install_path >)

For some reason, doing it via the command line does not work for me:

-D CMAKE_INSTALL_PREFIX=/home/user/Human-Detection-Module/build/install/
Max Dax
  • 49
  • 3
1

For example, to add exteranl projects:

The following works for me (cmake for windows: v3.25.2) based on this thread:

project("My_Project" VERSION 1.0.0 LANGUAGES C CXX)

if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
    
    set(CMAKE_INSTALL_PREFIX ${PROJECT_SOURCE_DIR}/external 
        CACHE PATH "Force path to set CMAKE_INSTALL_PREFIX" FORCE)

endif(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)

To verify, run $> ccmake build or $> ccmake . in the build directory to see the cache variable set to:

 CMAKE_BUILD_TYPE                 Debug                                                                                     
 CMAKE_CONFIGURATION_TYPES        Debug;Release;MinSizeRel;RelWithDebInfo                                                   
 CMAKE_EXPORT_COMPILE_COMMANDS    ON                                                                                        
 CMAKE_INSTALL_PREFIX             D:/Projects/CMakeTest/external 

Previously it was:

 CMAKE_BUILD_TYPE                 Debug                                                                                     
 CMAKE_CONFIGURATION_TYPES        Debug;Release;MinSizeRel;RelWithDebInfo                                                   
 CMAKE_EXPORT_COMPILE_COMMANDS    ON                                                                                        
 CMAKE_INSTALL_PREFIX             C:/Program Files/My_Project

This is on windows, I reckon that it would be /usr/cmake/My_project on linux.(if someone could confirm)

EDIT:

If the changes do not reflect, you can delete the CMakeCache.txt

Rohit Kumar J
  • 87
  • 1
  • 8