|  | # Copyright 2020 The IREE Authors | 
|  | # | 
|  | # Licensed under the Apache License v2.0 with LLVM Exceptions. | 
|  | # See https://llvm.org/LICENSE.txt for license information. | 
|  | # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | 
|  |  | 
|  | include(CMakeParseArguments) | 
|  |  | 
|  | # flatbuffer_c_library() | 
|  | # | 
|  | # CMake function to invoke the flatcc compiler. | 
|  | # | 
|  | # Parameters: | 
|  | # NAME: name of target (see Note) | 
|  | # SRCS: List of source files for the library | 
|  | # FLATCC_ARGS: List of flattbuffers arguments. Default: | 
|  | #             "--common" | 
|  | #             "--reader" | 
|  | # PUBLIC: Add this so that this library will be exported under iree:: | 
|  | # Also in IDE, target will appear in IREE folder while non PUBLIC will be in IREE/internal. | 
|  | # TESTONLY: When added, this target will only be built if user passes -DIREE_BUILD_TESTS=ON to CMake. | 
|  | # | 
|  | # Note: | 
|  | # By default, flatbuffer_c_library will always create a library named ${NAME}, | 
|  | # and alias target iree::${NAME}. The iree:: form should always be used. | 
|  | # This is to reduce namespace pollution. | 
|  | # | 
|  | # flatbuffer_c_library( | 
|  | #   NAME | 
|  | #     some_def | 
|  | #   SRCS | 
|  | #     "some_def.fbs" | 
|  | #   FLATCC_ARGS | 
|  | #     "--reader" | 
|  | #     "--builder" | 
|  | #     "--verifier" | 
|  | #     "--json" | 
|  | #   PUBLIC | 
|  | # ) | 
|  | # iree_cc_binary( | 
|  | #   NAME | 
|  | #     main_lib | 
|  | #   ... | 
|  | #   DEPS | 
|  | #     iree::schemas::some_def | 
|  | # ) | 
|  | function(flatbuffer_c_library) | 
|  | cmake_parse_arguments(_RULE | 
|  | "PUBLIC;TESTONLY" | 
|  | "NAME" | 
|  | "SRCS;FLATCC_ARGS" | 
|  | ${ARGN} | 
|  | ) | 
|  |  | 
|  | if(_RULE_TESTONLY AND NOT IREE_BUILD_TESTS) | 
|  | return() | 
|  | endif() | 
|  |  | 
|  | # Prefix the library with the package name, so we get: iree_package_name | 
|  | iree_package_name(_PACKAGE_NAME) | 
|  | set(_NAME "${_PACKAGE_NAME}_${_RULE_NAME}") | 
|  |  | 
|  | if(NOT DEFINED _RULE_FLATCC_ARGS) | 
|  | set(_RULE_FLATCC_ARGS | 
|  | "--common" | 
|  | "--reader" | 
|  | ) | 
|  | else() | 
|  | set(_RULE_FLATCC_ARGS ${_RULE_FLATCC_ARGS}) | 
|  | endif() | 
|  |  | 
|  | set(_OUTS "") | 
|  | foreach(_SRC ${_RULE_SRCS}) | 
|  | get_filename_component(_SRC_FILENAME ${_SRC} NAME_WE) | 
|  | foreach(_ARG ${_RULE_FLATCC_ARGS}) | 
|  | if(_ARG STREQUAL "--reader") | 
|  | list(APPEND _OUTS "${_SRC_FILENAME}_reader.h") | 
|  | elseif(_ARG STREQUAL "--builder") | 
|  | list(APPEND _OUTS "${_SRC_FILENAME}_builder.h") | 
|  | elseif(_ARG STREQUAL "--verifier") | 
|  | list(APPEND _OUTS "${_SRC_FILENAME}_verifier.h") | 
|  | elseif(_ARG STREQUAL "--json") | 
|  | list(APPEND _OUTS "${_SRC_FILENAME}_json_printer.h") | 
|  | list(APPEND _OUTS "${_SRC_FILENAME}_json_parser.h") | 
|  | endif() | 
|  | endforeach() | 
|  | endforeach() | 
|  | list(TRANSFORM _OUTS PREPEND "${CMAKE_CURRENT_BINARY_DIR}/") | 
|  |  | 
|  | add_custom_command( | 
|  | OUTPUT | 
|  | ${_OUTS} | 
|  | COMMAND | 
|  | iree-flatcc-cli | 
|  | -o "${CMAKE_CURRENT_BINARY_DIR}" | 
|  | -I "${IREE_ROOT_DIR}" | 
|  | ${_RULE_FLATCC_ARGS} | 
|  | "${_RULE_SRCS}" | 
|  | WORKING_DIRECTORY | 
|  | "${CMAKE_CURRENT_SOURCE_DIR}" | 
|  | MAIN_DEPENDENCY | 
|  | ${_RULE_SRCS} | 
|  | DEPENDS | 
|  | ${_RULE_SRCS} | 
|  | COMMAND_EXPAND_LISTS | 
|  | ) | 
|  |  | 
|  | set(_GEN_TARGET "${_NAME}_gen") | 
|  | add_custom_target( | 
|  | ${_GEN_TARGET} | 
|  | DEPENDS | 
|  | ${_OUTS} | 
|  | ) | 
|  |  | 
|  | add_library(${_NAME} INTERFACE) | 
|  | add_dependencies(${_NAME} ${_GEN_TARGET}) | 
|  | target_include_directories(${_NAME} SYSTEM | 
|  | INTERFACE | 
|  | ${CMAKE_CURRENT_BINARY_DIR} | 
|  | ) | 
|  | target_link_libraries(${_NAME} | 
|  | INTERFACE | 
|  | ${IREE_DEFAULT_LINKOPTS} | 
|  | ) | 
|  | target_compile_options(${_NAME} | 
|  | INTERFACE | 
|  | "-I${IREE_ROOT_DIR}/third_party/flatcc/include/" | 
|  | "-I${IREE_ROOT_DIR}/third_party/flatcc/include/flatcc/reflection/" | 
|  | ) | 
|  |  | 
|  | # Alias the iree_package_name library to iree::package::name. | 
|  | # This lets us more clearly map to Bazel and makes it possible to | 
|  | # disambiguate the underscores in paths vs. the separators. | 
|  | iree_package_ns(_PACKAGE_NS) | 
|  | add_library(${_PACKAGE_NS}::${_RULE_NAME} ALIAS ${_NAME}) | 
|  | endfunction() |