[CMake] set CMAKE_INSTALL_PREFIX in CMakeLists

Marcel Loose loose at astron.nl
Thu Dec 2 04:18:53 EST 2010


>>> On 30-11-2010 at 18:48, in message
<20101130174852.GC10257 at cryptio.net>, Tyler
Roscoe <tyler at cryptio.net> wrote: 
> On Thu, Nov 25, 2010 at 02:01:31PM +0100, Marcel Loose wrote:
>> >>> On 24-11-2010 at 17:45, in message
>> <20101124164507.GG23449 at cryptio.net>, Tyler
>> Roscoe <tyler at cryptio.net> wrote: 
>> > On Wed, Nov 24, 2010 at 12:11:56PM +0100, Micha Renner wrote:
>> >> 
>> >> >   SET(CMAKE_INSTALL_PREFIX "/foo/bar" CACHE PATH "Foo install
>> prefix")
>> >> > 
>> >> > So, without the test to
>> CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT,
>> >> > and without the FORCE option.
>> >>
>> >> No, as I mentioned, there was an article of one the
>> CMake-maintainers
>> >> who recommended this.
>> > 
>> > Micha is correct. CMAKE_INSTALL_PREFIX is set before your
>> CMakeLists.txt
>> > is processed, so the above will never do anything.
>> > 
>> > tyler
>> 
>> Well, I tested this before I posted my reply. It does work the way
I
>> describe it. Try it yourself.
> 
> It doesn't work for me:
> 
> [tylermr at tpb006:~/cmake-test-install-prefix]$ cmake --version
> cmake version 2.8.3
> 
> [tylermr at tpb006:~/cmake-test-install-prefix]$ cat CMakeLists.txt
> cmake_minimum_required(VERSION 2.8)
> project(p)
> 
> set (CMAKE_INSTALL_PREFIX "foo" CACHE PATH "docstring")
> message ("CMAKE_INSTALL_PREFIX = ${CMAKE_INSTALL_PREFIX}")
> 
> [tylermr at tpb006:~/cmake-test-install-prefix]$ mkdir b && cd b &&
cmake ..
> -- The C compiler identification is GNU
> -- The CXX compiler identification is GNU
> -- Check for working C compiler: /usr/bin/gcc
> -- Check for working C compiler: /usr/bin/gcc -- works
> -- Detecting C compiler ABI info
> -- Detecting C compiler ABI info - done
> -- Check for working CXX compiler: /usr/bin/c++
> -- Check for working CXX compiler: /usr/bin/c++ -- works
> -- Detecting CXX compiler ABI info
> -- Detecting CXX compiler ABI info - done
> CMAKE_INSTALL_PREFIX = /usr/local
> -- Configuring done
> -- Generating done
> -- Build files have been written to:
/tpb006/tylermr/cmake-test-install-prefix/b

Hi Tyler,

I now see why it works for me and not for you. Maybe I didn't write it
clearly, but I do SET(CMAKE_INSTALL_PREFIX ...) *before* the call to
PROJECT(). You are right that it doesn't work when you do it after the
PROJECT() call. Unfortunately, the solution with the IF-test doesn't
work when you use it before the PROJECT() call, for obvious reasons I
would say.

So, there are two solutions that work, but you have to choose carefully
among them.

1) Use this snippet *before* PROJECT(xxx):
  SET(CMAKE_INSTALL_PREFIX <path> CACHE PATH <comment>)

2) Use this snippet *after* PROJECT(xxx):
  IF(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
    SET(CMAKE_INSTALL_PREFIX <path> CACHE PATH <comment> FORCE)
  ENDIF(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)

Best regards,
Marcel Loose.



More information about the CMake mailing list