diff options
author | bjacob <benoitjacob@google.com> | 2021-01-20 06:21:49 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-01-20 06:21:49 +0300 |
commit | 4ed621615d2f0a54410976cdaaae22779eaec664 (patch) | |
tree | d508bf20de9c68f19aea55330c4d94949c6b608e /cmake | |
parent | b87d6d2e65ca24ba38e9afbf1e9d0744dbda82d3 (diff) |
Revert "Add CMake support with a converter from Bazel (#233)" (#243)
This reverts commit b87d6d2e65ca24ba38e9afbf1e9d0744dbda82d3.
Diffstat (limited to 'cmake')
-rwxr-xr-x | cmake/bazel_to_cmake.py | 279 | ||||
-rwxr-xr-x | cmake/bazel_to_cmake.sh | 35 | ||||
-rwxr-xr-x | cmake/run_android_test.sh | 16 | ||||
-rw-r--r-- | cmake/ruy_add_all_subdirs.cmake | 37 | ||||
-rw-r--r-- | cmake/ruy_cc_binary.cmake | 57 | ||||
-rw-r--r-- | cmake/ruy_cc_library.cmake | 85 | ||||
-rw-r--r-- | cmake/ruy_cc_test.cmake | 76 | ||||
-rw-r--r-- | cmake/ruy_include_directories.cmake | 33 |
8 files changed, 0 insertions, 618 deletions
diff --git a/cmake/bazel_to_cmake.py b/cmake/bazel_to_cmake.py deleted file mode 100755 index ba1a38b..0000000 --- a/cmake/bazel_to_cmake.py +++ /dev/null @@ -1,279 +0,0 @@ -#!/usr/bin/env python3 -# Copyright 2021 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""This is yet another bazel-to-cmake converter. It's independently written from -scratch but relies on the same basic idea as others (including IREE's), namely: -to let the python interpreter do the bulk of the work, exploiting the fact that -both Bazel's BUILD syntax and Starlark (".bzl") languages are more or less -subsets of Python. - -The main features that this converter supports and that others don't, justifying -its existence as of early 2021, are: - 1. Ad-hoc support for select(), generating CMake if()...elseif()... chains - parsing the condition keys (e.g. anything ending in ":windows" is - interpreted as the condition "the target platform is Windows"). This allows - to just ignore config_setting, as we only care about the config_setting - names, not their actual implementation, as well as all the variants from - the Bazel 'selects' library. - 2. Support for load(), loading macros from Starlark files. -""" - -import re -import os -import os.path -import pickle -import sys -import datetime -import itertools - -# Ruy's dependencies. -external_targets = ['gtest', 'gtest_main', 'cpuinfo'] - -# Text replacements [oldstring, newstring] pairs, applied on all BUILD and -# Starlark files that we load. Only used by preprocess_input_text. -replacements = [ - ['$(STACK_FRAME_UNLIMITED)', ''], - ['native.cc_', 'cc_'], - ['selects.config_setting_group', 'config_setting_group'], - ['@com_google_googletest//:gtest', 'gtest'], - ['@com_google_googletest//:gtest_main', 'gtest_main'], - ['@cpuinfo//:cpuinfo_with_unstripped_include_path', 'cpuinfo'], -] - - -def preprocess_input_text(text): - result = text - for replacement in replacements: - result = result.replace(replacement[0], replacement[1]) - return result - - -def set_cmake_list(list_name, values, indent): - semicolon_separated = ";".join(values) - print(f'{indent}set({list_name} "{semicolon_separated}")') - - -def generate_cmake_select(select_name, dict): - new_if_branch_keyword = 'if' - default_value = [] - for key in dict: - condition = '' - if key == '//conditions:default': - default_value = dict[key] - continue - elif re.search(r':windows$', key): - condition = 'CMAKE_SYSTEM_NAME STREQUAL Windows' - elif re.search(r':ppc$', key): - condition = 'CMAKE_SYSTEM_PROCESSOR STREQUAL ppc64 OR CMAKE_SYSTEM_PROCESSOR STREQUAL ppc64le' - elif re.search(r':s390x$', key): - condition = 'CMAKE_SYSTEM_PROCESSOR STREQUAL s390 OR CMAKE_SYSTEM_PROCESSOR STREQUAL s390x' - elif re.search(r':fuchsia$', key): - condition = 'CMAKE_SYSTEM_NAME STREQUAL Fuchsia' - elif re.search(r':arm32_assuming_neon$', key): - condition = 'CMAKE_SYSTEM_PROCESSOR STREQUAL arm' - elif re.search(r':do_not_want_O3$', key): - # Ruy is a specialist library: we always want code to be compiled - # with -O3 unless the build type is Debug or the compiler does not - # support that flag syntax. - condition = '(CMAKE_BUILD_TYPE STREQUAL Debug) OR MSVC' - elif re.search(r':x86_64_and_not_msvc$', key): - condition = '(CMAKE_SYSTEM_PROCESSOR STREQUAL x86_64 OR CMAKE_SYSTEM_PROCESSOR STREQUAL amd64) AND NOT MSVC' - elif re.search(r':windows_msvc$', key): - condition = 'MSVC' - elif re.search(r':ruy_profiler$', key): - condition = '${RUY_PROFILER}' - else: - raise ValueError(f'Unhandled key in select: {key}') - - print(f'{new_if_branch_keyword}({condition})') - set_cmake_list(select_name, dict[key], ' ') - new_if_branch_keyword = 'elseif' - - print('else()') - set_cmake_list(select_name, default_value, ' ') - - print('endif()\n') - - -def trim_multiple_ruy_prefixes(name): - return re.sub(r'(ruy_)+ruy', 'ruy', name) - -def get_cmake_local_target_name(name): - global package_prefix - return trim_multiple_ruy_prefixes(f'ruy_{package_prefix}_{name}') - - -def get_cmake_dep_target_name(name): - if name in external_targets: - return name - if name.startswith('$'): - # Happens for deps that are the result of expanding a select() that we - # have compiled to expanding a variable. - return name - if name.startswith('//'): - after_last_slash = name.split('/')[-1] - if not ':' in after_last_slash: - name = f'{name}:{after_last_slash}' - raw=name[2:].replace('/', '_').replace(':', '_') - return trim_multiple_ruy_prefixes(raw) - if name.startswith(':'): - name = name[1:] - return get_cmake_local_target_name(name) - - -# -# Functions implementing BUILD functions -# - - -def package(**kwargs): - pass - - -def exports_files(*args): - pass - - -def load(filename, *args): - if filename.startswith('@'): - return - elif filename.startswith(':'): - filename = os.path.join(bazel_package_dir, filename[1:]) - elif filename.startswith('//'): - split = filename[2:].split(':') - filename = os.path.join(bazel_workspace_dir, split[0], split[1]) - - src_file_content = open(filename).read() - processed_file_content = preprocess_input_text(src_file_content) - exec(processed_file_content, globals(), globals()) - - -def config_setting(**kwargs): - # Nothing to do since our implementation of select() is based on parsing - # the names of config_settings, not looking deep into their actual - # implementation. - pass - - -def filegroup(**kwargs): - pass - - -def config_setting_group(**kwargs): - # See config_setting. - pass - - -def bzl_library(**kwargs): - pass - - -select_index = 0 -select_cache = {} - - -def select(select_dict): - global select_index - global select_cache - global package_prefix - key = pickle.dumps(sorted(select_dict.items())) - if key in select_cache: - select_name = select_cache[key] - else: - unique_values = sorted(set(itertools.chain.from_iterable(select_dict.values()))) # sorting ensures determinism, no spurious diffs - description = '_'.join(unique_values) - select_name = f'{package_prefix}_{select_index}_{description}' - select_name = select_name.replace('c++', 'cxx') - select_name = re.sub(r'[^a-zA-Z0-9]+', '_', select_name) - select_index = select_index + 1 - select_cache[key] = select_name - generate_cmake_select(select_name, select_dict) - - return [f'${{{select_name}}}'] - - -def generic_rule(rule_name, **kwargs): - print(f'{rule_name}(') - for key in kwargs.keys(): - values = kwargs[key] - if type(values) is bool: - if values: - print(f' {key.upper()}') - continue - else: - raise ValueError( - 'Cannot specify FALSE boolean args in CMake') - if key == 'visibility': - if values == ['//visibility:public']: - print(f' PUBLIC') - continue - if key == 'tags': - values = list(filter(lambda x : not x.startswith('req_dep'), values)) - if not values: - continue - print(f' {key.upper()}') - if type(values) is list: - for value in values: - if key == 'deps': - target_name = get_cmake_dep_target_name(value) - print(f' {target_name}') - else: - print(f' {value}') - else: - if key == 'name': - target_name = get_cmake_local_target_name(values) - print(f' {target_name}') - else: - print(f' {values}') - print(')\n') - - -def cc_library(**kwargs): - generic_rule('ruy_cc_library', **kwargs) - - -def cc_test(**kwargs): - generic_rule('ruy_cc_test', **kwargs) - - -def cc_binary(**kwargs): - generic_rule('ruy_cc_binary', **kwargs) - - -# -# Program entry point. -# -if __name__ == "__main__": - if len(sys.argv) != 3: - print("Usage: bazel_to_cmake.py bazel_workspace_dir bazel_package_dir") - sys.exit(1) - - bazel_workspace_dir = sys.argv[1] - bazel_package_dir = sys.argv[2] - bazel_package_relative_dir = os.path.relpath( - bazel_package_dir, bazel_workspace_dir) - package_prefix = bazel_package_relative_dir.replace(os.path.sep, '_') - - print("""# This file is generated (whence no license header). Do not edit! -# To regenerate, run: -# cmake/bazel_to_cmake.sh -""") - - src_build_file = os.path.join(bazel_package_dir, "BUILD") - src_build_content = open(src_build_file).read() - processed_build_content = preprocess_input_text(src_build_content) - exec(processed_build_content) - - print("ruy_add_all_subdirs()") diff --git a/cmake/bazel_to_cmake.sh b/cmake/bazel_to_cmake.sh deleted file mode 100755 index 296219e..0000000 --- a/cmake/bazel_to_cmake.sh +++ /dev/null @@ -1,35 +0,0 @@ -#!/bin/bash -# Copyright 2021 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -this_script_dir="$(dirname "$0")" - -root_dir="$(git -C "${this_script_dir}" rev-parse --show-toplevel)" - -build_files="$(find "${root_dir}" -type f -name BUILD)" - -if ! command -v python3 &> /dev/null; then - python_command=python -else - python_command=python3 -fi - -for build_file in ${build_files}; do - package_dir="$(dirname "${build_file}")" - if [[ "${package_dir}" == "${root_dir}" ]]; then - # The root CMakeLists.txt is not generated. - continue - fi - "${python_command}" "${this_script_dir}/bazel_to_cmake.py" "${root_dir}" "${package_dir}" > "${package_dir}/CMakeLists.txt" -done diff --git a/cmake/run_android_test.sh b/cmake/run_android_test.sh deleted file mode 100755 index d643232..0000000 --- a/cmake/run_android_test.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash - -# Minimal script pushing and running a file on device! -# Contemporary versions of ADB properly propagate exit codes so nothing more -# is needed to let CTest report test success/failure. - -# TODO: consider clearing temporary files after testing, although that will -# get in the way of debugging and will make code more complex... also, -# Ruy's test files aren't huge and people running these probably have -# bigger clutter issues in their /data/local/tmp anyway. Anyway, if we want -# to do this, we could copy IREE's code. - -device_tmpdir=/data/local/tmp - -adb push "$1" "${device_tmpdir}" -adb shell "${device_tmpdir}/$(basename "$1")" diff --git a/cmake/ruy_add_all_subdirs.cmake b/cmake/ruy_add_all_subdirs.cmake deleted file mode 100644 index 1a7d126..0000000 --- a/cmake/ruy_add_all_subdirs.cmake +++ /dev/null @@ -1,37 +0,0 @@ -# Copyright 2020 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# Forked from IREE's iree_add_all_subdirs.cmake. - -# add_all_subidrs -# -# CMake function to add all subdirectories of the current directory that contain -# a CMakeLists.txt file -# -# Takes no arguments. -function(ruy_add_all_subdirs) - FILE(GLOB _CHILDREN RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/*) - SET(_DIRLIST "") - foreach(_CHILD ${_CHILDREN}) - if((NOT(subdir MATCHES third_party)) AND - (IS_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/${_CHILD}) AND - (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${_CHILD}/CMakeLists.txt)) - LIST(APPEND _DIRLIST ${_CHILD}) - endif() - endforeach() - - foreach(subdir ${_DIRLIST}) - add_subdirectory(${subdir}) - endforeach() -endfunction() diff --git a/cmake/ruy_cc_binary.cmake b/cmake/ruy_cc_binary.cmake deleted file mode 100644 index 21dbb9d..0000000 --- a/cmake/ruy_cc_binary.cmake +++ /dev/null @@ -1,57 +0,0 @@ -# Copyright 2019 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# Forked from IREE's iree_cc_binary.cmake. - -include(CMakeParseArguments) -include(cmake/ruy_include_directories.cmake) - -# ruy_cc_binary() -# -# CMake function to imitate Bazel's cc_binary rule. -function(ruy_cc_binary) - cmake_parse_arguments( - _RULE - "TESTONLY" - "NAME" - "SRCS;COPTS;LINKOPTS;DEPS;TAGS" - ${ARGN} - ) - - if(_RULE_TESTONLY AND NOT RUY_ENABLE_TESTS) - return() - endif() - - set(_NAME "${_RULE_NAME}") - - add_executable(${_NAME} "") - target_sources(${_NAME} - PRIVATE - ${_RULE_SRCS} - ) - set_target_properties(${_NAME} PROPERTIES OUTPUT_NAME "${_RULE_NAME}") - ruy_include_directories(${_NAME} "${_RULE_DEPS}") - target_compile_options(${_NAME} - PRIVATE - ${_RULE_COPTS} - ) - target_link_options(${_NAME} - PRIVATE - ${_RULE_LINKOPTS} - ) - target_link_libraries(${_NAME} - PUBLIC - ${_RULE_DEPS} - ) -endfunction() diff --git a/cmake/ruy_cc_library.cmake b/cmake/ruy_cc_library.cmake deleted file mode 100644 index 2fa413f..0000000 --- a/cmake/ruy_cc_library.cmake +++ /dev/null @@ -1,85 +0,0 @@ -# Copyright 2019 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# Forked from IREE's iree_cc_library.cmake. - -include(CMakeParseArguments) -include(cmake/ruy_include_directories.cmake) - -# ruy_cc_library() -# -# CMake function to imitate Bazel's cc_library rule. -function(ruy_cc_library) - cmake_parse_arguments( - _RULE - "PUBLIC;TESTONLY" - "NAME" - "HDRS;SRCS;COPTS;DEFINES;LINKOPTS;DEPS" - ${ARGN} - ) - - if(_RULE_TESTONLY AND NOT RUY_ENABLE_TESTS) - return() - endif() - - set(_NAME "${_RULE_NAME}") - - # Check if this is a header-only library. - if("${_RULE_SRCS}" STREQUAL "") - set(_RULE_IS_INTERFACE 1) - else() - set(_RULE_IS_INTERFACE 0) - endif() - - if(_RULE_IS_INTERFACE) - # Generating a header-only library. - add_library(${_NAME} INTERFACE) - target_include_directories(${_NAME} - INTERFACE - "${PROJECT_SOURCE_DIR}" - ) - target_link_libraries(${_NAME} - INTERFACE - ${_RULE_DEPS} - ${_RULE_LINKOPTS} - ) - target_compile_definitions(${_NAME} - INTERFACE - ${_RULE_DEFINES} - ) - else() - # Generating a static binary library. - add_library(${_NAME} STATIC "") - target_sources(${_NAME} - PRIVATE - ${_RULE_SRCS} - ${_RULE_HDRS} - ) - ruy_include_directories(${_NAME} "${_RULE_DEPS}") - target_compile_options(${_NAME} - PRIVATE - ${_RULE_COPTS} - ) - target_link_libraries(${_NAME} - PUBLIC - ${_RULE_DEPS} - PRIVATE - ${_RULE_LINKOPTS} - ) - target_compile_definitions(${_NAME} - PUBLIC - ${_RULE_DEFINES} - ) - endif() -endfunction() diff --git a/cmake/ruy_cc_test.cmake b/cmake/ruy_cc_test.cmake deleted file mode 100644 index 2d78697..0000000 --- a/cmake/ruy_cc_test.cmake +++ /dev/null @@ -1,76 +0,0 @@ -# Copyright 2019 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# Forked from IREE's iree_cc_test.cmake. - -include(CMakeParseArguments) -include(cmake/ruy_include_directories.cmake) - -# ruy_cc_test() -# -# CMake function to imitate Bazel's cc_test rule. -function(ruy_cc_test) - cmake_parse_arguments( - _RULE - "" - "NAME" - "SRCS;COPTS;LINKOPTS;DEPS;TAGS" - ${ARGN} - ) - - if(NOT RUY_ENABLE_TESTS) - return() - endif() - - set(_NAME "${_RULE_NAME}") - - add_executable(${_NAME} "") - target_sources(${_NAME} - PRIVATE - ${_RULE_SRCS} - ) - set_target_properties(${_NAME} PROPERTIES OUTPUT_NAME "${_RULE_NAME}") - ruy_include_directories(${_NAME} "${_RULE_DEPS}") - target_compile_options(${_NAME} - PRIVATE - ${_RULE_COPTS} - ) - target_link_options(${_NAME} - PRIVATE - ${_RULE_LINKOPTS} - ) - target_link_libraries(${_NAME} - PUBLIC - ${_RULE_DEPS} - ) - if(ANDROID) - add_test( - NAME - ${_NAME} - COMMAND - "${CMAKE_SOURCE_DIR}/cmake/run_android_test.sh" - "$<TARGET_FILE:${_NAME}>" - ) - else() - add_test( - NAME - ${_NAME} - COMMAND - "$<TARGET_FILE:${_NAME}>" - ) - endif() - if (_RULE_TAGS) - set_property(TEST ${_NAME} PROPERTY LABELS ${_RULE_TAGS}) - endif() -endfunction() diff --git a/cmake/ruy_include_directories.cmake b/cmake/ruy_include_directories.cmake deleted file mode 100644 index d2e0ad1..0000000 --- a/cmake/ruy_include_directories.cmake +++ /dev/null @@ -1,33 +0,0 @@ -# Copyright 2019-2021 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -function(ruy_include_directories NAME DEPS) - target_include_directories(${NAME} - PUBLIC - "${PROJECT_SOURCE_DIR}" - ) - if (cpuinfo IN_LIST DEPS) - target_include_directories(${NAME} - PRIVATE - "${PROJECT_SOURCE_DIR}/third_party/cpuinfo" - ) - endif() - if ((gtest IN_LIST DEPS) OR - (gtest_main IN_LIST DEPS)) - target_include_directories(${NAME} - PRIVATE - "${PROJECT_SOURCE_DIR}/third_party/googletest/googletest" - ) - endif() -endfunction()
\ No newline at end of file |