[CMake] set CMAKE_INSTALL_PREFIX in CMakeLists

S Roderick kiwi.net at mac.com
Thu Dec 2 08:18:20 EST 2010


On Dec 2, 2010, at 04:35 , Michael Wild wrote:

> On 12/02/2010 10:18 AM, Marcel Loose wrote:
>>>>> 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.
> 
> Considering what David said, the first solution depends on the
> implementation details of the PROJECT command and is very fragile since
> it works "accidentally" for some versions of CMake. I don't consider it
> to be an option at all. I would suggest to always use the second option.

As long as one of these approaches works, I'm happy. Just choose one, and document it.
S



More information about the CMake mailing list