[Insight-users] [CMake] INSTALL(EXPORT)
Rupert Brooks
rupe.brooks at gmail.com
Tue Sep 23 17:54:03 EDT 2008
Hi folks,
My apologies for cross-posting - I'm hoping this is of interest to the
ITK list, and it continues a month-old conversation on the CMake list.
Recap:
I like to have the debug and optimized versions of my ITK libraries
have different names (e.g. ITKCommon.lib, ITKCommond.lib). This way i
can install them in the same place, and link against the appropriate
one depending on my build type. Unfortunately this isn't supported in
the current out of the box ITK. Heres a way I found to get it working
- I hope it will help out a few people.
Its my understanding (from Brad King, see email chain further down)
that this will be included in a later ITK release. For the impatient,
here is what I did.
Caveats:
1. I never got this to work so i could link against the build tree.
It only works when installed.
2. I only build debug, and release, im not sure what happens if
RelWithDebInfo is used, etc.
3. I tested on both Intel Windows XP 32 bit and Intel Linux 32 and 64
bit, and so far so good. It ought to work on other systems, but i
didnt test.
4. This relies on the cleverness of the CMAKE Export scheme (Thanks
Brad for pointing me to this). I'm using CMake 2.6.1 - I THINK its
supported in 2.4, but again, i didnt try. Might be worth upgrading if
your going to try it.
Briefly, the main CMakeLists.txt must be edited to add the option
controlling the debug postfix, and to allow a new way of exporting the
library dependencies. Then each CMakeList must be edited to add an
EXPORT command for every library created.
Then when building, I can merrily build and install both the debug and
release versions and install them to the same path. For a project
that uses it, the CMakeLists.txt does a FindITK in the usual way - so
theres no difference between building against an ITK modified like
this, and the regular case. Other than its easier to end up using the
right library, of course. This way if i release my project to someone
who doesnt modify their ITK this way, it will still work for them.
Heres more details:
The main CMakeLists.txt file (in the Insight directory) must be edited
as follows. Lines that are changed are shown with **'s, others for
context. Dont actually put the **'s, obviously....
==================================================================
# If CMake is the version we're expecting, don't show the
# CMAKE_BACKWARDS_COMPATIBILITY option. If the version is higher than the
# minimal version required, then show the backward compatibility option.
IF("${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}" MATCHES "^2\\.4$")
MARK_AS_ADVANCED(FORCE CMAKE_BACKWARDS_COMPATIBILITY)
ELSE("${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}" MATCHES "^2\\.4$")
MARK_AS_ADVANCED(CLEAR CMAKE_BACKWARDS_COMPATIBILITY)
ENDIF("${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}" MATCHES "^2\\.4$")
**#-----------------------------------------------------------------------------
**# Option to add a debug postfix
**OPTION(ITK_USE_DEBUG_POSTFIX "Append a d to names of debug libraries" OFF)
**#MARK_AS_ADVANCED(USE_DEBUG_POSTFIX)
**IF( ITK_USE_DEBUG_POSTFIX )
** SET(CMAKE_DEBUG_POSTFIX "d")
**ENDIF( ITK_USE_DEBUG_POSTFIX )
==================================================================
and, further down, to write out a LibraryDependencies file.
==================================================================
ENDIF(NOT ITK_INSTALL_NO_DEVELOPMENT)
**FILE(REMOVE ITKLibraryDepends.cmake)
** INSTALL(EXPORT Libraries
** DESTINATION ${ITK_INSTALL_PACKAGE_DIR_CM24}
** FILE ITKLibraryDepends.cmake
** )
==================================================================
Now EVERY CMakeLists.txt in the whole ITK tree must be modified so
that any installed libraries get added to the "Libraries" export. This
way the export command above knows about them, and they get written to
the itkLibraryDepends.cmake.
Example:
INSTALL(TARGETS ITKAlgorithms
RUNTIME DESTINATION ${ITK_INSTALL_BIN_DIR_CM24} COMPONENT RuntimeLibraries
LIBRARY DESTINATION ${ITK_INSTALL_LIB_DIR_CM24} COMPONENT RuntimeLibraries
ARCHIVE DESTINATION ${ITK_INSTALL_LIB_DIR_CM24} COMPONENT Development)
becomes
**INSTALL(TARGETS ITKAlgorithms EXPORT Libraries
RUNTIME DESTINATION ${ITK_INSTALL_BIN_DIR_CM24} COMPONENT RuntimeLibraries
LIBRARY DESTINATION ${ITK_INSTALL_LIB_DIR_CM24} COMPONENT RuntimeLibraries
ARCHIVE DESTINATION ${ITK_INSTALL_LIB_DIR_CM24} COMPONENT Development)
hope someone finds it useful.
Cheers,
Rupert B.
On Wed, Aug 13, 2008 at 11:41 AM, Rupert Brooks <rupe.brooks at gmail.com> wrote:
> Thanks Brad,
>
> I will either export them as i go, or store them in a variable, and
> export that list at the end.
>
>>
>> FYI, I am planning to construct build-tree and install-tree export rules
>> for upstream VTK and ITK once we require CMake 2.6.
>
> I guess I am impatient ;-). The reason that I am trying to do this
> is that i use the CMAKE_DEBUG_POSTFIX option to have my debug
> libraries coexist with the non-debug libraries. This was pretty
> important for development, but lead to all kinds of unmaintainable
> hackery in my project CMakeLists to deal with it. Now that im
> sharing my code, i want a clean way for the USEItk.cmake to set up the
> debug vs optimized library dependencies if they exist, and do it the
> old way for "out of the box" ITK, so my collaborators dont run into
> problems.
>
> I was planning to share whatever I came up with on the ITK List - i
> think other people like the CMAKE_DEBUG_POSTFIX thing too. I'll CC
> here for sure. I just want to get it pretty solid first, as i build
> on a range of different systems.
>
> Cheers,
> Rupert B.
>
> --
> --------------------------------------------------------------
> Rupert Brooks
> McGill Centre for Intelligent Machines (www.cim.mcgill.ca)
> Ph.D Student, Electrical and Computer Engineering
> http://www.cyberus.ca/~rbrooks
>
--
--------------------------------------------------------------
Rupert Brooks
McGill Centre for Intelligent Machines (www.cim.mcgill.ca)
Ph.D Student, Electrical and Computer Engineering
http://www.cyberus.ca/~rbrooks
More information about the Insight-users
mailing list