Scott Todd | d0a0629 | 2020-01-24 14:41:50 -0800 | [diff] [blame] | 1 | #!/usr/bin/env python3 |
| 2 | # Copyright 2020 Google LLC |
| 3 | # |
| 4 | # Licensed under the Apache License, Version 2.0 (the "License"); |
| 5 | # you may not use this file except in compliance with the License. |
| 6 | # You may obtain a copy of the License at |
| 7 | # |
| 8 | # https://www.apache.org/licenses/LICENSE-2.0 |
| 9 | # |
| 10 | # Unless required by applicable law or agreed to in writing, software |
| 11 | # distributed under the License is distributed on an "AS IS" BASIS, |
| 12 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 13 | # See the License for the specific language governing permissions and |
| 14 | # limitations under the License. |
| 15 | |
| 16 | # This script assists with converting from Bazel BUILD files to CMakeLists.txt. |
| 17 | # |
| 18 | # Bazel BUILD files should, where possible, be written to use simple features |
| 19 | # that can be directly evaluated and avoid more advanced features like |
| 20 | # variables, list comprehensions, etc. |
| 21 | # |
| 22 | # Generated CMake files will be similar in structure to their source BUILD |
| 23 | # files by using the functions in build_tools/cmake/ that imitate corresponding |
| 24 | # Bazel rules (e.g. cc_library -> iree_cc_library.cmake). |
| 25 | # |
| 26 | # For usage, see: |
Geoffrey Martin-Noble | b9aa31f | 2020-02-04 13:24:14 -0800 | [diff] [blame] | 27 | # python3 build_tools/bazel_to_cmake/bazel_to_cmake.py --help |
Scott Todd | d0a0629 | 2020-01-24 14:41:50 -0800 | [diff] [blame] | 28 | |
Geoffrey Martin-Noble | ea9c683 | 2020-02-29 20:26:35 -0800 | [diff] [blame] | 29 | # pylint: disable=missing-docstring |
| 30 | # pylint: disable=invalid-name |
| 31 | # pylint: disable=unused-argument |
| 32 | # pylint: disable=exec-used |
| 33 | |
Scott Todd | d0a0629 | 2020-01-24 14:41:50 -0800 | [diff] [blame] | 34 | import argparse |
Scott Todd | d0a0629 | 2020-01-24 14:41:50 -0800 | [diff] [blame] | 35 | import datetime |
Geoffrey Martin-Noble | ea9c683 | 2020-02-29 20:26:35 -0800 | [diff] [blame] | 36 | import itertools |
Scott Todd | d0a0629 | 2020-01-24 14:41:50 -0800 | [diff] [blame] | 37 | import os |
Geoffrey Martin-Noble | 2a36c38 | 2020-01-28 15:04:30 -0800 | [diff] [blame] | 38 | import re |
Geoffrey Martin-Noble | ea9c683 | 2020-02-29 20:26:35 -0800 | [diff] [blame] | 39 | import textwrap |
| 40 | |
| 41 | import bazel_to_cmake_targets |
Scott Todd | d0a0629 | 2020-01-24 14:41:50 -0800 | [diff] [blame] | 42 | |
| 43 | repo_root = None |
| 44 | |
Geoffrey Martin-Noble | 2a36c38 | 2020-01-28 15:04:30 -0800 | [diff] [blame] | 45 | EDIT_BLOCKING_PATTERN = re.compile( |
Geoffrey Martin-Noble | c9784d6 | 2020-02-18 13:49:49 -0800 | [diff] [blame] | 46 | r"bazel[\s_]*to[\s_]*cmake[\s_]*:?[\s_]*do[\s_]*not[\s_]*edit", |
Geoffrey Martin-Noble | 2a36c38 | 2020-01-28 15:04:30 -0800 | [diff] [blame] | 47 | flags=re.IGNORECASE) |
| 48 | |
Scott Todd | d0a0629 | 2020-01-24 14:41:50 -0800 | [diff] [blame] | 49 | |
| 50 | def parse_arguments(): |
| 51 | global repo_root |
| 52 | |
| 53 | parser = argparse.ArgumentParser( |
| 54 | description="Bazel to CMake conversion helper.") |
| 55 | parser.add_argument( |
| 56 | "--preview", |
| 57 | help="Prints results instead of writing files", |
| 58 | action="store_true", |
| 59 | default=False) |
Geoffrey Martin-Noble | f26a05a | 2020-03-06 13:09:25 -0800 | [diff] [blame] | 60 | # TODO(b/149926655): Invert the default to be strict and rename this flag. |
Geoffrey Martin-Noble | f7be55a | 2020-01-28 17:47:42 -0800 | [diff] [blame] | 61 | parser.add_argument( |
| 62 | "--strict", |
| 63 | help="Does not try to generate files where it cannot convert completely", |
| 64 | action="store_true", |
| 65 | default=False) |
Scott Todd | d0a0629 | 2020-01-24 14:41:50 -0800 | [diff] [blame] | 66 | |
| 67 | # Specify only one of these (defaults to --root_dir=iree). |
| 68 | group = parser.add_mutually_exclusive_group() |
| 69 | group.add_argument( |
| 70 | "--dir", |
| 71 | help="Converts the BUILD file in the given directory", |
| 72 | default=None) |
| 73 | group.add_argument( |
| 74 | "--root_dir", |
| 75 | help="Converts all BUILD files under a root directory (defaults to iree/)", |
| 76 | default="iree") |
| 77 | |
| 78 | # TODO(scotttodd): --check option that returns success/failure depending on |
| 79 | # if files match the converted versions |
| 80 | |
| 81 | args = parser.parse_args() |
| 82 | |
| 83 | # --dir takes precedence over --root_dir. |
| 84 | # They are mutually exclusive, but the default value is still set. |
| 85 | if args.dir: |
| 86 | args.root_dir = None |
| 87 | |
| 88 | return args |
| 89 | |
| 90 | |
| 91 | def setup_environment(): |
| 92 | """Sets up some environment globals.""" |
| 93 | global repo_root |
| 94 | |
| 95 | # Determine the repository root (two dir-levels up). |
| 96 | repo_root = os.path.dirname( |
| 97 | os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) |
| 98 | |
| 99 | |
| 100 | class BuildFileFunctions(object): |
| 101 | """Object passed to `exec` that has handlers for BUILD file functions.""" |
| 102 | |
| 103 | def __init__(self, converter): |
| 104 | self.converter = converter |
Geoffrey Martin-Noble | 2b09fce | 2020-02-25 12:03:55 -0800 | [diff] [blame] | 105 | # TODO(gcmn): Do this in a less hard-coded way |
| 106 | self.PLATFORM_VULKAN_DEPS = [] |
| 107 | self.PLATFORM_VULKAN_TEST_DEPS = ["//iree/testing:gtest_main"] |
| 108 | self.FLATBUFFER_SUPPORTS_REFLECTIONS = False |
| 109 | self.PLATFORM_VULKAN_LOADER_COPTS = [] |
Geoffrey Martin-Noble | 1029c89 | 2020-02-27 15:37:08 -0800 | [diff] [blame] | 110 | self.IREE_DRIVER_MODULES = [ |
Geoffrey Martin-Noble | 1029c89 | 2020-02-27 15:37:08 -0800 | [diff] [blame] | 111 | # TODO(b/142004903): enable when Dawn HAL implementation is functional |
| 112 | # "//iree/hal/dawn:dawn_driver_module", |
| 113 | "//iree/hal/vmla:vmla_driver_module", |
| 114 | "//iree/hal/vulkan:vulkan_driver_module", |
| 115 | "//iree/hal/llvmjit:llvmjit_driver_module", |
| 116 | ] |
Scott Todd | d0a0629 | 2020-01-24 14:41:50 -0800 | [diff] [blame] | 117 | |
| 118 | # ------------------------------------------------------------------------- # |
| 119 | # Conversion utilities, written to reduce boilerplate and allow for reuse # |
| 120 | # between similar rule conversions (e.g. cc_library and cc_binary). # |
| 121 | # ------------------------------------------------------------------------- # |
| 122 | |
Geoffrey Martin-Noble | fe8389b | 2020-01-28 15:00:09 -0800 | [diff] [blame] | 123 | def _convert_name_block(self, name): |
Scott Todd | d0a0629 | 2020-01-24 14:41:50 -0800 | [diff] [blame] | 124 | # NAME |
| 125 | # rule_name |
Phoenix Meadowlark | 01bbb6c | 2020-03-30 14:20:11 -0700 | [diff] [blame^] | 126 | return f" NAME\n {name}\n" |
Scott Todd | d0a0629 | 2020-01-24 14:41:50 -0800 | [diff] [blame] | 127 | |
Marius Brehler | 855a419 | 2020-02-20 10:45:52 -0800 | [diff] [blame] | 128 | def _convert_out_block(self, out): |
| 129 | # OUT |
| 130 | # out_name |
Phoenix Meadowlark | 01bbb6c | 2020-03-30 14:20:11 -0700 | [diff] [blame^] | 131 | return f" OUT\n {out}\n" |
Marius Brehler | 855a419 | 2020-02-20 10:45:52 -0800 | [diff] [blame] | 132 | |
Geoffrey Martin-Noble | fe8389b | 2020-01-28 15:00:09 -0800 | [diff] [blame] | 133 | def _convert_cc_namespace_block(self, cc_namespace): |
Scott Todd | d0a0629 | 2020-01-24 14:41:50 -0800 | [diff] [blame] | 134 | # CC_NAMESPACE |
| 135 | # "cc_namespace" |
Geoffrey Martin-Noble | fe8389b | 2020-01-28 15:00:09 -0800 | [diff] [blame] | 136 | if not cc_namespace: |
| 137 | return "" |
Phoenix Meadowlark | 01bbb6c | 2020-03-30 14:20:11 -0700 | [diff] [blame^] | 138 | return f' CC_NAMESPACE\n "{cc_namespace}"\n' |
Scott Todd | d0a0629 | 2020-01-24 14:41:50 -0800 | [diff] [blame] | 139 | |
Geoffrey Martin-Noble | fe8389b | 2020-01-28 15:00:09 -0800 | [diff] [blame] | 140 | def _convert_cpp_namespace_block(self, cpp_namespace): |
Marius Brehler | fa76580 | 2020-01-27 11:53:39 -0800 | [diff] [blame] | 141 | # CPP_NAMESPACE |
| 142 | # "cpp_namespace" |
Phoenix Meadowlark | 01bbb6c | 2020-03-30 14:20:11 -0700 | [diff] [blame^] | 143 | if not cpp_namespace: |
| 144 | return "" |
| 145 | return f' CPP_NAMESPACE\n "{cpp_namespace}"\n' |
Marius Brehler | fa76580 | 2020-01-27 11:53:39 -0800 | [diff] [blame] | 146 | |
Scott Todd | 90b44f7 | 2020-03-03 16:44:14 -0800 | [diff] [blame] | 147 | def _convert_flags_block(self, flags): |
Phoenix Meadowlark | 01bbb6c | 2020-03-30 14:20:11 -0700 | [diff] [blame^] | 148 | flags_list = "\n".join([f' "{flag}"' for flag in flags]) |
| 149 | return f" FLAGS\n{flags_list}\n" |
Scott Todd | d0a0629 | 2020-01-24 14:41:50 -0800 | [diff] [blame] | 150 | |
Geoffrey Martin-Noble | fe8389b | 2020-01-28 15:00:09 -0800 | [diff] [blame] | 151 | def _convert_translate_tool_block(self, translate_tool): |
Ben Vanik | d572ef6 | 2020-03-26 12:15:16 -0700 | [diff] [blame] | 152 | if translate_tool and translate_tool != "//iree/tools:iree-translate": |
Marius Brehler | fa76580 | 2020-01-27 11:53:39 -0800 | [diff] [blame] | 153 | # Bazel `//iree/base` -> CMake `iree::base` |
| 154 | # Bazel `//iree/base:api` -> CMake `iree::base::api` |
Geoffrey Martin-Noble | c9784d6 | 2020-02-18 13:49:49 -0800 | [diff] [blame] | 155 | translate_tool = translate_tool.replace("//iree", "iree") # iree/base:api |
Marius Brehler | fa76580 | 2020-01-27 11:53:39 -0800 | [diff] [blame] | 156 | translate_tool = translate_tool.replace(":", "_") # iree/base::api |
| 157 | translate_tool = translate_tool.replace("/", "_") # iree::base::api |
Phoenix Meadowlark | 01bbb6c | 2020-03-30 14:20:11 -0700 | [diff] [blame^] | 158 | return f" TRANSLATE_TOOL\n {translate_tool}\n" |
Marius Brehler | fa76580 | 2020-01-27 11:53:39 -0800 | [diff] [blame] | 159 | else: |
| 160 | return "" |
| 161 | |
Scott Todd | d0a0629 | 2020-01-24 14:41:50 -0800 | [diff] [blame] | 162 | def _convert_option_block(self, option, option_value): |
| 163 | if option_value: |
| 164 | # Note: this is a truthiness check as well as an existence check, i.e. |
| 165 | # Bazel `testonly = False` will be handled correctly by this condition. |
Phoenix Meadowlark | 01bbb6c | 2020-03-30 14:20:11 -0700 | [diff] [blame^] | 166 | return f" {option}\n" |
Scott Todd | d0a0629 | 2020-01-24 14:41:50 -0800 | [diff] [blame] | 167 | else: |
| 168 | return "" |
| 169 | |
Geoffrey Martin-Noble | fe8389b | 2020-01-28 15:00:09 -0800 | [diff] [blame] | 170 | def _convert_alwayslink_block(self, alwayslink): |
| 171 | return self._convert_option_block("ALWAYSLINK", alwayslink) |
Scott Todd | d0a0629 | 2020-01-24 14:41:50 -0800 | [diff] [blame] | 172 | |
Geoffrey Martin-Noble | fe8389b | 2020-01-28 15:00:09 -0800 | [diff] [blame] | 173 | def _convert_testonly_block(self, testonly): |
| 174 | return self._convert_option_block("TESTONLY", testonly) |
Scott Todd | d0a0629 | 2020-01-24 14:41:50 -0800 | [diff] [blame] | 175 | |
Geoffrey Martin-Noble | fe8389b | 2020-01-28 15:00:09 -0800 | [diff] [blame] | 176 | def _convert_flatten_block(self, flatten): |
| 177 | return self._convert_option_block("FLATTEN", flatten) |
Marius Brehler | fa76580 | 2020-01-27 11:53:39 -0800 | [diff] [blame] | 178 | |
Geoffrey Martin-Noble | fe39a19 | 2020-02-18 10:53:21 -0800 | [diff] [blame] | 179 | def _convert_file_list_block(self, list_name, files): |
Scott Todd | d0a0629 | 2020-01-24 14:41:50 -0800 | [diff] [blame] | 180 | # list_name |
| 181 | # "file_1.h" |
| 182 | # "file_2.h" |
| 183 | # "file_3.h" |
Phoenix Meadowlark | 01bbb6c | 2020-03-30 14:20:11 -0700 | [diff] [blame^] | 184 | if not files: |
| 185 | return "" |
| 186 | files_list = "\n".join([f' "{file}"' for file in files]) |
| 187 | return f" {list_name}\n{files_list}\n" |
Scott Todd | d0a0629 | 2020-01-24 14:41:50 -0800 | [diff] [blame] | 188 | |
Geoffrey Martin-Noble | fe8389b | 2020-01-28 15:00:09 -0800 | [diff] [blame] | 189 | def _convert_hdrs_block(self, hdrs): |
Geoffrey Martin-Noble | fe39a19 | 2020-02-18 10:53:21 -0800 | [diff] [blame] | 190 | return self._convert_file_list_block("HDRS", hdrs) |
Scott Todd | d0a0629 | 2020-01-24 14:41:50 -0800 | [diff] [blame] | 191 | |
Marius Brehler | 2a53ec9 | 2020-01-29 14:48:49 -0800 | [diff] [blame] | 192 | def _convert_textual_hdrs_block(self, textual_hdrs): |
Geoffrey Martin-Noble | fe39a19 | 2020-02-18 10:53:21 -0800 | [diff] [blame] | 193 | return self._convert_file_list_block("TEXTUAL_HDRS", textual_hdrs) |
Marius Brehler | 2a53ec9 | 2020-01-29 14:48:49 -0800 | [diff] [blame] | 194 | |
Geoffrey Martin-Noble | fe8389b | 2020-01-28 15:00:09 -0800 | [diff] [blame] | 195 | def _convert_srcs_block(self, srcs): |
Geoffrey Martin-Noble | fe39a19 | 2020-02-18 10:53:21 -0800 | [diff] [blame] | 196 | return self._convert_file_list_block("SRCS", srcs) |
Scott Todd | d0a0629 | 2020-01-24 14:41:50 -0800 | [diff] [blame] | 197 | |
Geoffrey Martin-Noble | fe8389b | 2020-01-28 15:00:09 -0800 | [diff] [blame] | 198 | def _convert_src_block(self, src): |
Phoenix Meadowlark | 01bbb6c | 2020-03-30 14:20:11 -0700 | [diff] [blame^] | 199 | return f' SRC\n "{src}"\n' |
Scott Todd | d0a0629 | 2020-01-24 14:41:50 -0800 | [diff] [blame] | 200 | |
Geoffrey Martin-Noble | fe8389b | 2020-01-28 15:00:09 -0800 | [diff] [blame] | 201 | def _convert_cc_file_output_block(self, cc_file_output): |
Phoenix Meadowlark | 01bbb6c | 2020-03-30 14:20:11 -0700 | [diff] [blame^] | 202 | return f' CC_FILE_OUTPUT\n "{cc_file_output}"\n' |
Marius Brehler | fa76580 | 2020-01-27 11:53:39 -0800 | [diff] [blame] | 203 | |
Geoffrey Martin-Noble | fe8389b | 2020-01-28 15:00:09 -0800 | [diff] [blame] | 204 | def _convert_h_file_output_block(self, h_file_output): |
Phoenix Meadowlark | 01bbb6c | 2020-03-30 14:20:11 -0700 | [diff] [blame^] | 205 | return f' H_FILE_OUTPUT\n "{h_file_output}"\n' |
Marius Brehler | fa76580 | 2020-01-27 11:53:39 -0800 | [diff] [blame] | 206 | |
Geoffrey Martin-Noble | fe8389b | 2020-01-28 15:00:09 -0800 | [diff] [blame] | 207 | def _convert_td_file_block(self, td_file): |
Marius Brehler | fa76580 | 2020-01-27 11:53:39 -0800 | [diff] [blame] | 208 | if td_file.startswith("//iree"): |
| 209 | # Bazel `//iree/dir/td_file.td` |
| 210 | # -> CMake `${IREE_ROOT_DIR}/iree/dir/td_file.td |
| 211 | # Bazel `//iree/dir/IR:td_file.td` |
| 212 | # -> CMake `${IREE_ROOT_DIR}/iree/dir/IR/td_file.td |
Geoffrey Martin-Noble | c9784d6 | 2020-02-18 13:49:49 -0800 | [diff] [blame] | 213 | td_file = td_file.replace("//iree", "${IREE_ROOT_DIR}/iree") |
Marius Brehler | fa76580 | 2020-01-27 11:53:39 -0800 | [diff] [blame] | 214 | td_file = td_file.replace(":", "/") |
Phoenix Meadowlark | 01bbb6c | 2020-03-30 14:20:11 -0700 | [diff] [blame^] | 215 | return f' TD_FILE\n "{td_file}"\n' |
Marius Brehler | fa76580 | 2020-01-27 11:53:39 -0800 | [diff] [blame] | 216 | |
Geoffrey Martin-Noble | fe8389b | 2020-01-28 15:00:09 -0800 | [diff] [blame] | 217 | def _convert_tbl_outs_block(self, tbl_outs): |
Phoenix Meadowlark | 01bbb6c | 2020-03-30 14:20:11 -0700 | [diff] [blame^] | 218 | outs_list = "\n".join([f" {flag} {value}" for flag, value in tbl_outs]) |
| 219 | return f" OUTS\n{outs_list}\n" |
Marius Brehler | fa76580 | 2020-01-27 11:53:39 -0800 | [diff] [blame] | 220 | |
Geoffrey Martin-Noble | fe8389b | 2020-01-28 15:00:09 -0800 | [diff] [blame] | 221 | def _convert_tblgen_block(self, tblgen): |
Marius Brehler | fa76580 | 2020-01-27 11:53:39 -0800 | [diff] [blame] | 222 | if tblgen.endswith("iree-tblgen"): |
| 223 | return " TBLGEN\n IREE\n" |
| 224 | else: |
| 225 | return "" |
| 226 | |
Scott Todd | d0a0629 | 2020-01-24 14:41:50 -0800 | [diff] [blame] | 227 | def _convert_target(self, target): |
Marius Brehler | 5ae825d | 2020-01-30 11:17:11 -0800 | [diff] [blame] | 228 | if target.startswith(":") and target.endswith(("_gen", "Gen")): |
| 229 | # Files created by gentbl have to be included as source and header files |
| 230 | # and not as a dependency. Adding these targets to the dependencies list, |
| 231 | # results in linkage failures if the library including the gentbl dep is |
| 232 | # marked as ALWAYSLINK. |
| 233 | # This drops deps in the local namespace ending with '_gen' and 'Gen' |
Marius Brehler | 19c069d | 2020-01-31 16:22:29 -0800 | [diff] [blame] | 234 | target = [""] |
Marius Brehler | 5ae825d | 2020-01-30 11:17:11 -0800 | [diff] [blame] | 235 | elif not target.startswith(("//iree", ":")): |
Scott Todd | d0a0629 | 2020-01-24 14:41:50 -0800 | [diff] [blame] | 236 | # External target, call helper method for special case handling. |
| 237 | target = bazel_to_cmake_targets.convert_external_target(target) |
| 238 | else: |
Marius Brehler | 5ae825d | 2020-01-30 11:17:11 -0800 | [diff] [blame] | 239 | # Bazel `:api` -> CMake `::api` |
Scott Todd | d0a0629 | 2020-01-24 14:41:50 -0800 | [diff] [blame] | 240 | # Bazel `//iree/base` -> CMake `iree::base` |
| 241 | # Bazel `//iree/base:api` -> CMake `iree::base::api` |
Geoffrey Martin-Noble | c9784d6 | 2020-02-18 13:49:49 -0800 | [diff] [blame] | 242 | target = target.replace("//iree", "iree") # iree/base:api |
Marius Brehler | 5ae825d | 2020-01-30 11:17:11 -0800 | [diff] [blame] | 243 | target = target.replace(":", "::") # iree/base::api or ::api |
Scott Todd | d0a0629 | 2020-01-24 14:41:50 -0800 | [diff] [blame] | 244 | target = target.replace("/", "::") # iree::base::api |
Marius Brehler | 19c069d | 2020-01-31 16:22:29 -0800 | [diff] [blame] | 245 | target = [target] |
Scott Todd | d0a0629 | 2020-01-24 14:41:50 -0800 | [diff] [blame] | 246 | return target |
| 247 | |
Geoffrey Martin-Noble | fe39a19 | 2020-02-18 10:53:21 -0800 | [diff] [blame] | 248 | def _convert_target_list_block(self, list_name, targets): |
| 249 | if not targets: |
Scott Todd | d0a0629 | 2020-01-24 14:41:50 -0800 | [diff] [blame] | 250 | return "" |
| 251 | |
| 252 | # DEPS |
| 253 | # package1::target1 |
| 254 | # package1::target2 |
| 255 | # package2::target |
Geoffrey Martin-Noble | fe39a19 | 2020-02-18 10:53:21 -0800 | [diff] [blame] | 256 | targets = [self._convert_target(t) for t in targets] |
Marius Brehler | 19c069d | 2020-01-31 16:22:29 -0800 | [diff] [blame] | 257 | # Flatten lists |
Geoffrey Martin-Noble | ea9c683 | 2020-02-29 20:26:35 -0800 | [diff] [blame] | 258 | targets = list(itertools.chain.from_iterable(targets)) |
Geoffrey Martin-Noble | ff6c6d6 | 2020-02-18 11:22:43 -0800 | [diff] [blame] | 259 | # Remove duplicates |
| 260 | targets = set(targets) |
| 261 | # Remove Falsey (None and empty string) values |
| 262 | targets = filter(None, targets) |
| 263 | # Sort the targets and convert to a list |
| 264 | targets = sorted(targets) |
Phoenix Meadowlark | 01bbb6c | 2020-03-30 14:20:11 -0700 | [diff] [blame^] | 265 | target_list_string = "\n".join([f" {target}" for target in targets]) |
| 266 | return f" {list_name}\n{target_list_string}\n" |
Geoffrey Martin-Noble | fe39a19 | 2020-02-18 10:53:21 -0800 | [diff] [blame] | 267 | |
| 268 | def _convert_data_block(self, data): |
| 269 | return self._convert_target_list_block("DATA", data) |
| 270 | |
| 271 | def _convert_deps_block(self, deps): |
| 272 | return self._convert_target_list_block("DEPS", deps) |
Scott Todd | d0a0629 | 2020-01-24 14:41:50 -0800 | [diff] [blame] | 273 | |
Marius Brehler | 4242b73 | 2020-02-10 19:05:48 -0800 | [diff] [blame] | 274 | def _convert_flatc_args_block(self, flatc_args): |
| 275 | if not flatc_args: |
| 276 | return "" |
Phoenix Meadowlark | 01bbb6c | 2020-03-30 14:20:11 -0700 | [diff] [blame^] | 277 | flatc_args = "\n".join([f' "{flatc_arg}"' for flatc_arg in flatc_args]) |
| 278 | return f" FLATC_ARGS\n{flatc_args}\n" |
Marius Brehler | 4242b73 | 2020-02-10 19:05:48 -0800 | [diff] [blame] | 279 | |
Geoffrey Martin-Noble | d6b31c0 | 2020-02-04 17:22:16 -0800 | [diff] [blame] | 280 | def _convert_unimplemented_function(self, function, details=""): |
Phoenix Meadowlark | 01bbb6c | 2020-03-30 14:20:11 -0700 | [diff] [blame^] | 281 | message = f"Unimplemented {function}: {details}" |
Geoffrey Martin-Noble | f7be55a | 2020-01-28 17:47:42 -0800 | [diff] [blame] | 282 | if not self.converter.first_error: |
| 283 | self.converter.first_error = NotImplementedError(message) |
Geoffrey Martin-Noble | f26a05a | 2020-03-06 13:09:25 -0800 | [diff] [blame] | 284 | # Avoid submitting the raw results from non-strict runs. These are still |
| 285 | # useful but are generally not safe to submit as-is. An upstream check |
| 286 | # prevents changes with this phrase from being submitted. |
| 287 | # Written as separate literals to avoid the check triggering here. |
| 288 | submit_blocker = "DO" + " NOT" + " SUBMIT." |
Phoenix Meadowlark | 01bbb6c | 2020-03-30 14:20:11 -0700 | [diff] [blame^] | 289 | self.converter.body += f"# {submit_blocker} {message}\n" |
Scott Todd | d0a0629 | 2020-01-24 14:41:50 -0800 | [diff] [blame] | 290 | |
| 291 | # ------------------------------------------------------------------------- # |
| 292 | # Function handlers that convert BUILD definitions to CMake definitions. # |
| 293 | # # |
| 294 | # Names and signatures must match 1:1 with those expected in BUILD files. # |
| 295 | # Each function that may be found in a BUILD file must be listed here. # |
| 296 | # ------------------------------------------------------------------------- # |
| 297 | |
| 298 | def load(self, *args): |
Geoffrey Martin-Noble | fe8389b | 2020-01-28 15:00:09 -0800 | [diff] [blame] | 299 | # No mapping to CMake, ignore. |
Scott Todd | d0a0629 | 2020-01-24 14:41:50 -0800 | [diff] [blame] | 300 | pass |
| 301 | |
| 302 | def package(self, **kwargs): |
| 303 | # No mapping to CMake, ignore. |
| 304 | pass |
| 305 | |
| 306 | def iree_build_test(self, **kwargs): |
| 307 | pass |
| 308 | |
Geoffrey Martin-Noble | d6b31c0 | 2020-02-04 17:22:16 -0800 | [diff] [blame] | 309 | def filegroup(self, name, **kwargs): |
Scott Todd | d0a0629 | 2020-01-24 14:41:50 -0800 | [diff] [blame] | 310 | # Not implemented yet. Might be a no-op, or may want to evaluate the srcs |
| 311 | # attribute and pass them along to any targets that depend on the filegroup. |
| 312 | # Cross-package dependencies and complicated globs could be hard to handle. |
Geoffrey Martin-Noble | faa30be | 2020-02-25 16:37:59 -0800 | [diff] [blame] | 313 | |
Geoffrey Martin-Noble | ea9c683 | 2020-02-29 20:26:35 -0800 | [diff] [blame] | 314 | # We have a bunch of filegroups that just contain TD files. CMake doesn't |
| 315 | # model this at all, so we'll just hardcode this special case. |
Geoffrey Martin-Noble | faa30be | 2020-02-25 16:37:59 -0800 | [diff] [blame] | 316 | # TODO(gcmn): Handle this robustly |
Geoffrey Martin-Noble | ea9c683 | 2020-02-29 20:26:35 -0800 | [diff] [blame] | 317 | if name == "td_files": |
Geoffrey Martin-Noble | faa30be | 2020-02-25 16:37:59 -0800 | [diff] [blame] | 318 | return |
| 319 | |
Geoffrey Martin-Noble | d6b31c0 | 2020-02-04 17:22:16 -0800 | [diff] [blame] | 320 | self._convert_unimplemented_function("filegroup", name) |
Scott Todd | d0a0629 | 2020-01-24 14:41:50 -0800 | [diff] [blame] | 321 | |
Geoffrey Martin-Noble | 2b09fce | 2020-02-25 12:03:55 -0800 | [diff] [blame] | 322 | def sh_binary(self, name, **kwargs): |
| 323 | self._convert_unimplemented_function("sh_binary", name) |
| 324 | |
Scott Todd | d0a0629 | 2020-01-24 14:41:50 -0800 | [diff] [blame] | 325 | def exports_files(self, *args, **kwargs): |
Geoffrey Martin-Noble | fe8389b | 2020-01-28 15:00:09 -0800 | [diff] [blame] | 326 | # No mapping to CMake, ignore. |
Scott Todd | d0a0629 | 2020-01-24 14:41:50 -0800 | [diff] [blame] | 327 | pass |
| 328 | |
Geoffrey Martin-Noble | ea9c683 | 2020-02-29 20:26:35 -0800 | [diff] [blame] | 329 | def glob(self, include, exclude=None, exclude_directories=1): |
Geoffrey Martin-Noble | 252cdbb | 2020-01-28 10:26:25 -0800 | [diff] [blame] | 330 | if exclude_directories != 1: |
Geoffrey Martin-Noble | d6b31c0 | 2020-02-04 17:22:16 -0800 | [diff] [blame] | 331 | self._convert_unimplemented_function("glob", "with exclude_directories") |
Geoffrey Martin-Noble | 632d04a | 2020-03-16 07:53:05 -0700 | [diff] [blame] | 332 | if exclude: |
| 333 | self._convert_unimplemented_function("glob", "with exclude") |
Geoffrey Martin-Noble | 252cdbb | 2020-01-28 10:26:25 -0800 | [diff] [blame] | 334 | |
Geoffrey Martin-Noble | d6b31c0 | 2020-02-04 17:22:16 -0800 | [diff] [blame] | 335 | glob_vars = [] |
Geoffrey Martin-Noble | 252cdbb | 2020-01-28 10:26:25 -0800 | [diff] [blame] | 336 | for pattern in include: |
| 337 | if "**" in pattern: |
Geoffrey Martin-Noble | ea9c683 | 2020-02-29 20:26:35 -0800 | [diff] [blame] | 338 | # bazel's glob has some specific restrictions about crossing package |
| 339 | # boundaries. We have no uses of recursive globs. Rather than try to |
| 340 | # emulate them or silently give different behavior, just error out. |
Geoffrey Martin-Noble | 252cdbb | 2020-01-28 10:26:25 -0800 | [diff] [blame] | 341 | # See https://docs.bazel.build/versions/master/be/functions.html#glob |
Geoffrey Martin-Noble | f7be55a | 2020-01-28 17:47:42 -0800 | [diff] [blame] | 342 | raise NotImplementedError("Recursive globs not supported") |
Geoffrey Martin-Noble | d6b31c0 | 2020-02-04 17:22:16 -0800 | [diff] [blame] | 343 | # Bazel `*.mlir` glob -> CMake Variable `_GLOB_X_MLIR` |
Phoenix Meadowlark | 01bbb6c | 2020-03-30 14:20:11 -0700 | [diff] [blame^] | 344 | var = "_GLOB_" + pattern.replace("*", "X").replace(".", "_").upper() |
| 345 | glob_vars.append(f"${{{var}}}") # {{ / }} are the escapes for { / } |
| 346 | self.converter.body += f"file(GLOB {var} CONFIGURE_DEPENDS {pattern})\n" |
Geoffrey Martin-Noble | d6b31c0 | 2020-02-04 17:22:16 -0800 | [diff] [blame] | 347 | return glob_vars |
Scott Todd | d0a0629 | 2020-01-24 14:41:50 -0800 | [diff] [blame] | 348 | |
Geoffrey Martin-Noble | 2b09fce | 2020-02-25 12:03:55 -0800 | [diff] [blame] | 349 | # TODO(gcmn) implement these types of functions in a less hard-coded way |
| 350 | def platform_trampoline_deps(self, basename, path="base"): |
Phoenix Meadowlark | 01bbb6c | 2020-03-30 14:20:11 -0700 | [diff] [blame^] | 351 | return [f"//iree/{path}/internal:{basename}_internal"] |
Geoffrey Martin-Noble | 2b09fce | 2020-02-25 12:03:55 -0800 | [diff] [blame] | 352 | |
| 353 | def select(self, d): |
| 354 | self._convert_unimplemented_function("select", str(d)) |
| 355 | return d["//conditions:default"] |
| 356 | |
Scott Todd | d0a0629 | 2020-01-24 14:41:50 -0800 | [diff] [blame] | 357 | def config_setting(self, **kwargs): |
| 358 | # No mapping to CMake, ignore. |
| 359 | pass |
| 360 | |
Geoffrey Martin-Noble | fe8389b | 2020-01-28 15:00:09 -0800 | [diff] [blame] | 361 | def cc_library(self, |
| 362 | name, |
Geoffrey Martin-Noble | ea9c683 | 2020-02-29 20:26:35 -0800 | [diff] [blame] | 363 | hdrs=None, |
| 364 | textual_hdrs=None, |
| 365 | srcs=None, |
Scott Todd | 633148d | 2020-03-09 10:53:56 -0700 | [diff] [blame] | 366 | data=None, |
Geoffrey Martin-Noble | ea9c683 | 2020-02-29 20:26:35 -0800 | [diff] [blame] | 367 | deps=None, |
Geoffrey Martin-Noble | fe8389b | 2020-01-28 15:00:09 -0800 | [diff] [blame] | 368 | alwayslink=False, |
| 369 | testonly=False, |
Geoffrey Martin-Noble | b8cbe34 | 2020-03-02 11:28:35 -0800 | [diff] [blame] | 370 | linkopts=None, |
Geoffrey Martin-Noble | fe8389b | 2020-01-28 15:00:09 -0800 | [diff] [blame] | 371 | **kwargs): |
Geoffrey Martin-Noble | b8cbe34 | 2020-03-02 11:28:35 -0800 | [diff] [blame] | 372 | if linkopts: |
| 373 | self._convert_unimplemented_function("linkopts") |
Geoffrey Martin-Noble | fe8389b | 2020-01-28 15:00:09 -0800 | [diff] [blame] | 374 | name_block = self._convert_name_block(name) |
| 375 | hdrs_block = self._convert_hdrs_block(hdrs) |
Marius Brehler | 2a53ec9 | 2020-01-29 14:48:49 -0800 | [diff] [blame] | 376 | textual_hdrs_block = self._convert_textual_hdrs_block(textual_hdrs) |
Geoffrey Martin-Noble | fe8389b | 2020-01-28 15:00:09 -0800 | [diff] [blame] | 377 | srcs_block = self._convert_srcs_block(srcs) |
Scott Todd | 633148d | 2020-03-09 10:53:56 -0700 | [diff] [blame] | 378 | data_block = self._convert_data_block(data) |
Geoffrey Martin-Noble | fe8389b | 2020-01-28 15:00:09 -0800 | [diff] [blame] | 379 | deps_block = self._convert_deps_block(deps) |
| 380 | alwayslink_block = self._convert_alwayslink_block(alwayslink) |
| 381 | testonly_block = self._convert_testonly_block(testonly) |
Scott Todd | d0a0629 | 2020-01-24 14:41:50 -0800 | [diff] [blame] | 382 | |
Phoenix Meadowlark | 01bbb6c | 2020-03-30 14:20:11 -0700 | [diff] [blame^] | 383 | self.converter.body += (f"iree_cc_library(\n" |
| 384 | f"{name_block}" |
| 385 | f"{hdrs_block}" |
| 386 | f"{textual_hdrs_block}" |
| 387 | f"{srcs_block}" |
| 388 | f"{data_block}" |
| 389 | f"{deps_block}" |
| 390 | f"{alwayslink_block}" |
| 391 | f"{testonly_block}" |
| 392 | f" PUBLIC\n)\n\n") |
Scott Todd | d0a0629 | 2020-01-24 14:41:50 -0800 | [diff] [blame] | 393 | |
Scott Todd | 633148d | 2020-03-09 10:53:56 -0700 | [diff] [blame] | 394 | def cc_test(self, name, hdrs=None, srcs=None, data=None, deps=None, **kwargs): |
Geoffrey Martin-Noble | fe8389b | 2020-01-28 15:00:09 -0800 | [diff] [blame] | 395 | name_block = self._convert_name_block(name) |
| 396 | hdrs_block = self._convert_hdrs_block(hdrs) |
| 397 | srcs_block = self._convert_srcs_block(srcs) |
Scott Todd | 633148d | 2020-03-09 10:53:56 -0700 | [diff] [blame] | 398 | data_block = self._convert_data_block(data) |
Geoffrey Martin-Noble | fe8389b | 2020-01-28 15:00:09 -0800 | [diff] [blame] | 399 | deps_block = self._convert_deps_block(deps) |
Scott Todd | d0a0629 | 2020-01-24 14:41:50 -0800 | [diff] [blame] | 400 | |
Phoenix Meadowlark | 01bbb6c | 2020-03-30 14:20:11 -0700 | [diff] [blame^] | 401 | self.converter.body += (f"iree_cc_test(\n" |
| 402 | f"{name_block}" |
| 403 | f"{hdrs_block}" |
| 404 | f"{srcs_block}" |
| 405 | f"{data_block}" |
| 406 | f"{deps_block}" |
| 407 | f")\n\n") |
Scott Todd | d0a0629 | 2020-01-24 14:41:50 -0800 | [diff] [blame] | 408 | |
Geoffrey Martin-Noble | de99442 | 2020-03-04 11:25:22 -0800 | [diff] [blame] | 409 | def cc_binary(self, |
| 410 | name, |
| 411 | srcs=None, |
Scott Todd | 633148d | 2020-03-09 10:53:56 -0700 | [diff] [blame] | 412 | data=None, |
Geoffrey Martin-Noble | de99442 | 2020-03-04 11:25:22 -0800 | [diff] [blame] | 413 | deps=None, |
| 414 | linkopts=None, |
| 415 | testonly=False, |
| 416 | **kwargs): |
Geoffrey Martin-Noble | b8cbe34 | 2020-03-02 11:28:35 -0800 | [diff] [blame] | 417 | if linkopts: |
| 418 | self._convert_unimplemented_function("linkopts") |
Geoffrey Martin-Noble | fe8389b | 2020-01-28 15:00:09 -0800 | [diff] [blame] | 419 | name_block = self._convert_name_block(name) |
Marius Brehler | 855a419 | 2020-02-20 10:45:52 -0800 | [diff] [blame] | 420 | out_block = self._convert_out_block(name) |
Geoffrey Martin-Noble | fe8389b | 2020-01-28 15:00:09 -0800 | [diff] [blame] | 421 | srcs_block = self._convert_srcs_block(srcs) |
Scott Todd | 633148d | 2020-03-09 10:53:56 -0700 | [diff] [blame] | 422 | data_block = self._convert_data_block(data) |
Geoffrey Martin-Noble | fe8389b | 2020-01-28 15:00:09 -0800 | [diff] [blame] | 423 | deps_block = self._convert_deps_block(deps) |
Geoffrey Martin-Noble | de99442 | 2020-03-04 11:25:22 -0800 | [diff] [blame] | 424 | testonly_block = self._convert_testonly_block(testonly) |
Scott Todd | d0a0629 | 2020-01-24 14:41:50 -0800 | [diff] [blame] | 425 | |
Phoenix Meadowlark | 01bbb6c | 2020-03-30 14:20:11 -0700 | [diff] [blame^] | 426 | self.converter.body += (f"iree_cc_binary(\n" |
| 427 | f"{name_block}" |
| 428 | f"{out_block}" |
| 429 | f"{srcs_block}" |
| 430 | f"{data_block}" |
| 431 | f"{deps_block}" |
| 432 | f"{testonly_block}" |
| 433 | f")\n\n") |
Scott Todd | d0a0629 | 2020-01-24 14:41:50 -0800 | [diff] [blame] | 434 | |
Geoffrey Martin-Noble | fe8389b | 2020-01-28 15:00:09 -0800 | [diff] [blame] | 435 | def cc_embed_data(self, |
| 436 | name, |
| 437 | srcs, |
| 438 | cc_file_output, |
| 439 | h_file_output, |
| 440 | cpp_namespace=None, |
| 441 | strip_prefix=None, |
| 442 | flatten=False, |
| 443 | identifier=None, |
| 444 | **kwargs): |
| 445 | if identifier: |
Geoffrey Martin-Noble | d6b31c0 | 2020-02-04 17:22:16 -0800 | [diff] [blame] | 446 | self._convert_unimplemented_function("cc_embed_data", |
| 447 | name + " has identifier") |
Geoffrey Martin-Noble | fe8389b | 2020-01-28 15:00:09 -0800 | [diff] [blame] | 448 | name_block = self._convert_name_block(name) |
| 449 | srcs_block = self._convert_srcs_block(srcs) |
| 450 | cc_file_output_block = self._convert_cc_file_output_block(cc_file_output) |
| 451 | h_file_output_block = self._convert_h_file_output_block(h_file_output) |
| 452 | namespace_block = self._convert_cpp_namespace_block(cpp_namespace) |
| 453 | flatten_block = self._convert_flatten_block(flatten) |
Marius Brehler | fa76580 | 2020-01-27 11:53:39 -0800 | [diff] [blame] | 454 | |
Phoenix Meadowlark | 01bbb6c | 2020-03-30 14:20:11 -0700 | [diff] [blame^] | 455 | self.converter.body += (f"iree_cc_embed_data(\n" |
| 456 | f"{name_block}" |
| 457 | f"{srcs_block}" |
| 458 | f"{cc_file_output_block}" |
| 459 | f"{h_file_output_block}" |
| 460 | f"{namespace_block}" |
| 461 | f"{flatten_block}" |
| 462 | f" PUBLIC\n)\n\n") |
Marius Brehler | fa76580 | 2020-01-27 11:53:39 -0800 | [diff] [blame] | 463 | |
Geoffrey Martin-Noble | fe8389b | 2020-01-28 15:00:09 -0800 | [diff] [blame] | 464 | def spirv_kernel_cc_library(self, name, srcs): |
| 465 | name_block = self._convert_name_block(name) |
| 466 | srcs_block = self._convert_srcs_block(srcs) |
Scott Todd | d0a0629 | 2020-01-24 14:41:50 -0800 | [diff] [blame] | 467 | |
Phoenix Meadowlark | 01bbb6c | 2020-03-30 14:20:11 -0700 | [diff] [blame^] | 468 | self.converter.body += (f"iree_spirv_kernel_cc_library(\n" |
| 469 | f"{name_block}" |
| 470 | f"{srcs_block}" |
| 471 | f")\n\n") |
Scott Todd | d0a0629 | 2020-01-24 14:41:50 -0800 | [diff] [blame] | 472 | |
Geoffrey Martin-Noble | fe8389b | 2020-01-28 15:00:09 -0800 | [diff] [blame] | 473 | def iree_bytecode_module(self, |
| 474 | name, |
| 475 | src, |
Scott Todd | 90b44f7 | 2020-03-03 16:44:14 -0800 | [diff] [blame] | 476 | flags=["-iree-mlir-to-vm-bytecode-module"], |
Geoffrey Martin-Noble | fe8389b | 2020-01-28 15:00:09 -0800 | [diff] [blame] | 477 | translate_tool="//iree/tools:iree-translate", |
| 478 | cc_namespace=None): |
| 479 | name_block = self._convert_name_block(name) |
| 480 | src_block = self._convert_src_block(src) |
| 481 | namespace_block = self._convert_cc_namespace_block(cc_namespace) |
| 482 | translate_tool_block = self._convert_translate_tool_block(translate_tool) |
Scott Todd | 90b44f7 | 2020-03-03 16:44:14 -0800 | [diff] [blame] | 483 | flags_block = self._convert_flags_block(flags) |
Scott Todd | d0a0629 | 2020-01-24 14:41:50 -0800 | [diff] [blame] | 484 | |
Phoenix Meadowlark | 01bbb6c | 2020-03-30 14:20:11 -0700 | [diff] [blame^] | 485 | self.converter.body += (f"iree_bytecode_module(\n" |
| 486 | f"{name_block}" |
| 487 | f"{src_block}" |
| 488 | f"{namespace_block}" |
| 489 | f"{translate_tool_block}" |
| 490 | f"{flags_block}" |
| 491 | f" PUBLIC\n)\n\n") |
Scott Todd | d0a0629 | 2020-01-24 14:41:50 -0800 | [diff] [blame] | 492 | |
Geoffrey Martin-Noble | ea9c683 | 2020-02-29 20:26:35 -0800 | [diff] [blame] | 493 | def iree_flatbuffer_cc_library(self, name, srcs, flatc_args=None): |
Marius Brehler | 4242b73 | 2020-02-10 19:05:48 -0800 | [diff] [blame] | 494 | name_block = self._convert_name_block(name) |
| 495 | srcs_block = self._convert_srcs_block(srcs) |
| 496 | flatc_args_block = self._convert_flatc_args_block(flatc_args) |
| 497 | |
Phoenix Meadowlark | 01bbb6c | 2020-03-30 14:20:11 -0700 | [diff] [blame^] | 498 | self.converter.body += (f"flatbuffer_cc_library(\n" |
| 499 | f"{name_block}" |
| 500 | f"{srcs_block}" |
| 501 | f"{flatc_args_block}" |
| 502 | f" PUBLIC\n)\n\n") |
Marius Brehler | 4242b73 | 2020-02-10 19:05:48 -0800 | [diff] [blame] | 503 | |
Geoffrey Martin-Noble | fe8389b | 2020-01-28 15:00:09 -0800 | [diff] [blame] | 504 | def gentbl(self, |
| 505 | name, |
| 506 | tblgen, |
| 507 | td_file, |
| 508 | tbl_outs, |
Geoffrey Martin-Noble | ea9c683 | 2020-02-29 20:26:35 -0800 | [diff] [blame] | 509 | td_srcs=None, |
| 510 | td_includes=None, |
Geoffrey Martin-Noble | fe8389b | 2020-01-28 15:00:09 -0800 | [diff] [blame] | 511 | strip_include_prefix=None, |
| 512 | test=False): |
| 513 | name_block = self._convert_name_block(name) |
| 514 | tblgen_block = self._convert_tblgen_block(tblgen) |
| 515 | td_file_block = self._convert_td_file_block(td_file) |
| 516 | outs_block = self._convert_tbl_outs_block(tbl_outs) |
Scott Todd | d0a0629 | 2020-01-24 14:41:50 -0800 | [diff] [blame] | 517 | |
Phoenix Meadowlark | 01bbb6c | 2020-03-30 14:20:11 -0700 | [diff] [blame^] | 518 | self.converter.body += (f"iree_tablegen_library(\n" |
| 519 | f"{name_block}" |
| 520 | f"{td_file_block}" |
| 521 | f"{outs_block}" |
| 522 | f"{tblgen_block}" |
| 523 | f")\n\n") |
Scott Todd | d0a0629 | 2020-01-24 14:41:50 -0800 | [diff] [blame] | 524 | |
Lei Zhang | 22f0e24 | 2020-03-30 12:09:20 -0700 | [diff] [blame] | 525 | def iree_tablegen_doc(self, |
| 526 | name, |
| 527 | tblgen, |
| 528 | td_file, |
| 529 | tbl_outs, |
| 530 | td_srcs=None, |
| 531 | td_includes=None, |
| 532 | strip_include_prefix=None): |
| 533 | name_block = self._convert_name_block(name) |
| 534 | tblgen_block = self._convert_tblgen_block(tblgen) |
| 535 | td_file_block = self._convert_td_file_block(td_file) |
| 536 | outs_block = self._convert_tbl_outs_block(tbl_outs) |
| 537 | |
Phoenix Meadowlark | 01bbb6c | 2020-03-30 14:20:11 -0700 | [diff] [blame^] | 538 | self.converter.body += (f"iree_tablegen_doc(\n" |
| 539 | f"{name_block}" |
| 540 | f"{td_file_block}" |
| 541 | f"{outs_block}" |
| 542 | f"{tblgen_block}" |
| 543 | f")\n\n") |
Lei Zhang | 22f0e24 | 2020-03-30 12:09:20 -0700 | [diff] [blame] | 544 | |
Geoffrey Martin-Noble | fe8389b | 2020-01-28 15:00:09 -0800 | [diff] [blame] | 545 | def iree_lit_test_suite(self, name, srcs, data, **kwargs): |
| 546 | name_block = self._convert_name_block(name) |
| 547 | srcs_block = self._convert_srcs_block(srcs) |
| 548 | data_block = self._convert_data_block(data) |
Geoffrey Martin-Noble | 252cdbb | 2020-01-28 10:26:25 -0800 | [diff] [blame] | 549 | |
Phoenix Meadowlark | 01bbb6c | 2020-03-30 14:20:11 -0700 | [diff] [blame^] | 550 | self.converter.body += (f"iree_lit_test_suite(\n" |
| 551 | f"{name_block}" |
| 552 | f"{srcs_block}" |
| 553 | f"{data_block}" |
| 554 | f")\n\n") |
Geoffrey Martin-Noble | 252cdbb | 2020-01-28 10:26:25 -0800 | [diff] [blame] | 555 | |
Scott Todd | d0a0629 | 2020-01-24 14:41:50 -0800 | [diff] [blame] | 556 | |
| 557 | class Converter(object): |
| 558 | """Conversion state tracking and full file template substitution.""" |
| 559 | |
| 560 | def __init__(self, directory_path, rel_build_file_path): |
| 561 | self.body = "" |
| 562 | self.directory_path = directory_path |
| 563 | self.rel_build_file_path = rel_build_file_path |
Geoffrey Martin-Noble | f7be55a | 2020-01-28 17:47:42 -0800 | [diff] [blame] | 564 | self.first_error = None |
Scott Todd | d0a0629 | 2020-01-24 14:41:50 -0800 | [diff] [blame] | 565 | |
Geoffrey Martin-Noble | 2a36c38 | 2020-01-28 15:04:30 -0800 | [diff] [blame] | 566 | def convert(self, copyright_line): |
Phoenix Meadowlark | 01bbb6c | 2020-03-30 14:20:11 -0700 | [diff] [blame^] | 567 | converted_file = (f"{copyright_line}\n" |
| 568 | f"{self.apache_license}\n\n" |
| 569 | f"iree_add_all_subdirs()\n\n" |
| 570 | f"{self.body}") |
Scott Todd | d0a0629 | 2020-01-24 14:41:50 -0800 | [diff] [blame] | 571 | |
| 572 | # Cleanup newline characters. This is more convenient than ensuring all |
| 573 | # conversions are careful with where they insert newlines. |
| 574 | converted_file = converted_file.replace("\n\n\n", "\n") |
| 575 | converted_file = converted_file.rstrip() + "\n" |
| 576 | |
| 577 | return converted_file |
| 578 | |
Phoenix Meadowlark | 01bbb6c | 2020-03-30 14:20:11 -0700 | [diff] [blame^] | 579 | apache_license = textwrap.dedent("""\ |
Scott Todd | d0a0629 | 2020-01-24 14:41:50 -0800 | [diff] [blame] | 580 | # |
| 581 | # Licensed under the Apache License, Version 2.0 (the "License"); |
| 582 | # you may not use this file except in compliance with the License. |
| 583 | # You may obtain a copy of the License at |
| 584 | # |
| 585 | # https://www.apache.org/licenses/LICENSE-2.0 |
| 586 | # |
| 587 | # Unless required by applicable law or agreed to in writing, software |
| 588 | # distributed under the License is distributed on an "AS IS" BASIS, |
| 589 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 590 | # See the License for the specific language governing permissions and |
Phoenix Meadowlark | 01bbb6c | 2020-03-30 14:20:11 -0700 | [diff] [blame^] | 591 | # limitations under the License.""") |
Scott Todd | d0a0629 | 2020-01-24 14:41:50 -0800 | [diff] [blame] | 592 | |
| 593 | |
| 594 | def GetDict(obj): |
| 595 | ret = {} |
| 596 | for k in dir(obj): |
| 597 | if not k.startswith("_"): |
| 598 | ret[k] = getattr(obj, k) |
| 599 | return ret |
| 600 | |
| 601 | |
Geoffrey Martin-Noble | f7be55a | 2020-01-28 17:47:42 -0800 | [diff] [blame] | 602 | def convert_directory_tree(root_directory_path, write_files, strict): |
Phoenix Meadowlark | 01bbb6c | 2020-03-30 14:20:11 -0700 | [diff] [blame^] | 603 | print(f"convert_directory_tree: {root_directory_path}") |
Geoffrey Martin-Noble | 1b4ac81 | 2020-03-09 11:21:03 -0700 | [diff] [blame] | 604 | for root, _, _ in os.walk(root_directory_path): |
Geoffrey Martin-Noble | f7be55a | 2020-01-28 17:47:42 -0800 | [diff] [blame] | 605 | convert_directory(root, write_files, strict) |
Scott Todd | d0a0629 | 2020-01-24 14:41:50 -0800 | [diff] [blame] | 606 | |
| 607 | |
Geoffrey Martin-Noble | f7be55a | 2020-01-28 17:47:42 -0800 | [diff] [blame] | 608 | def convert_directory(directory_path, write_files, strict): |
Scott Todd | d0a0629 | 2020-01-24 14:41:50 -0800 | [diff] [blame] | 609 | if not os.path.isdir(directory_path): |
Phoenix Meadowlark | 01bbb6c | 2020-03-30 14:20:11 -0700 | [diff] [blame^] | 610 | raise FileNotFoundError(f"Cannot find directory '{directory_path}'") |
Scott Todd | d0a0629 | 2020-01-24 14:41:50 -0800 | [diff] [blame] | 611 | |
| 612 | build_file_path = os.path.join(directory_path, "BUILD") |
| 613 | cmakelists_file_path = os.path.join(directory_path, "CMakeLists.txt") |
| 614 | |
| 615 | if not os.path.isfile(build_file_path): |
| 616 | # No Bazel BUILD file in this directory to convert, skip. |
| 617 | return |
| 618 | |
| 619 | global repo_root |
| 620 | rel_build_file_path = os.path.relpath(build_file_path, repo_root) |
| 621 | rel_cmakelists_file_path = os.path.relpath(cmakelists_file_path, repo_root) |
Phoenix Meadowlark | 01bbb6c | 2020-03-30 14:20:11 -0700 | [diff] [blame^] | 622 | print(f"Converting {rel_build_file_path} to {rel_cmakelists_file_path}") |
Scott Todd | d0a0629 | 2020-01-24 14:41:50 -0800 | [diff] [blame] | 623 | |
Geoffrey Martin-Noble | 2a36c38 | 2020-01-28 15:04:30 -0800 | [diff] [blame] | 624 | cmake_file_exists = os.path.isfile(cmakelists_file_path) |
Phoenix Meadowlark | 01bbb6c | 2020-03-30 14:20:11 -0700 | [diff] [blame^] | 625 | copyright_line = f"# Copyright {datetime.date.today().year} Google LLC" |
Geoffrey Martin-Noble | 2a36c38 | 2020-01-28 15:04:30 -0800 | [diff] [blame] | 626 | write_allowed = write_files |
| 627 | if cmake_file_exists: |
| 628 | with open(cmakelists_file_path) as f: |
| 629 | for i, line in enumerate(f): |
| 630 | if line.startswith("# Copyright"): |
| 631 | copyright_line = line.rstrip() |
| 632 | if EDIT_BLOCKING_PATTERN.search(line): |
Phoenix Meadowlark | 01bbb6c | 2020-03-30 14:20:11 -0700 | [diff] [blame^] | 633 | print(f" {rel_cmakelists_file_path} already exists, and " |
| 634 | f"line {i + 1}: '{line.strip()}' prevents edits. " |
| 635 | "Falling back to preview") |
Geoffrey Martin-Noble | 2a36c38 | 2020-01-28 15:04:30 -0800 | [diff] [blame] | 636 | write_allowed = False |
| 637 | |
| 638 | if write_allowed: |
Scott Todd | d0a0629 | 2020-01-24 14:41:50 -0800 | [diff] [blame] | 639 | # TODO(scotttodd): Attempt to merge instead of overwrite? |
| 640 | # Existing CMakeLists.txt may have special logic that should be preserved |
Geoffrey Martin-Noble | 2a36c38 | 2020-01-28 15:04:30 -0800 | [diff] [blame] | 641 | if cmake_file_exists: |
Phoenix Meadowlark | 01bbb6c | 2020-03-30 14:20:11 -0700 | [diff] [blame^] | 642 | print(f" {rel_cmakelists_file_path} already exists; overwriting") |
Scott Todd | d0a0629 | 2020-01-24 14:41:50 -0800 | [diff] [blame] | 643 | else: |
Phoenix Meadowlark | 01bbb6c | 2020-03-30 14:20:11 -0700 | [diff] [blame^] | 644 | print(f" {rel_cmakelists_file_path} does not exist yet; creating") |
Scott Todd | d0a0629 | 2020-01-24 14:41:50 -0800 | [diff] [blame] | 645 | print("") |
| 646 | |
| 647 | with open(build_file_path, "rt") as build_file: |
| 648 | build_file_code = compile(build_file.read(), build_file_path, "exec") |
| 649 | converter = Converter(directory_path, rel_build_file_path) |
| 650 | try: |
| 651 | exec(build_file_code, GetDict(BuildFileFunctions(converter))) |
Geoffrey Martin-Noble | 2a36c38 | 2020-01-28 15:04:30 -0800 | [diff] [blame] | 652 | converted_text = converter.convert(copyright_line) |
Geoffrey Martin-Noble | f7be55a | 2020-01-28 17:47:42 -0800 | [diff] [blame] | 653 | if strict and converter.first_error: |
Geoffrey Martin-Noble | ea9c683 | 2020-02-29 20:26:35 -0800 | [diff] [blame] | 654 | raise converter.first_error # pylint: disable=raising-bad-type |
Geoffrey Martin-Noble | 2a36c38 | 2020-01-28 15:04:30 -0800 | [diff] [blame] | 655 | if write_allowed: |
Scott Todd | d0a0629 | 2020-01-24 14:41:50 -0800 | [diff] [blame] | 656 | with open(cmakelists_file_path, "wt") as cmakelists_file: |
| 657 | cmakelists_file.write(converted_text) |
| 658 | else: |
| 659 | print(converted_text) |
Geoffrey Martin-Noble | f7be55a | 2020-01-28 17:47:42 -0800 | [diff] [blame] | 660 | except (NameError, NotImplementedError) as e: |
Phoenix Meadowlark | 01bbb6c | 2020-03-30 14:20:11 -0700 | [diff] [blame^] | 661 | print(f"Failed to convert {rel_build_file_path}.", end=" ") |
| 662 | print("Missing a rule handler in bazel_to_cmake.py?") |
| 663 | print(f" Reason: `{type(e).__name__}: {e}`") |
Scott Todd | d0a0629 | 2020-01-24 14:41:50 -0800 | [diff] [blame] | 664 | except KeyError as e: |
Phoenix Meadowlark | 01bbb6c | 2020-03-30 14:20:11 -0700 | [diff] [blame^] | 665 | print(f"Failed to convert {rel_build_file_path}.", end=" ") |
| 666 | print("Missing a conversion in bazel_to_cmake_targets.py?") |
| 667 | print(f" Reason: `{type(e).__name__}: {e}`") |
Scott Todd | d0a0629 | 2020-01-24 14:41:50 -0800 | [diff] [blame] | 668 | |
| 669 | |
| 670 | def main(args): |
| 671 | """Runs Bazel to CMake conversion.""" |
| 672 | global repo_root |
| 673 | |
| 674 | write_files = not args.preview |
| 675 | |
| 676 | if args.root_dir: |
Geoffrey Martin-Noble | f7be55a | 2020-01-28 17:47:42 -0800 | [diff] [blame] | 677 | convert_directory_tree( |
| 678 | os.path.join(repo_root, args.root_dir), write_files, args.strict) |
Scott Todd | d0a0629 | 2020-01-24 14:41:50 -0800 | [diff] [blame] | 679 | elif args.dir: |
Geoffrey Martin-Noble | f7be55a | 2020-01-28 17:47:42 -0800 | [diff] [blame] | 680 | convert_directory( |
| 681 | os.path.join(repo_root, args.dir), write_files, args.strict) |
Scott Todd | d0a0629 | 2020-01-24 14:41:50 -0800 | [diff] [blame] | 682 | |
| 683 | |
| 684 | if __name__ == "__main__": |
| 685 | setup_environment() |
| 686 | main(parse_arguments()) |