cmake: add support for building and installing interfaces
This commit is contained in:
75
cmake/Msg-Interface.cmake
Normal file
75
cmake/Msg-Interface.cmake
Normal file
@@ -0,0 +1,75 @@
|
||||
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)
|
||||
Reference in New Issue
Block a user