76 lines
1.9 KiB
CMake
76 lines
1.9 KiB
CMake
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)
|