Skip to content

Commit 87cc629

Browse files
committed
ENH: Use target-based includes for ITK modules
Replace directory-level include_directories() with target-based include properties to enable modern CMake practices and support proper transitive include propagation. Changes: 1. Created ${itk-module}_GENEX_INCLUDE_DIRS and ${itk-module}_SYSTEM_GENEX_INCLUDE_DIRS - Use generator expressions for BUILD_INTERFACE and INSTALL_INTERFACE paths - Variables produced in each module's CMake configuration file - Enables proper include path handling in build and install trees 2. Modified itk_module_add_library() to apply target properties - Uses target_include_directories() instead of directory-level includes - Uses target_link_directories() for system library directories - Ensures proper PUBLIC include propagation 3. Updated ITKModuleHeaderTest.cmake - Added module include directories to header test targets - Fixes compilation errors for header-only modules 4. Maintain directory level include for ThirdParty modules Compatibility Notes: - Modules not using itk_module_add_library() may need directory-level include_directories() added explicitly - External modules should update to use itk_module_add_library()
1 parent 32b0d07 commit 87cc629

File tree

2 files changed

+72
-9
lines changed

2 files changed

+72
-9
lines changed

CMake/ITKModuleHeaderTest.cmake

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,21 @@ macro(itk_module_headertest _name)
126126
${${_name}_LIBRARIES}
127127
itksys
128128
)
129+
130+
# Add module include directories to target
131+
target_include_directories(
132+
${_test_name}
133+
PRIVATE
134+
${${_name}_GENEX_INCLUDE_DIRS}
135+
)
136+
137+
# Add module system include directories to target
138+
target_include_directories(
139+
${_test_name}
140+
PRIVATE
141+
${${_name}_GENEX_SYSTEM_INCLUDE_DIRS}
142+
)
143+
129144
target_link_options(
130145
${_test_name}
131146
PRIVATE

CMake/ITKModuleMacros.cmake

Lines changed: 57 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -194,20 +194,43 @@ macro(itk_module_impl)
194194
list(APPEND ${itk-module}_INCLUDE_DIRS ${${itk-module}_BINARY_DIR}/include)
195195
endif()
196196

197-
if(${itk-module}_INCLUDE_DIRS)
198-
include_directories(${${itk-module}_INCLUDE_DIRS})
199-
endif()
200-
if(${itk-module}_SYSTEM_INCLUDE_DIRS)
201-
# _SYSTEM_INCLUDE_DIRS should searched after internal _INCLUDE_DIRS
202-
include_directories(AFTER ${${itk-module}_SYSTEM_INCLUDE_DIRS})
203-
endif()
197+
# Prepare include directories with generator expressions for use in targets
198+
set(${itk-module}_GENEX_INCLUDE_DIRS "")
199+
foreach(_dir ${${itk-module}_INCLUDE_DIRS})
200+
list(APPEND ${itk-module}_GENEX_INCLUDE_DIRS "$<BUILD_INTERFACE:${_dir}>")
201+
endforeach()
202+
list(
203+
APPEND
204+
${itk-module}_GENEX_INCLUDE_DIRS
205+
"$<INSTALL_INTERFACE:$<INSTALL_PREFIX>/${${itk-module}_INSTALL_INCLUDE_DIR}>"
206+
)
204207

205-
if(${itk-module}_SYSTEM_LIBRARY_DIRS)
206-
link_directories(${${itk-module}_SYSTEM_LIBRARY_DIRS})
208+
# Prepare system include directories with generator expressions
209+
set(${itk-module}_SYSTEM_GENEX_INCLUDE_DIRS "")
210+
if(${itk-module}_SYSTEM_INCLUDE_DIRS)
211+
foreach(_dir ${${itk-module}_SYSTEM_INCLUDE_DIRS})
212+
list(
213+
APPEND
214+
${itk-module}_SYSTEM_GENEX_INCLUDE_DIRS
215+
"$<BUILD_INTERFACE:${_dir}>"
216+
)
217+
list(
218+
APPEND
219+
${itk-module}_SYSTEM_GENEX_INCLUDE_DIRS
220+
"$<INSTALL_INTERFACE:${_dir}>"
221+
)
222+
endforeach()
207223
endif()
208224

209225
if(${itk-module}_THIRD_PARTY)
210226
itk_module_warnings_disable(C CXX)
227+
if(${itk-module}_INCLUDE_DIRS)
228+
include_directories(${${itk-module}_INCLUDE_DIRS})
229+
endif()
230+
if(${itk-module}_SYSTEM_INCLUDE_DIRS)
231+
# _SYSTEM_INCLUDE_DIRS should searched after internal _INCLUDE_DIRS
232+
include_directories(AFTER ${${itk-module}_SYSTEM_INCLUDE_DIRS})
233+
endif()
211234
else()
212235
if(ITK_USE_KWSTYLE)
213236
itk_module_kwstyle_test(${itk-module})
@@ -371,6 +394,12 @@ macro(itk_module_impl)
371394
"${itk-module-RUNTIME_LIBRARY_DIRS-build}"
372395
)
373396
set(itk-module-INCLUDE_DIRS "${itk-module-INCLUDE_DIRS-build}")
397+
# set itk-module-GENEX_INCLUDE_DIRS so that includes both install interface and build interface path in appropriate generator expressions
398+
set(itk-module-GENEX_INCLUDE_DIRS "")
399+
foreach(_dir ${itk-module-INCLUDE_DIRS-build})
400+
list(APPEND itk-module-GENEX_INCLUDE_DIRS "$<BUILD_INTERFACE:${_dir}>")
401+
endforeach()
402+
374403
set(itk-module-EXPORT_CODE "${itk-module-EXPORT_CODE-build}")
375404
set(itk-module-TARGETS_FILE "${itk-module-TARGETS_FILE-build}")
376405
configure_file(
@@ -626,6 +655,25 @@ macro(itk_module_add_library _name)
626655
${ARGN}
627656
)
628657
target_compile_features(${_name} PUBLIC cxx_std_${CMAKE_CXX_STANDARD})
658+
659+
# Add module include directories to target
660+
target_include_directories(
661+
${_name}
662+
PUBLIC
663+
${${itk-module}_GENEX_INCLUDE_DIRS}
664+
)
665+
666+
# Add module system include directories to target
667+
target_include_directories(
668+
${_name}
669+
SYSTEM
670+
PUBLIC
671+
${${itk-module}_SYSTEM_GENEX_INCLUDE_DIRS}
672+
)
673+
674+
# Add module library directories to target
675+
target_link_directories(${_name} PUBLIC ${${itk-module}_SYSTEM_LIBRARY_DIRS})
676+
629677
target_link_options(
630678
${_name}
631679
PUBLIC

0 commit comments

Comments
 (0)