From 07e1645dcc6c013b954d26b826fcd41f85585e55 Mon Sep 17 00:00:00 2001 From: UebelAndre Date: Sat, 20 Mar 2021 13:11:57 -0700 Subject: [PATCH] Added test for ensuring docs are always appropriately updated (#576) * Added test for ensuring docs are always appropriately updated * Updated docs --- .bazelci/config.yaml | 2 ++ .gitignore | 3 +++ README.md | 14 +++++++------- docs/BUILD.bazel | 8 +++++++- docs/README.md | 12 ++++++------ docs/test_docs.sh | 12 ++++++++++++ foreign_cc/private/framework.bzl | 4 ++-- 7 files changed, 39 insertions(+), 16 deletions(-) create mode 100755 docs/test_docs.sh diff --git a/.bazelci/config.yaml b/.bazelci/config.yaml index ff59e46..8567e95 100644 --- a/.bazelci/config.yaml +++ b/.bazelci/config.yaml @@ -138,6 +138,8 @@ tasks: working_directory: docs build_targets: - //... + run_targets: + - //:test_docs min_supported_version: name: "Minimum Supported Version" bazel: "3.7.0" diff --git a/.gitignore b/.gitignore index c89a196..4b2f484 100644 --- a/.gitignore +++ b/.gitignore @@ -71,6 +71,9 @@ fabric.properties # Vim swap files .*.sw? +# Bazel CI +bazelci.py + ##### # Bazel: https://github.com/github/gitignore/blob/master/community/Bazel.gitignore ##### diff --git a/README.md b/README.md index 1441b99..41ec0e5 100644 --- a/README.md +++ b/README.md @@ -25,11 +25,11 @@ For more generalized updates, please see [NEWS.md](./NEWS.md) or checkout the ## Building CMake projects -- Build libraries/binaries with CMake from sources using cmake_external rule -- Use cmake_external targets in [cc_library][ccl], [cc_binary][ccb] targets as dependency -- Bazel [cc_toolchain][cct] parameters are used inside cmake_external build -- See full list of cmake_external arguments below 'example' -- cmake_external is defined in `./tools/build_defs` +- Build libraries/binaries with CMake from sources using cmake rule +- Use cmake targets in [cc_library][ccl], [cc_binary][ccb] targets as dependency +- Bazel [cc_toolchain][cct] parameters are used inside cmake build +- See full list of cmake arguments below 'example' +- cmake is defined in `./tools/build_defs` - Works on Ubuntu, Mac OS and Windows(\* see special notes below in Windows section) operating systems **Example:** @@ -38,7 +38,7 @@ For more generalized updates, please see [NEWS.md](./NEWS.md) or checkout the The example for **Windows** is below, in the section 'Usage on Windows'. - In `WORKSPACE.bazel`, we use a `http_archive` to download tarballs with the libraries we use. -- In `BUILD.bazel`, we instantiate a `cmake_external` rule which behaves similarly to a [cc_library][ccl], which can then be used in a C++ rule ([cc_binary][ccb] in this case). +- In `BUILD.bazel`, we instantiate a `cmake` rule which behaves similarly to a [cc_library][ccl], which can then be used in a C++ rule ([cc_binary][ccb] in this case). In `WORKSPACE.bazel`, put @@ -105,7 +105,7 @@ bazel build //:pcre **Usage on Windows** -When using on Windows, you should start Bazel in MSYS2 shell, as the shell script inside cmake_external assumes this. +When using on Windows, you should start Bazel in MSYS2 shell, as the shell script inside cmake assumes this. Also, you should explicitly specify **make commands and option to generate CMake crosstool file**. The default generator for CMake will be detected automatically, or you can specify it explicitly. diff --git a/docs/BUILD.bazel b/docs/BUILD.bazel index a5a37ac..abba723 100644 --- a/docs/BUILD.bazel +++ b/docs/BUILD.bazel @@ -34,8 +34,9 @@ genrule( outs = ["generate_docs.sh"], cmd = """cat << EOF > $@ #!/bin/bash -set -e +set -euo pipefail cat \\$${BUILD_WORKSPACE_DIRECTORY}/$(location //:docs) > \\$${BUILD_WORKSPACE_DIRECTORY}/README.md +EOF """, ) @@ -44,3 +45,8 @@ sh_binary( srcs = [":generate_docs_src"], data = [":docs"], ) + +sh_binary( + name = "test_docs", + srcs = ["test_docs.sh"] +) \ No newline at end of file diff --git a/docs/README.md b/docs/README.md index c17ab1c..8880007 100644 --- a/docs/README.md +++ b/docs/README.md @@ -42,7 +42,7 @@ Rule for building Boost. Invokes bootstrap.sh and then b2 install. | data | Files needed by this rule at runtime. May list file or rule targets. Generally allows any target. | List of labels | optional | [] | | defines | Optional compilation definitions to be passed to the dependencies of this library. They are NOT passed to the compiler, you should duplicate them in the configuration options. | List of strings | optional | [] | | deps | Optional dependencies to be copied into the directory structure. Typically those directly required for the external building of the library/binaries. (i.e. those that the external buidl system will be looking for and paths to which are provided by the calling rule) | List of labels | optional | [] | -| env | Environment variables to set during the build. $(execpath) macros may be used to point at files which are listed as data deps, tools_deps, or additional_tools, but unlike with other rules, these will be replaced with absolute paths to those files, because the build does not run in the exec root. No other macros are supported. | Dictionary: String -> String | optional | {} | +| env | Environment variables to set during the build. $(execpath) macros may be used to point at files which are listed as data deps, tools_deps, or additional_tools, but unlike with other rules, these will be replaced with absolute paths to those files, because the build does not run in the exec root. No other macros are supported. | Dictionary: String -> String | optional | {} | | headers_only | __deprecated__: Use out_headers_only instead. | Boolean | optional | False | | interface_libraries | __deprecated__: Use out_interface_libs instead. | List of strings | optional | [] | | lib_name | Library name. Defines the name of the install directory and the name of the static library, if no output files parameters are defined (any of static_libraries, shared_libraries, interface_libraries, binaries_names) Optional. If not defined, defaults to the target's name. | String | optional | "" | @@ -94,7 +94,7 @@ Rule for building external library with CMake. | data | Files needed by this rule at runtime. May list file or rule targets. Generally allows any target. | List of labels | optional | [] | | defines | Optional compilation definitions to be passed to the dependencies of this library. They are NOT passed to the compiler, you should duplicate them in the configuration options. | List of strings | optional | [] | | deps | Optional dependencies to be copied into the directory structure. Typically those directly required for the external building of the library/binaries. (i.e. those that the external buidl system will be looking for and paths to which are provided by the calling rule) | List of labels | optional | [] | -| env | Environment variables to set during the build. $(execpath) macros may be used to point at files which are listed as data deps, tools_deps, or additional_tools, but unlike with other rules, these will be replaced with absolute paths to those files, because the build does not run in the exec root. No other macros are supported. | Dictionary: String -> String | optional | {} | +| env | Environment variables to set during the build. $(execpath) macros may be used to point at files which are listed as data deps, tools_deps, or additional_tools, but unlike with other rules, these will be replaced with absolute paths to those files, because the build does not run in the exec root. No other macros are supported. | Dictionary: String -> String | optional | {} | | env_vars | CMake environment variable values to join with toolchain-defined. For example, additional CXXFLAGS. | Dictionary: String -> String | optional | {} | | generate_args | Arguments for CMake's generate command. Arguments should be passed as key/value pairs. eg: ["-G Ninja", "--debug-output", "-DFOO=bar"]. Note that unless a generator (-G) argument is provided, the default generators are [Unix Makefiles](https://cmake.org/cmake/help/latest/generator/Unix%20Makefiles.html) for Linux and MacOS and [Ninja](https://cmake.org/cmake/help/latest/generator/Ninja.html) for Windows. | List of strings | optional | [] | | generate_crosstool_file | When True, CMake crosstool file will be generated from the toolchain values, provided cache-entries and env_vars (some values will still be passed as -Dkey=value and environment variables). If CMAKE_TOOLCHAIN_FILE cache entry is passed, specified crosstool file will be used When using this option to cross-compile, it is required to specify CMAKE_SYSTEM_NAME in the cache_entries | Boolean | optional | True | @@ -187,14 +187,14 @@ Rule for building external libraries with configure-make pattern. Some 'configur | data | Files needed by this rule at runtime. May list file or rule targets. Generally allows any target. | List of labels | optional | [] | | defines | Optional compilation definitions to be passed to the dependencies of this library. They are NOT passed to the compiler, you should duplicate them in the configuration options. | List of strings | optional | [] | | deps | Optional dependencies to be copied into the directory structure. Typically those directly required for the external building of the library/binaries. (i.e. those that the external buidl system will be looking for and paths to which are provided by the calling rule) | List of labels | optional | [] | -| env | Environment variables to set during the build. $(execpath) macros may be used to point at files which are listed as data deps, tools_deps, or additional_tools, but unlike with other rules, these will be replaced with absolute paths to those files, because the build does not run in the exec root. No other macros are supported. | Dictionary: String -> String | optional | {} | +| env | Environment variables to set during the build. $(execpath) macros may be used to point at files which are listed as data deps, tools_deps, or additional_tools, but unlike with other rules, these will be replaced with absolute paths to those files, because the build does not run in the exec root. No other macros are supported. | Dictionary: String -> String | optional | {} | | headers_only | __deprecated__: Use out_headers_only instead. | Boolean | optional | False | | install_prefix | Install prefix, i.e. relative path to where to install the result of the build. Passed to the 'configure' script with --prefix flag. | String | optional | "" | | interface_libraries | __deprecated__: Use out_interface_libs instead. | List of strings | optional | [] | | lib_name | Library name. Defines the name of the install directory and the name of the static library, if no output files parameters are defined (any of static_libraries, shared_libraries, interface_libraries, binaries_names) Optional. If not defined, defaults to the target's name. | String | optional | "" | | lib_source | Label with source code to build. Typically a filegroup for the source of remote repository. Mandatory. | Label | required | | | linkopts | Optional link options to be passed up to the dependencies of this library | List of strings | optional | [] | -| make_commands | Optinal make commands, defaults to ["make", "make install"] | List of strings | optional | ["make", "make install"] | +| make_commands | Optional make commands. | List of strings | optional | ["make", "make install"] | | out_bin_dir | Optional name of the output subdirectory with the binary files, defaults to 'bin'. | String | optional | "bin" | | out_binaries | Optional names of the resulting binaries. | List of strings | optional | [] | | out_headers_only | Flag variable to indicate that the library produces only headers | Boolean | optional | False | @@ -238,7 +238,7 @@ Rule for building external libraries with GNU Make. GNU Make commands (make and | data | Files needed by this rule at runtime. May list file or rule targets. Generally allows any target. | List of labels | optional | [] | | defines | Optional compilation definitions to be passed to the dependencies of this library. They are NOT passed to the compiler, you should duplicate them in the configuration options. | List of strings | optional | [] | | deps | Optional dependencies to be copied into the directory structure. Typically those directly required for the external building of the library/binaries. (i.e. those that the external buidl system will be looking for and paths to which are provided by the calling rule) | List of labels | optional | [] | -| env | Environment variables to set during the build. $(execpath) macros may be used to point at files which are listed as data deps, tools_deps, or additional_tools, but unlike with other rules, these will be replaced with absolute paths to those files, because the build does not run in the exec root. No other macros are supported. | Dictionary: String -> String | optional | {} | +| env | Environment variables to set during the build. $(execpath) macros may be used to point at files which are listed as data deps, tools_deps, or additional_tools, but unlike with other rules, these will be replaced with absolute paths to those files, because the build does not run in the exec root. No other macros are supported. | Dictionary: String -> String | optional | {} | | headers_only | __deprecated__: Use out_headers_only instead. | Boolean | optional | False | | interface_libraries | __deprecated__: Use out_interface_libs instead. | List of strings | optional | [] | | keep_going | __deprecated__: To maintain this behavior, pass -k to the args attribute when not using the make_commands attribute. | Boolean | optional | True | @@ -331,7 +331,7 @@ Rule for building external libraries with [Ninja](https://ninja-build.org/). | defines | Optional compilation definitions to be passed to the dependencies of this library. They are NOT passed to the compiler, you should duplicate them in the configuration options. | List of strings | optional | [] | | deps | Optional dependencies to be copied into the directory structure. Typically those directly required for the external building of the library/binaries. (i.e. those that the external buidl system will be looking for and paths to which are provided by the calling rule) | List of labels | optional | [] | | directory | A directory to pass as the -C argument. The rule will always use the root directory of the lib_sources attribute if this attribute is not set | String | optional | "" | -| env | Environment variables to set during the build. $(execpath) macros may be used to point at files which are listed as data deps, tools_deps, or additional_tools, but unlike with other rules, these will be replaced with absolute paths to those files, because the build does not run in the exec root. No other macros are supported. | Dictionary: String -> String | optional | {} | +| env | Environment variables to set during the build. $(execpath) macros may be used to point at files which are listed as data deps, tools_deps, or additional_tools, but unlike with other rules, these will be replaced with absolute paths to those files, because the build does not run in the exec root. No other macros are supported. | Dictionary: String -> String | optional | {} | | headers_only | __deprecated__: Use out_headers_only instead. | Boolean | optional | False | | interface_libraries | __deprecated__: Use out_interface_libs instead. | List of strings | optional | [] | | lib_name | Library name. Defines the name of the install directory and the name of the static library, if no output files parameters are defined (any of static_libraries, shared_libraries, interface_libraries, binaries_names) Optional. If not defined, defaults to the target's name. | String | optional | "" | diff --git a/docs/test_docs.sh b/docs/test_docs.sh new file mode 100755 index 0000000..c17eefd --- /dev/null +++ b/docs/test_docs.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +set -euo pipefail + +pushd "${BUILD_WORKSPACE_DIRECTORY}" &> /dev/null +bazel run //:generate_docs +if [ -n "$(git status --porcelain)" ]; then + git status + echo '/docs is out of date. Please run `bazel run //:generate_docs` from that directory and commit the results' >&2 + exit 1 +fi +popd &> /dev/null diff --git a/foreign_cc/private/framework.bzl b/foreign_cc/private/framework.bzl index 6082543..d5647e9 100644 --- a/foreign_cc/private/framework.bzl +++ b/foreign_cc/private/framework.bzl @@ -95,7 +95,7 @@ CC_EXTERNAL_RULE_ATTRIBUTES = { "env": attr.string_dict( doc = ( "Environment variables to set during the build. " + - "$(execpath) macros may be used to point at files which are listed as data deps, tools_deps, or additional_tools, " + + "`$(execpath)` macros may be used to point at files which are listed as data deps, tools_deps, or additional_tools, " + "but unlike with other rules, these will be replaced with absolute paths to those files, " + "because the build does not run in the exec root. " + "No other macros are supported." @@ -133,7 +133,7 @@ CC_EXTERNAL_RULE_ATTRIBUTES = { default = [], ), "make_commands": attr.string_list( - doc = "Optinal make commands, defaults to [\"make\", \"make install\"]", + doc = "Optional make commands.", mandatory = False, default = ["make", "make install"], ),