HULL/cmake/utils/find_include_dirs.cmake
2025-08-03 17:36:01 +01:00

38 lines
1.3 KiB
CMake

include_guard(GLOBAL)
function(find_include_dirs OUT_VAR)
set(SOURCES ${ARGN})
# Get top most common directory prefix for all source files
set(COMMON_PATH "")
foreach(FILE IN LISTS SOURCES)
get_filename_component(DIR ${FILE} DIRECTORY)
file(REAL_PATH ${DIR} DIR)
if(COMMON_PATH STREQUAL "")
set(COMMON_PATH ${DIR})
else()
string(LENGTH ${COMMON_PATH} PREFIX_LEN)
while(NOT ${DIR} MATCHES "^${COMMON_PATH}(/|$)" AND PREFIX_LEN GREATER 0)
string(SUBSTRING ${COMMON_PATH} 0 ${PREFIX_LEN} COMMON_PATH)
math(EXPR PREFIX_LEN "${PREFIX_LEN} - 1")
endwhile()
endif()
endforeach()
if(NOT IS_DIRECTORY ${COMMON_PATH})
message(FATAL_ERROR "Could not determine common directory for source files")
endif()
# Recursively find directories that contain .h files under common directory
file(GLOB_RECURSE HEADER_FILES ${COMMON_PATH}/*.h)
set(INCLUDE_DIRS "")
foreach(HEADER_FILE IN LISTS HEADER_FILES)
get_filename_component(HEADER_DIR ${HEADER_FILE} DIRECTORY)
list(APPEND INCLUDE_DIRS ${HEADER_DIR})
endforeach()
list(REMOVE_DUPLICATES INCLUDE_DIRS)
set(${OUT_VAR} ${INCLUDE_DIRS} PARENT_SCOPE)
endfunction()