[CMake] Multiple versions of ITK in one build?

Brad King brad.king at kitware.com
Tue May 28 15:13:38 EDT 2013


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


More information about the CMake mailing list