find_program(IFC NAMES ifc REQUIRED HINTS ${BUILD_TOOLS_DIR}) message(STATUS "Found interface compiler: ${IFC}") function(add_interface) set(options) set(one_value_args NAME PARENT_DIR PATH) set(multi_value_args) cmake_parse_arguments(PARSE_ARGV 0 arg "${options}" "${one_value_args}" "${multi_value_args}") message(STATUS "Building interface ${arg_NAME}") file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${arg_PARENT_DIR}) set(header_path ${CMAKE_CURRENT_BINARY_DIR}/${arg_PARENT_DIR}/${arg_NAME}.h) add_custom_command( OUTPUT ${header_path} COMMAND ${IFC} ${arg_PATH} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${arg_PARENT_DIR} COMMENT "Compiling interface: ${arg_NAME}") add_custom_target(ifgen-${arg_NAME} ALL DEPENDS ${header_path}) set_target_properties(ifgen-${arg_NAME} PROPERTIES iface_header_path ${header_path} iface_parent_dir ${arg_PARENT_DIR}) add_library(iflib-${arg_NAME} INTERFACE) set_target_properties(iflib-${arg_NAME} PROPERTIES INTERFACE_INCLUDE_DIRECTORIES ${CMAKE_CURRENT_BINARY_DIR}) add_dependencies(iflib-${arg_NAME} ifgen-${arg_NAME}) add_library(interface::${arg_NAME} ALIAS iflib-${arg_NAME}) endfunction(add_interface) function(iface_get_header_path) set(options) set(one_value_args NAME OUT) set(multi_value_args) cmake_parse_arguments(PARSE_ARGV 0 arg "${options}" "${one_value_args}" "${multi_value_args}") get_property( value TARGET ifgen-${name} PROPERTY iface_header_path) set(${arg_OUT} ${value} PARENT_SCOPE) endfunction(iface_get_header_path) function(iface_get_parent_dir) set(options) set(one_value_args NAME OUT) set(multi_value_args) cmake_parse_arguments(PARSE_ARGV 0 arg "${options}" "${one_value_args}" "${multi_value_args}") get_property( value TARGET ifgen-${name} PROPERTY iface_parent_dir) set(${arg_OUT} ${value} PARENT_SCOPE) endfunction(iface_get_parent_dir)