[CMake] Updating cache entries on variable modification
Theodore Papadopoulo
Theodore.Papadopoulo at sophia.inria.fr
Fri Oct 16 05:39:48 EDT 2009
Tyler Roscoe wrote:
> On Wed, Oct 14, 2009 at 04:59:17PM +0200, Theodore Papadopoulo wrote:
>
>> We have a project which can be built either with static or dynamic
>> libraries. The toggle
>> is defined via an option named BUILD_SHARED which has some default value
>> (let's say static).
>>
>> Unfortunately, after the first "configure" in ccmake all the libraries
>> are set to their values corresponding
>> to the default static choice (typically .a files) and then changing the
>> BUILD_SHARED option to shared
>> never recomputes the proper library names (still the .a files).
>>
>
> I think we'll need to see some code from your CMakeLists, but are you
> familiar with set(... CACHE)?
>
Not enough apparently.... Anyway thanks for the answer, it opened some
perspectives.
Here is some simple CMakeList.txt at the end of this mail.
After the first configure the library selected is liblapack.so, then if
you change the value
of the option BUILD_SHARED and re-configure, the library remains
liblapack.so instead of the
expected liblapack.a.
Uncommenting the commented line, indeed forces the discovery of the
libraries at each configure,
but we were wondering whether there is a way of doing so only if eg
CMAKE_FIND_LIBRARY_SUFFIXES
is changed, hence the original question. I hope that this is now clearer.
Inserting something along the lines of:
IF ( BUILD_SHARED )
SET(LIB_TYPE SHARED)
ELSE ( BUILD_SHARED )
SET(LIB_TYPE STATIC)
ENDIF ( BUILD_SHARED )
STRING(COMPARE NOTEQUAL "${BUILD_SHARED_STATUS}" ""
BUILD_SHARED_STATUS_NOT_EMPTY)
IF(BUILD_SHARED_STATUS_NOT_EMPTY)
STRING(COMPARE NOTEQUAL "${BUILD_SHARED_STATUS}"
"${BUILD_SHARED}" RESET)
IF(${RESET})
# MESSAGE("Reset")
SET(LAPACK_ATLAS_LIB NOTFOUND CACHE STRING "Atlas Lib"
FORCE)
ENDIF()
ENDIF()
# Store in cache previous value of BUILD_SHARED
SET(BUILD_SHARED_STATUS "${BUILD_SHARED}" CACHE STRING "Build shared
status (do not modify)" FORCE)
MARK_AS_ADVANCED(BUILD_SHARED_STATUS)
Seems not work but is not very elegant and there is the risk that some
user using the advanced toggle plays with the
BUILD_SHARED_STATUS variable. So I wondered whether there is a better
solution. Obviously, ideally,
FIND_LIBRARY would detect that CMAKE_FIND_LIBRARY_SUFFIXES has changed
and would update the libraries,
but I probably demand too much
Thank's for any hint.
Theo.
PROJECT(Test)
CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
OPTION(BUILD_SHARED "BUILD_SHARED" ON)
IF(BUILD_SHARED)
SET(CMAKE_FIND_LIBRARY_SUFFIXES ".so")
ELSE ()
SET(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
ENDIF()
#SET(TEST_LIB NOTFOUND CACHE STRING "Lib" FORCE)
FIND_LIBRARY(TEST_LIB lapack)
MESSAGE(${TEST_LIB})
More information about the CMake
mailing list