blob: 834aef142b6a749b41a52e560969b04f028e4e28 [file] [log] [blame]
Geoffrey Martin-Noble552d3f82021-05-25 17:56:09 -07001# Copyright 2020 The IREE Authors
Ben Vanik2d1808b2020-07-17 19:02:16 -07002#
Geoffrey Martin-Noble552d3f82021-05-25 17:56:09 -07003# Licensed under the Apache License v2.0 with LLVM Exceptions.
4# See https://llvm.org/LICENSE.txt for license information.
5# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
Ben Vanik2d1808b2020-07-17 19:02:16 -07006
7include(CMakeParseArguments)
8
9# flatbuffer_c_library()
10#
11# CMake function to invoke the flatcc compiler.
12#
13# Parameters:
14# NAME: name of target (see Note)
15# SRCS: List of source files for the library
Ben Vanik2d1808b2020-07-17 19:02:16 -070016# FLATCC_ARGS: List of flattbuffers arguments. Default:
17# "--common"
18# "--reader"
19# PUBLIC: Add this so that this library will be exported under iree::
20# Also in IDE, target will appear in IREE folder while non PUBLIC will be in IREE/internal.
21# TESTONLY: When added, this target will only be built if user passes -DIREE_BUILD_TESTS=ON to CMake.
22#
23# Note:
24# By default, flatbuffer_c_library will always create a library named ${NAME},
25# and alias target iree::${NAME}. The iree:: form should always be used.
26# This is to reduce namespace pollution.
27#
28# flatbuffer_c_library(
29# NAME
Ben Vanike5774c32020-11-15 17:06:09 -080030# some_def
Ben Vanik2d1808b2020-07-17 19:02:16 -070031# SRCS
Ben Vanike5774c32020-11-15 17:06:09 -080032# "some_def.fbs"
33# FLATCC_ARGS
34# "--reader"
35# "--builder"
36# "--verifier"
37# "--json"
Ben Vanik2d1808b2020-07-17 19:02:16 -070038# PUBLIC
39# )
Ben Vanik2d1808b2020-07-17 19:02:16 -070040# iree_cc_binary(
41# NAME
42# main_lib
43# ...
44# DEPS
Ben Vanike5774c32020-11-15 17:06:09 -080045# iree::schemas::some_def
Ben Vanik2d1808b2020-07-17 19:02:16 -070046# )
47function(flatbuffer_c_library)
48 cmake_parse_arguments(_RULE
49 "PUBLIC;TESTONLY"
50 "NAME"
Ben Vanike5774c32020-11-15 17:06:09 -080051 "SRCS;FLATCC_ARGS"
Ben Vanik2d1808b2020-07-17 19:02:16 -070052 ${ARGN}
53 )
54
55 if(_RULE_TESTONLY AND NOT IREE_BUILD_TESTS)
56 return()
57 endif()
58
59 # Prefix the library with the package name, so we get: iree_package_name
60 iree_package_name(_PACKAGE_NAME)
61 set(_NAME "${_PACKAGE_NAME}_${_RULE_NAME}")
62
63 if(NOT DEFINED _RULE_FLATCC_ARGS)
64 set(_RULE_FLATCC_ARGS
65 "--common"
66 "--reader"
67 )
68 else()
69 set(_RULE_FLATCC_ARGS ${_RULE_FLATCC_ARGS})
70 endif()
71
72 set(_OUTS "")
73 foreach(_SRC ${_RULE_SRCS})
74 get_filename_component(_SRC_FILENAME ${_SRC} NAME_WE)
75 foreach(_ARG ${_RULE_FLATCC_ARGS})
76 if(_ARG STREQUAL "--reader")
77 list(APPEND _OUTS "${_SRC_FILENAME}_reader.h")
78 elseif(_ARG STREQUAL "--builder")
79 list(APPEND _OUTS "${_SRC_FILENAME}_builder.h")
80 elseif(_ARG STREQUAL "--verifier")
81 list(APPEND _OUTS "${_SRC_FILENAME}_verifier.h")
Ben Vanikbc685ed2020-11-14 17:09:46 -080082 elseif(_ARG STREQUAL "--json")
83 list(APPEND _OUTS "${_SRC_FILENAME}_json_printer.h")
84 list(APPEND _OUTS "${_SRC_FILENAME}_json_parser.h")
Ben Vanik2d1808b2020-07-17 19:02:16 -070085 endif()
86 endforeach()
87 endforeach()
88 list(TRANSFORM _OUTS PREPEND "${CMAKE_CURRENT_BINARY_DIR}/")
89
Scott Todd4e1a69b2021-01-25 15:29:49 -080090 iree_get_executable_path(_FLATCC_BIN iree-flatcc-cli)
Ben Vanik2d1808b2020-07-17 19:02:16 -070091 add_custom_command(
92 OUTPUT
93 ${_OUTS}
94 COMMAND
95 "${_FLATCC_BIN}"
96 -o "${CMAKE_CURRENT_BINARY_DIR}"
97 -I "${IREE_ROOT_DIR}"
98 ${_RULE_FLATCC_ARGS}
99 "${_RULE_SRCS}"
100 WORKING_DIRECTORY
101 "${CMAKE_CURRENT_SOURCE_DIR}"
102 MAIN_DEPENDENCY
103 ${_RULE_SRCS}
104 DEPENDS
Ben Vanik2d1808b2020-07-17 19:02:16 -0700105 ${_RULE_SRCS}
106 COMMAND_EXPAND_LISTS
107 )
108
109 set(_GEN_TARGET "${_NAME}_gen")
110 add_custom_target(
111 ${_GEN_TARGET}
112 DEPENDS
113 ${_OUTS}
Ben Vanik2d1808b2020-07-17 19:02:16 -0700114 )
115
116 add_library(${_NAME} INTERFACE)
117 add_dependencies(${_NAME} ${_GEN_TARGET})
Ben Vanikafd7abe2020-10-07 09:01:53 -0700118 target_include_directories(${_NAME} SYSTEM
Ben Vanik2d1808b2020-07-17 19:02:16 -0700119 INTERFACE
Ben Vanik6bc6f902020-11-16 05:37:08 -0800120 "$<BUILD_INTERFACE:${IREE_SOURCE_DIR}>"
121 "$<BUILD_INTERFACE:${IREE_BINARY_DIR}>"
Ben Vanik2d1808b2020-07-17 19:02:16 -0700122 ${CMAKE_CURRENT_BINARY_DIR}
123 )
124 target_link_libraries(${_NAME}
125 INTERFACE
Ben Vanik2d1808b2020-07-17 19:02:16 -0700126 ${IREE_DEFAULT_LINKOPTS}
Ben Vanik2d1808b2020-07-17 19:02:16 -0700127 )
128 target_compile_options(${_NAME}
129 INTERFACE
Ben Vanik94b11c32020-11-14 17:07:56 -0800130 "-I${IREE_ROOT_DIR}/third_party/flatcc/include/"
Ben Vanik2d1808b2020-07-17 19:02:16 -0700131 "-I${IREE_ROOT_DIR}/third_party/flatcc/include/flatcc/reflection/"
132 )
133
134 # Alias the iree_package_name library to iree::package::name.
135 # This lets us more clearly map to Bazel and makes it possible to
136 # disambiguate the underscores in paths vs. the separators.
137 iree_package_ns(_PACKAGE_NS)
138 add_library(${_PACKAGE_NS}::${_RULE_NAME} ALIAS ${_NAME})
139endfunction()