[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