From a5f789ff038e31c8eac51601d3cdd8dc7e18b5a2 Mon Sep 17 00:00:00 2001 From: ClausKlein Date: Sun, 22 Feb 2026 22:51:02 +0100 Subject: [PATCH 1/5] Prepare cxx_module usage --- .clang-format | 9 + .clang-tidy | 55 +++ .codespellignore | 8 + .codespellrc | 6 + .github/workflows/.beman_submodule | 4 - .github/workflows/.github/CODEOWNERS | 1 - .github/workflows/LICENSE | 230 ------------ .github/workflows/README.md | 85 ----- .github/workflows/ci_tests.yml | 72 ++-- .github/workflows/pre-commit-check.yml | 13 + .github/workflows/pre-commit-update.yml | 15 + .../reusable-beman-build-and-test.yml | 174 --------- ...reusable-beman-create-issue-when-fault.yml | 30 -- .../workflows/reusable-beman-pre-commit.yml | 73 ---- .../workflows/reusable-beman-preset-test.yml | 34 -- .../reusable-beman-submodule-check.yml | 20 - .pre-commit-config.yaml | 56 +-- CMakeLists.txt | 83 +++-- CMakePresets.json | 51 ++- cmake/Config.cmake.in | 11 +- cmake/beman-install-library.cmake | 351 ++++++++++++++++++ examples/CMakeLists.txt | 27 +- src/beman/net/CMakeLists.txt | 98 ++--- tests/beman/net/CMakeLists.txt | 2 +- 24 files changed, 677 insertions(+), 831 deletions(-) create mode 100644 .clang-tidy create mode 100644 .codespellignore create mode 100644 .codespellrc delete mode 100644 .github/workflows/.beman_submodule delete mode 100644 .github/workflows/.github/CODEOWNERS delete mode 100644 .github/workflows/LICENSE delete mode 100644 .github/workflows/README.md create mode 100644 .github/workflows/pre-commit-check.yml create mode 100644 .github/workflows/pre-commit-update.yml delete mode 100644 .github/workflows/reusable-beman-build-and-test.yml delete mode 100644 .github/workflows/reusable-beman-create-issue-when-fault.yml delete mode 100644 .github/workflows/reusable-beman-pre-commit.yml delete mode 100644 .github/workflows/reusable-beman-preset-test.yml delete mode 100644 .github/workflows/reusable-beman-submodule-check.yml create mode 100644 cmake/beman-install-library.cmake diff --git a/.clang-format b/.clang-format index 01d5fac..ddf30aa 100644 --- a/.clang-format +++ b/.clang-format @@ -1,4 +1,13 @@ --- +BasedOnStyle: LLVM +Language: Json +IndentWidth: 2 +UseTab: Never +--- +Language: JavaScript +IndentWidth: 4 +UseTab: Never +--- Language: Cpp AccessModifierOffset: -2 AlignAfterOpenBracket: Align diff --git a/.clang-tidy b/.clang-tidy new file mode 100644 index 0000000..d853657 --- /dev/null +++ b/.clang-tidy @@ -0,0 +1,55 @@ +Checks: + -*, + boost-*, + bugprone-*, + cert-*, + -cert-dcl58-cpp, + clang-analyzer-*, + concurrency-*, + -cppcoreguidelines-*, + -google-*, + hicpp-*, + misc-*, + -misc-const-correctness, + -misc-include-cleaner, + -misc-non-private-member-variables-in-classes, + -modernize-*, + -modernize-use-nodiscard, + performance-*, + portability-*, + -readability-*, + -readability-identifier-*, + -readability-implicit-bool-conversion, + -readability-magic-numbers, + -*-named-parameter, + -*-uppercase-literal-suffix, + -*-use-equals-default, + -*-braces-around-statements +HeaderFilterRegex: '.*/execution/(include|src|example|tests)/.*\.(hpp)$' +WarningsAsErrors: 'clang*' +FormatStyle: file + +CheckOptions: + - { key: readability-identifier-naming.NamespaceCase, value: CamelCase } + - { key: readability-identifier-naming.ClassCase, value: CamelCase } + - { key: readability-identifier-naming.EnumCase, value: CamelCase } + - { key: readability-identifier-naming.MemberCase, value: camelBack } + - { key: readability-identifier-naming.MemberPrefix, value: m_ } + - { key: readability-identifier-naming.StructCase, value: lower_case } + - { key: readability-identifier-naming.UnionCase, value: lower_case } + - { key: readability-identifier-naming.TypedefCase, value: lower_case } + - { key: readability-identifier-naming.TypedefSuffix, value: _type } + - { key: readability-identifier-naming.FunctionCase, value: camelBack } + - { key: readability-identifier-naming.VariableCase, value: camelBack } + - { key: readability-identifier-naming.ParameterCase, value: camelBack } + - { key: readability-identifier-naming.LocalVariableCase, value: camelBack } + - { key: readability-identifier-naming.ConstexprFunctionCase, value: camelBack } + - { key: readability-identifier-naming.ConstexprMethodCase, value: camelBack } + - { key: readability-identifier-naming.ConstexprVariableCase, value: UPPER_CASE } + - { key: readability-identifier-naming.ClassConstantCase, value: UPPER_CASE } + - { key: readability-identifier-naming.EnumConstantCase, value: UPPER_CASE } + - { key: readability-identifier-naming.GlobalConstantCase, value: UPPER_CASE } + - { key: readability-identifier-naming.GlobalConstantPointerCase, value: UPPER_CASE } + - { key: readability-identifier-naming.LocalConstantPointerCase, value: UPPER_CASE } + - { key: readability-identifier-naming.ScopedEnumConstantCase, value: UPPER_CASE } + - { key: readability-identifier-naming.StaticConstantCase, value: UPPER_CASE } diff --git a/.codespellignore b/.codespellignore new file mode 100644 index 0000000..124186a --- /dev/null +++ b/.codespellignore @@ -0,0 +1,8 @@ +dur +que +cancelled +copyable +pullrequest +snd +statics +Claus diff --git a/.codespellrc b/.codespellrc new file mode 100644 index 0000000..2060d89 --- /dev/null +++ b/.codespellrc @@ -0,0 +1,6 @@ +[codespell] +builtin = clear,rare,en-GB_to_en-US,names,informal,code +check-hidden = +skip = ./.git,./build/*,./stagedir/*,./docs/html/*,./docs/latex/*,*.log,.*.swp,*~,*.bak,Makefile,*.pdf +quiet-level = 2 +ignore-words = .codespellignore diff --git a/.github/workflows/.beman_submodule b/.github/workflows/.beman_submodule deleted file mode 100644 index d48589c..0000000 --- a/.github/workflows/.beman_submodule +++ /dev/null @@ -1,4 +0,0 @@ -[beman_submodule] -remote=https://github.com/bemanproject/infra-workflows.git -commit_hash=132186fc8bca457512d7fa0400be34ea958542a0 -allow_untracked_files=True diff --git a/.github/workflows/.github/CODEOWNERS b/.github/workflows/.github/CODEOWNERS deleted file mode 100644 index 7a5f53c..0000000 --- a/.github/workflows/.github/CODEOWNERS +++ /dev/null @@ -1 +0,0 @@ -* @ednolan diff --git a/.github/workflows/LICENSE b/.github/workflows/LICENSE deleted file mode 100644 index 111a208..0000000 --- a/.github/workflows/LICENSE +++ /dev/null @@ -1,230 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - 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 - - 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. - - ----- LLVM Exceptions to the Apache 2.0 License ---- - -As an exception, if, as a result of your compiling your source code, portions -of this Software are embedded into an Object form of such source code, you -may redistribute such embedded portions in such Object form without complying -with the conditions of Sections 4(a), 4(b) and 4(d) of the License. - -In addition, if you combine or link compiled forms of this Software with -software that is licensed under the GPLv2 ("Combined Software") and if a -court of competent jurisdiction determines that the patent provision (Section -3), the indemnity provision (Section 9) or other Section of the License -conflicts with the conditions of the GPLv2, you may retroactively and -prospectively choose to deem waived or otherwise exclude such Section(s) of -the License, but only in their entirety and only with respect to the Combined -Software. - -============================================================================== -Software from third parties included in the Beman Project: -============================================================================== -The Beman Project contains third party software which is under different license -terms. All such code will be identified clearly using at least one of two -mechanisms: -1) It will be in a separate directory tree with its own `LICENSE.txt` or - `LICENSE` file at the top containing the specific license and restrictions - which apply to that software, or -2) It will contain specific license and restriction terms at the top of every - file. diff --git a/.github/workflows/README.md b/.github/workflows/README.md deleted file mode 100644 index f71fd91..0000000 --- a/.github/workflows/README.md +++ /dev/null @@ -1,85 +0,0 @@ -# Beman Project Reusable Github Actions Repository - - - -This repository contains [reusable GitHub Actions -workflows](https://docs.github.com/en/actions/how-tos/sharing-automations/reusing-workflows) -workflow files, intended to help unify the GitHub Actions machinery used across Beman -repositories for CI. It contains the following reusable workflows: - -## `reusable-beman-build-and-test.yml` - -This is the main workflow file used for CI. It takes in a JSON build configuration like -the following example: - -```json -{ - "gcc": [ - { "versions": ["15"], - "tests": [ - { "cxxversions": ["c++26"], - "tests": [ - { "stdlibs": ["libstdc++"], - "tests": [ - "Debug.Default", "Release.Default", "Debug.TSan", "Debug.MaxSan", - "Debug.Werror", "Debug.Dynamic" - ] - } - ] - }, - { "cxxversions": ["c++23", "c++20", "c++17"], - "tests": [{ "stdlibs": ["libstdc++"], "tests": ["Release.Default"]}] - } - ] - }, - "clang-p2996": [ - { "versions": ["trunk"], - "tests": [ - { "cxxversions": ["c++26"], - "tests": [{"stdlibs": ["libc++"], "tests": ["Release.-DCMAKE_CXX_FLAGS='-freflection-latest'"]}] - } - ] - } - ] -} -``` - -It then runs jobs corresponding to the specified set of configurations. - -## `reusable-beman-create-issue-when-fault.yml` - -This workflow is intended to help with projects that invoke CI on a scheduled basis when -those jobs fail. It creates a GitHub issue describing the CI failure. - -## `reusable-beman-preset-test.yml` - -This workflow is intended to ensure that the CMake presets provided by beman/infra are -valid and working for the given repository. It takes in a JSON build configuration like -the following: - -```json -[ - {"preset": "gcc-debug", "image": "ghcr.io/bemanproject/infra-containers-gcc:latest"}, - {"preset": "gcc-release", "image": "ghcr.io/bemanproject/infra-containers-gcc:latest"}, - {"preset": "llvm-debug", "image": "ghcr.io/bemanproject/infra-containers-clang:latest"}, - {"preset": "llvm-release", "image": "ghcr.io/bemanproject/infra-containers-clang:latest"}, - {"preset": "appleclang-debug", "runner": "macos-latest"}, - {"preset": "appleclang-release", "runner": "macos-latest"}, - {"preset": "msvc-debug", "runner": "windows-latest"}, - {"preset": "msvc-release", "runner": "windows-latest"} -] -``` - -It then runs jobs corresponding to the specified set of presets. - -## `reusable-beman-pre-commit.yml` - -This provides a workflow for running the -[pre-commit](https://github.com/pre-commit/pre-commit) checks Beman libraries use, on pull -requests and on push. - -## `reusable-beman-submodule-check.yml` - -This provides a workflow for checking consistency of -[`beman-submodule`](https://github.com/bemanproject/infra/blob/main/tools/beman-submodule/README.md) -directories used by Beman repositories to deduplicate infrastructure. diff --git a/.github/workflows/ci_tests.yml b/.github/workflows/ci_tests.yml index 16fd11e..2054883 100644 --- a/.github/workflows/ci_tests.yml +++ b/.github/workflows/ci_tests.yml @@ -13,10 +13,10 @@ on: jobs: beman-submodule-check: - uses: ./.github/workflows/reusable-beman-submodule-check.yml + uses: bemanproject/infra-workflows/.github/workflows/reusable-beman-submodule-check.yml@1.3.0 preset-test: - uses: ./.github/workflows/reusable-beman-preset-test.yml + uses: bemanproject/infra-workflows/.github/workflows/reusable-beman-preset-test.yml@1.3.0 with: matrix_config: > [ @@ -24,12 +24,12 @@ jobs: {"preset": "gcc-release", "image": "ghcr.io/bemanproject/infra-containers-gcc:latest"}, {"preset": "llvm-debug", "image": "ghcr.io/bemanproject/infra-containers-clang:latest"}, {"preset": "llvm-release", "image": "ghcr.io/bemanproject/infra-containers-clang:latest"}, - {"preset": "appleclang-debug", "runner": "macos-latest"}, - {"preset": "appleclang-release", "runner": "macos-latest"} + {"preset": "msvc-debug", "runner": "windows-latest"}, + {"preset": "msvc-release", "runner": "windows-latest"} ] build-and-test: - uses: ./.github/workflows/reusable-beman-build-and-test.yml + uses: bemanproject/infra-workflows/.github/workflows/reusable-beman-build-and-test.yml@1.3.0 with: matrix_config: > { @@ -40,79 +40,67 @@ jobs: "tests": [ { "stdlibs": ["libstdc++"], "tests": [ - "Debug.Default", "Release.Default", "Release.TSan", - "Release.MaxSan", "Debug.Werror", "Debug.Dynamic", - "Debug.Coverage" + "Debug.Default", "Release.Default", "Release.MaxSan", + "Debug.Coverage", "Debug.Werror", + "Debug.Dynamic", "Release.Dynamic" ] } ] }, - { "cxxversions": ["c++23", "c++20"], + { "cxxversions": ["c++23"], "tests": [{ "stdlibs": ["libstdc++"], "tests": ["Release.Default"]}] } ] }, - { "versions": ["14", "13"], + { "versions": ["14"], "tests": [ - { "cxxversions": ["c++26", "c++23", "c++20"], - "tests": [{ "stdlibs": ["libstdc++"], "tests": ["Release.Default"]}] - } - ] - }, - { - "versions": ["11"], - "tests": [ - { "cxxversions": ["c++23", "c++20"], + { "cxxversions": ["c++26", "c++23"], "tests": [{ "stdlibs": ["libstdc++"], "tests": ["Release.Default"]}] } ] } ], "clang": [ - { "versions": ["20"], + { "versions": ["21"], "tests": [ {"cxxversions": ["c++26"], "tests": [ - { "stdlibs": ["libstdc++"], + { "stdlibs": ["libc++"], "tests": [ - "Debug.Default", "Release.Default", "Release.TSan", - "Release.MaxSan", "Debug.Werror", "Debug.Dynamic" + "Debug.Default", "Release.Default", "Release.MaxSan", + "Debug.Dynamic", "Release.Dynamic" ] } ] }, - { "cxxversions": ["c++23", "c++20"], + { "cxxversions": ["c++23"], "tests": [ - {"stdlibs": ["libstdc++", "libc++"], "tests": ["Release.Default"]} + {"stdlibs": ["libc++"], "tests": ["Release.Default"]} ] } ] }, - { "versions": ["19"], + { "versions": ["20", "19"], "tests": [ - { "cxxversions": ["c++26", "c++23", "c++20"], + { "cxxversions": ["c++26", "c++23"], "tests": [ - {"stdlibs": ["libstdc++", "libc++"], "tests": ["Release.Default"]} + {"stdlibs": ["libc++"], "tests": ["Release.Default"]} ] } ] - }, - { "versions": ["18", "17"], - "tests": [ - { "cxxversions": ["c++26", "c++23", "c++20"], - "tests": [{"stdlibs": ["libc++"], "tests": ["Release.Default"]}] - }, - { "cxxversions": ["c++20"], - "tests": [{"stdlibs": ["libstdc++"], "tests": ["Release.Default"]}] - } - ] } ], - "appleclang": [ + "msvc": [ { "versions": ["latest"], "tests": [ - { "cxxversions": ["c++26", "c++23", "c++20"], - "tests": [{ "stdlibs": ["libc++"], "tests": ["Release.Default"]}] + { "cxxversions": ["c++23"], + "tests": [ + { "stdlibs": ["stl"], + "tests": ["Debug.Default", "Release.Default", "Release.MaxSan", + "Debug.Dynamic", "Release.Dynamic" + ] + } + ] } ] } @@ -122,4 +110,4 @@ jobs: create-issue-when-fault: needs: [preset-test, build-and-test] if: failure() && github.event_name == 'schedule' - uses: ./.github/workflows/reusable-beman-create-issue-when-fault.yml + uses: bemanproject/infra-workflows/.github/workflows/reusable-beman-create-issue-when-fault.yml@1.3.0 diff --git a/.github/workflows/pre-commit-check.yml b/.github/workflows/pre-commit-check.yml new file mode 100644 index 0000000..2f91103 --- /dev/null +++ b/.github/workflows/pre-commit-check.yml @@ -0,0 +1,13 @@ +name: Lint Check (pre-commit) + +on: + # We have to use pull_request_target here as pull_request does not grant + # enough permission for reviewdog + pull_request_target: + push: + branches: + - main + +jobs: + pre-commit: + uses: bemanproject/infra-workflows/.github/workflows/reusable-beman-pre-commit.yml@1.3.0 diff --git a/.github/workflows/pre-commit-update.yml b/.github/workflows/pre-commit-update.yml new file mode 100644 index 0000000..930b750 --- /dev/null +++ b/.github/workflows/pre-commit-update.yml @@ -0,0 +1,15 @@ +# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + +name: Weekly pre-commit autoupdate + +on: + workflow_dispatch: + schedule: + - cron: "0 16 * * 0" + +jobs: + auto-update-pre-commit: + uses: bemanproject/infra-workflows/.github/workflows/reusable-beman-update-pre-commit.yml@1.3.0 + secrets: + APP_ID: ${{ secrets.AUTO_PR_BOT_APP_ID }} + PRIVATE_KEY: ${{ secrets.AUTO_PR_BOT_PRIVATE_KEY }} diff --git a/.github/workflows/reusable-beman-build-and-test.yml b/.github/workflows/reusable-beman-build-and-test.yml deleted file mode 100644 index a347c4c..0000000 --- a/.github/workflows/reusable-beman-build-and-test.yml +++ /dev/null @@ -1,174 +0,0 @@ -# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception - -name: 'Beman build-and-test matrix' -on: - workflow_call: - inputs: - matrix_config: - description: 'JSON specification of tests to run' - type: string - required: true -jobs: - configure_test_matrix: - name: Configure test matrix - runs-on: ubuntu-latest - outputs: - matrix: ${{ steps.set-matrix.outputs.matrix }} - steps: - - uses: actions/checkout@v4 - - id: set-matrix - shell: python - run: | - import json - import os - import sys - - input_data = json.loads('''${{inputs.matrix_config}}''') - output_list = [] - - image_prefix = "ghcr.io/bemanproject/infra-containers-" - for compiler, compiler_tests in input_data.items(): - for compiler_test in compiler_tests: - for version in compiler_test["versions"]: - image = None - if compiler == "gcc" or compiler.startswith("clang"): - image = image_prefix + compiler + ":" + version - for versions_test in compiler_test["tests"]: - for cxxversion in versions_test["cxxversions"]: - for cxxversion_test in versions_test["tests"]: - for stdlib in cxxversion_test["stdlibs"]: - for stdlib_test in cxxversion_test["tests"]: - test = { - "compiler": compiler, - "version": version, - "cxxversion": cxxversion, - "stdlib": stdlib, - "test": stdlib_test - } - if image is not None: - test["image"] = image - output_list.append(test) - json_string = json.dumps(output_list) - with open(os.environ['GITHUB_OUTPUT'], 'a') as output_file: - print(f"matrix={json_string}", file=output_file) - test_matrix: - needs: configure_test_matrix - strategy: - fail-fast: false - matrix: - config: ${{ fromJson(needs.configure_test_matrix.outputs.matrix) }} - name: "${{ matrix.config.compiler }} ${{ matrix.config.version }} ${{ matrix.config.cxxversion }} ${{ matrix.config.stdlib }} ${{ matrix.config.test }}" - runs-on: >- - ${{ (matrix.config.compiler == 'gcc' || startsWith(matrix.config.compiler, 'clang')) && 'ubuntu-latest' - || (matrix.config.compiler == 'appleclang' && 'macos-latest') - || (matrix.config.compiler == 'msvc' && 'windows-latest') }} - container: ${{ matrix.config.image }} - steps: - - name: Checkout repository - uses: actions/checkout@v4 - with: - submodules: 'recursive' - - name: Setup MSVC - if: matrix.config.compiler == 'msvc' - uses: TheMrMilchmann/setup-msvc-dev@v3 - with: - arch: x64 - - name: Setup Macos - if: matrix.config.compiler == 'appleclang' - shell: bash - run: sudo chmod -R 777 /opt/ - - name: Print installed software - shell: bash - run: | - echo "Build system:" - cmake --version - ninja --version - - name: Process configuration - id: vars - shell: bash - run: | - cxxversion=${{ matrix.config.cxxversion }} - echo "cpp_version=${cxxversion#c++}" >> "$GITHUB_OUTPUT" - case ${{ matrix.config.compiler }} in - gcc) echo "toolchain_file=infra/cmake/gnu-toolchain.cmake" >> "$GITHUB_OUTPUT" ;; - clang*) - case ${{ matrix.config.stdlib }} in - libstdc++) - echo "toolchain_file=infra/cmake/llvm-toolchain.cmake" >> "$GITHUB_OUTPUT" ;; - libc++) - echo "toolchain_file=infra/cmake/llvm-libc++-toolchain.cmake" >> "$GITHUB_OUTPUT" ;; - esac ;; - appleclang) - echo "toolchain_file=infra/cmake/appleclang-toolchain.cmake" >> "$GITHUB_OUTPUT" ;; - msvc) - echo "toolchain_file=infra/cmake/msvc-toolchain.cmake" >> "$GITHUB_OUTPUT" ;; - esac - test=${{ matrix.config.test }} - echo "build_config=${test%%[.]*}" >> "$GITHUB_OUTPUT" - test_type=${test##*[.]} - echo "test_type=$test_type" >> "$GITHUB_OUTPUT" - case $test_type in - Default) ;; - TSan) - echo "cmake_extra_args=-DBEMAN_BUILDSYS_SANITIZER=TSan" >> "$GITHUB_OUTPUT" ;; - MaxSan) - echo "cmake_extra_args=-DBEMAN_BUILDSYS_SANITIZER=MaxSan" >> "$GITHUB_OUTPUT" ;; - Werror) - echo "cmake_extra_args=-DCMAKE_CXX_FLAGS='-Werror=all -Werror=extra'" >> "$GITHUB_OUTPUT" ;; - Dynamic) - echo "cmake_extra_args=-DBUILD_SHARED_LIBS=on" >> "$GITHUB_OUTPUT" ;; - Coverage) - echo "cmake_extra_args=-DCMAKE_CXX_FLAGS='-fno-default-inline -fno-inline --coverage -fprofile-abs-path'" >> "$GITHUB_OUTPUT";; - *) - echo "cmake_extra_args=$test_type" >> "$GITHUB_OUTPUT" ;; - esac - - name: Print parameters - shell: bash - run: | - echo ${{ matrix.config.compiler }} ${{ matrix.config.cxxversion }} ${{ matrix.config.stdlib }} ${{ matrix.config.test }} - echo ${{ steps.vars.outputs.cpp_version }} ${{ steps.vars.outputs.toolchain_file }} ${{ steps.vars.outputs.cmake_extra_args }} ${{ steps.vars.outputs.build_config }} - - name: Configure CMake - shell: bash - run: | - cmake \ - -B build \ - -S . \ - -DCMAKE_CXX_STANDARD=${{ steps.vars.outputs.cpp_version }} \ - -DCMAKE_TOOLCHAIN_FILE="${{ steps.vars.outputs.toolchain_file }}" \ - -DCMAKE_PROJECT_TOP_LEVEL_INCLUDES="./infra/cmake/use-fetch-content.cmake" \ - ${{ steps.vars.outputs.cmake_extra_args }} - env: - CMAKE_GENERATOR: "Ninja Multi-Config" - - name: Build - shell: bash - run: | - cmake --build build --config ${{ steps.vars.outputs.build_config }} --parallel --verbose - cmake --build build --config ${{ steps.vars.outputs.build_config }} --target all_verify_interface_header_sets - cmake --install build --config ${{ steps.vars.outputs.build_config }} --prefix /opt/beman.package - ls -R /opt/beman.package - - name: Test - shell: bash - run: ctest --test-dir build --build-config ${{ steps.vars.outputs.build_config }} --output-on-failure - - name: Generate Coverage Files - if: steps.vars.outputs.test_type == 'Coverage' - shell: bash - run: | - cat > gcovr.cfg < +# TARGETS [ ...] +# [DEPENDENCIES [ ...]] +# [NAMESPACE ] +# [EXPORT_NAME ] +# [DESTINATION ] +# [VERSION_SUFFIX] +# ) +# +# Arguments: +# ---------- +# +# name +# Logical package name (e.g. "beman.utility"). +# Used to derive config file names and cache variable prefixes. +# +# TARGETS (required) +# List of CMake targets to install. +# +# DEPENDENCIES (optional) +# Semicolon-separated list, one dependency per entry. +# Each entry is a valid find_dependency() argument list. +# Note: you must use the bracket form for quoting if not only a package name is used! +# "[===[beman.inplace_vector 1.0.0]===] [===[beman.scope 0.0.1 EXACT]===] fmt" +# +# NAMESPACE (optional) +# Namespace for exported targets. +# Defaults to "beman::". +# +# EXPORT_NAME (optional) +# Name of the CMake export set. +# Defaults to "-targets". +# +# DESTINATION (optional) +# The install destination for CXX_MODULES. +# Defaults to ${CMAKE_INSTALL_LIBDIR}/cmake/${name}/modules. +# +# VERSION_SUFFIX (optional) +# option to enable the versioning of install destinations +# +# Brief +# ----- +# +# This function installs the specified project TARGETS and its FILE_SET +# HEADERS to the default CMAKE install destination. +# +# It also handles the installation of the CMake config package files if +# needed. If the given targets has FILE_SET CXX_MODULE, it will also +# installed to the given DESTINATION +# +# Cache variables: +# ---------------- +# +# BEMAN_INSTALL_CONFIG_FILE_PACKAGES +# List of package names for which config files should be installed. +# +# _INSTALL_CONFIG_FILE_PACKAGE +# Per-package override to enable/disable config file installation. +# is the uppercased package name with dots replaced by underscores. +# +# Caveats +# ------- +# +# **Only one `FILE_SET CXX_MODULES` is yet supported to install with this +# function!** +# +# **Only header files contained in a `PUBLIC FILE_SET TYPE HEADERS` will be +# install with this function!** + +function(beman_install_library name) + # ---------------------------- + # Argument parsing + # ---------------------------- + set(options VERSION_SUFFIX) + set(oneValueArgs NAMESPACE EXPORT_NAME DESTINATION) + set(multiValueArgs TARGETS DEPENDENCIES) + + cmake_parse_arguments( + BEMAN + "${options}" + "${oneValueArgs}" + "${multiValueArgs}" + ${ARGN} + ) + + if(NOT BEMAN_TARGETS) + message( + FATAL_ERROR + "beman_install_library(${name}): TARGETS must be specified" + ) + endif() + + if(CMAKE_SKIP_INSTALL_RULES) + message( + WARNING + "beman_install_library(${name}): not installing targets '${BEMAN_TARGETS}' due to CMAKE_SKIP_INSTALL_RULES" + ) + return() + endif() + + # gersemi: off + set(_version_suffix) + set(_include_install_dir) + set(_lib_install_dir) + set(_bin_install_dir) + # NOTE: If one of this variables is not set, the default DESTINATION is used! CK + if(BEMAN_VERSION_SUFFIX) + set(_version_suffix "-${PROJECT_VERSION}") + set(_include_install_dir DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/beman${_version_suffix}) + # set(_lib_install_dir DESTINATION ${CMAKE_INSTALL_LIBDIR}/beman${_version_suffix}) + # set(_bin_install_dir DESTINATION ${CMAKE_INSTALL_BINDIR}/beman${_version_suffix}) + endif() + set(_config_install_dir "${CMAKE_INSTALL_LIBDIR}/cmake/${name}${_version_suffix}") + # gersemi: on + + # ---------------------------- + # Defaults + # ---------------------------- + if(NOT BEMAN_NAMESPACE) + set(BEMAN_NAMESPACE "beman::") + endif() + + if(NOT BEMAN_EXPORT_NAME) + set(BEMAN_EXPORT_NAME "${name}-targets") + endif() + + if(NOT BEMAN_DESTINATION) + set(BEMAN_DESTINATION "${_config_install_dir}/modules") + endif() + + string(REPLACE "beman." "" install_component_name "${name}") + message( + VERBOSE + "beman-install-library(${name}): COMPONENT '${install_component_name}'" + ) + + # -------------------------------------------------- + # Install each target with all of its file sets + # -------------------------------------------------- + foreach(_tgt IN LISTS BEMAN_TARGETS) + if(NOT TARGET "${_tgt}") + message( + WARNING + "beman_install_library(${name}): '${_tgt}' is not a target" + ) + continue() + endif() + + # Given foo.bar, the component name is bar + string(REPLACE "." ";" name_parts "${_tgt}") + # fail if the name doesn't look like foo.bar + list(LENGTH name_parts name_parts_length) + if(NOT name_parts_length EQUAL 2) + message( + FATAL_ERROR + "beman_install_library(${name}): expects a name of the form 'beman.', got '${_tgt}'" + ) + endif() + list(GET name_parts -1 component_name) + set_target_properties( + "${_tgt}" + PROPERTIES EXPORT_NAME "${component_name}" + ) + message( + VERBOSE + "beman_install_library(${name}): EXPORT_NAME ${component_name} for TARGET '${_tgt}'" + ) + + # Get the list of interface header sets, exact one expected! + set(_install_header_set_args) + get_target_property( + _available_header_sets + ${_tgt} + INTERFACE_HEADER_SETS + ) + if(_available_header_sets) + message( + VERBOSE + "beman-install-library(${name}): '${_tgt}' has INTERFACE_HEADER_SETS=${_available_header_sets}" + ) + foreach(_install_header_set IN LISTS _available_header_sets) + list( + APPEND _install_header_set_args + FILE_SET + "${_install_header_set}" + ${_include_install_dir} + COMPONENT + "${install_component_name}_Development" + ) + endforeach() + else() + set(_install_header_set_args FILE_SET HEADERS) # Note: empty FILE_SET in this case! CK + endif() + + # Detect presence of C++ module file sets, exact one expected! + get_target_property(_module_sets "${_tgt}" CXX_MODULE_SETS) + if(_module_sets) + message( + VERBOSE + "beman-install-library(${name}): '${_tgt}' has CXX_MODULE_SETS=${_module_sets}" + ) + install( + TARGETS "${_tgt}" + EXPORT ${BEMAN_EXPORT_NAME} + ARCHIVE + ${_lib_install_dir} + COMPONENT "${install_component_name}_Development" + LIBRARY + ${_lib_install_dir} + COMPONENT "${install_component_name}_Runtime" + NAMELINK_COMPONENT "${install_component_name}_Development" + RUNTIME + ${_bin_install_dir} + COMPONENT "${install_component_name}_Runtime" + ${_install_header_set_args} + FILE_SET ${_module_sets} + DESTINATION "${BEMAN_DESTINATION}" + COMPONENT "${install_component_name}_Development" + # NOTE: There's currently no convention for this location! CK + CXX_MODULES_BMI + # TODO(CK): DESTINATION ${_config_install_dir}/bmi-${CMAKE_CXX_COMPILER_ID}_$ + COMPONENT "${install_component_name}_Development" + ) + else() + install( + TARGETS "${_tgt}" + EXPORT ${BEMAN_EXPORT_NAME} + ARCHIVE + ${_lib_install_dir} + COMPONENT "${install_component_name}_Development" + LIBRARY + ${_lib_install_dir} + COMPONENT "${install_component_name}_Runtime" + NAMELINK_COMPONENT "${install_component_name}_Development" + RUNTIME + ${_bin_install_dir} + COMPONENT "${install_component_name}_Runtime" + ${_install_header_set_args} + ) + endif() + endforeach() + + # -------------------------------------------------- + # Export targets + # -------------------------------------------------- + # gersemi: off + install( + EXPORT ${BEMAN_EXPORT_NAME} + NAMESPACE ${BEMAN_NAMESPACE} + CXX_MODULES_DIRECTORY cxx-modules + DESTINATION ${_config_install_dir} + COMPONENT "${install_component_name}_Development" + ) + # gersemi: on + + # ---------------------------------------- + # Config file installation logic + # ---------------------------------------- + string(TOUPPER "${name}" _pkg_upper) + string(REPLACE "." "_" _pkg_prefix "${_pkg_upper}") + + option( + ${_pkg_prefix}_INSTALL_CONFIG_FILE_PACKAGE + "Enable creating and installing a CMake config-file package. Default: ON. Values: { ON, OFF }." + ON + ) + + set(_pkg_var "${_pkg_prefix}_INSTALL_CONFIG_FILE_PACKAGE") + + if(NOT DEFINED ${_pkg_var}) + set(${_pkg_var} + OFF + CACHE BOOL + "Install CMake package config files for ${name}" + ) + endif() + + set(_install_config OFF) + + if(${_pkg_var}) + set(_install_config ON) + elseif(BEMAN_INSTALL_CONFIG_FILE_PACKAGES) + list(FIND BEMAN_INSTALL_CONFIG_FILE_PACKAGES "${name}" _idx) + if(NOT _idx EQUAL -1) + set(_install_config ON) + endif() + endif() + + # ---------------------------------------- + # expand dependencies + # ---------------------------------------- + set(_beman_find_deps "") + foreach(dep IN ITEMS ${BEMAN_DEPENDENCIES}) + message( + VERBOSE + "beman-install-library(${name}): Add find_dependency(${dep})" + ) + string(APPEND _beman_find_deps "find_dependency(${dep})\n") + endforeach() + set(BEMAN_FIND_DEPENDENCIES "${_beman_find_deps}") + + # ---------------------------------------- + # Generate + install config files + # ---------------------------------------- + if(_install_config) + configure_package_config_file( + "${CMAKE_CURRENT_FUNCTION_LIST_DIR}/Config.cmake.in" + "${CMAKE_CURRENT_BINARY_DIR}/${name}-config.cmake" + INSTALL_DESTINATION ${_config_install_dir} + ) + + write_basic_package_version_file( + "${CMAKE_CURRENT_BINARY_DIR}/${name}-config-version.cmake" + VERSION ${PROJECT_VERSION} + COMPATIBILITY SameMajorVersion + ) + + install( + FILES + "${CMAKE_CURRENT_BINARY_DIR}/${name}-config.cmake" + "${CMAKE_CURRENT_BINARY_DIR}/${name}-config-version.cmake" + DESTINATION ${_config_install_dir} + COMPONENT "${install_component_name}_Development" + ) + else() + message( + WARNING + "beman-install-library(${name}): Not installing a config package for '${name}'" + ) + endif() +endfunction() + +set(CPACK_GENERATOR TGZ) +include(CPack) diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index ac726ae..402ed96 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -3,6 +3,24 @@ # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception # cmake-format: on +cmake_minimum_required(VERSION 3.30...4.3) + +# include(../cmake/prelude.cmake) + +project(beman_net.example LANGUAGES CXX) + +# TODO(CK): cmake -S . -G Ninja -B build -D CMAKE_BUILD_TYPE=RelWithDebInfo --fresh +if(PROJECT_IS_TOP_LEVEL) + # include(../cmake/cxx-modules-rules.cmake) + set(BEMAN_USE_MODULES OFF) + set(BEMAN_USE_STD_MODULE OFF) + set(CMAKE_CXX_STANDARD 23) + + find_package(beman.net 0.1.0 EXACT REQUIRED) + + enable_testing() +endif() + set(EXAMPLES http-warwick taps @@ -21,12 +39,9 @@ foreach(EXAMPLE ${EXAMPLES}) set(EXAMPLE_TARGET ${TARGET_PREFIX}.examples.${EXAMPLE}) add_executable(${EXAMPLE_TARGET}) if(BEMAN_NET_WITH_URING) - target_compile_definitions( - ${EXAMPLE_TARGET} - PRIVATE BEMAN_NET_USE_URING - ) + # XXX target_compile_definitions( ${EXAMPLE_TARGET} PRIVATE BEMAN_NET_USE_URING) endif() target_sources(${EXAMPLE_TARGET} PRIVATE ${EXAMPLE}.cpp) - target_link_libraries(${EXAMPLE_TARGET} PRIVATE ${TARGET_LIBRARY}) - target_link_libraries(${EXAMPLE_TARGET} PRIVATE beman::task) + target_link_libraries(${EXAMPLE_TARGET} PRIVATE beman::net_headers) + target_link_libraries(${EXAMPLE_TARGET} PRIVATE beman::task_headers) endforeach() diff --git a/src/beman/net/CMakeLists.txt b/src/beman/net/CMakeLists.txt index 439f08a..7e352fc 100644 --- a/src/beman/net/CMakeLists.txt +++ b/src/beman/net/CMakeLists.txt @@ -3,81 +3,65 @@ # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception # cmake-format: on -add_library(${TARGET_LIBRARY} STATIC) -add_library(${TARGET_ALIAS} ALIAS ${TARGET_LIBRARY}) +add_library(${PROJECT_NAME}_headers INTERFACE) +add_library(beman::net_headers ALIAS ${PROJECT_NAME}_headers) target_sources( - ${TARGET_LIBRARY} - PRIVATE net.cpp + ${PROJECT_NAME}_headers + # XXX PRIVATE net.cpp PUBLIC - FILE_SET ${TARGET_LIBRARY}_public_headers + FILE_SET public_headers TYPE HEADERS BASE_DIRS ${PROJECT_SOURCE_DIR}/include - FILES ${PROJECT_SOURCE_DIR}/include/beman/${TARGET_NAME}/net.hpp + FILES ${PROJECT_SOURCE_DIR}/include/beman/net/net.hpp PUBLIC - FILE_SET ${TARGET_LIBRARY}_detail_headers + FILE_SET detail_headers TYPE HEADERS BASE_DIRS ${PROJECT_SOURCE_DIR}/include FILES - ${PROJECT_SOURCE_DIR}/include/beman/${TARGET_NAME}/detail/basic_socket.hpp - ${PROJECT_SOURCE_DIR}/include/beman/${TARGET_NAME}/detail/basic_socket_acceptor.hpp - ${PROJECT_SOURCE_DIR}/include/beman/${TARGET_NAME}/detail/basic_stream_socket.hpp - ${PROJECT_SOURCE_DIR}/include/beman/${TARGET_NAME}/detail/buffer.hpp - ${PROJECT_SOURCE_DIR}/include/beman/${TARGET_NAME}/detail/container.hpp - ${PROJECT_SOURCE_DIR}/include/beman/${TARGET_NAME}/detail/context_base.hpp - ${PROJECT_SOURCE_DIR}/include/beman/${TARGET_NAME}/detail/endpoint.hpp - ${PROJECT_SOURCE_DIR}/include/beman/${TARGET_NAME}/detail/execution.hpp - ${PROJECT_SOURCE_DIR}/include/beman/${TARGET_NAME}/detail/internet.hpp - ${PROJECT_SOURCE_DIR}/include/beman/${TARGET_NAME}/detail/io_base.hpp - ${PROJECT_SOURCE_DIR}/include/beman/${TARGET_NAME}/detail/io_context.hpp - ${PROJECT_SOURCE_DIR}/include/beman/${TARGET_NAME}/detail/io_context_scheduler.hpp - ${PROJECT_SOURCE_DIR}/include/beman/${TARGET_NAME}/detail/netfwd.hpp - ${PROJECT_SOURCE_DIR}/include/beman/${TARGET_NAME}/detail/operations.hpp - ${PROJECT_SOURCE_DIR}/include/beman/${TARGET_NAME}/detail/poll_context.hpp - ${PROJECT_SOURCE_DIR}/include/beman/${TARGET_NAME}/detail/sender.hpp - ${PROJECT_SOURCE_DIR}/include/beman/${TARGET_NAME}/detail/socket_base.hpp - ${PROJECT_SOURCE_DIR}/include/beman/${TARGET_NAME}/detail/socket_category.hpp - ${PROJECT_SOURCE_DIR}/include/beman/${TARGET_NAME}/detail/sorted_list.hpp - ${PROJECT_SOURCE_DIR}/include/beman/${TARGET_NAME}/detail/stop_token.hpp - ${PROJECT_SOURCE_DIR}/include/beman/${TARGET_NAME}/detail/timer.hpp - ${PROJECT_SOURCE_DIR}/include/beman/${TARGET_NAME}/detail/uring_context.hpp + ${PROJECT_SOURCE_DIR}/include/beman/net/detail/basic_socket.hpp + ${PROJECT_SOURCE_DIR}/include/beman/net/detail/basic_socket_acceptor.hpp + ${PROJECT_SOURCE_DIR}/include/beman/net/detail/basic_stream_socket.hpp + ${PROJECT_SOURCE_DIR}/include/beman/net/detail/buffer.hpp + ${PROJECT_SOURCE_DIR}/include/beman/net/detail/container.hpp + ${PROJECT_SOURCE_DIR}/include/beman/net/detail/context_base.hpp + ${PROJECT_SOURCE_DIR}/include/beman/net/detail/endpoint.hpp + ${PROJECT_SOURCE_DIR}/include/beman/net/detail/execution.hpp + ${PROJECT_SOURCE_DIR}/include/beman/net/detail/internet.hpp + ${PROJECT_SOURCE_DIR}/include/beman/net/detail/io_base.hpp + ${PROJECT_SOURCE_DIR}/include/beman/net/detail/io_context.hpp + ${PROJECT_SOURCE_DIR}/include/beman/net/detail/io_context_scheduler.hpp + ${PROJECT_SOURCE_DIR}/include/beman/net/detail/netfwd.hpp + ${PROJECT_SOURCE_DIR}/include/beman/net/detail/operations.hpp + ${PROJECT_SOURCE_DIR}/include/beman/net/detail/poll_context.hpp + ${PROJECT_SOURCE_DIR}/include/beman/net/detail/sender.hpp + ${PROJECT_SOURCE_DIR}/include/beman/net/detail/socket_base.hpp + ${PROJECT_SOURCE_DIR}/include/beman/net/detail/socket_category.hpp + ${PROJECT_SOURCE_DIR}/include/beman/net/detail/sorted_list.hpp + ${PROJECT_SOURCE_DIR}/include/beman/net/detail/stop_token.hpp + ${PROJECT_SOURCE_DIR}/include/beman/net/detail/timer.hpp + ${PROJECT_SOURCE_DIR}/include/beman/net/detail/uring_context.hpp ) + get_property( DETAIL_HEADER_FILES - TARGET ${TARGET_LIBRARY} - PROPERTY HEADER_SET_${TARGET_LIBRARY}_detail_headers + TARGET ${PROJECT_NAME}_headers + PROPERTY HEADER_SET_detail_headers ) source_group("Header Files\\detail" FILES ${DETAIL_HEADER_FILES}) -include(GNUInstallDirs) -include_directories(${CMAKE_CURRENT_SOURCE_DIR}) - -string(TOLOWER ${CMAKE_PROJECT_NAME} CMAKE_LOWER_PROJECT_NAME) - -install( - TARGETS ${TARGET_LIBRARY} - EXPORT ${TARGETS_EXPORT_NAME} - ARCHIVE DESTINATION lib/$ - FILE_SET ${TARGET_LIBRARY}_public_headers - FILE_SET ${TARGET_LIBRARY}_detail_headers +target_link_libraries(${PROJECT_NAME}_headers INTERFACE beman::task_headers) +set_target_properties( + ${PROJECT_NAME}_headers + PROPERTIES VERIFY_INTERFACE_HEADER_SETS ON ) -target_include_directories( - ${TARGET_LIBRARY} - PUBLIC $ -) -target_link_libraries(${TARGET_LIBRARY} PUBLIC beman::task) -if(BEMAN_NET_WITH_URING) +if(LINUX AND BEMAN_NET_WITH_URING) find_package(PkgConfig REQUIRED) pkg_check_modules(uring REQUIRED IMPORTED_TARGET liburing) - target_link_libraries(${TARGET_LIBRARY} PUBLIC PkgConfig::uring) -endif() - -if(FALSE) - install( - EXPORT ${TARGETS_EXPORT_NAME} - FILE ${TARGET_LIBRARY}-config.cmake - DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${TARGET_LIBRARY}" - NAMESPACE ${TARGET_LIBRARY}:: + target_link_libraries(${PROJECT_NAME}_headers INTERFACE PkgConfig::uring) + target_compile_definitions( + ${PROJECT_NAME}_headers + INTERFACE BEMAN_NET_USE_URING ) endif() diff --git a/tests/beman/net/CMakeLists.txt b/tests/beman/net/CMakeLists.txt index 8c9e744..81e054e 100644 --- a/tests/beman/net/CMakeLists.txt +++ b/tests/beman/net/CMakeLists.txt @@ -7,6 +7,6 @@ list(APPEND tests sorted_list.pass) foreach(test ${tests}) add_executable(${test} ${test}.cpp) - target_link_libraries(${test} PRIVATE ${TARGET_LIBRARY}) + target_link_libraries(${test} PRIVATE beman::net_headers) add_test(NAME ${test} COMMAND $) endforeach() From e7c4826cd72e20411e04f4f62075359aaf7870a7 Mon Sep 17 00:00:00 2001 From: ClausKlein Date: Mon, 23 Feb 2026 13:38:44 +0100 Subject: [PATCH 2/5] Use FETCHCONTENT_SOURCE_DIR_ right --- CMakeLists.txt | 10 ++++++---- Makefile | 3 ++- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index fe91750..d2923f7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -18,16 +18,18 @@ option( option( BEMAN_NET_BUILD_EXAMPLES "Enable building examples. Default: ON. Values: { ON, OFF }." - ${PROJECT_IS_TOP_LEVEL} + OFF # TODO(CK): ${PROJECT_IS_TOP_LEVEL} ) -option(BEMAN_NET_WITH_URING "Enable liburing io context" OFF) +if(LINUX) + option(BEMAN_NET_WITH_URING "Enable liburing io context" OFF) +endif() include(FetchContent) FetchContent_Declare( execution - # SOURCE_DIR ${CMAKE_SOURCE_DIR}/../execution + # FETCHCONTENT_SOURCE_DIR_EXECUTION ${CMAKE_SOURCE_DIR}/../execution GIT_REPOSITORY https://github.com/bemanproject/execution GIT_TAG 66295d5 SYSTEM @@ -43,7 +45,7 @@ FetchContent_MakeAvailable(execution) FetchContent_Declare( task - # SOURCE_DIR ${CMAKE_SOURCE_DIR}/../task + # FETCHCONTENT_SOURCE_DIR_TASK ${CMAKE_SOURCE_DIR}/../task GIT_REPOSITORY https://github.com/bemanproject/task GIT_TAG 9075137 FIND_PACKAGE_ARGS 0.2.0 EXACT NAMES beman.task COMPONENTS task_headers diff --git a/Makefile b/Makefile index ebda0d3..1bc894c 100644 --- a/Makefile +++ b/Makefile @@ -64,7 +64,8 @@ $(SANITIZERS): build: @mkdir -p $(BUILD) - cd $(BUILD); CC=$(CXX) cmake $(SOURCEDIR) $(TOOLCHAIN) $(SYSROOT) -DCMAKE_CXX_STANDARD=23 -DCMAKE_CXX_COMPILER=$(CXX) -DCMAKE_CXX_FLAGS="$(CXX_FLAGS) $(SAN_FLAGS)" + cd $(BUILD); CC=$(CXX) cmake $(SOURCEDIR) $(TOOLCHAIN) $(SYSROOT) -DCMAKE_CXX_STANDARD=23 -DCMAKE_CXX_COMPILER=$(CXX) -DCMAKE_CXX_FLAGS="$(CXX_FLAGS) $(SAN_FLAGS)" \ + --log-level=VERBOSE -Wdev cmake --build $(BUILD) test: build From 7371894ba108bfecc6e16bd289d56d6d61dec1cd Mon Sep 17 00:00:00 2001 From: ClausKlein Date: Mon, 23 Feb 2026 13:50:47 +0100 Subject: [PATCH 3/5] Disable VERIFY_INTERFACE_HEADER_SETS for now --- src/beman/net/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/beman/net/CMakeLists.txt b/src/beman/net/CMakeLists.txt index 7e352fc..2eca9a7 100644 --- a/src/beman/net/CMakeLists.txt +++ b/src/beman/net/CMakeLists.txt @@ -53,7 +53,7 @@ source_group("Header Files\\detail" FILES ${DETAIL_HEADER_FILES}) target_link_libraries(${PROJECT_NAME}_headers INTERFACE beman::task_headers) set_target_properties( ${PROJECT_NAME}_headers - PROPERTIES VERIFY_INTERFACE_HEADER_SETS ON + PROPERTIES VERIFY_INTERFACE_HEADER_SETS OFF # FIXME:${PROJECT_IS_TOP_LEVEL} ) if(LINUX AND BEMAN_NET_WITH_URING) From f043a83fd71d734260d84a106f1b8c1f2fffa7af Mon Sep 17 00:00:00 2001 From: Claus Klein Date: Mon, 23 Feb 2026 15:23:36 +0100 Subject: [PATCH 4/5] Update src/beman/net/CMakeLists.txt Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- src/beman/net/CMakeLists.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/beman/net/CMakeLists.txt b/src/beman/net/CMakeLists.txt index 2eca9a7..86c40e5 100644 --- a/src/beman/net/CMakeLists.txt +++ b/src/beman/net/CMakeLists.txt @@ -53,7 +53,9 @@ source_group("Header Files\\detail" FILES ${DETAIL_HEADER_FILES}) target_link_libraries(${PROJECT_NAME}_headers INTERFACE beman::task_headers) set_target_properties( ${PROJECT_NAME}_headers - PROPERTIES VERIFY_INTERFACE_HEADER_SETS OFF # FIXME:${PROJECT_IS_TOP_LEVEL} + PROPERTIES + VERIFY_INTERFACE_HEADER_SETS + OFF # FIXME:${PROJECT_IS_TOP_LEVEL} ) if(LINUX AND BEMAN_NET_WITH_URING) From 2a02d3eda3a00a1823b37f4085d3cb36055e3eaf Mon Sep 17 00:00:00 2001 From: ClausKlein Date: Mon, 23 Feb 2026 16:30:24 +0100 Subject: [PATCH 5/5] Install all headers for now --- src/beman/net/CMakeLists.txt | 54 ++++++++++++++++++++++++------------ 1 file changed, 36 insertions(+), 18 deletions(-) diff --git a/src/beman/net/CMakeLists.txt b/src/beman/net/CMakeLists.txt index 86c40e5..18f993c 100644 --- a/src/beman/net/CMakeLists.txt +++ b/src/beman/net/CMakeLists.txt @@ -13,34 +13,52 @@ target_sources( FILE_SET public_headers TYPE HEADERS BASE_DIRS ${PROJECT_SOURCE_DIR}/include - FILES ${PROJECT_SOURCE_DIR}/include/beman/net/net.hpp + FILES + ${PROJECT_SOURCE_DIR}/include/beman/net/net.hpp + ${PROJECT_SOURCE_DIR}/include/beman/net29/net.hpp PUBLIC FILE_SET detail_headers TYPE HEADERS BASE_DIRS ${PROJECT_SOURCE_DIR}/include FILES - ${PROJECT_SOURCE_DIR}/include/beman/net/detail/basic_socket.hpp - ${PROJECT_SOURCE_DIR}/include/beman/net/detail/basic_socket_acceptor.hpp - ${PROJECT_SOURCE_DIR}/include/beman/net/detail/basic_stream_socket.hpp - ${PROJECT_SOURCE_DIR}/include/beman/net/detail/buffer.hpp + ${PROJECT_SOURCE_DIR}/include/beman/net/detail/into_expected.hpp + ${PROJECT_SOURCE_DIR}/include/beman/net/detail/netfwd.hpp + ${PROJECT_SOURCE_DIR}/include/beman/net/detail/poll_context.hpp ${PROJECT_SOURCE_DIR}/include/beman/net/detail/container.hpp - ${PROJECT_SOURCE_DIR}/include/beman/net/detail/context_base.hpp - ${PROJECT_SOURCE_DIR}/include/beman/net/detail/endpoint.hpp - ${PROJECT_SOURCE_DIR}/include/beman/net/detail/execution.hpp + ${PROJECT_SOURCE_DIR}/include/beman/net/detail/basic_stream_socket.hpp + ${PROJECT_SOURCE_DIR}/include/beman/net/detail/security_props.hpp + ${PROJECT_SOURCE_DIR}/include/beman/net/detail/io_context_scheduler.hpp ${PROJECT_SOURCE_DIR}/include/beman/net/detail/internet.hpp - ${PROJECT_SOURCE_DIR}/include/beman/net/detail/io_base.hpp + ${PROJECT_SOURCE_DIR}/include/beman/net/detail/transport_preference.hpp + ${PROJECT_SOURCE_DIR}/include/beman/net/detail/transport_props.hpp + ${PROJECT_SOURCE_DIR}/include/beman/net/detail/scope.hpp + ${PROJECT_SOURCE_DIR}/include/beman/net/detail/execution.hpp + ${PROJECT_SOURCE_DIR}/include/beman/net/detail/get_io_handle.hpp + ${PROJECT_SOURCE_DIR}/include/beman/net/detail/context_base.hpp + ${PROJECT_SOURCE_DIR}/include/beman/net/detail/task.hpp + ${PROJECT_SOURCE_DIR}/include/beman/net/detail/preconnection.hpp + ${PROJECT_SOURCE_DIR}/include/beman/net/detail/local_endpoint.hpp + ${PROJECT_SOURCE_DIR}/include/beman/net/detail/rendezvous.hpp ${PROJECT_SOURCE_DIR}/include/beman/net/detail/io_context.hpp - ${PROJECT_SOURCE_DIR}/include/beman/net/detail/io_context_scheduler.hpp - ${PROJECT_SOURCE_DIR}/include/beman/net/detail/netfwd.hpp - ${PROJECT_SOURCE_DIR}/include/beman/net/detail/operations.hpp - ${PROJECT_SOURCE_DIR}/include/beman/net/detail/poll_context.hpp - ${PROJECT_SOURCE_DIR}/include/beman/net/detail/sender.hpp - ${PROJECT_SOURCE_DIR}/include/beman/net/detail/socket_base.hpp + ${PROJECT_SOURCE_DIR}/include/beman/net/detail/basic_socket.hpp + ${PROJECT_SOURCE_DIR}/include/beman/net/detail/timer.hpp + ${PROJECT_SOURCE_DIR}/include/beman/net/detail/io_base.hpp + ${PROJECT_SOURCE_DIR}/include/beman/net/detail/endpoint.hpp + ${PROJECT_SOURCE_DIR}/include/beman/net/detail/repeat_effect_until.hpp + ${PROJECT_SOURCE_DIR}/include/beman/net/detail/basic_socket_acceptor.hpp ${PROJECT_SOURCE_DIR}/include/beman/net/detail/socket_category.hpp - ${PROJECT_SOURCE_DIR}/include/beman/net/detail/sorted_list.hpp + ${PROJECT_SOURCE_DIR}/include/beman/net/detail/socket_base.hpp + ${PROJECT_SOURCE_DIR}/include/beman/net/detail/listen.hpp + ${PROJECT_SOURCE_DIR}/include/beman/net/detail/event_type.hpp + ${PROJECT_SOURCE_DIR}/include/beman/net/detail/operations.hpp + ${PROJECT_SOURCE_DIR}/include/beman/net/detail/buffer.hpp ${PROJECT_SOURCE_DIR}/include/beman/net/detail/stop_token.hpp - ${PROJECT_SOURCE_DIR}/include/beman/net/detail/timer.hpp + ${PROJECT_SOURCE_DIR}/include/beman/net/detail/sorted_list.hpp + ${PROJECT_SOURCE_DIR}/include/beman/net/detail/sender.hpp + ${PROJECT_SOURCE_DIR}/include/beman/net/detail/get_scope_token.hpp + ${PROJECT_SOURCE_DIR}/include/beman/net/detail/remote_endpoint.hpp ${PROJECT_SOURCE_DIR}/include/beman/net/detail/uring_context.hpp + ${PROJECT_SOURCE_DIR}/include/beman/net/detail/initiate.hpp ) get_property( @@ -55,7 +73,7 @@ set_target_properties( ${PROJECT_NAME}_headers PROPERTIES VERIFY_INTERFACE_HEADER_SETS - OFF # FIXME:${PROJECT_IS_TOP_LEVEL} + OFF # FIXME: ${PROJECT_IS_TOP_LEVEL} ) if(LINUX AND BEMAN_NET_WITH_URING)