Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
# Codeowners for reviews on PRs

* @JeffGarland @ashu3103
55 changes: 55 additions & 0 deletions docs/infra/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
# Beman Project Infrastructure Repository

<!-- SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -->

This repository contains the infrastructure for The Beman Project. This is NOT a library repository,
so it does not respect the usual structure of a Beman library repository nor The Beman Standard!

## Description

* `cmake/`: CMake modules and toolchain files used by Beman libraries.
* `containers/`: Containers used for CI builds and tests in the Beman org.
* `tools/`: Tools used to manage the infrastructure and the codebase (e.g., linting, formatting, etc.).

## Usage

This repository is intended to be used as a beman-submodule in other Beman repositories. See
[the Beman Submodule documentation](./tools/beman-submodule/README.md) for details.


### CMake Modules


#### `beman_install_library`

The CMake modules in this repository are intended to be used by Beman libraries. Use the
`beman_add_install_library_config()` function to install your library, along with header
files, any metadata files, and a CMake config file for `find_package()` support.

```cmake
add_library(beman.something)
add_library(beman::something ALIAS beman.something)

# ... configure your target as needed ...

find_package(beman-install-library REQUIRED)
beman_install_library(beman.something)
```

Note that the target must be created before calling `beman_install_library()`. The module
also assumes that the target is named using the `beman.something` convention, and it
uses that assumption to derive the names to match other Beman standards and conventions.
If your target does not follow that convention, raise an issue or pull request to add
more configurability to the module.

The module will configure the target to install:

* The library target itself
* Any public headers associated with the target
* CMake files for `find_package(beman.something)` support

Some options for the project and target will also be supported:

* `BEMAN_INSTALL_CONFIG_FILE_PACKAGES` - a list of package names (e.g., `beman.something`) for which to install the config file
(default: all packages)
* `<BEMAN_NAME>_INSTALL_CONFIG_FILE_PACKAGE` - a per-project option to enable/disable config file installation (default: `ON` if the project is top-level, `OFF` otherwise). For instance for `beman.something`, the option would be `BEMAN_SOMETHING_INSTALL_CONFIG_FILE_PACKAGE`.
63 changes: 63 additions & 0 deletions docs/infra/tools/beman-submodule/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
# beman-submodule

<!-- SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -->

## What is this script?

`beman-submodule` provides some of the features of `git submodule`, adding child git
repositories to a parent git repository, but unlike with `git submodule`, the entire child
repo is directly checked in, so only maintainers, not users, need to run this script. The
command line interface mimics `git submodule`'s.

## How do I add a beman submodule to my repository?

The first beman submodule you should add is this repository, `infra/`, which you can
bootstrap by running:

<!-- markdownlint-disable MD013 -->
```sh
curl -s https://raw.githubusercontent.com/bemanproject/infra/refs/heads/main/tools/beman-submodule/beman-submodule | python3 - add https://github.com/bemanproject/infra.git
```

Once that's added, you can run the script from `infra/tools/beman-submodule/beman-submodule`.

## How do I update a beman submodule to the latest trunk?

You can run `beman-submodule update --remote` to update all beman submodule to latest
trunk, or e.g. `beman-submodule update --remote infra` to update only a specific one.

## How does it work under the hood?

Along with the files from the child repository, it creates a dotfile called
`.beman_submodule`, which looks like this:

```ini
[beman_submodule]
remote=https://github.com/bemanproject/infra.git
commit_hash=9b88395a86c4290794e503e94d8213b6c442ae77
```

## How do I update a beman submodule to a specific commit or change the remote URL?

You can edit the corresponding lines in the `.beman_submodule` file and run
`beman-submodule update` to update the state of the beman submodule to the new
`.beman_submodule` settings.

## How can I make CI ensure that my beman submodules are in a valid state?

Add this job to your CI workflow:

```yaml
beman-submodule-test:
runs-on: ubuntu-latest
name: "Check beman submodules for consistency"
steps:
- name: Checkout
uses: actions/checkout@v4
- name: beman submodule consistency check
run: |
(set -o pipefail; ./infra/tools/beman-submodule/beman-submodule status | grep -qvF '+')
```

This will fail if the contents of any beman submodule don't match what's specified in the
`.beman_submodule` file.