function(DefineImplementations prefix) FILE(GLOB children RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}/${prefix} ${CMAKE_CURRENT_SOURCE_DIR}/${prefix}/*) set(implementations "") foreach(child ${children}) IF(IS_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/${prefix}/${child}) LIST(APPEND implementations ${child}) ENDIF() ENDFOREACH() list(LENGTH implementations nr_implementations) if(nr_implementations EQUAL 0) message(FATAL_ERROR "Cannot call DefineImplementations with an empty implementations list.") endif() get_filename_component(lib ${CMAKE_CURRENT_SOURCE_DIR} NAME) string(REGEX REPLACE "-" "_" lib ${lib}) list(GET implementations 0 default) if ("${prefix}" STREQUAL "") set(prefix "") else() set(prefix "${prefix}_") string(REGEX REPLACE "/" "_" prefix ${prefix}) endif() set(${lib}_${prefix}implementations ${implementations} PARENT_SCOPE) set(${lib}_${prefix}implementation "${default}" CACHE STRING "${lib} implementation chosen at configure time") set_property(CACHE ${lib}_${prefix}implementation PROPERTY STRINGS ${implementations}) endfunction(DefineImplementations)