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

Reply via email to