[Insight-developers] passing include dirs and libs list through

Alexandre GOUAILLARD agouaillard at gmail.com
Tue May 17 02:25:17 EDT 2011


Works on my machine, as expected.

I ll make a patch and submit to gerrit.

thanks again.

alex.


On Tue, May 17, 2011 at 1:59 AM, Alexandre GOUAILLARD
<agouaillard at gmail.com> wrote:
> great !
>
> it's 2am here, so I ll test that tomorrow on my win XP machine (even
> if it s national hollyday - vesak day).
>
> thanks again brad, that s really helpfull.
>
> alex.
>
>
> On Mon, May 16, 2011 at 11:52 PM, Brad King <brad.king at kitware.com> wrote:
>> On 05/14/2011 07:31 AM, Alexandre GOUAILLARD wrote:
>>> then, in ITK,  In the case of GDCM, this is not happening, and the
>>> list of librairies are hardcoded in
>>> Modules/ThirdParty/GDCM/CMakeList.txt
>>> Can you confirm that we are suppose to copy over the list to
>>> ITK-GDCM_LIBRARIES and that some cmake magic will take care of using
>>> those when needed?
>>
>> It's not a copy.  It is a list of the libraries that ITK-GDCM intends
>> to provide whether from the system or from its own source tree.  Every
>> module that provides libraries sets that list explicitly to the libraries
>> it provides.
>>
>>> that, and that we should use the "GDCM_LIBRARY_DIRS" for that.
>> [snip]
>>> If I look in other third party module ... they do not seem to use it
>>
>> The ITK-VNL module in The Modules/ThirdParty/VNL/CMakeLists.txt does.
>> In Modules/ThirdParty/GDCM/CMakeLists.txt add:
>>
>>   set(ITK-GDCM_LIBRARIES  gdcmDICT gdcmMSFF )
>> +  set(ITK-GDCM_SYSTEM_LIBRARY_DIRS "${GDCM_LIBRARY_DIRS}")
>>   set(ITK-GDCM_NO_SRC 1)
>>
>> to propagate library directories from the system.  Of course since
>> GDCMConfig does not provide GDCM_LIBRARY_DIRS this won't actually
>> help.  However, GDCM exports its targets in GDCMTargets.cmake and
>> loads them from GDCMConfig so you shouldn't ever need link dirs
>> at all.  See below.
>>
>>> What am I missing here?
>>
>> Nothing.  This is due to an oversight in our design for modules that
>> can switch between building a library or finding it on the system :(
>> The design does not account for third-party packages on the system
>> that actually provide a targets file like GDCM does.
>>
>> What GDCM intends to happen is that the dependent package runs
>> find_package(GDCM) which loads GDCMConfig.cmake which then loads
>> GDCMTargets.cmake to import the GDCM library targets as logical
>> names:
>>
>>  http://www.cmake.org/Wiki/CMake/Tutorials/Exporting_and_Importing_Targets
>>
>> Even though GDCM is providing the right stuff ITK is not using it
>> correctly.  The problem is that imported targets have scope only in
>> the directory where they are imported, and below.  Therefore in
>> ITK the GDCM logical target names are meaningful only in the
>> Modules/ThirdParty/GDCM directory and below.  When the string names
>> are passed to other directories through ITK-GDCM_LIBRARIES and used
>> in target_link_libraries calls, CMake has no idea that the names are
>> supposed to be interpreted as imported targets.  Therefore it just
>> passes them with -l options.
>>
>> The patch below works around this problem by creating a normal
>> library target "ITK-GDCM" that links to the imported libraries in
>> a scope where they are available.  When other directories reference
>> ${ITK-GDCM_LIBRARIES} they will get just ITK-GDCM which is a real
>> target.  CMake follows the transitive dependencies of it correctly
>> in the proper scope and links the real gdcm libraries.
>>
>> -Brad
>>
>>
>> diff --git a/Modules/ThirdParty/GDCM/CMakeLists.txt b/Modules/ThirdParty/GDCM/CMakeLists.txt
>> index 2c68408..004f530 100644
>> --- a/Modules/ThirdParty/GDCM/CMakeLists.txt
>> +++ b/Modules/ThirdParty/GDCM/CMakeLists.txt
>> @@ -9,8 +9,7 @@ if(ITK_USE_SYSTEM_GDCM)
>>   set(ITK-GDCM_SYSTEM_INCLUDE_DIRS
>>     ${GDCM_INCLUDE_DIRS}
>>     )
>> -  set(ITK-GDCM_LIBRARIES  gdcmDICT gdcmMSFF )
>> -  set(ITK-GDCM_NO_SRC 1)
>> +  set(ITK-GDCM_LIBRARIES ITK-GDCM)
>>  else()
>>   set(ITK-GDCM_INCLUDE_DIRS
>>     ${ITK-GDCM_BINARY_DIR}
>> diff --git a/Modules/ThirdParty/GDCM/src/CMakeLists.txt b/Modules/ThirdParty/GDCM/src/CMakeLists.txt
>> index 2eec2dc..9170bb0 100644
>> --- a/Modules/ThirdParty/GDCM/src/CMakeLists.txt
>> +++ b/Modules/ThirdParty/GDCM/src/CMakeLists.txt
>> @@ -1,3 +1,10 @@
>> +if(ITK_USE_SYSTEM_GDCM)
>> +  add_library(ITK-GDCM ITK-GDCM.cxx)
>> +  target_link_libraries(ITK-GDCM gdcmDICT gdcmMSFF)
>> +  itk_module_target(ITK-GDCM)
>> +  return()
>> +endif()
>> +
>>  set(GDCM_TARGETS_NAME ${ITK-GDCM-targets})
>>  set(GDCM_INSTALL_BIN_DIR ${ITK-GDCM_INSTALL_RUNTIME_DIR})
>>  set(GDCM_INSTALL_LIB_DIR ${ITK-GDCM_INSTALL_LIBRARY_DIR})
>> diff --git a/Modules/ThirdParty/GDCM/src/ITK-GDCM.cxx b/Modules/ThirdParty/GDCM/src/ITK-GDCM.cxx
>> new file mode 100644
>> index 0000000..286c861
>> --- /dev/null
>> +++ b/Modules/ThirdParty/GDCM/src/ITK-GDCM.cxx
>> @@ -0,0 +1 @@
>> +int ITK_GDCM(void) { return 0; }
>>
>


More information about the Insight-developers mailing list