From 731d5402b22c9db4a6302eae894b006a1fa983bc Mon Sep 17 00:00:00 2001 From: quicksilver Date: Thu, 26 Sep 2019 10:50:27 +0800 Subject: [PATCH] add cmake format python file Former-commit-id: 073fb9af2e0d2e4ea64de620cbcc2852e9fe83ee --- cmake-format.py | 59 ++++++++++++++++++++++++++++ run-cmake-format.py | 96 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 155 insertions(+) create mode 100644 cmake-format.py create mode 100755 run-cmake-format.py diff --git a/cmake-format.py b/cmake-format.py new file mode 100644 index 00000000..09766420 --- /dev/null +++ b/cmake-format.py @@ -0,0 +1,59 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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 +# +# http://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. + +# cmake-format configuration file +# Use run-cmake-format.py to reformat all cmake files in the source tree + +# How wide to allow formatted cmake files +line_width = 90 + +# How many spaces to tab for indent +tab_size = 2 + +# If arglists are longer than this, break them always +max_subargs_per_line = 4 + +# If true, separate flow control names from their parentheses with a space +separate_ctrl_name_with_space = False + +# If true, separate function names from parentheses with a space +separate_fn_name_with_space = False + +# If a statement is wrapped to more than one line, than dangle the closing +# parenthesis on it's own line +dangle_parens = False + +# What style line endings to use in the output. +line_ending = 'unix' + +# Format command names consistently as 'lower' or 'upper' case +command_case = 'lower' + +# Format keywords consistently as 'lower' or 'upper' case +keyword_case = 'unchanged' + +# enable comment markup parsing and reflow +enable_markup = False + +# If comment markup is enabled, don't reflow the first comment block in +# eachlistfile. Use this to preserve formatting of your +# copyright/licensestatements. +first_comment_is_literal = False + +# If comment markup is enabled, don't reflow any comment block which matchesthis +# (regex) pattern. Default is `None` (disabled). +literal_comment_pattern = None diff --git a/run-cmake-format.py b/run-cmake-format.py new file mode 100755 index 00000000..07c61599 --- /dev/null +++ b/run-cmake-format.py @@ -0,0 +1,96 @@ +#!/usr/bin/env python3 + +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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 +# +# http://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. + +import hashlib +import pathlib +import subprocess +import sys + + +patterns = [ + 'cpp/CMakeLists.txt', + # Keep an explicit list of files to format as we don't want to reformat + # files we imported from other location. + 'cpp/cmake/BuildUtils.cmake', + 'cpp/cmake/DefineOptions.cmake', + 'cpp/cmake/FindClangTools.cmake', + 'cpp/cmake/ThirdPartyPackages.cmake', + 'cpp/src/core/cmake/BuildUtilsCore.cmake', + 'cpp/src/core/cmake/DefineOptionsCore.cmake', + 'cpp/src/core/cmake/ThirdPartyPackagesCore.cmake + 'cpp/src/**/CMakeLists.txt', + 'cpp/unittest/**/CMakeLists.txt' +] + +here = pathlib.Path(__file__).parent + + +def find_cmake_files(): + for pat in patterns: + yield from here.glob(pat) + + +def run_cmake_format(paths): + # cmake-format is fast enough that running in parallel doesn't seem + # necessary + # autosort is off because it breaks in cmake_format 5.1 + # See: https://github.com/cheshirekow/cmake_format/issues/111 + cmd = ['cmake-format', '--in-place', '--autosort=false'] + paths + try: + subprocess.run(cmd, check=True) + except FileNotFoundError: + try: + import cmake_format + except ImportError: + raise ImportError( + "Please install cmake-format: `pip install cmake_format`") + else: + # Other error, re-raise + raise + + +def check_cmake_format(paths): + hashes = {} + for p in paths: + contents = p.read_bytes() + hashes[p] = hashlib.sha256(contents).digest() + + run_cmake_format(paths) + + # Check contents didn't change + changed = [] + for p in paths: + contents = p.read_bytes() + if hashes[p] != hashlib.sha256(contents).digest(): + changed.append(p) + + if changed: + items = "\n".join("- %s" % p for p in sorted(changed)) + print("The following cmake files need re-formatting:\n%s" % (items,)) + print() + print("Consider running `run-cmake-format.py`") + sys.exit(1) + + +if __name__ == "__main__": + paths = list(find_cmake_files()) + if "--check" in sys.argv: + check_cmake_format(paths) + else: + run_cmake_format(paths) -- GitLab