[prev in list] [next in list] [prev in thread] [next in thread] 

List:       cmake
Subject:    Re: [CMake] Multiple versions of ITK in one build?
From:       Brad King <brad.king () kitware ! com>
Date:       2013-05-28 19:13:38
Message-ID: 51A501E2.5000306 () kitware ! com
[Download RAW message or body]

On 05/28/2013 11:38 AM, Zamir Khan wrote:
> I should probably clarify the situation (I'm not sure I provided enough info up \
> front). The larger dependencies like ITK are pre-built (I guess one would assume \
> this; we don't rebuild ITK or VTK with every build of our project). So I thought it \
> would be a simple problem of overwrite and then restoring the ITK_DIR value at the \
> right time (e.g. at the point of find_package(ITK ...) for the modules in \
> question). I feel like we've almost got this working. There are some lingering \
> issues that we're still solving, but the respective modules seem to reference the \
> correct versions of ITK now. I guess I'm wondering whether this approach is doomed \
> to fail for a reason we haven't anticipated. 
> I'm doing the replacement as follows:
> 
> # This module uses an older version of ITK (3.2) than the rest of
> # the project (4.31), so here we overwrite the ITK_DIR variable
> # so that the correct version is found.
> MESSAGE( STATUS "ITK_DIR_SECONDARY value:  "  ${ITK_DIR_SECONDARY})
> 
> MESSAGE( STATUS "ITK_DIR value (before overwrite):  "  ${ITK_DIR})
> # Store the primary ITK directory in a temporary variable
> set(ITK_DIR_PRIMARY ${ITK_DIR})
> # Overwrite the ITK_DIR cache variable
> set(ITK_DIR ${ITK_DIR_SECONDARY} CACHE STRING "The directory containing a CMake \
> configuration file for ITK" FORCE) MESSAGE( STATUS "ITK_DIR value (after \
> overwrite):  "  ${ITK_DIR}) 
> FIND_PACKAGE(ITK 3.2)
> IF(ITK_FOUND)
> INCLUDE(${ITK_USE_FILE})
> ELSE(ITK_FOUND)
> MESSAGE(FATAL_ERROR "ITK not found. Please set ITK_DIR.")
> ENDIF(ITK_FOUND)
> 
> # Restore the original (primary) ITK_DIR value
> SET(ITK_DIR ${ITK_DIR_PRIMARY} CACHE STRING "The directory containing a CMake \
> configuration file for ITK" FORCE) MESSAGE( STATUS "ITK_DIR value (after restore):  \
> "  ${ITK_DIR})

CACHE values are loaded only at the beginning of processing CMake code
so the FORCE set will not take effect until the next time you run CMake.
Instead set ITK_DIR as a normal (non-cached) variable:

 set(ITK_DIR "${ITK_DIR_4_3}")
 find_package(ITK 4.3)

 ...

 set(ITK_DIR "${ITK_DIR_3_2}")
 find_package(ITK 3.2)

That should get the package configuration file from each ITK loaded.

There may be other problems with multiple versions of ITK in a single
project but I can't enumerate any off the top of my head.  Certainly
it will work only when the two find_package calls are in separate
subdirectories (via add_subdirectory) and cannot see each other.

-Brad
--

Powered by www.kitware.com

Visit other Kitware open-source projects at \
http://www.kitware.com/opensource/opensource.html

Please keep messages on-topic and check the CMake FAQ at: \
http://www.cmake.org/Wiki/CMake_FAQ

Follow this link to subscribe/unsubscribe:
http://www.cmake.org/mailman/listinfo/cmake


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic