From a8afbbcb0c5db8937d190ee3657511f73a8714dd Mon Sep 17 00:00:00 2001 From: Bret Brown Date: Sat, 6 Apr 2024 12:33:53 -0400 Subject: [PATCH 001/199] Create the repo. Use an empty commit for the first commit. This makes simplifies: * Review workflows for the first files in the repo * Rebasing operations that might include the first commit From 00081e683894595145f04c75370b18a9cb1f719c Mon Sep 17 00:00:00 2001 From: River <26424577+wusatosi@users.noreply.github.com> Date: Thu, 14 Nov 2024 14:30:33 -0500 Subject: [PATCH 002/199] add toolchain --- cmake/toolchain.cmake | 49 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 cmake/toolchain.cmake diff --git a/cmake/toolchain.cmake b/cmake/toolchain.cmake new file mode 100644 index 0000000..60b4769 --- /dev/null +++ b/cmake/toolchain.cmake @@ -0,0 +1,49 @@ +# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + +# Toolchain file +set(CMAKE_C_FLAGS_RELWITHDEBINFO_INIT "-O3") +set(CMAKE_CXX_FLAGS_RELWITHDEBINFO_INIT "-O3") + +# BEMAN_BUILDSYS_SANITIZER is not a general use option +# It is used by preset and CI system. +# There's three possible values: +# TSan: Thread sanitizer +# ASan: All sanitizer (majorly Address sanitizer) that doesn't conflict with TSan +# OFF: No sanitizer + +if(DEFINED BEMAN_BUILDSYS_SANITIZER) + if(BEMAN_BUILDSYS_SANITIZER STREQUAL "ASan") + # Basic ASan flags + set(SANITIZER_FLAGS + "-fsanitize=address -fsanitize=pointer-compare -fsanitize=pointer-subtract -fsanitize=undefined" + ) + + # Exclude -fsanitize=leak if using GCC on macOS + # TODO: Is there a way to detect Apple Clang??? + if( + CMAKE_CXX_COMPILER_ID STREQUAL "GNU" + AND CMAKE_SYSTEM_NAME STREQUAL "Darwin" + ) + message(STATUS "Using GCC on macOS; excluding -fsanitize=leak") + else() + list(APPEND SANITIZER_FLAGS "-fsanitize=leak") + endif() + elseif(BEMAN_BUILDSYS_SANITIZER STREQUAL "TSan") + set(SANITIZER_FLAGS "-fsanitize=thread") + elseif(BEMAN_BUILDSYS_SANITIZER STREQUAL "OFF") + set(SANITIZER_FLAGS "") + else() + message( + FATAL_ERROR + "Invalid BEMAN_BUILDSYS_SANITIZER option: ${BEMAN_BUILDSYS_SANITIZER}" + ) + endif() + + # Apply flags to both C and C++ compilers, along with debug settings + set(CMAKE_C_FLAGS_DEBUG_INIT + "${CMAKE_C_FLAGS_DEBUG_INIT} ${SANITIZER_FLAGS}" + ) + set(CMAKE_CXX_FLAGS_DEBUG_INIT + "${CMAKE_C_FLAGS_DEBUG_INIT} ${SANITIZER_FLAGS}" + ) +endif() From 71f36fbca30cc595b58a5387a3f16c9dcebb7e86 Mon Sep 17 00:00:00 2001 From: River <26424577+wusatosi@users.noreply.github.com> Date: Thu, 14 Nov 2024 14:41:58 -0500 Subject: [PATCH 003/199] fix toolchain --- cmake/toolchain.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmake/toolchain.cmake b/cmake/toolchain.cmake index 60b4769..77d6b54 100644 --- a/cmake/toolchain.cmake +++ b/cmake/toolchain.cmake @@ -26,9 +26,10 @@ if(DEFINED BEMAN_BUILDSYS_SANITIZER) ) message(STATUS "Using GCC on macOS; excluding -fsanitize=leak") else() - list(APPEND SANITIZER_FLAGS "-fsanitize=leak") + set(SANITIZER_FLAGS "${SANITIZER_FLAGS} -fsanitize=leak") endif() elseif(BEMAN_BUILDSYS_SANITIZER STREQUAL "TSan") + # Basic ASan flags set(SANITIZER_FLAGS "-fsanitize=thread") elseif(BEMAN_BUILDSYS_SANITIZER STREQUAL "OFF") set(SANITIZER_FLAGS "") @@ -39,7 +40,6 @@ if(DEFINED BEMAN_BUILDSYS_SANITIZER) ) endif() - # Apply flags to both C and C++ compilers, along with debug settings set(CMAKE_C_FLAGS_DEBUG_INIT "${CMAKE_C_FLAGS_DEBUG_INIT} ${SANITIZER_FLAGS}" ) From 091446153fcda3b726ac37961f12e4aeb19d51c4 Mon Sep 17 00:00:00 2001 From: River <26424577+wusatosi@users.noreply.github.com> Date: Thu, 14 Nov 2024 15:18:54 -0500 Subject: [PATCH 004/199] update action script --- cmake/toolchain.cmake | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cmake/toolchain.cmake b/cmake/toolchain.cmake index 77d6b54..8d01d9e 100644 --- a/cmake/toolchain.cmake +++ b/cmake/toolchain.cmake @@ -1,6 +1,8 @@ # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -# Toolchain file +set(CMAKE_C_FLAGS_RELEASE_INIT "-O3") +set(CMAKE_CXX_FLAGS_RELEASE_INIT "-O3") + set(CMAKE_C_FLAGS_RELWITHDEBINFO_INIT "-O3") set(CMAKE_CXX_FLAGS_RELWITHDEBINFO_INIT "-O3") From 997a13bce4cfd89165efca3936f994fb03af69dc Mon Sep 17 00:00:00 2001 From: River <26424577+wusatosi@users.noreply.github.com> Date: Thu, 14 Nov 2024 17:36:14 -0500 Subject: [PATCH 005/199] Update toolchain.cmake --- cmake/toolchain.cmake | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/cmake/toolchain.cmake b/cmake/toolchain.cmake index 8d01d9e..b3cd128 100644 --- a/cmake/toolchain.cmake +++ b/cmake/toolchain.cmake @@ -20,12 +20,8 @@ if(DEFINED BEMAN_BUILDSYS_SANITIZER) "-fsanitize=address -fsanitize=pointer-compare -fsanitize=pointer-subtract -fsanitize=undefined" ) - # Exclude -fsanitize=leak if using GCC on macOS - # TODO: Is there a way to detect Apple Clang??? - if( - CMAKE_CXX_COMPILER_ID STREQUAL "GNU" - AND CMAKE_SYSTEM_NAME STREQUAL "Darwin" - ) + # Exclude -fsanitize=leak on Apple Clang (gcc on macos) as it is not supported. + if(CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang") message(STATUS "Using GCC on macOS; excluding -fsanitize=leak") else() set(SANITIZER_FLAGS "${SANITIZER_FLAGS} -fsanitize=leak") From da702aecbe3467243d29569490c02a9fcd2d5562 Mon Sep 17 00:00:00 2001 From: River <26424577+wusatosi@users.noreply.github.com> Date: Thu, 14 Nov 2024 23:51:49 -0500 Subject: [PATCH 006/199] give up using toolchain --- cmake/apply_santizers.cmake | 37 +++++++++++++++++++++++++++++ cmake/toolchain.cmake | 47 ------------------------------------- 2 files changed, 37 insertions(+), 47 deletions(-) create mode 100644 cmake/apply_santizers.cmake delete mode 100644 cmake/toolchain.cmake diff --git a/cmake/apply_santizers.cmake b/cmake/apply_santizers.cmake new file mode 100644 index 0000000..30e2d3f --- /dev/null +++ b/cmake/apply_santizers.cmake @@ -0,0 +1,37 @@ +# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + +# BEMAN_BUILDSYS_SANITIZER is not a general use option +# It is used by preset and CI system. +# There's three possible values: +# TSan: Thread sanitizer +# ASan: All sanitizer (majorly Address sanitizer) that doesn't conflict with TSan +# OFF: No sanitizer + +message("Applying sanitizers for ${CMAKE_CXX_COMPILER_ID}") + +if(BEMAN_BUILDSYS_SANITIZER STREQUAL "ASan") + # Basic ASan flags + set(SANITIZER_FLAGS + "-fsanitize=address -fsanitize=pointer-compare -fsanitize=pointer-subtract -fsanitize=undefined" + ) + + # Exclude -fsanitize=leak on Apple Clang (gcc on macos) as it is not supported. + if(CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang") + message(STATUS "Using GCC on macOS; excluding -fsanitize=leak") + else() + set(SANITIZER_FLAGS "${SANITIZER_FLAGS} -fsanitize=leak") + endif() +elseif(BEMAN_BUILDSYS_SANITIZER STREQUAL "TSan") + # Basic ASan flags + set(SANITIZER_FLAGS "-fsanitize=thread") +elseif(BEMAN_BUILDSYS_SANITIZER STREQUAL "OFF") + set(SANITIZER_FLAGS "") +else() + message( + FATAL_ERROR + "Invalid BEMAN_BUILDSYS_SANITIZER option: ${BEMAN_BUILDSYS_SANITIZER}" + ) +endif() + +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${SANITIZER_FLAGS}") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${SANITIZER_FLAGS}") diff --git a/cmake/toolchain.cmake b/cmake/toolchain.cmake deleted file mode 100644 index b3cd128..0000000 --- a/cmake/toolchain.cmake +++ /dev/null @@ -1,47 +0,0 @@ -# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception - -set(CMAKE_C_FLAGS_RELEASE_INIT "-O3") -set(CMAKE_CXX_FLAGS_RELEASE_INIT "-O3") - -set(CMAKE_C_FLAGS_RELWITHDEBINFO_INIT "-O3") -set(CMAKE_CXX_FLAGS_RELWITHDEBINFO_INIT "-O3") - -# BEMAN_BUILDSYS_SANITIZER is not a general use option -# It is used by preset and CI system. -# There's three possible values: -# TSan: Thread sanitizer -# ASan: All sanitizer (majorly Address sanitizer) that doesn't conflict with TSan -# OFF: No sanitizer - -if(DEFINED BEMAN_BUILDSYS_SANITIZER) - if(BEMAN_BUILDSYS_SANITIZER STREQUAL "ASan") - # Basic ASan flags - set(SANITIZER_FLAGS - "-fsanitize=address -fsanitize=pointer-compare -fsanitize=pointer-subtract -fsanitize=undefined" - ) - - # Exclude -fsanitize=leak on Apple Clang (gcc on macos) as it is not supported. - if(CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang") - message(STATUS "Using GCC on macOS; excluding -fsanitize=leak") - else() - set(SANITIZER_FLAGS "${SANITIZER_FLAGS} -fsanitize=leak") - endif() - elseif(BEMAN_BUILDSYS_SANITIZER STREQUAL "TSan") - # Basic ASan flags - set(SANITIZER_FLAGS "-fsanitize=thread") - elseif(BEMAN_BUILDSYS_SANITIZER STREQUAL "OFF") - set(SANITIZER_FLAGS "") - else() - message( - FATAL_ERROR - "Invalid BEMAN_BUILDSYS_SANITIZER option: ${BEMAN_BUILDSYS_SANITIZER}" - ) - endif() - - set(CMAKE_C_FLAGS_DEBUG_INIT - "${CMAKE_C_FLAGS_DEBUG_INIT} ${SANITIZER_FLAGS}" - ) - set(CMAKE_CXX_FLAGS_DEBUG_INIT - "${CMAKE_C_FLAGS_DEBUG_INIT} ${SANITIZER_FLAGS}" - ) -endif() From fda3c6bb001201cd5d1328a4c41e3efde736f9f7 Mon Sep 17 00:00:00 2001 From: River <26424577+wusatosi@users.noreply.github.com> Date: Fri, 15 Nov 2024 01:03:41 -0500 Subject: [PATCH 007/199] refactor apply_santizers --- cmake/apply_santizers.cmake | 39 ++++++++++++++++++++++++++++++------- 1 file changed, 32 insertions(+), 7 deletions(-) diff --git a/cmake/apply_santizers.cmake b/cmake/apply_santizers.cmake index 30e2d3f..fa8da82 100644 --- a/cmake/apply_santizers.cmake +++ b/cmake/apply_santizers.cmake @@ -10,20 +10,45 @@ message("Applying sanitizers for ${CMAKE_CXX_COMPILER_ID}") if(BEMAN_BUILDSYS_SANITIZER STREQUAL "ASan") - # Basic ASan flags - set(SANITIZER_FLAGS + set(_ASAN_ADDR "-fsanitize=address") + set(_ASAN_LEAK "-fsanitize=leak") + set(_ASAN_MISC "-fsanitize=address -fsanitize=pointer-compare -fsanitize=pointer-subtract -fsanitize=undefined" ) - # Exclude -fsanitize=leak on Apple Clang (gcc on macos) as it is not supported. + # Exclude -fsanitize=leak on Apple Clang as it is not supported. if(CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang") - message(STATUS "Using GCC on macOS; excluding -fsanitize=leak") + message(STATUS "Using AppleClang; excluding -fsanitize=leak") + set(SANITIZER_FLAGS "${_ASAN_ADDR} ${_ASAN_MISC}") + # Only include Address sanitizer on MSVC + elseif(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") + message(STATUS "Using MSVC; only Address sanitizer is set") + set(SANITIZER_FLAGS _ASAN_ADDR) + # We are able to enable all sanitizers on Clang and GNU + elseif( + CMAKE_CXX_COMPILER_ID STREQUAL "Clang" + OR CMAKE_CXX_COMPILER_ID STREQUAL "GNU" + ) + set(SANITIZER_FLAGS "${_ASAN_ADDR} ${_ASAN_LEAK} ${_ASAN_MISC}") else() - set(SANITIZER_FLAGS "${SANITIZER_FLAGS} -fsanitize=leak") + message( + STATUS + "Unknown compiler ${CMAKE_CXX_COMPILER_ID}, no sanitizer is set" + ) endif() elseif(BEMAN_BUILDSYS_SANITIZER STREQUAL "TSan") - # Basic ASan flags - set(SANITIZER_FLAGS "-fsanitize=thread") + # Basic TSan flags + if( + CMAKE_CXX_COMPILER_ID STREQUAL "Clang" + OR CMAKE_CXX_COMPILER_ID STREQUAL "GNU" + ) + set(SANITIZER_FLAGS "-fsanitize=thread") + else() + message( + STATUS + "TSan not supported/ Unknown compiler: ${CMAKE_CXX_COMPILER_ID}, no sanitizer is set" + ) + endif() elseif(BEMAN_BUILDSYS_SANITIZER STREQUAL "OFF") set(SANITIZER_FLAGS "") else() From 6d0ee72344538829ba56f738f4be4665d4532c08 Mon Sep 17 00:00:00 2001 From: River <26424577+wusatosi@users.noreply.github.com> Date: Tue, 26 Nov 2024 02:18:37 -0500 Subject: [PATCH 008/199] tweak for msvc --- cmake/apply_santizers.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmake/apply_santizers.cmake b/cmake/apply_santizers.cmake index fa8da82..6483596 100644 --- a/cmake/apply_santizers.cmake +++ b/cmake/apply_santizers.cmake @@ -20,10 +20,10 @@ if(BEMAN_BUILDSYS_SANITIZER STREQUAL "ASan") if(CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang") message(STATUS "Using AppleClang; excluding -fsanitize=leak") set(SANITIZER_FLAGS "${_ASAN_ADDR} ${_ASAN_MISC}") - # Only include Address sanitizer on MSVC + # Only include Address sanitizer on MSVC, debug info must be included for MSVC to work elseif(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") message(STATUS "Using MSVC; only Address sanitizer is set") - set(SANITIZER_FLAGS _ASAN_ADDR) + set(SANITIZER_FLAGS "/fsanitize=address /Zi") # We are able to enable all sanitizers on Clang and GNU elseif( CMAKE_CXX_COMPILER_ID STREQUAL "Clang" From 475ac8776c375a79ceaaf75c40ca91d6332e0df0 Mon Sep 17 00:00:00 2001 From: River <26424577+wusatosi@users.noreply.github.com> Date: Tue, 26 Nov 2024 02:19:13 -0500 Subject: [PATCH 009/199] warp apply_santizers.cmake in ifdef --- cmake/apply_santizers.cmake | 92 +++++++++++++++++++------------------ 1 file changed, 47 insertions(+), 45 deletions(-) diff --git a/cmake/apply_santizers.cmake b/cmake/apply_santizers.cmake index 6483596..e4693ba 100644 --- a/cmake/apply_santizers.cmake +++ b/cmake/apply_santizers.cmake @@ -7,56 +7,58 @@ # ASan: All sanitizer (majorly Address sanitizer) that doesn't conflict with TSan # OFF: No sanitizer -message("Applying sanitizers for ${CMAKE_CXX_COMPILER_ID}") +if(DEFINED BEMAN_BUILDSYS_SANITIZER) + message("Applying sanitizers for ${CMAKE_CXX_COMPILER_ID}") -if(BEMAN_BUILDSYS_SANITIZER STREQUAL "ASan") - set(_ASAN_ADDR "-fsanitize=address") - set(_ASAN_LEAK "-fsanitize=leak") - set(_ASAN_MISC - "-fsanitize=address -fsanitize=pointer-compare -fsanitize=pointer-subtract -fsanitize=undefined" - ) + if(BEMAN_BUILDSYS_SANITIZER STREQUAL "ASan") + set(_ASAN_ADDR "-fsanitize=address") + set(_ASAN_LEAK "-fsanitize=leak") + set(_ASAN_MISC + "-fsanitize=address -fsanitize=pointer-compare -fsanitize=pointer-subtract -fsanitize=undefined" + ) - # Exclude -fsanitize=leak on Apple Clang as it is not supported. - if(CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang") - message(STATUS "Using AppleClang; excluding -fsanitize=leak") - set(SANITIZER_FLAGS "${_ASAN_ADDR} ${_ASAN_MISC}") - # Only include Address sanitizer on MSVC, debug info must be included for MSVC to work - elseif(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") - message(STATUS "Using MSVC; only Address sanitizer is set") - set(SANITIZER_FLAGS "/fsanitize=address /Zi") - # We are able to enable all sanitizers on Clang and GNU - elseif( - CMAKE_CXX_COMPILER_ID STREQUAL "Clang" - OR CMAKE_CXX_COMPILER_ID STREQUAL "GNU" - ) - set(SANITIZER_FLAGS "${_ASAN_ADDR} ${_ASAN_LEAK} ${_ASAN_MISC}") - else() - message( - STATUS - "Unknown compiler ${CMAKE_CXX_COMPILER_ID}, no sanitizer is set" + # Exclude -fsanitize=leak on Apple Clang as it is not supported. + if(CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang") + message(STATUS "Using AppleClang; excluding -fsanitize=leak") + set(SANITIZER_FLAGS "${_ASAN_ADDR} ${_ASAN_MISC}") + # Only include Address sanitizer on MSVC, debug info must be included for MSVC to work + elseif(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") + message(STATUS "Using MSVC; only Address sanitizer is set") + set(SANITIZER_FLAGS "/fsanitize=address /Zi") + # We are able to enable all sanitizers on Clang and GNU + elseif( + CMAKE_CXX_COMPILER_ID STREQUAL "Clang" + OR CMAKE_CXX_COMPILER_ID STREQUAL "GNU" ) - endif() -elseif(BEMAN_BUILDSYS_SANITIZER STREQUAL "TSan") - # Basic TSan flags - if( - CMAKE_CXX_COMPILER_ID STREQUAL "Clang" - OR CMAKE_CXX_COMPILER_ID STREQUAL "GNU" - ) - set(SANITIZER_FLAGS "-fsanitize=thread") + set(SANITIZER_FLAGS "${_ASAN_ADDR} ${_ASAN_LEAK} ${_ASAN_MISC}") + else() + message( + STATUS + "Unknown compiler ${CMAKE_CXX_COMPILER_ID}, no sanitizer is set" + ) + endif() + elseif(BEMAN_BUILDSYS_SANITIZER STREQUAL "TSan") + # Basic TSan flags + if( + CMAKE_CXX_COMPILER_ID STREQUAL "Clang" + OR CMAKE_CXX_COMPILER_ID STREQUAL "GNU" + ) + set(SANITIZER_FLAGS "-fsanitize=thread") + else() + message( + STATUS + "TSan not supported/ Unknown compiler: ${CMAKE_CXX_COMPILER_ID}, no sanitizer is set" + ) + endif() + elseif(BEMAN_BUILDSYS_SANITIZER STREQUAL "OFF") + set(SANITIZER_FLAGS "") else() message( - STATUS - "TSan not supported/ Unknown compiler: ${CMAKE_CXX_COMPILER_ID}, no sanitizer is set" + FATAL_ERROR + "Invalid BEMAN_BUILDSYS_SANITIZER option: ${BEMAN_BUILDSYS_SANITIZER}" ) endif() -elseif(BEMAN_BUILDSYS_SANITIZER STREQUAL "OFF") - set(SANITIZER_FLAGS "") -else() - message( - FATAL_ERROR - "Invalid BEMAN_BUILDSYS_SANITIZER option: ${BEMAN_BUILDSYS_SANITIZER}" - ) -endif() -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${SANITIZER_FLAGS}") -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${SANITIZER_FLAGS}") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${SANITIZER_FLAGS}") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${SANITIZER_FLAGS}") +endif() From 526505163b81e698d44db828c2c9596fcef13cad Mon Sep 17 00:00:00 2001 From: River <26424577+wusatosi@users.noreply.github.com> Date: Tue, 26 Nov 2024 13:43:43 -0500 Subject: [PATCH 010/199] extract sanitizer generation as function --- cmake/apply_santizers.cmake | 50 ++++++++++++++----------------------- 1 file changed, 19 insertions(+), 31 deletions(-) diff --git a/cmake/apply_santizers.cmake b/cmake/apply_santizers.cmake index e4693ba..391fb5a 100644 --- a/cmake/apply_santizers.cmake +++ b/cmake/apply_santizers.cmake @@ -7,58 +7,46 @@ # ASan: All sanitizer (majorly Address sanitizer) that doesn't conflict with TSan # OFF: No sanitizer -if(DEFINED BEMAN_BUILDSYS_SANITIZER) - message("Applying sanitizers for ${CMAKE_CXX_COMPILER_ID}") - - if(BEMAN_BUILDSYS_SANITIZER STREQUAL "ASan") +function(GENERATE_SANITIZER_PARAM KIND COMPILER_ID SANITIZER_FLAGS) + if(${KIND} STREQUAL "ASan") set(_ASAN_ADDR "-fsanitize=address") set(_ASAN_LEAK "-fsanitize=leak") set(_ASAN_MISC "-fsanitize=address -fsanitize=pointer-compare -fsanitize=pointer-subtract -fsanitize=undefined" ) - # Exclude -fsanitize=leak on Apple Clang as it is not supported. - if(CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang") + if(${COMPILER_ID} STREQUAL "AppleClang") + # Exclude -fsanitize=leak on Apple Clang as it is not supported. message(STATUS "Using AppleClang; excluding -fsanitize=leak") - set(SANITIZER_FLAGS "${_ASAN_ADDR} ${_ASAN_MISC}") + set(RES "${_ASAN_ADDR} ${_ASAN_MISC}") + elseif(${COMPILER_ID} STREQUAL "MSVC") # Only include Address sanitizer on MSVC, debug info must be included for MSVC to work - elseif(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") message(STATUS "Using MSVC; only Address sanitizer is set") - set(SANITIZER_FLAGS "/fsanitize=address /Zi") + set(RES "/fsanitize=address /Zi") + elseif(${COMPILER_ID} STREQUAL "Clang" OR ${COMPILER_ID} STREQUAL "GNU") # We are able to enable all sanitizers on Clang and GNU - elseif( - CMAKE_CXX_COMPILER_ID STREQUAL "Clang" - OR CMAKE_CXX_COMPILER_ID STREQUAL "GNU" - ) - set(SANITIZER_FLAGS "${_ASAN_ADDR} ${_ASAN_LEAK} ${_ASAN_MISC}") + set(RES "${_ASAN_ADDR} ${_ASAN_LEAK} ${_ASAN_MISC}") else() message( STATUS - "Unknown compiler ${CMAKE_CXX_COMPILER_ID}, no sanitizer is set" + "Unknown compiler ${${COMPILER_ID}}, no sanitizer is set" ) endif() - elseif(BEMAN_BUILDSYS_SANITIZER STREQUAL "TSan") + elseif(KIND STREQUAL "TSan") # Basic TSan flags - if( - CMAKE_CXX_COMPILER_ID STREQUAL "Clang" - OR CMAKE_CXX_COMPILER_ID STREQUAL "GNU" - ) - set(SANITIZER_FLAGS "-fsanitize=thread") + if(${COMPILER_ID} STREQUAL "Clang" OR ${COMPILER_ID} STREQUAL "GNU") + set(RES "-fsanitize=thread") else() message( STATUS - "TSan not supported/ Unknown compiler: ${CMAKE_CXX_COMPILER_ID}, no sanitizer is set" + "TSan not supported/ Unknown compiler: ${${COMPILER_ID}}, no sanitizer is set" ) endif() - elseif(BEMAN_BUILDSYS_SANITIZER STREQUAL "OFF") - set(SANITIZER_FLAGS "") + elseif(KIND STREQUAL "OFF") + set(RES "") else() - message( - FATAL_ERROR - "Invalid BEMAN_BUILDSYS_SANITIZER option: ${BEMAN_BUILDSYS_SANITIZER}" - ) + message(FATAL_ERROR "Invalid Sanitizer class kind option: ${KIND}") endif() - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${SANITIZER_FLAGS}") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${SANITIZER_FLAGS}") -endif() + set(${SANITIZER_FLAGS} ${RES} PARENT_SCOPE) +endfunction() From db05fccd88965a34ff4add4077accba7c35632b9 Mon Sep 17 00:00:00 2001 From: River <26424577+wusatosi@users.noreply.github.com> Date: Tue, 26 Nov 2024 13:45:27 -0500 Subject: [PATCH 011/199] update comment --- cmake/apply_santizers.cmake | 3 --- 1 file changed, 3 deletions(-) diff --git a/cmake/apply_santizers.cmake b/cmake/apply_santizers.cmake index 391fb5a..dfbdf37 100644 --- a/cmake/apply_santizers.cmake +++ b/cmake/apply_santizers.cmake @@ -1,12 +1,9 @@ # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -# BEMAN_BUILDSYS_SANITIZER is not a general use option -# It is used by preset and CI system. # There's three possible values: # TSan: Thread sanitizer # ASan: All sanitizer (majorly Address sanitizer) that doesn't conflict with TSan # OFF: No sanitizer - function(GENERATE_SANITIZER_PARAM KIND COMPILER_ID SANITIZER_FLAGS) if(${KIND} STREQUAL "ASan") set(_ASAN_ADDR "-fsanitize=address") From 931d6bb01fa48b65648acf74969b10b4fe1584a1 Mon Sep 17 00:00:00 2001 From: River <26424577+wusatosi@users.noreply.github.com> Date: Wed, 11 Dec 2024 18:25:25 -0500 Subject: [PATCH 012/199] use toolchain --- cmake/gnu-toolchain.cmake | 18 ++++++++++++++++++ cmake/llvm-toolchain.cmake | 18 ++++++++++++++++++ 2 files changed, 36 insertions(+) create mode 100644 cmake/gnu-toolchain.cmake create mode 100644 cmake/llvm-toolchain.cmake diff --git a/cmake/gnu-toolchain.cmake b/cmake/gnu-toolchain.cmake new file mode 100644 index 0000000..4f3a3a2 --- /dev/null +++ b/cmake/gnu-toolchain.cmake @@ -0,0 +1,18 @@ +set(CMAKE_C_COMPILER gcc) +set(CMAKE_CXX_COMPILER g++) +set(CMAKE_GENERATOR "Ninja Multi-Config") + +if(BEMAN_BUILDSYS_SANITIZER STREQUAL "ASan") + set(CMAKE_CXX_FLAGS_DEBUG_INIT + "-fsanitize=address -fsanitize=leak -fsanitize=pointer-compare -fsanitize=pointer-subtract -fsanitize=undefined" + ) + set(CMAKE_C_FLAGS_DEBUG_INIT + "-fsanitize=address -fsanitize=leak -fsanitize=pointer-compare -fsanitize=pointer-subtract -fsanitize=undefined" + ) +elseif(BEMAN_BUILDSYS_SANITIZER STREQUAL "TSan") + set(CMAKE_CXX_FLAGS_DEBUG_INIT "-fsanitize=thread") + set(CMAKE_C_FLAGS_DEBUG_INIT "-fsanitize=thread") +endif() + +set(CMAKE_C_FLAGS_RELWITHDEBINFO_INIT "-O3") +set(CMAKE_CXX_FLAGS_RELWITHDEBINFO_INIT "-O3") diff --git a/cmake/llvm-toolchain.cmake b/cmake/llvm-toolchain.cmake new file mode 100644 index 0000000..5cc375c --- /dev/null +++ b/cmake/llvm-toolchain.cmake @@ -0,0 +1,18 @@ +set(CMAKE_C_COMPILER clang) +set(CMAKE_CXX_COMPILER clang++) +set(CMAKE_GENERATOR "Ninja Multi-Config") + +if(BEMAN_BUILDSYS_SANITIZER STREQUAL "ASan") + set(CMAKE_CXX_FLAGS_DEBUG_INIT + "-fsanitize=address -fsanitize=leak -fsanitize=pointer-compare -fsanitize=pointer-subtract -fsanitize=undefined" + ) + set(CMAKE_C_FLAGS_DEBUG_INIT + "-fsanitize=address -fsanitize=leak -fsanitize=pointer-compare -fsanitize=pointer-subtract -fsanitize=undefined" + ) +elseif(BEMAN_BUILDSYS_SANITIZER STREQUAL "TSan") + set(CMAKE_CXX_FLAGS_DEBUG_INIT "-fsanitize=thread") + set(CMAKE_C_FLAGS_DEBUG_INIT "-fsanitize=thread") +endif() + +set(CMAKE_C_FLAGS_RELWITHDEBINFO_INIT "-O3") +set(CMAKE_CXX_FLAGS_RELWITHDEBINFO_INIT "-O3") From 9f471295519b8348f40eb9172317827c5ddf5bf1 Mon Sep 17 00:00:00 2001 From: River <26424577+wusatosi@users.noreply.github.com> Date: Wed, 11 Dec 2024 18:31:10 -0500 Subject: [PATCH 013/199] move generator out --- cmake/gnu-toolchain.cmake | 1 - cmake/llvm-toolchain.cmake | 1 - 2 files changed, 2 deletions(-) diff --git a/cmake/gnu-toolchain.cmake b/cmake/gnu-toolchain.cmake index 4f3a3a2..b17ddef 100644 --- a/cmake/gnu-toolchain.cmake +++ b/cmake/gnu-toolchain.cmake @@ -1,6 +1,5 @@ set(CMAKE_C_COMPILER gcc) set(CMAKE_CXX_COMPILER g++) -set(CMAKE_GENERATOR "Ninja Multi-Config") if(BEMAN_BUILDSYS_SANITIZER STREQUAL "ASan") set(CMAKE_CXX_FLAGS_DEBUG_INIT diff --git a/cmake/llvm-toolchain.cmake b/cmake/llvm-toolchain.cmake index 5cc375c..afcfe3f 100644 --- a/cmake/llvm-toolchain.cmake +++ b/cmake/llvm-toolchain.cmake @@ -1,6 +1,5 @@ set(CMAKE_C_COMPILER clang) set(CMAKE_CXX_COMPILER clang++) -set(CMAKE_GENERATOR "Ninja Multi-Config") if(BEMAN_BUILDSYS_SANITIZER STREQUAL "ASan") set(CMAKE_CXX_FLAGS_DEBUG_INIT From cabf5fddc0277918a0b4725087624649898e0ade Mon Sep 17 00:00:00 2001 From: River <26424577+wusatosi@users.noreply.github.com> Date: Wed, 11 Dec 2024 18:40:41 -0500 Subject: [PATCH 014/199] remove cmake/apply_santizers.cmake --- cmake/apply_santizers.cmake | 49 ------------------------------------- 1 file changed, 49 deletions(-) delete mode 100644 cmake/apply_santizers.cmake diff --git a/cmake/apply_santizers.cmake b/cmake/apply_santizers.cmake deleted file mode 100644 index dfbdf37..0000000 --- a/cmake/apply_santizers.cmake +++ /dev/null @@ -1,49 +0,0 @@ -# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception - -# There's three possible values: -# TSan: Thread sanitizer -# ASan: All sanitizer (majorly Address sanitizer) that doesn't conflict with TSan -# OFF: No sanitizer -function(GENERATE_SANITIZER_PARAM KIND COMPILER_ID SANITIZER_FLAGS) - if(${KIND} STREQUAL "ASan") - set(_ASAN_ADDR "-fsanitize=address") - set(_ASAN_LEAK "-fsanitize=leak") - set(_ASAN_MISC - "-fsanitize=address -fsanitize=pointer-compare -fsanitize=pointer-subtract -fsanitize=undefined" - ) - - if(${COMPILER_ID} STREQUAL "AppleClang") - # Exclude -fsanitize=leak on Apple Clang as it is not supported. - message(STATUS "Using AppleClang; excluding -fsanitize=leak") - set(RES "${_ASAN_ADDR} ${_ASAN_MISC}") - elseif(${COMPILER_ID} STREQUAL "MSVC") - # Only include Address sanitizer on MSVC, debug info must be included for MSVC to work - message(STATUS "Using MSVC; only Address sanitizer is set") - set(RES "/fsanitize=address /Zi") - elseif(${COMPILER_ID} STREQUAL "Clang" OR ${COMPILER_ID} STREQUAL "GNU") - # We are able to enable all sanitizers on Clang and GNU - set(RES "${_ASAN_ADDR} ${_ASAN_LEAK} ${_ASAN_MISC}") - else() - message( - STATUS - "Unknown compiler ${${COMPILER_ID}}, no sanitizer is set" - ) - endif() - elseif(KIND STREQUAL "TSan") - # Basic TSan flags - if(${COMPILER_ID} STREQUAL "Clang" OR ${COMPILER_ID} STREQUAL "GNU") - set(RES "-fsanitize=thread") - else() - message( - STATUS - "TSan not supported/ Unknown compiler: ${${COMPILER_ID}}, no sanitizer is set" - ) - endif() - elseif(KIND STREQUAL "OFF") - set(RES "") - else() - message(FATAL_ERROR "Invalid Sanitizer class kind option: ${KIND}") - endif() - - set(${SANITIZER_FLAGS} ${RES} PARENT_SCOPE) -endfunction() From de10ecff88677e31c6abe0a2c1850ee1f03a24af Mon Sep 17 00:00:00 2001 From: River <26424577+wusatosi@users.noreply.github.com> Date: Wed, 11 Dec 2024 18:45:47 -0500 Subject: [PATCH 015/199] add msvc toolchain --- cmake/msvc-toolchain.cmake | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 cmake/msvc-toolchain.cmake diff --git a/cmake/msvc-toolchain.cmake b/cmake/msvc-toolchain.cmake new file mode 100644 index 0000000..3d9e3d9 --- /dev/null +++ b/cmake/msvc-toolchain.cmake @@ -0,0 +1,15 @@ +set(CMAKE_C_COMPILER cl) +set(CMAKE_CXX_COMPILER cl) + +if(BEMAN_BUILDSYS_SANITIZER STREQUAL "ASan") + set(CMAKE_CXX_FLAGS_DEBUG_INIT "/fsanitize=address /Zi") + set(CMAKE_C_FLAGS_DEBUG_INIT "/fsanitize=address /Zi") +endif() + +set(CMAKE_CXX_FLAGS_DEBUG_INIT + "${CMAKE_CXX_FLAGS_DEBUG_INIT} /EHsc /permissive-" +) +set(CMAKE_C_FLAGS_DEBUG_INIT "${CMAKE_C_FLAGS_DEBUG_INIT} /EHsc /permissive-") + +set(CMAKE_C_FLAGS_RELWITHDEBINFO_INIT "/EHsc /permissive- /O2") +set(CMAKE_CXX_FLAGS_RELWITHDEBINFO_INIT "/EHsc /permissive- /O2") From f925411573d063a44658ec1b8dad2278d03dd035 Mon Sep 17 00:00:00 2001 From: River <26424577+wusatosi@users.noreply.github.com> Date: Sat, 14 Dec 2024 19:07:44 -0500 Subject: [PATCH 016/199] apply license --- cmake/gnu-toolchain.cmake | 2 ++ cmake/llvm-toolchain.cmake | 2 ++ cmake/msvc-toolchain.cmake | 2 ++ 3 files changed, 6 insertions(+) diff --git a/cmake/gnu-toolchain.cmake b/cmake/gnu-toolchain.cmake index b17ddef..b4dc0f6 100644 --- a/cmake/gnu-toolchain.cmake +++ b/cmake/gnu-toolchain.cmake @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + set(CMAKE_C_COMPILER gcc) set(CMAKE_CXX_COMPILER g++) diff --git a/cmake/llvm-toolchain.cmake b/cmake/llvm-toolchain.cmake index afcfe3f..db30515 100644 --- a/cmake/llvm-toolchain.cmake +++ b/cmake/llvm-toolchain.cmake @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + set(CMAKE_C_COMPILER clang) set(CMAKE_CXX_COMPILER clang++) diff --git a/cmake/msvc-toolchain.cmake b/cmake/msvc-toolchain.cmake index 3d9e3d9..cb6f889 100644 --- a/cmake/msvc-toolchain.cmake +++ b/cmake/msvc-toolchain.cmake @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + set(CMAKE_C_COMPILER cl) set(CMAKE_CXX_COMPILER cl) From e83824c617a68ca34ff252a139e78d45d6edf388 Mon Sep 17 00:00:00 2001 From: River <26424577+wusatosi@users.noreply.github.com> Date: Mon, 16 Dec 2024 13:09:57 -0500 Subject: [PATCH 017/199] adopt include guard --- cmake/gnu-toolchain.cmake | 2 ++ cmake/llvm-toolchain.cmake | 2 ++ cmake/msvc-toolchain.cmake | 2 ++ 3 files changed, 6 insertions(+) diff --git a/cmake/gnu-toolchain.cmake b/cmake/gnu-toolchain.cmake index b4dc0f6..2b74d5c 100644 --- a/cmake/gnu-toolchain.cmake +++ b/cmake/gnu-toolchain.cmake @@ -1,5 +1,7 @@ # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +include_guard(GLOBAL) + set(CMAKE_C_COMPILER gcc) set(CMAKE_CXX_COMPILER g++) diff --git a/cmake/llvm-toolchain.cmake b/cmake/llvm-toolchain.cmake index db30515..debacef 100644 --- a/cmake/llvm-toolchain.cmake +++ b/cmake/llvm-toolchain.cmake @@ -1,5 +1,7 @@ # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +include_guard(GLOBAL) + set(CMAKE_C_COMPILER clang) set(CMAKE_CXX_COMPILER clang++) diff --git a/cmake/msvc-toolchain.cmake b/cmake/msvc-toolchain.cmake index cb6f889..0f40ba7 100644 --- a/cmake/msvc-toolchain.cmake +++ b/cmake/msvc-toolchain.cmake @@ -1,5 +1,7 @@ # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +include_guard(GLOBAL) + set(CMAKE_C_COMPILER cl) set(CMAKE_CXX_COMPILER cl) From 30981d42bc63a844198a7ba0959d381a32a35785 Mon Sep 17 00:00:00 2001 From: River <26424577+wusatosi@users.noreply.github.com> Date: Fri, 20 Dec 2024 15:50:45 -0500 Subject: [PATCH 018/199] apply sanitizer to all targets --- cmake/gnu-toolchain.cmake | 15 +++++++-------- cmake/llvm-toolchain.cmake | 15 +++++++-------- cmake/msvc-toolchain.cmake | 17 +++++++++-------- 3 files changed, 23 insertions(+), 24 deletions(-) diff --git a/cmake/gnu-toolchain.cmake b/cmake/gnu-toolchain.cmake index 2b74d5c..e6ad701 100644 --- a/cmake/gnu-toolchain.cmake +++ b/cmake/gnu-toolchain.cmake @@ -6,16 +6,15 @@ set(CMAKE_C_COMPILER gcc) set(CMAKE_CXX_COMPILER g++) if(BEMAN_BUILDSYS_SANITIZER STREQUAL "ASan") - set(CMAKE_CXX_FLAGS_DEBUG_INIT - "-fsanitize=address -fsanitize=leak -fsanitize=pointer-compare -fsanitize=pointer-subtract -fsanitize=undefined" - ) - set(CMAKE_C_FLAGS_DEBUG_INIT + set(SANITIZER_FLAGS "-fsanitize=address -fsanitize=leak -fsanitize=pointer-compare -fsanitize=pointer-subtract -fsanitize=undefined" ) elseif(BEMAN_BUILDSYS_SANITIZER STREQUAL "TSan") - set(CMAKE_CXX_FLAGS_DEBUG_INIT "-fsanitize=thread") - set(CMAKE_C_FLAGS_DEBUG_INIT "-fsanitize=thread") + set(SANITIZER_FLAGS "-fsanitize=thread") endif() -set(CMAKE_C_FLAGS_RELWITHDEBINFO_INIT "-O3") -set(CMAKE_CXX_FLAGS_RELWITHDEBINFO_INIT "-O3") +set(CMAKE_C_FLAGS_DEBUG_INIT "${SANITIZER_FLAGS}") +set(CMAKE_CXX_FLAGS_DEBUG_INIT "${SANITIZER_FLAGS}") + +set(CMAKE_C_FLAGS_RELWITHDEBINFO_INIT "-O3 ${SANITIZER_FLAGS}") +set(CMAKE_CXX_FLAGS_RELWITHDEBINFO_INIT "-O3 ${SANITIZER_FLAGS}") diff --git a/cmake/llvm-toolchain.cmake b/cmake/llvm-toolchain.cmake index debacef..4029ae9 100644 --- a/cmake/llvm-toolchain.cmake +++ b/cmake/llvm-toolchain.cmake @@ -6,16 +6,15 @@ set(CMAKE_C_COMPILER clang) set(CMAKE_CXX_COMPILER clang++) if(BEMAN_BUILDSYS_SANITIZER STREQUAL "ASan") - set(CMAKE_CXX_FLAGS_DEBUG_INIT - "-fsanitize=address -fsanitize=leak -fsanitize=pointer-compare -fsanitize=pointer-subtract -fsanitize=undefined" - ) - set(CMAKE_C_FLAGS_DEBUG_INIT + set(SANITIZER_FLAGS "-fsanitize=address -fsanitize=leak -fsanitize=pointer-compare -fsanitize=pointer-subtract -fsanitize=undefined" ) elseif(BEMAN_BUILDSYS_SANITIZER STREQUAL "TSan") - set(CMAKE_CXX_FLAGS_DEBUG_INIT "-fsanitize=thread") - set(CMAKE_C_FLAGS_DEBUG_INIT "-fsanitize=thread") + set(SANITIZER_FLAGS "-fsanitize=thread") endif() -set(CMAKE_C_FLAGS_RELWITHDEBINFO_INIT "-O3") -set(CMAKE_CXX_FLAGS_RELWITHDEBINFO_INIT "-O3") +set(CMAKE_C_FLAGS_DEBUG_INIT "${SANITIZER_FLAGS}") +set(CMAKE_CXX_FLAGS_DEBUG_INIT "${SANITIZER_FLAGS}") + +set(CMAKE_C_FLAGS_RELWITHDEBINFO_INIT "-O3 ${SANITIZER_FLAGS}") +set(CMAKE_CXX_FLAGS_RELWITHDEBINFO_INIT "-O3 ${SANITIZER_FLAGS}") diff --git a/cmake/msvc-toolchain.cmake b/cmake/msvc-toolchain.cmake index 0f40ba7..9f96cba 100644 --- a/cmake/msvc-toolchain.cmake +++ b/cmake/msvc-toolchain.cmake @@ -6,14 +6,15 @@ set(CMAKE_C_COMPILER cl) set(CMAKE_CXX_COMPILER cl) if(BEMAN_BUILDSYS_SANITIZER STREQUAL "ASan") - set(CMAKE_CXX_FLAGS_DEBUG_INIT "/fsanitize=address /Zi") - set(CMAKE_C_FLAGS_DEBUG_INIT "/fsanitize=address /Zi") + set(SANITIZER_FLAGS "/fsanitize=address /Zi") endif() -set(CMAKE_CXX_FLAGS_DEBUG_INIT - "${CMAKE_CXX_FLAGS_DEBUG_INIT} /EHsc /permissive-" -) -set(CMAKE_C_FLAGS_DEBUG_INIT "${CMAKE_C_FLAGS_DEBUG_INIT} /EHsc /permissive-") +set(CMAKE_CXX_FLAGS_DEBUG_INIT "/EHsc /permissive- ${SANITIZER_FLAGS}") +set(CMAKE_C_FLAGS_DEBUG_INIT "/EHsc /permissive- ${SANITIZER_FLAGS}") -set(CMAKE_C_FLAGS_RELWITHDEBINFO_INIT "/EHsc /permissive- /O2") -set(CMAKE_CXX_FLAGS_RELWITHDEBINFO_INIT "/EHsc /permissive- /O2") +set(CMAKE_C_FLAGS_RELWITHDEBINFO_INIT + "/EHsc /permissive- /O2 ${SANITIZER_FLAGS}" +) +set(CMAKE_CXX_FLAGS_RELWITHDEBINFO_INIT + "/EHsc /permissive- /O2 ${SANITIZER_FLAGS}" +) From 0438616903f3a39b642982ba8e18b0a572dd2fbb Mon Sep 17 00:00:00 2001 From: River <26424577+wusatosi@users.noreply.github.com> Date: Fri, 20 Dec 2024 15:58:54 -0500 Subject: [PATCH 019/199] update all release targets --- cmake/gnu-toolchain.cmake | 9 +++++++-- cmake/llvm-toolchain.cmake | 9 +++++++-- cmake/msvc-toolchain.cmake | 13 +++++++------ 3 files changed, 21 insertions(+), 10 deletions(-) diff --git a/cmake/gnu-toolchain.cmake b/cmake/gnu-toolchain.cmake index e6ad701..eca1eeb 100644 --- a/cmake/gnu-toolchain.cmake +++ b/cmake/gnu-toolchain.cmake @@ -16,5 +16,10 @@ endif() set(CMAKE_C_FLAGS_DEBUG_INIT "${SANITIZER_FLAGS}") set(CMAKE_CXX_FLAGS_DEBUG_INIT "${SANITIZER_FLAGS}") -set(CMAKE_C_FLAGS_RELWITHDEBINFO_INIT "-O3 ${SANITIZER_FLAGS}") -set(CMAKE_CXX_FLAGS_RELWITHDEBINFO_INIT "-O3 ${SANITIZER_FLAGS}") +set(RELEASE_FLAG "-O3 ${SANITIZER_FLAGS}") + +set(CMAKE_C_FLAGS_RELWITHDEBINFO_INIT "${RELEASE_FLAG}") +set(CMAKE_CXX_FLAGS_RELWITHDEBINFO_INIT "${RELEASE_FLAG}") + +set(CMAKE_C_FLAGS_RELEASE_INIT "${RELEASE_FLAG}") +set(CMAKE_CXX_FLAGS_RELEASE_INIT "${RELEASE_FLAG}") diff --git a/cmake/llvm-toolchain.cmake b/cmake/llvm-toolchain.cmake index 4029ae9..7015b76 100644 --- a/cmake/llvm-toolchain.cmake +++ b/cmake/llvm-toolchain.cmake @@ -16,5 +16,10 @@ endif() set(CMAKE_C_FLAGS_DEBUG_INIT "${SANITIZER_FLAGS}") set(CMAKE_CXX_FLAGS_DEBUG_INIT "${SANITIZER_FLAGS}") -set(CMAKE_C_FLAGS_RELWITHDEBINFO_INIT "-O3 ${SANITIZER_FLAGS}") -set(CMAKE_CXX_FLAGS_RELWITHDEBINFO_INIT "-O3 ${SANITIZER_FLAGS}") +set(RELEASE_FLAG "-O3 ${SANITIZER_FLAGS}") + +set(CMAKE_C_FLAGS_RELWITHDEBINFO_INIT "${RELEASE_FLAG}") +set(CMAKE_CXX_FLAGS_RELWITHDEBINFO_INIT "${RELEASE_FLAG}") + +set(CMAKE_C_FLAGS_RELEASE_INIT "${RELEASE_FLAG}") +set(CMAKE_CXX_FLAGS_RELEASE_INIT "${RELEASE_FLAG}") diff --git a/cmake/msvc-toolchain.cmake b/cmake/msvc-toolchain.cmake index 9f96cba..23e650c 100644 --- a/cmake/msvc-toolchain.cmake +++ b/cmake/msvc-toolchain.cmake @@ -12,9 +12,10 @@ endif() set(CMAKE_CXX_FLAGS_DEBUG_INIT "/EHsc /permissive- ${SANITIZER_FLAGS}") set(CMAKE_C_FLAGS_DEBUG_INIT "/EHsc /permissive- ${SANITIZER_FLAGS}") -set(CMAKE_C_FLAGS_RELWITHDEBINFO_INIT - "/EHsc /permissive- /O2 ${SANITIZER_FLAGS}" -) -set(CMAKE_CXX_FLAGS_RELWITHDEBINFO_INIT - "/EHsc /permissive- /O2 ${SANITIZER_FLAGS}" -) +set(RELEASE_FLAG "/EHsc /permissive- /O2 ${SANITIZER_FLAGS}") + +set(CMAKE_C_FLAGS_RELWITHDEBINFO_INIT "${RELEASE_FLAG}") +set(CMAKE_CXX_FLAGS_RELWITHDEBINFO_INIT "${RELEASE_FLAG}") + +set(CMAKE_C_FLAGS_RELEASE_INIT "${RELEASE_FLAG}") +set(CMAKE_CXX_FLAGS_RELEASE_INIT "${RELEASE_FLAG}") From 12559d4573ef6200cf1db2e71315dd5b1fc1acbe Mon Sep 17 00:00:00 2001 From: River <26424577+wusatosi@users.noreply.github.com> Date: Fri, 20 Dec 2024 16:04:13 -0500 Subject: [PATCH 020/199] asan -> maxsan --- cmake/gnu-toolchain.cmake | 2 +- cmake/llvm-toolchain.cmake | 2 +- cmake/msvc-toolchain.cmake | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cmake/gnu-toolchain.cmake b/cmake/gnu-toolchain.cmake index eca1eeb..df837fd 100644 --- a/cmake/gnu-toolchain.cmake +++ b/cmake/gnu-toolchain.cmake @@ -5,7 +5,7 @@ include_guard(GLOBAL) set(CMAKE_C_COMPILER gcc) set(CMAKE_CXX_COMPILER g++) -if(BEMAN_BUILDSYS_SANITIZER STREQUAL "ASan") +if(BEMAN_BUILDSYS_SANITIZER STREQUAL "MaxSan") set(SANITIZER_FLAGS "-fsanitize=address -fsanitize=leak -fsanitize=pointer-compare -fsanitize=pointer-subtract -fsanitize=undefined" ) diff --git a/cmake/llvm-toolchain.cmake b/cmake/llvm-toolchain.cmake index 7015b76..670f404 100644 --- a/cmake/llvm-toolchain.cmake +++ b/cmake/llvm-toolchain.cmake @@ -5,7 +5,7 @@ include_guard(GLOBAL) set(CMAKE_C_COMPILER clang) set(CMAKE_CXX_COMPILER clang++) -if(BEMAN_BUILDSYS_SANITIZER STREQUAL "ASan") +if(BEMAN_BUILDSYS_SANITIZER STREQUAL "MaxSan") set(SANITIZER_FLAGS "-fsanitize=address -fsanitize=leak -fsanitize=pointer-compare -fsanitize=pointer-subtract -fsanitize=undefined" ) diff --git a/cmake/msvc-toolchain.cmake b/cmake/msvc-toolchain.cmake index 23e650c..d0157ec 100644 --- a/cmake/msvc-toolchain.cmake +++ b/cmake/msvc-toolchain.cmake @@ -5,7 +5,7 @@ include_guard(GLOBAL) set(CMAKE_C_COMPILER cl) set(CMAKE_CXX_COMPILER cl) -if(BEMAN_BUILDSYS_SANITIZER STREQUAL "ASan") +if(BEMAN_BUILDSYS_SANITIZER STREQUAL "MaxSan") set(SANITIZER_FLAGS "/fsanitize=address /Zi") endif() From 18cd51340f65909a9973900f2f411845f3cb12d6 Mon Sep 17 00:00:00 2001 From: River <26424577+wusatosi@users.noreply.github.com> Date: Sun, 22 Dec 2024 13:24:24 -0500 Subject: [PATCH 021/199] add documentation --- cmake/gnu-toolchain.cmake | 13 +++++++++++++ cmake/llvm-toolchain.cmake | 13 +++++++++++++ cmake/msvc-toolchain.cmake | 15 +++++++++++++++ 3 files changed, 41 insertions(+) diff --git a/cmake/gnu-toolchain.cmake b/cmake/gnu-toolchain.cmake index df837fd..184338b 100644 --- a/cmake/gnu-toolchain.cmake +++ b/cmake/gnu-toolchain.cmake @@ -1,5 +1,18 @@ # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +# This toolchain file is not meant to be used directly, +# but to be invoked by CMake preset and GitHub CI. +# +# This toolchain file configures for GNU family of compiler. +# +# BEMAN_BUILDSYS_SANITIZER: +# This optional CMake parameter is not meant for public use and is subject to +# change. +# Possible values: +# - MaxSan: configures gcc and g++ to use all available non-conflicting +# sanitizers. +# - TSan: configures gcc and g++ to enable the use of thread sanitizer + include_guard(GLOBAL) set(CMAKE_C_COMPILER gcc) diff --git a/cmake/llvm-toolchain.cmake b/cmake/llvm-toolchain.cmake index 670f404..e30dd4d 100644 --- a/cmake/llvm-toolchain.cmake +++ b/cmake/llvm-toolchain.cmake @@ -1,5 +1,18 @@ # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +# This toolchain file is not meant to be used directly, +# but to be invoked by CMake preset and GitHub CI. +# +# This toolchain file configures for LLVM family of compiler. +# +# BEMAN_BUILDSYS_SANITIZER: +# This optional CMake parameter is not meant for public use and is subject to +# change. +# Possible values: +# - MaxSan: configures clang and clang++ to use all available non-conflicting +# sanitizers. +# - TSan: configures clang and clang++ to enable the use of thread sanitizer. + include_guard(GLOBAL) set(CMAKE_C_COMPILER clang) diff --git a/cmake/msvc-toolchain.cmake b/cmake/msvc-toolchain.cmake index d0157ec..11c8382 100644 --- a/cmake/msvc-toolchain.cmake +++ b/cmake/msvc-toolchain.cmake @@ -1,5 +1,20 @@ # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +# This toolchain file is not meant to be used directly, +# but to be invoked by CMake preset and GitHub CI. +# +# This toolchain file configures for MSVC family of compiler. +# +# BEMAN_BUILDSYS_SANITIZER: +# This optional CMake parameter is not meant for public use and is subject to +# change. +# Possible values: +# - MaxSan: configures cl to use all available non-conflicting sanitizers. +# +# Note that in other toolchain files, TSan is also a possible value for +# BEMAN_BUILDSYS_SANITIZER, however, MSVC does not support thread sanitizer, +# thus this value is omitted. + include_guard(GLOBAL) set(CMAKE_C_COMPILER cl) From 6456fadef123e311e83eb38ad9852e2eecf8f7ac Mon Sep 17 00:00:00 2001 From: River <26424577+wusatosi@users.noreply.github.com> Date: Mon, 23 Dec 2024 19:17:42 -0500 Subject: [PATCH 022/199] remove unneeded include guard --- cmake/gnu-toolchain.cmake | 2 -- cmake/llvm-toolchain.cmake | 2 -- cmake/msvc-toolchain.cmake | 2 -- 3 files changed, 6 deletions(-) diff --git a/cmake/gnu-toolchain.cmake b/cmake/gnu-toolchain.cmake index 184338b..4b3c363 100644 --- a/cmake/gnu-toolchain.cmake +++ b/cmake/gnu-toolchain.cmake @@ -13,8 +13,6 @@ # sanitizers. # - TSan: configures gcc and g++ to enable the use of thread sanitizer -include_guard(GLOBAL) - set(CMAKE_C_COMPILER gcc) set(CMAKE_CXX_COMPILER g++) diff --git a/cmake/llvm-toolchain.cmake b/cmake/llvm-toolchain.cmake index e30dd4d..5a2a1c1 100644 --- a/cmake/llvm-toolchain.cmake +++ b/cmake/llvm-toolchain.cmake @@ -13,8 +13,6 @@ # sanitizers. # - TSan: configures clang and clang++ to enable the use of thread sanitizer. -include_guard(GLOBAL) - set(CMAKE_C_COMPILER clang) set(CMAKE_CXX_COMPILER clang++) diff --git a/cmake/msvc-toolchain.cmake b/cmake/msvc-toolchain.cmake index 11c8382..67f28b3 100644 --- a/cmake/msvc-toolchain.cmake +++ b/cmake/msvc-toolchain.cmake @@ -15,8 +15,6 @@ # BEMAN_BUILDSYS_SANITIZER, however, MSVC does not support thread sanitizer, # thus this value is omitted. -include_guard(GLOBAL) - set(CMAKE_C_COMPILER cl) set(CMAKE_CXX_COMPILER cl) From eee29a3bdc9744ec7c76443f3d50ce2bb9c149f9 Mon Sep 17 00:00:00 2001 From: River <26424577+wusatosi@users.noreply.github.com> Date: Tue, 24 Dec 2024 21:42:50 -0500 Subject: [PATCH 023/199] update use of toolchain for appleclang and msvc --- cmake/appleclang-toolchain.cmake | 37 ++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 cmake/appleclang-toolchain.cmake diff --git a/cmake/appleclang-toolchain.cmake b/cmake/appleclang-toolchain.cmake new file mode 100644 index 0000000..c915b24 --- /dev/null +++ b/cmake/appleclang-toolchain.cmake @@ -0,0 +1,37 @@ +# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + +# This toolchain file is not meant to be used directly, +# but to be invoked by CMake preset and GitHub CI. +# +# This toolchain file configures for apple clang family of compiler. +# Note this is different from LLVM toolchain. +# +# BEMAN_BUILDSYS_SANITIZER: +# This optional CMake parameter is not meant for public use and is subject to +# change. +# Possible values: +# - MaxSan: configures clang and clang++ to use all available non-conflicting +# sanitizers. Note that apple clang does not support leak sanitizer. +# - TSan: configures clang and clang++ to enable the use of thread sanitizer. + +set(CMAKE_C_COMPILER clang) +set(CMAKE_CXX_COMPILER clang++) + +if(BEMAN_BUILDSYS_SANITIZER STREQUAL "MaxSan") + set(SANITIZER_FLAGS + "-fsanitize=address -fsanitize=pointer-compare -fsanitize=pointer-subtract -fsanitize=undefined" + ) +elseif(BEMAN_BUILDSYS_SANITIZER STREQUAL "TSan") + set(SANITIZER_FLAGS "-fsanitize=thread") +endif() + +set(CMAKE_C_FLAGS_DEBUG_INIT "${SANITIZER_FLAGS}") +set(CMAKE_CXX_FLAGS_DEBUG_INIT "${SANITIZER_FLAGS}") + +set(RELEASE_FLAG "-O3 ${SANITIZER_FLAGS}") + +set(CMAKE_C_FLAGS_RELWITHDEBINFO_INIT "${RELEASE_FLAG}") +set(CMAKE_CXX_FLAGS_RELWITHDEBINFO_INIT "${RELEASE_FLAG}") + +set(CMAKE_C_FLAGS_RELEASE_INIT "${RELEASE_FLAG}") +set(CMAKE_CXX_FLAGS_RELEASE_INIT "${RELEASE_FLAG}") From 7731e0283803bc72672e4a79ecd7b40a884f0569 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Darius=20Nea=C8=9Bu?= Date: Fri, 27 Dec 2024 21:18:37 +0200 Subject: [PATCH 024/199] Initial commit --- .gitignore | 32 ++++++++++++++++++++++++++++++++ README.md | 2 ++ 2 files changed, 34 insertions(+) create mode 100644 .gitignore create mode 100644 README.md diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..259148f --- /dev/null +++ b/.gitignore @@ -0,0 +1,32 @@ +# Prerequisites +*.d + +# Compiled Object files +*.slo +*.lo +*.o +*.obj + +# Precompiled Headers +*.gch +*.pch + +# Compiled Dynamic libraries +*.so +*.dylib +*.dll + +# Fortran module files +*.mod +*.smod + +# Compiled Static libraries +*.lai +*.la +*.a +*.lib + +# Executables +*.exe +*.out +*.app diff --git a/README.md b/README.md new file mode 100644 index 0000000..20b8539 --- /dev/null +++ b/README.md @@ -0,0 +1,2 @@ +# infra +Internal Beman Project infrastructure repo From c05ce19a9162bde2c35251a7d3ab3da928b071aa Mon Sep 17 00:00:00 2001 From: River <26424577+wusatosi@users.noreply.github.com> Date: Thu, 9 Jan 2025 16:57:45 -0500 Subject: [PATCH 025/199] RELEASE_FLAG -> RELEASE_FLAGS --- cmake/appleclang-toolchain.cmake | 10 +++++----- cmake/gnu-toolchain.cmake | 10 +++++----- cmake/llvm-toolchain.cmake | 10 +++++----- cmake/msvc-toolchain.cmake | 10 +++++----- 4 files changed, 20 insertions(+), 20 deletions(-) diff --git a/cmake/appleclang-toolchain.cmake b/cmake/appleclang-toolchain.cmake index c915b24..eee6406 100644 --- a/cmake/appleclang-toolchain.cmake +++ b/cmake/appleclang-toolchain.cmake @@ -28,10 +28,10 @@ endif() set(CMAKE_C_FLAGS_DEBUG_INIT "${SANITIZER_FLAGS}") set(CMAKE_CXX_FLAGS_DEBUG_INIT "${SANITIZER_FLAGS}") -set(RELEASE_FLAG "-O3 ${SANITIZER_FLAGS}") +set(RELEASE_FLAGS "-O3 ${SANITIZER_FLAGS}") -set(CMAKE_C_FLAGS_RELWITHDEBINFO_INIT "${RELEASE_FLAG}") -set(CMAKE_CXX_FLAGS_RELWITHDEBINFO_INIT "${RELEASE_FLAG}") +set(CMAKE_C_FLAGS_RELWITHDEBINFO_INIT "${RELEASE_FLAGS}") +set(CMAKE_CXX_FLAGS_RELWITHDEBINFO_INIT "${RELEASE_FLAGS}") -set(CMAKE_C_FLAGS_RELEASE_INIT "${RELEASE_FLAG}") -set(CMAKE_CXX_FLAGS_RELEASE_INIT "${RELEASE_FLAG}") +set(CMAKE_C_FLAGS_RELEASE_INIT "${RELEASE_FLAGS}") +set(CMAKE_CXX_FLAGS_RELEASE_INIT "${RELEASE_FLAGS}") diff --git a/cmake/gnu-toolchain.cmake b/cmake/gnu-toolchain.cmake index 4b3c363..9d91ddd 100644 --- a/cmake/gnu-toolchain.cmake +++ b/cmake/gnu-toolchain.cmake @@ -27,10 +27,10 @@ endif() set(CMAKE_C_FLAGS_DEBUG_INIT "${SANITIZER_FLAGS}") set(CMAKE_CXX_FLAGS_DEBUG_INIT "${SANITIZER_FLAGS}") -set(RELEASE_FLAG "-O3 ${SANITIZER_FLAGS}") +set(RELEASE_FLAGS "-O3 ${SANITIZER_FLAGS}") -set(CMAKE_C_FLAGS_RELWITHDEBINFO_INIT "${RELEASE_FLAG}") -set(CMAKE_CXX_FLAGS_RELWITHDEBINFO_INIT "${RELEASE_FLAG}") +set(CMAKE_C_FLAGS_RELWITHDEBINFO_INIT "${RELEASE_FLAGS}") +set(CMAKE_CXX_FLAGS_RELWITHDEBINFO_INIT "${RELEASE_FLAGS}") -set(CMAKE_C_FLAGS_RELEASE_INIT "${RELEASE_FLAG}") -set(CMAKE_CXX_FLAGS_RELEASE_INIT "${RELEASE_FLAG}") +set(CMAKE_C_FLAGS_RELEASE_INIT "${RELEASE_FLAGS}") +set(CMAKE_CXX_FLAGS_RELEASE_INIT "${RELEASE_FLAGS}") diff --git a/cmake/llvm-toolchain.cmake b/cmake/llvm-toolchain.cmake index 5a2a1c1..6ba5f80 100644 --- a/cmake/llvm-toolchain.cmake +++ b/cmake/llvm-toolchain.cmake @@ -27,10 +27,10 @@ endif() set(CMAKE_C_FLAGS_DEBUG_INIT "${SANITIZER_FLAGS}") set(CMAKE_CXX_FLAGS_DEBUG_INIT "${SANITIZER_FLAGS}") -set(RELEASE_FLAG "-O3 ${SANITIZER_FLAGS}") +set(RELEASE_FLAGS "-O3 ${SANITIZER_FLAGS}") -set(CMAKE_C_FLAGS_RELWITHDEBINFO_INIT "${RELEASE_FLAG}") -set(CMAKE_CXX_FLAGS_RELWITHDEBINFO_INIT "${RELEASE_FLAG}") +set(CMAKE_C_FLAGS_RELWITHDEBINFO_INIT "${RELEASE_FLAGS}") +set(CMAKE_CXX_FLAGS_RELWITHDEBINFO_INIT "${RELEASE_FLAGS}") -set(CMAKE_C_FLAGS_RELEASE_INIT "${RELEASE_FLAG}") -set(CMAKE_CXX_FLAGS_RELEASE_INIT "${RELEASE_FLAG}") +set(CMAKE_C_FLAGS_RELEASE_INIT "${RELEASE_FLAGS}") +set(CMAKE_CXX_FLAGS_RELEASE_INIT "${RELEASE_FLAGS}") diff --git a/cmake/msvc-toolchain.cmake b/cmake/msvc-toolchain.cmake index 67f28b3..5ca67b7 100644 --- a/cmake/msvc-toolchain.cmake +++ b/cmake/msvc-toolchain.cmake @@ -25,10 +25,10 @@ endif() set(CMAKE_CXX_FLAGS_DEBUG_INIT "/EHsc /permissive- ${SANITIZER_FLAGS}") set(CMAKE_C_FLAGS_DEBUG_INIT "/EHsc /permissive- ${SANITIZER_FLAGS}") -set(RELEASE_FLAG "/EHsc /permissive- /O2 ${SANITIZER_FLAGS}") +set(RELEASE_FLAGS "/EHsc /permissive- /O2 ${SANITIZER_FLAGS}") -set(CMAKE_C_FLAGS_RELWITHDEBINFO_INIT "${RELEASE_FLAG}") -set(CMAKE_CXX_FLAGS_RELWITHDEBINFO_INIT "${RELEASE_FLAG}") +set(CMAKE_C_FLAGS_RELWITHDEBINFO_INIT "${RELEASE_FLAGS}") +set(CMAKE_CXX_FLAGS_RELWITHDEBINFO_INIT "${RELEASE_FLAGS}") -set(CMAKE_C_FLAGS_RELEASE_INIT "${RELEASE_FLAG}") -set(CMAKE_CXX_FLAGS_RELEASE_INIT "${RELEASE_FLAG}") +set(CMAKE_C_FLAGS_RELEASE_INIT "${RELEASE_FLAGS}") +set(CMAKE_CXX_FLAGS_RELEASE_INIT "${RELEASE_FLAGS}") From b76f790018aa481b1db806a0b548a8e3a8d831e6 Mon Sep 17 00:00:00 2001 From: River <26424577+wusatosi@users.noreply.github.com> Date: Thu, 9 Jan 2025 18:27:16 -0500 Subject: [PATCH 026/199] add documentation for /Zi flag --- cmake/msvc-toolchain.cmake | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cmake/msvc-toolchain.cmake b/cmake/msvc-toolchain.cmake index 5ca67b7..cf5b533 100644 --- a/cmake/msvc-toolchain.cmake +++ b/cmake/msvc-toolchain.cmake @@ -19,6 +19,8 @@ set(CMAKE_C_COMPILER cl) set(CMAKE_CXX_COMPILER cl) if(BEMAN_BUILDSYS_SANITIZER STREQUAL "MaxSan") + # /Zi flag (add debug symbol) is needed when using address sanitizer + # See C5072: https://learn.microsoft.com/en-us/cpp/error-messages/compiler-warnings/compiler-warning-c5072 set(SANITIZER_FLAGS "/fsanitize=address /Zi") endif() From 3f13a5f7bec670a2b40f679e3c1e0de894bf3962 Mon Sep 17 00:00:00 2001 From: River <26424577+wusatosi@users.noreply.github.com> Date: Sat, 11 Jan 2025 04:09:29 +0000 Subject: [PATCH 027/199] Readd include guard This reverts commit 6456fadef123e311e83eb38ad9852e2eecf8f7ac. --- cmake/gnu-toolchain.cmake | 2 ++ cmake/llvm-toolchain.cmake | 2 ++ cmake/msvc-toolchain.cmake | 2 ++ 3 files changed, 6 insertions(+) diff --git a/cmake/gnu-toolchain.cmake b/cmake/gnu-toolchain.cmake index 9d91ddd..2e2a2ad 100644 --- a/cmake/gnu-toolchain.cmake +++ b/cmake/gnu-toolchain.cmake @@ -13,6 +13,8 @@ # sanitizers. # - TSan: configures gcc and g++ to enable the use of thread sanitizer +include_guard(GLOBAL) + set(CMAKE_C_COMPILER gcc) set(CMAKE_CXX_COMPILER g++) diff --git a/cmake/llvm-toolchain.cmake b/cmake/llvm-toolchain.cmake index 6ba5f80..d783803 100644 --- a/cmake/llvm-toolchain.cmake +++ b/cmake/llvm-toolchain.cmake @@ -13,6 +13,8 @@ # sanitizers. # - TSan: configures clang and clang++ to enable the use of thread sanitizer. +include_guard(GLOBAL) + set(CMAKE_C_COMPILER clang) set(CMAKE_CXX_COMPILER clang++) diff --git a/cmake/msvc-toolchain.cmake b/cmake/msvc-toolchain.cmake index cf5b533..c2fffa7 100644 --- a/cmake/msvc-toolchain.cmake +++ b/cmake/msvc-toolchain.cmake @@ -15,6 +15,8 @@ # BEMAN_BUILDSYS_SANITIZER, however, MSVC does not support thread sanitizer, # thus this value is omitted. +include_guard(GLOBAL) + set(CMAKE_C_COMPILER cl) set(CMAKE_CXX_COMPILER cl) From 2e840936768f31708747a96e88b27b022d84f1c5 Mon Sep 17 00:00:00 2001 From: River <26424577+wusatosi@users.noreply.github.com> Date: Sat, 11 Jan 2025 04:10:38 +0000 Subject: [PATCH 028/199] add include guard for appleclang-toolchain --- cmake/appleclang-toolchain.cmake | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cmake/appleclang-toolchain.cmake b/cmake/appleclang-toolchain.cmake index eee6406..bc12103 100644 --- a/cmake/appleclang-toolchain.cmake +++ b/cmake/appleclang-toolchain.cmake @@ -14,6 +14,8 @@ # sanitizers. Note that apple clang does not support leak sanitizer. # - TSan: configures clang and clang++ to enable the use of thread sanitizer. +include_guard(GLOBAL) + set(CMAKE_C_COMPILER clang) set(CMAKE_CXX_COMPILER clang++) From a4b0a4ab448f51c4cae1162ececc3bafb7cdca46 Mon Sep 17 00:00:00 2001 From: Darius Neatu Date: Wed, 22 Jan 2025 09:40:48 +0200 Subject: [PATCH 029/199] Add skel for infra repo --- .github/CODEOWNERS | 4 + LICENSE | 218 +++++++++++++++++++++++++++++++++++++++++++++ README.md | 13 ++- 3 files changed, 233 insertions(+), 2 deletions(-) create mode 100644 .github/CODEOWNERS create mode 100644 LICENSE diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 0000000..ca6c395 --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1,4 @@ +# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +# Codeowners for reviews on PRs + +* @neatudarius @dietmarkuehl @JeffGarland @camio @inbal2l diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..537293d --- /dev/null +++ b/LICENSE @@ -0,0 +1,218 @@ + 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. diff --git a/README.md b/README.md index 20b8539..dae4313 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,11 @@ -# infra -Internal Beman Project infrastructure repo +# Beman Project Infrastructure Repository + + + +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. + +## Description + +* `tools/`: Tools used to manage the infrastructure and the codebase (e.g., linting, formatting, etc.). From a9aef1db0a5414e91f59cb091c00c8af90bbf827 Mon Sep 17 00:00:00 2001 From: Darius Neatu Date: Wed, 22 Jan 2025 09:47:35 +0200 Subject: [PATCH 030/199] beman-tidy: add skel --- .markdownlint.yaml | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 .markdownlint.yaml diff --git a/.markdownlint.yaml b/.markdownlint.yaml new file mode 100644 index 0000000..81f5fcd --- /dev/null +++ b/.markdownlint.yaml @@ -0,0 +1,9 @@ +# MD033/no-inline-html : Inline HTML : https://github.com/DavidAnson/markdownlint/blob/v0.35.0/doc/md033.md +# Disable inline html linter is needed for
+MD033: false + +# MD013/line-length : Line length : https://github.com/DavidAnson/markdownlint/blob/v0.35.0/doc/md013.md +# Conforms to .clang-format ColumnLimit +# Update the comment in .clang-format if we no-longer tie these two column limits. +MD013: + line_length: 119 From f85829b7506ca55edb61b6ac36d1e9c39d13eb07 Mon Sep 17 00:00:00 2001 From: Darius Neatu Date: Wed, 22 Jan 2025 11:43:15 +0200 Subject: [PATCH 031/199] beman-tidy: add checks pipeline --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index dae4313..8ea7b61 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,8 @@ SPDX-License-Identifier: 2.0 license with LLVM exceptions --> -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. +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. ## Description From 83178a0ec53f19f6c8dfc268b1953e7a349ee480 Mon Sep 17 00:00:00 2001 From: Darius Neatu Date: Wed, 12 Feb 2025 11:02:50 +0100 Subject: [PATCH 032/199] Mirror LICENSE from beman repo --- LICENSE | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/LICENSE b/LICENSE index 537293d..111a208 100644 --- a/LICENSE +++ b/LICENSE @@ -216,3 +216,15 @@ 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. From 9bed1b53bc4155cd2aad78509d274b327487dcb3 Mon Sep 17 00:00:00 2001 From: Chris Hayden Date: Wed, 12 Feb 2025 12:35:29 +0000 Subject: [PATCH 033/199] Initial config-file package creation. --- cmake/beman.exemplar-config.cmake.in | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 cmake/beman.exemplar-config.cmake.in diff --git a/cmake/beman.exemplar-config.cmake.in b/cmake/beman.exemplar-config.cmake.in new file mode 100644 index 0000000..5769cc3 --- /dev/null +++ b/cmake/beman.exemplar-config.cmake.in @@ -0,0 +1,7 @@ +set(BEMAN_EXEMPLAR_VERSION @PROJECT_VERSION@) + +@PACKAGE_INIT@ + +include(${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@-targets.cmake) + +check_required_components(@PROJECT_NAME@) From 64d71a2fe428f4cb286066dfeab3baaa1f81ac7a Mon Sep 17 00:00:00 2001 From: Darius Neatu Date: Wed, 12 Feb 2025 16:20:22 +0100 Subject: [PATCH 034/199] beman-tidy: update docs with install instructions --- requirements.txt | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 requirements.txt diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..78f6634 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +Markdown==3.4.4 +Requests==2.32.3 From 699d2c3b7203a3bde735182bf7de9cc82409db74 Mon Sep 17 00:00:00 2001 From: Darius Neatu Date: Wed, 12 Feb 2025 16:56:52 +0100 Subject: [PATCH 035/199] beman-tidy: move requirements.txt --- requirements.txt | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 requirements.txt diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index 78f6634..0000000 --- a/requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ -Markdown==3.4.4 -Requests==2.32.3 From 936733b668e5a4850955eb96dd4e0d467aae462b Mon Sep 17 00:00:00 2001 From: River <26424577+wusatosi@users.noreply.github.com> Date: Fri, 21 Feb 2025 20:53:05 +0000 Subject: [PATCH 036/199] init --- .devcontainer/generic_container/Dockerfile | 16 ++++++++++++++++ .../generic_container/devcontainer.json | 15 +++++++++++++++ .devcontainer/generic_container/postcreate.sh | 3 +++ devcontainer/Dockerfile | 16 ++++++++++++++++ devcontainer/README.md | 3 +++ 5 files changed, 53 insertions(+) create mode 100644 .devcontainer/generic_container/Dockerfile create mode 100644 .devcontainer/generic_container/devcontainer.json create mode 100644 .devcontainer/generic_container/postcreate.sh create mode 100644 devcontainer/Dockerfile create mode 100644 devcontainer/README.md diff --git a/.devcontainer/generic_container/Dockerfile b/.devcontainer/generic_container/Dockerfile new file mode 100644 index 0000000..b7b2938 --- /dev/null +++ b/.devcontainer/generic_container/Dockerfile @@ -0,0 +1,16 @@ +FROM mcr.microsoft.com/devcontainers/cpp:1-ubuntu-24.04 + +USER vscode + +# Install latest cmake +RUN wget -O - https://apt.kitware.com/keys/kitware-archive-latest.asc 2>/dev/null | gpg --dearmor - | sudo tee /usr/share/keyrings/kitware-archive-keyring.gpg >/dev/null +RUN echo 'deb [signed-by=/usr/share/keyrings/kitware-archive-keyring.gpg] https://apt.kitware.com/ubuntu/ noble main' | sudo tee /etc/apt/sources.list.d/kitware.list >/dev/null +RUN sudo apt-get update && sudo apt-get install -y cmake + +# Install pre-commit +RUN sudo apt-get install -y pipx && pipx install pre-commit + +# Newer gcc/ llvm is needed to avoid ASAN Stalling +# See: https://github.com/google/sanitizers/issues/1614 +# Minimal vesion: clang-18.1.3, gcc-13.2 +RUN sudo apt-get install -y gcc-14 \ No newline at end of file diff --git a/.devcontainer/generic_container/devcontainer.json b/.devcontainer/generic_container/devcontainer.json new file mode 100644 index 0000000..75364bd --- /dev/null +++ b/.devcontainer/generic_container/devcontainer.json @@ -0,0 +1,15 @@ +{ + "name": "Beman Project Generic Devcontainer", + "build": { + "dockerfile": "Dockerfile" + }, + "postCreateCommand": "bash .devcontainer/postcreate.sh", + "customizations": { + "vscode": { + "extensions": [ + "ms-vscode.cpptools", + "ms-vscode.cmake-tools" + ] + } + } +} \ No newline at end of file diff --git a/.devcontainer/generic_container/postcreate.sh b/.devcontainer/generic_container/postcreate.sh new file mode 100644 index 0000000..3bae98e --- /dev/null +++ b/.devcontainer/generic_container/postcreate.sh @@ -0,0 +1,3 @@ +# Setup pre-commit +pre-commit +pre-commit install \ No newline at end of file diff --git a/devcontainer/Dockerfile b/devcontainer/Dockerfile new file mode 100644 index 0000000..b7b2938 --- /dev/null +++ b/devcontainer/Dockerfile @@ -0,0 +1,16 @@ +FROM mcr.microsoft.com/devcontainers/cpp:1-ubuntu-24.04 + +USER vscode + +# Install latest cmake +RUN wget -O - https://apt.kitware.com/keys/kitware-archive-latest.asc 2>/dev/null | gpg --dearmor - | sudo tee /usr/share/keyrings/kitware-archive-keyring.gpg >/dev/null +RUN echo 'deb [signed-by=/usr/share/keyrings/kitware-archive-keyring.gpg] https://apt.kitware.com/ubuntu/ noble main' | sudo tee /etc/apt/sources.list.d/kitware.list >/dev/null +RUN sudo apt-get update && sudo apt-get install -y cmake + +# Install pre-commit +RUN sudo apt-get install -y pipx && pipx install pre-commit + +# Newer gcc/ llvm is needed to avoid ASAN Stalling +# See: https://github.com/google/sanitizers/issues/1614 +# Minimal vesion: clang-18.1.3, gcc-13.2 +RUN sudo apt-get install -y gcc-14 \ No newline at end of file diff --git a/devcontainer/README.md b/devcontainer/README.md new file mode 100644 index 0000000..99cab15 --- /dev/null +++ b/devcontainer/README.md @@ -0,0 +1,3 @@ +# Devcontainer + +TODO \ No newline at end of file From 82e3295e21bd126212c32b3e883e729568307871 Mon Sep 17 00:00:00 2001 From: River <26424577+wusatosi@users.noreply.github.com> Date: Fri, 21 Feb 2025 16:03:14 -0500 Subject: [PATCH 037/199] Create build_devcontainer.yml --- .github/workflows/build_devcontainer.yml | 39 ++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 .github/workflows/build_devcontainer.yml diff --git a/.github/workflows/build_devcontainer.yml b/.github/workflows/build_devcontainer.yml new file mode 100644 index 0000000..b824dd1 --- /dev/null +++ b/.github/workflows/build_devcontainer.yml @@ -0,0 +1,39 @@ +# SPDX-License-Identifier: 2.0 license with LLVM exceptions +name: Publish Beman devcontainers + +on: + push: + workflow_dispatch: + +env: + REGISTRY: ghcr.io + IMAGE_NAME: devcontainers + +permissions: + packages: write + +jobs: + build-and-push-devcontainer-image: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + - name: Log in to the Container registry + uses: docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + - name: Extract metadata (tags, labels) for Docker + id: meta + uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7 + with: + images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} + - name: Build and push Docker image + id: push + uses: docker/build-push-action@f2a1d5e99d037542a71f64918e516c093c6f3fc4 + with: + context: devcontainer + push: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} From 5c64edeac3c6c7b6bf2fe8c4c3432f041fdca86a Mon Sep 17 00:00:00 2001 From: River <26424577+wusatosi@users.noreply.github.com> Date: Fri, 21 Feb 2025 16:07:06 -0500 Subject: [PATCH 038/199] Update build_devcontainer.yml --- .github/workflows/build_devcontainer.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build_devcontainer.yml b/.github/workflows/build_devcontainer.yml index b824dd1..3a02bd3 100644 --- a/.github/workflows/build_devcontainer.yml +++ b/.github/workflows/build_devcontainer.yml @@ -7,7 +7,7 @@ on: env: REGISTRY: ghcr.io - IMAGE_NAME: devcontainers + IMAGE_NAME: ${{ github.repository }} permissions: packages: write From 151fd66241ecffcf6880e3a901abd9ff0a7be52e Mon Sep 17 00:00:00 2001 From: River <26424577+wusatosi@users.noreply.github.com> Date: Fri, 21 Feb 2025 17:26:46 -0500 Subject: [PATCH 039/199] Update build_devcontainer.yml --- .github/workflows/build_devcontainer.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build_devcontainer.yml b/.github/workflows/build_devcontainer.yml index 3a02bd3..cd28afa 100644 --- a/.github/workflows/build_devcontainer.yml +++ b/.github/workflows/build_devcontainer.yml @@ -15,23 +15,24 @@ permissions: jobs: build-and-push-devcontainer-image: runs-on: ubuntu-latest + name: Update devcontainer steps: - name: Checkout repository uses: actions/checkout@v4 - name: Log in to the Container registry - uses: docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1 + uses: docker/login-action@v3 with: registry: ghcr.io username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - name: Extract metadata (tags, labels) for Docker id: meta - uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7 + uses: docker/metadata-action@v5 with: images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} - name: Build and push Docker image id: push - uses: docker/build-push-action@f2a1d5e99d037542a71f64918e516c093c6f3fc4 + uses: docker/build-push-action@v6 with: context: devcontainer push: true From 31df352b6f1ff75ac4af9d2647a92528bce3f55d Mon Sep 17 00:00:00 2001 From: River <26424577+wusatosi@users.noreply.github.com> Date: Fri, 21 Feb 2025 17:31:35 -0500 Subject: [PATCH 040/199] Run `pipx ensurepath` --- devcontainer/Dockerfile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/devcontainer/Dockerfile b/devcontainer/Dockerfile index b7b2938..9d1f3cd 100644 --- a/devcontainer/Dockerfile +++ b/devcontainer/Dockerfile @@ -8,9 +8,9 @@ RUN echo 'deb [signed-by=/usr/share/keyrings/kitware-archive-keyring.gpg] https: RUN sudo apt-get update && sudo apt-get install -y cmake # Install pre-commit -RUN sudo apt-get install -y pipx && pipx install pre-commit +RUN sudo apt-get install -y pipx && pipx ensurepath && pipx install pre-commit -# Newer gcc/ llvm is needed to avoid ASAN Stalling +# Newer gcc/ llvm is needed to avoid ASAN Stalling, which is turned on by default across beman projects. # See: https://github.com/google/sanitizers/issues/1614 # Minimal vesion: clang-18.1.3, gcc-13.2 -RUN sudo apt-get install -y gcc-14 \ No newline at end of file +RUN sudo apt-get install -y gcc-14 From 9f0aad1d9584ea9dcb3e70672a0374bc21a56349 Mon Sep 17 00:00:00 2001 From: River <26424577+wusatosi@users.noreply.github.com> Date: Fri, 21 Feb 2025 17:33:14 -0500 Subject: [PATCH 041/199] run `pipx ensurepath` separately --- devcontainer/Dockerfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/devcontainer/Dockerfile b/devcontainer/Dockerfile index 9d1f3cd..d2b65aa 100644 --- a/devcontainer/Dockerfile +++ b/devcontainer/Dockerfile @@ -8,7 +8,8 @@ RUN echo 'deb [signed-by=/usr/share/keyrings/kitware-archive-keyring.gpg] https: RUN sudo apt-get update && sudo apt-get install -y cmake # Install pre-commit -RUN sudo apt-get install -y pipx && pipx ensurepath && pipx install pre-commit +RUN sudo apt-get install -y pipx && pipx ensurepath +RUN pipx install pre-commit # Newer gcc/ llvm is needed to avoid ASAN Stalling, which is turned on by default across beman projects. # See: https://github.com/google/sanitizers/issues/1614 From 30f05305ecd946eff4ec94ab9d0c1c58524fc7d9 Mon Sep 17 00:00:00 2001 From: River <26424577+wusatosi@users.noreply.github.com> Date: Fri, 21 Feb 2025 17:36:18 -0500 Subject: [PATCH 042/199] revert `pipx ensurepath` --- devcontainer/Dockerfile | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/devcontainer/Dockerfile b/devcontainer/Dockerfile index d2b65aa..295a3a4 100644 --- a/devcontainer/Dockerfile +++ b/devcontainer/Dockerfile @@ -8,8 +8,7 @@ RUN echo 'deb [signed-by=/usr/share/keyrings/kitware-archive-keyring.gpg] https: RUN sudo apt-get update && sudo apt-get install -y cmake # Install pre-commit -RUN sudo apt-get install -y pipx && pipx ensurepath -RUN pipx install pre-commit +RUN sudo apt-get install -y pipx && pipx install pre-commit # Newer gcc/ llvm is needed to avoid ASAN Stalling, which is turned on by default across beman projects. # See: https://github.com/google/sanitizers/issues/1614 From 56b63720c5c2b1dc032d58d880da275e7fa7c037 Mon Sep 17 00:00:00 2001 From: River <26424577+wusatosi@users.noreply.github.com> Date: Sun, 23 Feb 2025 17:43:19 +0000 Subject: [PATCH 043/199] swap out dev container definition --- .../docker_dev_container/devcontainer.json | 15 +++++++++++++++ .devcontainer/generic_container/Dockerfile | 16 ---------------- .../generic_container/devcontainer.json | 15 --------------- .devcontainer/generic_container/postcreate.sh | 3 --- 4 files changed, 15 insertions(+), 34 deletions(-) create mode 100644 .devcontainer/docker_dev_container/devcontainer.json delete mode 100644 .devcontainer/generic_container/Dockerfile delete mode 100644 .devcontainer/generic_container/devcontainer.json delete mode 100644 .devcontainer/generic_container/postcreate.sh diff --git a/.devcontainer/docker_dev_container/devcontainer.json b/.devcontainer/docker_dev_container/devcontainer.json new file mode 100644 index 0000000..922e0a8 --- /dev/null +++ b/.devcontainer/docker_dev_container/devcontainer.json @@ -0,0 +1,15 @@ +// For format details, see https://aka.ms/devcontainer.json. For config options, see the +// README at: https://github.com/devcontainers/templates/tree/main/src/cpp + +{ + "name": "beman.infra Docker Devcontainer", + "image": "mcr.microsoft.com/devcontainers/base:ubuntu", + "features": { + "ghcr.io/devcontainers/features/docker-in-docker:2": { + "version": "latest", + "enableNonRootDocker": true, + "moby": false + }, + "ghcr.io/devcontainers-extra/features/pre-commit:2": {} + } +} \ No newline at end of file diff --git a/.devcontainer/generic_container/Dockerfile b/.devcontainer/generic_container/Dockerfile deleted file mode 100644 index b7b2938..0000000 --- a/.devcontainer/generic_container/Dockerfile +++ /dev/null @@ -1,16 +0,0 @@ -FROM mcr.microsoft.com/devcontainers/cpp:1-ubuntu-24.04 - -USER vscode - -# Install latest cmake -RUN wget -O - https://apt.kitware.com/keys/kitware-archive-latest.asc 2>/dev/null | gpg --dearmor - | sudo tee /usr/share/keyrings/kitware-archive-keyring.gpg >/dev/null -RUN echo 'deb [signed-by=/usr/share/keyrings/kitware-archive-keyring.gpg] https://apt.kitware.com/ubuntu/ noble main' | sudo tee /etc/apt/sources.list.d/kitware.list >/dev/null -RUN sudo apt-get update && sudo apt-get install -y cmake - -# Install pre-commit -RUN sudo apt-get install -y pipx && pipx install pre-commit - -# Newer gcc/ llvm is needed to avoid ASAN Stalling -# See: https://github.com/google/sanitizers/issues/1614 -# Minimal vesion: clang-18.1.3, gcc-13.2 -RUN sudo apt-get install -y gcc-14 \ No newline at end of file diff --git a/.devcontainer/generic_container/devcontainer.json b/.devcontainer/generic_container/devcontainer.json deleted file mode 100644 index 75364bd..0000000 --- a/.devcontainer/generic_container/devcontainer.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "Beman Project Generic Devcontainer", - "build": { - "dockerfile": "Dockerfile" - }, - "postCreateCommand": "bash .devcontainer/postcreate.sh", - "customizations": { - "vscode": { - "extensions": [ - "ms-vscode.cpptools", - "ms-vscode.cmake-tools" - ] - } - } -} \ No newline at end of file diff --git a/.devcontainer/generic_container/postcreate.sh b/.devcontainer/generic_container/postcreate.sh deleted file mode 100644 index 3bae98e..0000000 --- a/.devcontainer/generic_container/postcreate.sh +++ /dev/null @@ -1,3 +0,0 @@ -# Setup pre-commit -pre-commit -pre-commit install \ No newline at end of file From c6dc92a9ab699332cdaeb9b5cb22a2d16aa81f20 Mon Sep 17 00:00:00 2001 From: River <26424577+wusatosi@users.noreply.github.com> Date: Sun, 23 Feb 2025 18:22:22 +0000 Subject: [PATCH 044/199] update docker script --- devcontainer/Dockerfile | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/devcontainer/Dockerfile b/devcontainer/Dockerfile index 295a3a4..7386c48 100644 --- a/devcontainer/Dockerfile +++ b/devcontainer/Dockerfile @@ -1,16 +1,28 @@ FROM mcr.microsoft.com/devcontainers/cpp:1-ubuntu-24.04 -USER vscode +# Latest CMake needed for most of the beman libraries, +# so we need to install via kitware's apt repo +RUN bash </dev/null | gpg --dearmor - | sudo tee /usr/share/keyrings/kitware-archive-keyring.gpg >/dev/null + echo 'deb [signed-by=/usr/share/keyrings/kitware-archive-keyring.gpg] https://apt.kitware.com/ubuntu/ noble main' | sudo tee /etc/apt/sources.list.d/kitware.list >/dev/null + sudo apt-get update && sudo apt-get install -y cmake +EOF -# Install latest cmake -RUN wget -O - https://apt.kitware.com/keys/kitware-archive-latest.asc 2>/dev/null | gpg --dearmor - | sudo tee /usr/share/keyrings/kitware-archive-keyring.gpg >/dev/null -RUN echo 'deb [signed-by=/usr/share/keyrings/kitware-archive-keyring.gpg] https://apt.kitware.com/ubuntu/ noble main' | sudo tee /etc/apt/sources.list.d/kitware.list >/dev/null -RUN sudo apt-get update && sudo apt-get install -y cmake - -# Install pre-commit RUN sudo apt-get install -y pipx && pipx install pre-commit # Newer gcc/ llvm is needed to avoid ASAN Stalling, which is turned on by default across beman projects. # See: https://github.com/google/sanitizers/issues/1614 # Minimal vesion: clang-18.1.3, gcc-13.2 -RUN sudo apt-get install -y gcc-14 +ARG gnu_version=14 +RUN bash < Date: Sun, 23 Feb 2025 18:30:20 +0000 Subject: [PATCH 045/199] update workflow --- .github/workflows/build_devcontainer.yml | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/.github/workflows/build_devcontainer.yml b/.github/workflows/build_devcontainer.yml index cd28afa..82970b4 100644 --- a/.github/workflows/build_devcontainer.yml +++ b/.github/workflows/build_devcontainer.yml @@ -22,19 +22,14 @@ jobs: - name: Log in to the Container registry uses: docker/login-action@v3 with: - registry: ghcr.io + registry: ${{ env.REGISTRY }} username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - - name: Extract metadata (tags, labels) for Docker - id: meta - uses: docker/metadata-action@v5 - with: - images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} - name: Build and push Docker image - id: push uses: docker/build-push-action@v6 with: context: devcontainer + build-args: | + gnu_version=14 push: true - tags: ${{ steps.meta.outputs.tags }} - labels: ${{ steps.meta.outputs.labels }} + tags: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:gnu-14 From 4a30c7a83563ab42192b4e5b3ebf384fcf0b5abc Mon Sep 17 00:00:00 2001 From: River <26424577+wusatosi@users.noreply.github.com> Date: Sun, 23 Feb 2025 18:43:38 +0000 Subject: [PATCH 046/199] update workflow --- .github/workflows/build_devcontainer.yml | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build_devcontainer.yml b/.github/workflows/build_devcontainer.yml index 82970b4..afd0643 100644 --- a/.github/workflows/build_devcontainer.yml +++ b/.github/workflows/build_devcontainer.yml @@ -7,7 +7,8 @@ on: env: REGISTRY: ghcr.io - IMAGE_NAME: ${{ github.repository }} + DEBUG_IMAGE_NAME: ${{ github.repository }} + DEPLOY_IMAGE_NAME: beman/devcontainers permissions: packages: write @@ -17,6 +18,15 @@ jobs: runs-on: ubuntu-latest name: Update devcontainer steps: + - name: Compute Tag + id: tag + run: + image_name=${{ env.DEPLOY_IMAGE_NAME }} + if [ "${{ github.repository_owner }}" != "beman" ]; then + image_name=${{ env.DEBUG_IMAGE_NAME }} + fi + tag=${{ env.REGISTRY }}/$image_name:gcc-14 + echo "tag=$tag" >> "$GITHUB_OUTPUT" - name: Checkout repository uses: actions/checkout@v4 - name: Log in to the Container registry @@ -32,4 +42,4 @@ jobs: build-args: | gnu_version=14 push: true - tags: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:gnu-14 + tags: ${{ steps.tag.outputs.tag }} From b3bd0d82a05ea7b9ec1a8de07054e713538439e0 Mon Sep 17 00:00:00 2001 From: River <26424577+wusatosi@users.noreply.github.com> Date: Sun, 23 Feb 2025 18:46:42 +0000 Subject: [PATCH 047/199] disable provenance --- .github/workflows/build_devcontainer.yml | 5 ++++- devcontainer/build.sh | 5 +++++ 2 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 devcontainer/build.sh diff --git a/.github/workflows/build_devcontainer.yml b/.github/workflows/build_devcontainer.yml index afd0643..d2e457b 100644 --- a/.github/workflows/build_devcontainer.yml +++ b/.github/workflows/build_devcontainer.yml @@ -25,7 +25,8 @@ jobs: if [ "${{ github.repository_owner }}" != "beman" ]; then image_name=${{ env.DEBUG_IMAGE_NAME }} fi - tag=${{ env.REGISTRY }}/$image_name:gcc-14 + tag=${{ env.REGISTRY }}/$image_name:gnu-14 + echo "computed tag:$tag" echo "tag=$tag" >> "$GITHUB_OUTPUT" - name: Checkout repository uses: actions/checkout@v4 @@ -43,3 +44,5 @@ jobs: gnu_version=14 push: true tags: ${{ steps.tag.outputs.tag }} + # https://github.com/docker/build-push-action/issues/894 + provenance: false diff --git a/devcontainer/build.sh b/devcontainer/build.sh new file mode 100644 index 0000000..7b12a13 --- /dev/null +++ b/devcontainer/build.sh @@ -0,0 +1,5 @@ +docker build \ +--build-arg compiler_kind=llvm \ +--build-arg compiler_version=14 \ +. \ +--progress=plain \ No newline at end of file From daee5552af01660e332df8c25bccabf8fee3355a Mon Sep 17 00:00:00 2001 From: River <26424577+wusatosi@users.noreply.github.com> Date: Sun, 23 Feb 2025 18:52:29 +0000 Subject: [PATCH 048/199] fix workflow --- .github/workflows/build_devcontainer.yml | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/.github/workflows/build_devcontainer.yml b/.github/workflows/build_devcontainer.yml index d2e457b..a8b7d07 100644 --- a/.github/workflows/build_devcontainer.yml +++ b/.github/workflows/build_devcontainer.yml @@ -18,16 +18,15 @@ jobs: runs-on: ubuntu-latest name: Update devcontainer steps: - - name: Compute Tag - id: tag - run: + - name: Compute Image Name + id: image_name + run: | image_name=${{ env.DEPLOY_IMAGE_NAME }} if [ "${{ github.repository_owner }}" != "beman" ]; then image_name=${{ env.DEBUG_IMAGE_NAME }} fi - tag=${{ env.REGISTRY }}/$image_name:gnu-14 - echo "computed tag:$tag" - echo "tag=$tag" >> "$GITHUB_OUTPUT" + echo "computed image name: $image_name" + echo "image_name=$image_name" >> "$GITHUB_OUTPUT" - name: Checkout repository uses: actions/checkout@v4 - name: Log in to the Container registry @@ -43,6 +42,6 @@ jobs: build-args: | gnu_version=14 push: true - tags: ${{ steps.tag.outputs.tag }} + tags: ${{ env.REGISTRY }}/${{ steps.image_name.outputs.image_name }}:gnu-14 # https://github.com/docker/build-push-action/issues/894 provenance: false From 7f4bbb9926546d08b9da9579f10c3352b1ff1076 Mon Sep 17 00:00:00 2001 From: River <26424577+wusatosi@users.noreply.github.com> Date: Sun, 23 Feb 2025 20:00:45 +0000 Subject: [PATCH 049/199] remove unneeded script --- devcontainer/build.sh | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 devcontainer/build.sh diff --git a/devcontainer/build.sh b/devcontainer/build.sh deleted file mode 100644 index 7b12a13..0000000 --- a/devcontainer/build.sh +++ /dev/null @@ -1,5 +0,0 @@ -docker build \ ---build-arg compiler_kind=llvm \ ---build-arg compiler_version=14 \ -. \ ---progress=plain \ No newline at end of file From 406a856ae8ac97a507a9956c7fafc693d2c48c88 Mon Sep 17 00:00:00 2001 From: River <26424577+wusatosi@users.noreply.github.com> Date: Mon, 24 Feb 2025 22:44:49 +0000 Subject: [PATCH 050/199] specify trigger path --- .github/workflows/build_devcontainer.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/build_devcontainer.yml b/.github/workflows/build_devcontainer.yml index a8b7d07..317acad 100644 --- a/.github/workflows/build_devcontainer.yml +++ b/.github/workflows/build_devcontainer.yml @@ -1,8 +1,11 @@ # SPDX-License-Identifier: 2.0 license with LLVM exceptions + name: Publish Beman devcontainers on: push: + paths: + - "devcontainer/**" workflow_dispatch: env: From c6ab1a23ebe4f73dbdec573cd4c6b789c9a765fb Mon Sep 17 00:00:00 2001 From: River <26424577+wusatosi@users.noreply.github.com> Date: Mon, 24 Feb 2025 22:46:36 +0000 Subject: [PATCH 051/199] add license --- .devcontainer/docker_dev_container/devcontainer.json | 4 +--- devcontainer/Dockerfile | 2 ++ devcontainer/README.md | 2 ++ 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/.devcontainer/docker_dev_container/devcontainer.json b/.devcontainer/docker_dev_container/devcontainer.json index 922e0a8..2b1a20e 100644 --- a/.devcontainer/docker_dev_container/devcontainer.json +++ b/.devcontainer/docker_dev_container/devcontainer.json @@ -1,6 +1,4 @@ -// For format details, see https://aka.ms/devcontainer.json. For config options, see the -// README at: https://github.com/devcontainers/templates/tree/main/src/cpp - +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception { "name": "beman.infra Docker Devcontainer", "image": "mcr.microsoft.com/devcontainers/base:ubuntu", diff --git a/devcontainer/Dockerfile b/devcontainer/Dockerfile index 7386c48..6a9a29d 100644 --- a/devcontainer/Dockerfile +++ b/devcontainer/Dockerfile @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + FROM mcr.microsoft.com/devcontainers/cpp:1-ubuntu-24.04 # Latest CMake needed for most of the beman libraries, diff --git a/devcontainer/README.md b/devcontainer/README.md index 99cab15..6238081 100644 --- a/devcontainer/README.md +++ b/devcontainer/README.md @@ -1,3 +1,5 @@ # Devcontainer + + TODO \ No newline at end of file From 0d4278207e55cdb28ee0f3c10d89135c47113bc4 Mon Sep 17 00:00:00 2001 From: River <26424577+wusatosi@users.noreply.github.com> Date: Mon, 24 Feb 2025 23:02:42 +0000 Subject: [PATCH 052/199] add more docs --- devcontainer/README.md | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/devcontainer/README.md b/devcontainer/README.md index 6238081..a2c4c8a 100644 --- a/devcontainer/README.md +++ b/devcontainer/README.md @@ -2,4 +2,23 @@ -TODO \ No newline at end of file +This folder contains the infrastructure for beman project's +generic devcontainer image. You can checkout the image in beman's +[GitHub Packages page](https://github.com/orgs/bemanproject/packages/container/package/devcontainers). + +The image is build on top of GitHub's +[C++ devcontainer image](https://github.com/devcontainers/images/tree/main/src/cpp) +for ubuntu 24.04. + +The image includes: + +- The latest CMake from kitware's apt repository +- GNU compiler version 14 (this is configurable via docker build arg) + +## Building your own image + +You can build your own beman devcontainer image with: + +```bash +docker build devcontainer/ +``` \ No newline at end of file From aabdc754d5fc31151bd4afe730b571ebf8e378af Mon Sep 17 00:00:00 2001 From: River <26424577+wusatosi@users.noreply.github.com> Date: Mon, 24 Feb 2025 18:08:26 -0500 Subject: [PATCH 053/199] Format --- .devcontainer/docker_dev_container/devcontainer.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.devcontainer/docker_dev_container/devcontainer.json b/.devcontainer/docker_dev_container/devcontainer.json index 2b1a20e..6707a25 100644 --- a/.devcontainer/docker_dev_container/devcontainer.json +++ b/.devcontainer/docker_dev_container/devcontainer.json @@ -8,6 +8,6 @@ "enableNonRootDocker": true, "moby": false }, - "ghcr.io/devcontainers-extra/features/pre-commit:2": {} + "ghcr.io/devcontainers-extra/features/pre-commit:2": {} } -} \ No newline at end of file +} From 7dc1f6e6ee1fc6d80f96543dabeabda4669049da Mon Sep 17 00:00:00 2001 From: River <26424577+wusatosi@users.noreply.github.com> Date: Wed, 26 Feb 2025 00:37:50 +0000 Subject: [PATCH 054/199] update docker file to install pre-commit correctly --- devcontainer/Dockerfile | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/devcontainer/Dockerfile b/devcontainer/Dockerfile index 6a9a29d..9e1bb58 100644 --- a/devcontainer/Dockerfile +++ b/devcontainer/Dockerfile @@ -10,8 +10,6 @@ RUN bash < Date: Wed, 26 Feb 2025 00:38:52 +0000 Subject: [PATCH 055/199] only use `beman/devcontainers` on main branch --- .github/workflows/build_devcontainer.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build_devcontainer.yml b/.github/workflows/build_devcontainer.yml index 317acad..b7111dc 100644 --- a/.github/workflows/build_devcontainer.yml +++ b/.github/workflows/build_devcontainer.yml @@ -25,7 +25,7 @@ jobs: id: image_name run: | image_name=${{ env.DEPLOY_IMAGE_NAME }} - if [ "${{ github.repository_owner }}" != "beman" ]; then + if [ "${{ github.repository }}/${{ github.ref }}" != "beman/infra/refs/heads/main" ]; then image_name=${{ env.DEBUG_IMAGE_NAME }} fi echo "computed image name: $image_name" From 92d0e89e4afc5f61c99b6337be286c7bbe446c4c Mon Sep 17 00:00:00 2001 From: River <26424577+wusatosi@users.noreply.github.com> Date: Wed, 26 Feb 2025 00:51:01 +0000 Subject: [PATCH 056/199] matrix-fy --- .github/workflows/build_devcontainer.yml | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build_devcontainer.yml b/.github/workflows/build_devcontainer.yml index b7111dc..45d124a 100644 --- a/.github/workflows/build_devcontainer.yml +++ b/.github/workflows/build_devcontainer.yml @@ -19,7 +19,12 @@ permissions: jobs: build-and-push-devcontainer-image: runs-on: ubuntu-latest - name: Update devcontainer + strategy: + fail-fast: false + matrix: + include: + - version: 14 + name: Update devcontainer gnu-${{ matrix.version }} steps: - name: Compute Image Name id: image_name @@ -43,8 +48,8 @@ jobs: with: context: devcontainer build-args: | - gnu_version=14 + gnu_version=${{ matrix.version }} push: true - tags: ${{ env.REGISTRY }}/${{ steps.image_name.outputs.image_name }}:gnu-14 + tags: ${{ env.REGISTRY }}/${{ steps.image_name.outputs.image_name }}:gnu-${{ matrix.version }} # https://github.com/docker/build-push-action/issues/894 provenance: false From decad6de3b2496ba84cbf5e6bd01194cd2fd2912 Mon Sep 17 00:00:00 2001 From: River <26424577+wusatosi@users.noreply.github.com> Date: Wed, 26 Feb 2025 00:55:25 +0000 Subject: [PATCH 057/199] Fix workflow trigger --- .github/workflows/build_devcontainer.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build_devcontainer.yml b/.github/workflows/build_devcontainer.yml index 45d124a..da9d05d 100644 --- a/.github/workflows/build_devcontainer.yml +++ b/.github/workflows/build_devcontainer.yml @@ -5,6 +5,7 @@ name: Publish Beman devcontainers on: push: paths: + - ".github/workflows/build_devcontainer.yml" - "devcontainer/**" workflow_dispatch: From 821569f476892024e5c2e82d8a024236974c6a35 Mon Sep 17 00:00:00 2001 From: River <26424577+wusatosi@users.noreply.github.com> Date: Wed, 26 Feb 2025 01:08:58 +0000 Subject: [PATCH 058/199] allow build of llvm --- .github/workflows/build_devcontainer.yml | 12 +++++--- devcontainer/Dockerfile | 21 +++++--------- devcontainer/install_compiler.sh | 36 ++++++++++++++++++++++++ 3 files changed, 51 insertions(+), 18 deletions(-) create mode 100644 devcontainer/install_compiler.sh diff --git a/.github/workflows/build_devcontainer.yml b/.github/workflows/build_devcontainer.yml index da9d05d..a003c32 100644 --- a/.github/workflows/build_devcontainer.yml +++ b/.github/workflows/build_devcontainer.yml @@ -24,8 +24,11 @@ jobs: fail-fast: false matrix: include: - - version: 14 - name: Update devcontainer gnu-${{ matrix.version }} + - kind: gnu + version: 14 + - kind: llvm + version: 19 + name: Update devcontainer ${{ matrix.kind }}-${{ matrix.version }} steps: - name: Compute Image Name id: image_name @@ -49,8 +52,9 @@ jobs: with: context: devcontainer build-args: | - gnu_version=${{ matrix.version }} + compiler_kind=${{ matrix.kind }} + compiler_version=${{ matrix.version }} push: true - tags: ${{ env.REGISTRY }}/${{ steps.image_name.outputs.image_name }}:gnu-${{ matrix.version }} + tags: ${{ env.REGISTRY }}/${{ steps.image_name.outputs.image_name }}:${{ matrix.kind }}-${{ matrix.version }} # https://github.com/docker/build-push-action/issues/894 provenance: false diff --git a/devcontainer/Dockerfile b/devcontainer/Dockerfile index 9e1bb58..5c2242e 100644 --- a/devcontainer/Dockerfile +++ b/devcontainer/Dockerfile @@ -2,6 +2,9 @@ FROM mcr.microsoft.com/devcontainers/cpp:1-ubuntu-24.04 +USER vscode +WORKDIR /tmp + # Latest CMake needed for most of the beman libraries, # so we need to install via kitware's apt repo RUN bash < Date: Tue, 25 Feb 2025 20:35:42 -0500 Subject: [PATCH 059/199] Update README.md --- devcontainer/README.md | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/devcontainer/README.md b/devcontainer/README.md index a2c4c8a..c878c87 100644 --- a/devcontainer/README.md +++ b/devcontainer/README.md @@ -3,7 +3,7 @@ This folder contains the infrastructure for beman project's -generic devcontainer image. You can checkout the image in beman's +generic devcontainer image. You can checkout available images in beman's [GitHub Packages page](https://github.com/orgs/bemanproject/packages/container/package/devcontainers). The image is build on top of GitHub's @@ -13,7 +13,29 @@ for ubuntu 24.04. The image includes: - The latest CMake from kitware's apt repository -- GNU compiler version 14 (this is configurable via docker build arg) +- Latest compiler based on build args (gnu or llvm) installed from the universe repository +- [pre-commit](https://pre-commit.com/), the standard linter manager across beman + +## Example devcontainer setup + +```json +// For format details, see https://aka.ms/devcontainer.json. For config options, see the +// README at: https://github.com/devcontainers/templates/tree/main/src/cpp + +{ + "name": "Beman Generic Devcontainer", + "image": "ghcr.io/bemanproject/devcontainers:gnu-14", + "postCreateCommand": "pre-commit", + "customizations": { + "vscode": { + "extensions": [ + "ms-vscode.cpptools", + "ms-vscode.cmake-tools" + ] + } + } +} +``` ## Building your own image @@ -21,4 +43,4 @@ You can build your own beman devcontainer image with: ```bash docker build devcontainer/ -``` \ No newline at end of file +``` From fa327324b450af8321b91212745c04e5c9f1cf92 Mon Sep 17 00:00:00 2001 From: River <26424577+wusatosi@users.noreply.github.com> Date: Tue, 25 Feb 2025 20:36:42 -0500 Subject: [PATCH 060/199] Fix license header in the example devcontainer setup --- devcontainer/README.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/devcontainer/README.md b/devcontainer/README.md index c878c87..4eb40d8 100644 --- a/devcontainer/README.md +++ b/devcontainer/README.md @@ -19,9 +19,7 @@ The image includes: ## Example devcontainer setup ```json -// For format details, see https://aka.ms/devcontainer.json. For config options, see the -// README at: https://github.com/devcontainers/templates/tree/main/src/cpp - +// SPDX-License-Identifier: 2.0 license with LLVM exceptions { "name": "Beman Generic Devcontainer", "image": "ghcr.io/bemanproject/devcontainers:gnu-14", From 027d362c431dcb5e0d3d90a4c8a8e2b74bf517c0 Mon Sep 17 00:00:00 2001 From: Bret Brown Date: Sun, 26 Jan 2025 15:52:28 -0500 Subject: [PATCH 061/199] Inject FetchContent logic Problem ------- **Given**: A sandbox environment is an environment where dependencies are all provided but access to the internet is not. Also take as a given that the build for this project happens in an environment that meets that description. **When**: Configuring this project with any of the provided approaches. For instance: ``` cmake -B build -S . ``` **Then**: The configuration step hangs or fails, depending on the nature of the sandboxed environment. Solution -------- Move to a `find_package` first implementation for the `CMakeLists.txt` of this project. Using `FetchContent` is still trivial, using the new functionality in `cmake/use-fetch-content.cmake` as documented in the updates to `README.md` included in this commit. Signed-off-by: Bret Brown --- cmake/use-fetch-content.cmake | 175 ++++++++++++++++++++++++++++++++++ 1 file changed, 175 insertions(+) create mode 100644 cmake/use-fetch-content.cmake diff --git a/cmake/use-fetch-content.cmake b/cmake/use-fetch-content.cmake new file mode 100644 index 0000000..606c007 --- /dev/null +++ b/cmake/use-fetch-content.cmake @@ -0,0 +1,175 @@ +cmake_minimum_required(VERSION 3.24) + +if(NOT BEMAN_EXEMPLAR_LOCKFILE) + set(BEMAN_EXEMPLAR_LOCKFILE + "lockfile.json" + CACHE FILEPATH + "Path to the dependency lockfile for the Beman Exemplar." + ) +endif() + +set(BemanExemplar_projectDir "${CMAKE_CURRENT_LIST_DIR}/..") +message(TRACE "BemanExemplar_projectDir=\"${BemanExemplar_projectDir}\"") + +message(TRACE "BEMAN_EXEMPLAR_LOCKFILE=\"${BEMAN_EXEMPLAR_LOCKFILE}\"") +file( + REAL_PATH + "${BEMAN_EXEMPLAR_LOCKFILE}" + BemanExemplar_lockfile + BASE_DIRECTORY "${BemanExemplar_projectDir}" + EXPAND_TILDE +) +message(DEBUG "Using lockfile: \"${BemanExemplar_lockfile}\"") + +# Force CMake to reconfigure the project if the lockfile changes +set_property( + DIRECTORY "${BemanExemplar_projectDir}" + APPEND + PROPERTY CMAKE_CONFIGURE_DEPENDS "${BemanExemplar_lockfile}" +) + +# For more on the protocol for this function, see: +# https://cmake.org/cmake/help/latest/command/cmake_language.html#provider-commands +function(BemanExemplar_provideDependency method package_name) + # Read the lockfile + file(READ "${BemanExemplar_lockfile}" BemanExemplar_rootObj) + + # Get the "dependencies" field and store it in BemanExemplar_dependenciesObj + string( + JSON + BemanExemplar_dependenciesObj + ERROR_VARIABLE BemanExemplar_error + GET "${BemanExemplar_rootObj}" + "dependencies" + ) + if(BemanExemplar_error) + message(FATAL_ERROR "${BemanExemplar_lockfile}: ${BemanExemplar_error}") + endif() + + # Get the length of the libraries array and store it in BemanExemplar_dependenciesObj + string( + JSON + BemanExemplar_numDependencies + ERROR_VARIABLE BemanExemplar_error + LENGTH "${BemanExemplar_dependenciesObj}" + ) + if(BemanExemplar_error) + message(FATAL_ERROR "${BemanExemplar_lockfile}: ${BemanExemplar_error}") + endif() + + # Loop over each dependency object + math(EXPR BemanExemplar_maxIndex "${BemanExemplar_numDependencies} - 1") + foreach(BemanExemplar_index RANGE "${BemanExemplar_maxIndex}") + set(BemanExemplar_errorPrefix + "${BemanExemplar_lockfile}, dependency ${BemanExemplar_index}" + ) + + # Get the dependency object at BemanExemplar_index + # and store it in BemanExemplar_depObj + string( + JSON + BemanExemplar_depObj + ERROR_VARIABLE BemanExemplar_error + GET "${BemanExemplar_dependenciesObj}" + "${BemanExemplar_index}" + ) + if(BemanExemplar_error) + message( + FATAL_ERROR + "${BemanExemplar_errorPrefix}: ${BemanExemplar_error}" + ) + endif() + + # Get the "name" field and store it in BemanExemplar_name + string( + JSON + BemanExemplar_name + ERROR_VARIABLE BemanExemplar_error + GET "${BemanExemplar_depObj}" + "name" + ) + if(BemanExemplar_error) + message( + FATAL_ERROR + "${BemanExemplar_errorPrefix}: ${BemanExemplar_error}" + ) + endif() + + # Get the "package_name" field and store it in BemanExemplar_pkgName + string( + JSON + BemanExemplar_pkgName + ERROR_VARIABLE BemanExemplar_error + GET "${BemanExemplar_depObj}" + "package_name" + ) + if(BemanExemplar_error) + message( + FATAL_ERROR + "${BemanExemplar_errorPrefix}: ${BemanExemplar_error}" + ) + endif() + + # Get the "git_repository" field and store it in BemanExemplar_repo + string( + JSON + BemanExemplar_repo + ERROR_VARIABLE BemanExemplar_error + GET "${BemanExemplar_depObj}" + "git_repository" + ) + if(BemanExemplar_error) + message( + FATAL_ERROR + "${BemanExemplar_errorPrefix}: ${BemanExemplar_error}" + ) + endif() + + # Get the "git_tag" field and store it in BemanExemplar_tag + string( + JSON + BemanExemplar_tag + ERROR_VARIABLE BemanExemplar_error + GET "${BemanExemplar_depObj}" + "git_tag" + ) + if(BemanExemplar_error) + message( + FATAL_ERROR + "${BemanExemplar_errorPrefix}: ${BemanExemplar_error}" + ) + endif() + + if(method STREQUAL "FIND_PACKAGE") + if(package_name STREQUAL BemanExemplar_pkgName) + string( + APPEND + BemanExemplar_debug + "Redirecting find_package calls for ${BemanExemplar_pkgName} " + "to FetchContent logic fetching ${BemanExemplar_repo} at " + "${BemanExemplar_tag} according to ${BemanExemplar_lockfile}." + ) + message(DEBUG "${BemanExemplar_debug}") + FetchContent_Declare( + "${BemanExemplar_name}" + GIT_REPOSITORY "${BemanExemplar_repo}" + GIT_TAG "${BemanExemplar_tag}" + EXCLUDE_FROM_ALL + ) + set(INSTALL_GTEST OFF) # Disable GoogleTest installation + FetchContent_MakeAvailable("${BemanExemplar_name}") + + # Important! _FOUND tells CMake that `find_package` is + # not needed for this package anymore + set("${BemanExemplar_pkgName}_FOUND" TRUE PARENT_SCOPE) + endif() + endif() + endforeach() + + set(GTest_FOUND TRUE PARENT_SCOPE) +endfunction() + +cmake_language( + SET_DEPENDENCY_PROVIDER BemanExemplar_provideDependency + SUPPORTED_METHODS FIND_PACKAGE +) From a47e323cc72299735230449c0ac3266d97231030 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Darius=20Nea=C8=9Bu?= Date: Tue, 11 Mar 2025 21:22:17 +0200 Subject: [PATCH 062/199] Update CODEOWNERS: add @bemanproject/core-reviewers --- .github/CODEOWNERS | 1 + 1 file changed, 1 insertion(+) create mode 100644 .github/CODEOWNERS diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 0000000..d3be6f1 --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1 @@ +* @bemanproject/core-reviewers From 9c47aa08176a5136796e506493da5f0874f51114 Mon Sep 17 00:00:00 2001 From: Steve Downey Date: Wed, 12 Mar 2025 11:48:50 -0400 Subject: [PATCH 063/199] Remove extra GTest_FOUND set Remove the extra variable set. --- cmake/use-fetch-content.cmake | 2 -- 1 file changed, 2 deletions(-) diff --git a/cmake/use-fetch-content.cmake b/cmake/use-fetch-content.cmake index 606c007..63dc9c9 100644 --- a/cmake/use-fetch-content.cmake +++ b/cmake/use-fetch-content.cmake @@ -165,8 +165,6 @@ function(BemanExemplar_provideDependency method package_name) endif() endif() endforeach() - - set(GTest_FOUND TRUE PARENT_SCOPE) endfunction() cmake_language( From 9034da10d47fa72b35fffcc3cb967ef06ae2a9b9 Mon Sep 17 00:00:00 2001 From: River <26424577+wusatosi@users.noreply.github.com> Date: Fri, 14 Mar 2025 14:18:40 -0400 Subject: [PATCH 064/199] Apply suggestions from code review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Darius Neațu Co-authored-by: Radu Nichita <45298861+RaduNichita@users.noreply.github.com> --- devcontainer/Dockerfile | 2 +- devcontainer/README.md | 8 ++++---- devcontainer/install_compiler.sh | 8 ++++---- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/devcontainer/Dockerfile b/devcontainer/Dockerfile index 5c2242e..1d6c7be 100644 --- a/devcontainer/Dockerfile +++ b/devcontainer/Dockerfile @@ -27,4 +27,4 @@ RUN sudo apt-get install -y pipx RUN pipx install pre-commit ENV PATH="/home/vscode/.local/bin:${PATH}" -ENTRYPOINT ["/usr/bin/bash"] \ No newline at end of file +ENTRYPOINT ["/usr/bin/bash"] diff --git a/devcontainer/README.md b/devcontainer/README.md index 4eb40d8..fbb2013 100644 --- a/devcontainer/README.md +++ b/devcontainer/README.md @@ -2,19 +2,19 @@ -This folder contains the infrastructure for beman project's +This folder contains the infrastructure for Beman project's generic devcontainer image. You can checkout available images in beman's [GitHub Packages page](https://github.com/orgs/bemanproject/packages/container/package/devcontainers). The image is build on top of GitHub's [C++ devcontainer image](https://github.com/devcontainers/images/tree/main/src/cpp) -for ubuntu 24.04. +for Ubuntu 24.04. The image includes: - The latest CMake from kitware's apt repository - Latest compiler based on build args (gnu or llvm) installed from the universe repository -- [pre-commit](https://pre-commit.com/), the standard linter manager across beman +- [pre-commit](https://pre-commit.com/), the standard linter manager across Beman ## Example devcontainer setup @@ -37,7 +37,7 @@ The image includes: ## Building your own image -You can build your own beman devcontainer image with: +You can build your own Beman devcontainer image with: ```bash docker build devcontainer/ diff --git a/devcontainer/install_compiler.sh b/devcontainer/install_compiler.sh index 573ba19..7ebdafd 100644 --- a/devcontainer/install_compiler.sh +++ b/devcontainer/install_compiler.sh @@ -2,11 +2,11 @@ # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception set -e - +set +x TOOL=$1 VERSION=$2 -echo "Install $TOOL at: $VERSION" +echo "Install ${TOOL} at: ${VERSION}" shopt -s nocasematch if [ "$TOOL" = "gnu" ]; then @@ -24,7 +24,7 @@ else sudo apt-get install -y lsb-release wget software-properties-common gnupg wget https://apt.llvm.org/llvm.sh - sudo bash llvm.sh $2 + sudo bash llvm.sh ${VERSION} sudo rm -f /usr/bin/clang sudo rm -f /usr/bin/clang++ @@ -33,4 +33,4 @@ else sudo ln -s $(which clang++-$VERSION) /usr/bin/clang++ clang --version -fi \ No newline at end of file +fi From 54085f7b26b6d1d95306b6fcd705f93c01c6709e Mon Sep 17 00:00:00 2001 From: River <26424577+wusatosi@users.noreply.github.com> Date: Fri, 14 Mar 2025 14:52:53 -0400 Subject: [PATCH 065/199] Apply shell check --- devcontainer/install_compiler.sh | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/devcontainer/install_compiler.sh b/devcontainer/install_compiler.sh index 7ebdafd..ec53dec 100644 --- a/devcontainer/install_compiler.sh +++ b/devcontainer/install_compiler.sh @@ -10,27 +10,27 @@ echo "Install ${TOOL} at: ${VERSION}" shopt -s nocasematch if [ "$TOOL" = "gnu" ]; then - sudo apt-get remove -y gcc-$VERSION g++-$VERSION gcc g++ - sudo apt-get install -y gcc-$VERSION g++-$VERSION + sudo apt-get remove -y gcc-"$VERSION" g++-"$VERSION" gcc g++ + sudo apt-get install -y gcc-"$VERSION" g++-"$VERSION" sudo rm -f /usr/bin/gcc sudo rm -f /usr/bin/g++ - sudo ln -s $(which gcc-$VERSION) /usr/bin/gcc - sudo ln -s $(which g++-$VERSION) /usr/bin/g++ + sudo ln -s "$(which gcc-"$VERSION")" /usr/bin/gcc + sudo ln -s "$(which g++-"$VERSION")" /usr/bin/g++ gcc --version else sudo apt-get install -y lsb-release wget software-properties-common gnupg wget https://apt.llvm.org/llvm.sh - sudo bash llvm.sh ${VERSION} + sudo bash llvm.sh "${VERSION}" sudo rm -f /usr/bin/clang sudo rm -f /usr/bin/clang++ - sudo ln -s $(which clang-$VERSION) /usr/bin/clang - sudo ln -s $(which clang++-$VERSION) /usr/bin/clang++ + sudo ln -s "$(which clang-"$VERSION")" /usr/bin/clang + sudo ln -s "$(which clang++-"$VERSION")" /usr/bin/clang++ clang --version fi From a2888be252957bfec0f5c9f2c16a151368ff9c7c Mon Sep 17 00:00:00 2001 From: River <26424577+wusatosi@users.noreply.github.com> Date: Fri, 14 Mar 2025 14:58:33 -0400 Subject: [PATCH 066/199] Install `libgtest` --- devcontainer/Dockerfile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/devcontainer/Dockerfile b/devcontainer/Dockerfile index 1d6c7be..f72e994 100644 --- a/devcontainer/Dockerfile +++ b/devcontainer/Dockerfile @@ -22,6 +22,9 @@ ARG compiler_version=14 COPY install_compiler.sh . RUN bash install_compiler.sh ${compiler_kind} ${compiler_version} +# Needed for recent exemplar +RUN sudo apt-get install -y libgtest-dev + # Pre-commit is beman library's standard linting tool RUN sudo apt-get install -y pipx RUN pipx install pre-commit From 7384a2b61df5bd4a1635f658bea20cd2af3cf92c Mon Sep 17 00:00:00 2001 From: River <26424577+wusatosi@users.noreply.github.com> Date: Fri, 14 Mar 2025 19:22:29 -0400 Subject: [PATCH 067/199] Quick fix for `Compute Image Name` --- .github/workflows/build_devcontainer.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build_devcontainer.yml b/.github/workflows/build_devcontainer.yml index a003c32..f538a67 100644 --- a/.github/workflows/build_devcontainer.yml +++ b/.github/workflows/build_devcontainer.yml @@ -28,13 +28,13 @@ jobs: version: 14 - kind: llvm version: 19 - name: Update devcontainer ${{ matrix.kind }}-${{ matrix.version }} + name: "devcontainer: ${{ matrix.kind }}-${{ matrix.version }}" steps: - name: Compute Image Name id: image_name run: | image_name=${{ env.DEPLOY_IMAGE_NAME }} - if [ "${{ github.repository }}/${{ github.ref }}" != "beman/infra/refs/heads/main" ]; then + if [ "${{ github.repository }}/${{ github.ref }}" != "bemanproject/infra/refs/heads/main" ]; then image_name=${{ env.DEBUG_IMAGE_NAME }} fi echo "computed image name: $image_name" From 4d7b01c8730fbca59ecbcdd2b804ec2a56e14b89 Mon Sep 17 00:00:00 2001 From: Edward Nolan Date: Sun, 16 Mar 2025 12:05:46 -0400 Subject: [PATCH 068/199] CMake: Add -fsanitize-undefined-trap-on-error to MaxSan configuration Previously, the following implementation of identity would pass all tests under MaxSan: ``` struct identity { // Returns `t`. template constexpr T&& operator()(T&& t) const noexcept { int x = std::numeric_limits::max(); ++x; return std::forward(t); } using is_transparent = __is_transparent; }; ``` This is because UndefinedBehaviorSanitizer would diagnose the integer overflow by printing, but would not abort the program: ``` [ RUN ] IdentityTest.check_is_transparent bemanproject/exemplar/include/beman/exemplar/identity.hpp:37:7: runtime error: signed integer overflow: 2147483647 + 1 cannot be represented in type 'int' [ OK ] IdentityTest.check_is_transparent (0 ms) ``` After this change, the test correctly fails, with SIGILL: ``` The following tests FAILED: 1 - IdentityTest.call_identity_with_int (ILLEGAL) ``` --- cmake/gnu-toolchain.cmake | 2 +- cmake/llvm-toolchain.cmake | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cmake/gnu-toolchain.cmake b/cmake/gnu-toolchain.cmake index 2e2a2ad..b6dddf6 100644 --- a/cmake/gnu-toolchain.cmake +++ b/cmake/gnu-toolchain.cmake @@ -20,7 +20,7 @@ set(CMAKE_CXX_COMPILER g++) if(BEMAN_BUILDSYS_SANITIZER STREQUAL "MaxSan") set(SANITIZER_FLAGS - "-fsanitize=address -fsanitize=leak -fsanitize=pointer-compare -fsanitize=pointer-subtract -fsanitize=undefined" + "-fsanitize=address -fsanitize=leak -fsanitize=pointer-compare -fsanitize=pointer-subtract -fsanitize=undefined -fsanitize-undefined-trap-on-error" ) elseif(BEMAN_BUILDSYS_SANITIZER STREQUAL "TSan") set(SANITIZER_FLAGS "-fsanitize=thread") diff --git a/cmake/llvm-toolchain.cmake b/cmake/llvm-toolchain.cmake index d783803..5f5ee4b 100644 --- a/cmake/llvm-toolchain.cmake +++ b/cmake/llvm-toolchain.cmake @@ -20,7 +20,7 @@ set(CMAKE_CXX_COMPILER clang++) if(BEMAN_BUILDSYS_SANITIZER STREQUAL "MaxSan") set(SANITIZER_FLAGS - "-fsanitize=address -fsanitize=leak -fsanitize=pointer-compare -fsanitize=pointer-subtract -fsanitize=undefined" + "-fsanitize=address -fsanitize=leak -fsanitize=pointer-compare -fsanitize=pointer-subtract -fsanitize=undefined -fsanitize-undefined-trap-on-error" ) elseif(BEMAN_BUILDSYS_SANITIZER STREQUAL "TSan") set(SANITIZER_FLAGS "-fsanitize=thread") From 90f6109ede8af7f93627b7666dd72ac27c63ac33 Mon Sep 17 00:00:00 2001 From: Bret Brown Date: Mon, 21 Apr 2025 10:45:16 -0400 Subject: [PATCH 069/199] Clean up install logic Problem ------- Using the parameters to describe the project in `project()` is misleading. It happens to be that the name `beman.exemplar` is used as the name of the project and as the CMake export name, but those are two different concepts that do not necessarily align. Also, the variable dereferencing in CMakeLists.txt is no less error prone than typing beman.exemplar. That's because it is not difficult to type things like ${PROJET_SOURCE_DIR}, which CMake will expand to an empty string. Instead, the readability of the install logic improves because it looks like a file with a specific name is being specifically created and referenced, which is the intention of the relevant installation logic. Solution -------- * Remove references to PROJECT_NAME, PROJECT_SOURCE_DIR, and PROJECT_BINARY_DIR. Prefer relative paths to CMAKE_CURRENT_SOUCE_DIR and CMAKE_CURRENT_BINARY_DIR instead. * Rename the install COMPONENT for beman.exemplar to "beman.exemplar" instead of "development". * Add the install COMPONENT to the installation of the beman.exemplar library target itself. * Move FetchContent include to use-fetch-content.cmake. --- cmake/beman.exemplar-config.cmake.in | 7 ------- cmake/use-fetch-content.cmake | 2 ++ 2 files changed, 2 insertions(+), 7 deletions(-) delete mode 100644 cmake/beman.exemplar-config.cmake.in diff --git a/cmake/beman.exemplar-config.cmake.in b/cmake/beman.exemplar-config.cmake.in deleted file mode 100644 index 5769cc3..0000000 --- a/cmake/beman.exemplar-config.cmake.in +++ /dev/null @@ -1,7 +0,0 @@ -set(BEMAN_EXEMPLAR_VERSION @PROJECT_VERSION@) - -@PACKAGE_INIT@ - -include(${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@-targets.cmake) - -check_required_components(@PROJECT_NAME@) diff --git a/cmake/use-fetch-content.cmake b/cmake/use-fetch-content.cmake index 63dc9c9..a913052 100644 --- a/cmake/use-fetch-content.cmake +++ b/cmake/use-fetch-content.cmake @@ -1,5 +1,7 @@ cmake_minimum_required(VERSION 3.24) +include(FetchContent) + if(NOT BEMAN_EXEMPLAR_LOCKFILE) set(BEMAN_EXEMPLAR_LOCKFILE "lockfile.json" From 9ebab824786c1086296e9ac1f668d45a3a2df81e Mon Sep 17 00:00:00 2001 From: Edward Nolan Date: Tue, 29 Apr 2025 10:39:36 -0400 Subject: [PATCH 070/199] Formatting and spelling cleanups to pass the exemplar lint check --- README.md | 1 + devcontainer/Dockerfile | 2 +- devcontainer/README.md | 28 ++++++++++++++-------------- 3 files changed, 16 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 20b8539..58da0f6 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,3 @@ # infra + Internal Beman Project infrastructure repo diff --git a/devcontainer/Dockerfile b/devcontainer/Dockerfile index f72e994..313e129 100644 --- a/devcontainer/Dockerfile +++ b/devcontainer/Dockerfile @@ -15,7 +15,7 @@ EOF # Newer gcc/ llvm is needed to avoid ASAN Stalling, which is turned on by default across beman projects. # See: https://github.com/google/sanitizers/issues/1614 -# Minimal vesion: clang-18.1.3, gcc-13.2 +# Minimal version: clang-18.1.3, gcc-13.2 ARG compiler_kind=gnu ARG compiler_version=14 diff --git a/devcontainer/README.md b/devcontainer/README.md index fbb2013..df60dc5 100644 --- a/devcontainer/README.md +++ b/devcontainer/README.md @@ -2,11 +2,11 @@ -This folder contains the infrastructure for Beman project's -generic devcontainer image. You can checkout available images in beman's +This folder contains the infrastructure for Beman project's +generic devcontainer image. You can checkout available images in beman's [GitHub Packages page](https://github.com/orgs/bemanproject/packages/container/package/devcontainers). -The image is build on top of GitHub's +The image is build on top of GitHub's [C++ devcontainer image](https://github.com/devcontainers/images/tree/main/src/cpp) for Ubuntu 24.04. @@ -21,17 +21,17 @@ The image includes: ```json // SPDX-License-Identifier: 2.0 license with LLVM exceptions { - "name": "Beman Generic Devcontainer", - "image": "ghcr.io/bemanproject/devcontainers:gnu-14", - "postCreateCommand": "pre-commit", - "customizations": { - "vscode": { - "extensions": [ - "ms-vscode.cpptools", - "ms-vscode.cmake-tools" - ] - } - } + "name": "Beman Generic Devcontainer", + "image": "ghcr.io/bemanproject/devcontainers:gnu-14", + "postCreateCommand": "pre-commit", + "customizations": { + "vscode": { + "extensions": [ + "ms-vscode.cpptools", + "ms-vscode.cmake-tools" + ] + } + } } ``` From ae209e10dfb88bada408fd710c2ea2f861ce1e18 Mon Sep 17 00:00:00 2001 From: River <26424577+wusatosi@users.noreply.github.com> Date: Tue, 29 Apr 2025 14:14:41 -0400 Subject: [PATCH 071/199] Fix container namespace --- .github/workflows/build_devcontainer.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build_devcontainer.yml b/.github/workflows/build_devcontainer.yml index f538a67..811f874 100644 --- a/.github/workflows/build_devcontainer.yml +++ b/.github/workflows/build_devcontainer.yml @@ -12,7 +12,7 @@ on: env: REGISTRY: ghcr.io DEBUG_IMAGE_NAME: ${{ github.repository }} - DEPLOY_IMAGE_NAME: beman/devcontainers + DEPLOY_IMAGE_NAME: bemanproject/devcontainers permissions: packages: write From 5c7d89bcbe07d4a23b221e31db73ed35c75ce343 Mon Sep 17 00:00:00 2001 From: River <26424577+wusatosi@users.noreply.github.com> Date: Tue, 29 Apr 2025 20:39:23 +0000 Subject: [PATCH 072/199] lay way for testing container --- .github/workflows/build_devcontainer.yml | 27 ++++++++++++++----- {devcontainer => containers}/Dockerfile | 0 {devcontainer => containers}/README.md | 23 +++++++++------- .../install_compiler.sh | 0 4 files changed, 33 insertions(+), 17 deletions(-) rename {devcontainer => containers}/Dockerfile (100%) rename {devcontainer => containers}/README.md (83%) rename {devcontainer => containers}/install_compiler.sh (100%) diff --git a/.github/workflows/build_devcontainer.yml b/.github/workflows/build_devcontainer.yml index f538a67..5852f93 100644 --- a/.github/workflows/build_devcontainer.yml +++ b/.github/workflows/build_devcontainer.yml @@ -12,13 +12,14 @@ on: env: REGISTRY: ghcr.io DEBUG_IMAGE_NAME: ${{ github.repository }} - DEPLOY_IMAGE_NAME: beman/devcontainers + DEPLOY_DEV_IMAGE_NAME: bemanproject/devcontainers + DEPLOY_TESTING_IMAGE_NAME: bemanproject/devcontainers permissions: packages: write jobs: - build-and-push-devcontainer-image: + devcontainers: runs-on: ubuntu-latest strategy: fail-fast: false @@ -26,19 +27,31 @@ jobs: include: - kind: gnu version: 14 + usage: dev - kind: llvm version: 19 - name: "devcontainer: ${{ matrix.kind }}-${{ matrix.version }}" + usage: dev + name: "${{ matrix.usage }}: ${{ matrix.kind }}-${{ matrix.version }}" steps: - name: Compute Image Name id: image_name run: | - image_name=${{ env.DEPLOY_IMAGE_NAME }} if [ "${{ github.repository }}/${{ github.ref }}" != "bemanproject/infra/refs/heads/main" ]; then - image_name=${{ env.DEBUG_IMAGE_NAME }} + image_name="${{ env.DEBUG_IMAGE_NAME }}" + tag="${{ matrix.usage }}-${{ matrix.kind }}-${{ matrix.version }}" + else + if [ "${{ matrix.usage }}" = "dev" ]; then + image_name="${{ env.DEPLOY_DEV_IMAGE_NAME }}" + else + image_name="${{ env.DEPLOY_TESTING_IMAGE_NAME }}" + fi + tag="${{ matrix.kind }}-${{ matrix.version }}" fi + echo "computed image name: $image_name" + echo "computed tag: $tag" echo "image_name=$image_name" >> "$GITHUB_OUTPUT" + echo "tag=$tag" >> "$GITHUB_OUTPUT" - name: Checkout repository uses: actions/checkout@v4 - name: Log in to the Container registry @@ -50,11 +63,11 @@ jobs: - name: Build and push Docker image uses: docker/build-push-action@v6 with: - context: devcontainer + context: containers build-args: | compiler_kind=${{ matrix.kind }} compiler_version=${{ matrix.version }} push: true - tags: ${{ env.REGISTRY }}/${{ steps.image_name.outputs.image_name }}:${{ matrix.kind }}-${{ matrix.version }} + tags: ${{ env.REGISTRY }}/${{ steps.image_name.outputs.image_name }}:${{ steps.image_name.outputs.tag }} # https://github.com/docker/build-push-action/issues/894 provenance: false diff --git a/devcontainer/Dockerfile b/containers/Dockerfile similarity index 100% rename from devcontainer/Dockerfile rename to containers/Dockerfile diff --git a/devcontainer/README.md b/containers/README.md similarity index 83% rename from devcontainer/README.md rename to containers/README.md index df60dc5..3e30133 100644 --- a/devcontainer/README.md +++ b/containers/README.md @@ -1,22 +1,25 @@ -# Devcontainer +# Containers This folder contains the infrastructure for Beman project's -generic devcontainer image. You can checkout available images in beman's -[GitHub Packages page](https://github.com/orgs/bemanproject/packages/container/package/devcontainers). +generic container images. You can checkout available images in beman's +[GitHub Packages page](https://github.com/orgs/bemanproject/packages). -The image is build on top of GitHub's -[C++ devcontainer image](https://github.com/devcontainers/images/tree/main/src/cpp) -for Ubuntu 24.04. - -The image includes: +These images includes: - The latest CMake from kitware's apt repository - Latest compiler based on build args (gnu or llvm) installed from the universe repository - [pre-commit](https://pre-commit.com/), the standard linter manager across Beman -## Example devcontainer setup + +## Devcontainer + +The image is build on top of GitHub's +[C++ devcontainer image](https://github.com/devcontainers/images/tree/main/src/cpp) +for Ubuntu 24.04. + +### Example devcontainer setup ```json // SPDX-License-Identifier: 2.0 license with LLVM exceptions @@ -35,7 +38,7 @@ The image includes: } ``` -## Building your own image +### Building your own image You can build your own Beman devcontainer image with: diff --git a/devcontainer/install_compiler.sh b/containers/install_compiler.sh similarity index 100% rename from devcontainer/install_compiler.sh rename to containers/install_compiler.sh From cbc7658fd8375a57f7b4d9152de79bb4e856d95d Mon Sep 17 00:00:00 2001 From: River <26424577+wusatosi@users.noreply.github.com> Date: Tue, 29 Apr 2025 21:02:33 +0000 Subject: [PATCH 073/199] add infra for test containers --- .github/workflows/build_devcontainer.yml | 13 ++++++++++++- containers/Dockerfile | 3 ++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build_devcontainer.yml b/.github/workflows/build_devcontainer.yml index 5852f93..4033884 100644 --- a/.github/workflows/build_devcontainer.yml +++ b/.github/workflows/build_devcontainer.yml @@ -14,12 +14,14 @@ env: DEBUG_IMAGE_NAME: ${{ github.repository }} DEPLOY_DEV_IMAGE_NAME: bemanproject/devcontainers DEPLOY_TESTING_IMAGE_NAME: bemanproject/devcontainers + BASE_IMAGE_DEV: mcr.microsoft.com/devcontainers/cpp:1-ubuntu-24.04 + BASE_IMAGE_TEST: ubuntu:24.04 permissions: packages: write jobs: - devcontainers: + containers: runs-on: ubuntu-latest strategy: fail-fast: false @@ -52,6 +54,14 @@ jobs: echo "computed tag: $tag" echo "image_name=$image_name" >> "$GITHUB_OUTPUT" echo "tag=$tag" >> "$GITHUB_OUTPUT" + - name: Compute Image base + id: image_base + run: | + if [ "${{ matrix.usage }}" == "dev" ]; then + echo "image=${{ env.BASE_IMAGE_DEV }}" >> "$GITHUB_OUTPUT" + else + echo "image=${{ env.BASE_IMAGE_TEST }}" >> "$GITHUB_OUTPUT" + fi - name: Checkout repository uses: actions/checkout@v4 - name: Log in to the Container registry @@ -65,6 +75,7 @@ jobs: with: context: containers build-args: | + base_image=${{ steps.image_base.outputs.image }} compiler_kind=${{ matrix.kind }} compiler_version=${{ matrix.version }} push: true diff --git a/containers/Dockerfile b/containers/Dockerfile index 313e129..1803727 100644 --- a/containers/Dockerfile +++ b/containers/Dockerfile @@ -1,6 +1,7 @@ # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -FROM mcr.microsoft.com/devcontainers/cpp:1-ubuntu-24.04 +ARG base_image=mcr.microsoft.com/devcontainers/cpp:1-ubuntu-24.04 +FROM ${base_image} USER vscode WORKDIR /tmp From 1924afd6c77084cee842ec79fe1da4bf84d923d9 Mon Sep 17 00:00:00 2001 From: River <26424577+wusatosi@users.noreply.github.com> Date: Tue, 29 Apr 2025 21:05:23 +0000 Subject: [PATCH 074/199] add a test container --- .github/workflows/build_devcontainer.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build_devcontainer.yml b/.github/workflows/build_devcontainer.yml index 4033884..fdbfd47 100644 --- a/.github/workflows/build_devcontainer.yml +++ b/.github/workflows/build_devcontainer.yml @@ -13,7 +13,7 @@ env: REGISTRY: ghcr.io DEBUG_IMAGE_NAME: ${{ github.repository }} DEPLOY_DEV_IMAGE_NAME: bemanproject/devcontainers - DEPLOY_TESTING_IMAGE_NAME: bemanproject/devcontainers + DEPLOY_TESTING_IMAGE_NAME: bemanproject/testing-images BASE_IMAGE_DEV: mcr.microsoft.com/devcontainers/cpp:1-ubuntu-24.04 BASE_IMAGE_TEST: ubuntu:24.04 @@ -33,6 +33,9 @@ jobs: - kind: llvm version: 19 usage: dev + - kind: gnu + version: 14 + usage: test name: "${{ matrix.usage }}: ${{ matrix.kind }}-${{ matrix.version }}" steps: - name: Compute Image Name @@ -49,9 +52,6 @@ jobs: fi tag="${{ matrix.kind }}-${{ matrix.version }}" fi - - echo "computed image name: $image_name" - echo "computed tag: $tag" echo "image_name=$image_name" >> "$GITHUB_OUTPUT" echo "tag=$tag" >> "$GITHUB_OUTPUT" - name: Compute Image base From 7dd4c6528d7a30c3795f2ca16e85b83700280b9c Mon Sep 17 00:00:00 2001 From: River <26424577+wusatosi@users.noreply.github.com> Date: Tue, 29 Apr 2025 21:11:22 +0000 Subject: [PATCH 075/199] create vscode user if not exist --- containers/Dockerfile | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/containers/Dockerfile b/containers/Dockerfile index 1803727..63fb1e0 100644 --- a/containers/Dockerfile +++ b/containers/Dockerfile @@ -3,6 +3,14 @@ ARG base_image=mcr.microsoft.com/devcontainers/cpp:1-ubuntu-24.04 FROM ${base_image} +# Create the vscode user +RUN bash </dev/null; then + sudo useradd -m -s /bin/bash vscode + sudo usermod -aG sudo vscode + fi +EOF + USER vscode WORKDIR /tmp From 484748c61e773b6bbfb8ce35418c63376261e2cd Mon Sep 17 00:00:00 2001 From: River <26424577+wusatosi@users.noreply.github.com> Date: Tue, 29 Apr 2025 21:12:20 +0000 Subject: [PATCH 076/199] update paths --- .github/workflows/build_devcontainer.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build_devcontainer.yml b/.github/workflows/build_devcontainer.yml index fdbfd47..969bebe 100644 --- a/.github/workflows/build_devcontainer.yml +++ b/.github/workflows/build_devcontainer.yml @@ -6,7 +6,7 @@ on: push: paths: - ".github/workflows/build_devcontainer.yml" - - "devcontainer/**" + - "containers/**" workflow_dispatch: env: From f93949115ec4679d1997fcc65ecbe424a28e62d5 Mon Sep 17 00:00:00 2001 From: River <26424577+wusatosi@users.noreply.github.com> Date: Tue, 29 Apr 2025 21:19:19 +0000 Subject: [PATCH 077/199] Fix docker --- containers/Dockerfile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/containers/Dockerfile b/containers/Dockerfile index 63fb1e0..a677040 100644 --- a/containers/Dockerfile +++ b/containers/Dockerfile @@ -6,8 +6,8 @@ FROM ${base_image} # Create the vscode user RUN bash </dev/null; then - sudo useradd -m -s /bin/bash vscode - sudo usermod -aG sudo vscode + apt-get update && apt-get install -y sudo adduser + useradd -ms /bin/bash -p "" vscode && usermod -aG sudo vscode fi EOF @@ -31,7 +31,7 @@ ARG compiler_version=14 COPY install_compiler.sh . RUN bash install_compiler.sh ${compiler_kind} ${compiler_version} -# Needed for recent exemplar +# Common dependency: google-test RUN sudo apt-get install -y libgtest-dev # Pre-commit is beman library's standard linting tool From 79ded6c010aa9e84c907f922722be816dbe25138 Mon Sep 17 00:00:00 2001 From: River <26424577+wusatosi@users.noreply.github.com> Date: Tue, 29 Apr 2025 21:20:55 +0000 Subject: [PATCH 078/199] install gpg --- containers/Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/containers/Dockerfile b/containers/Dockerfile index a677040..ffebd77 100644 --- a/containers/Dockerfile +++ b/containers/Dockerfile @@ -17,6 +17,7 @@ WORKDIR /tmp # Latest CMake needed for most of the beman libraries, # so we need to install via kitware's apt repo RUN bash </dev/null | gpg --dearmor - | sudo tee /usr/share/keyrings/kitware-archive-keyring.gpg >/dev/null echo 'deb [signed-by=/usr/share/keyrings/kitware-archive-keyring.gpg] https://apt.kitware.com/ubuntu/ noble main' | sudo tee /etc/apt/sources.list.d/kitware.list >/dev/null sudo apt-get update && sudo apt-get install -y cmake From 18458569efbf5d96ea21828e9e6551f6358ff864 Mon Sep 17 00:00:00 2001 From: River <26424577+wusatosi@users.noreply.github.com> Date: Tue, 29 Apr 2025 21:23:49 +0000 Subject: [PATCH 079/199] update matrix --- .github/workflows/build_devcontainer.yml | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/.github/workflows/build_devcontainer.yml b/.github/workflows/build_devcontainer.yml index 969bebe..ffc01ae 100644 --- a/.github/workflows/build_devcontainer.yml +++ b/.github/workflows/build_devcontainer.yml @@ -26,31 +26,27 @@ jobs: strategy: fail-fast: false matrix: - include: + compilers: - kind: gnu version: 14 - usage: dev - kind: llvm version: 19 - usage: dev - - kind: gnu - version: 14 - usage: test - name: "${{ matrix.usage }}: ${{ matrix.kind }}-${{ matrix.version }}" + usage: [dev, test] + name: "${{ matrix.usage }}: ${{ matrix.compilers.kind }}-${{ matrix.compilers.version }}" steps: - name: Compute Image Name id: image_name run: | if [ "${{ github.repository }}/${{ github.ref }}" != "bemanproject/infra/refs/heads/main" ]; then image_name="${{ env.DEBUG_IMAGE_NAME }}" - tag="${{ matrix.usage }}-${{ matrix.kind }}-${{ matrix.version }}" + tag="${{ matrix.usage }}-${{ matrix.compilers.kind }}-${{ matrix.compilers.version }}" else if [ "${{ matrix.usage }}" = "dev" ]; then image_name="${{ env.DEPLOY_DEV_IMAGE_NAME }}" else image_name="${{ env.DEPLOY_TESTING_IMAGE_NAME }}" fi - tag="${{ matrix.kind }}-${{ matrix.version }}" + tag="${{ matrix.compilers.kind }}-${{ matrix.compilers.version }}" fi echo "image_name=$image_name" >> "$GITHUB_OUTPUT" echo "tag=$tag" >> "$GITHUB_OUTPUT" @@ -76,8 +72,8 @@ jobs: context: containers build-args: | base_image=${{ steps.image_base.outputs.image }} - compiler_kind=${{ matrix.kind }} - compiler_version=${{ matrix.version }} + compiler_kind=${{ matrix.compilers.kind }} + compiler_version=${{ matrix.compilers.version }} push: true tags: ${{ env.REGISTRY }}/${{ steps.image_name.outputs.image_name }}:${{ steps.image_name.outputs.tag }} # https://github.com/docker/build-push-action/issues/894 From 83e3ba0b050b6f04fd9356bd7ea9607331c9f84f Mon Sep 17 00:00:00 2001 From: River <26424577+wusatosi@users.noreply.github.com> Date: Tue, 29 Apr 2025 21:29:59 +0000 Subject: [PATCH 080/199] Add more basic utilities --- containers/Dockerfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/containers/Dockerfile b/containers/Dockerfile index ffebd77..b5b7dbb 100644 --- a/containers/Dockerfile +++ b/containers/Dockerfile @@ -14,10 +14,11 @@ EOF USER vscode WORKDIR /tmp +# Install basic utilities and CMake. # Latest CMake needed for most of the beman libraries, # so we need to install via kitware's apt repo RUN bash </dev/null | gpg --dearmor - | sudo tee /usr/share/keyrings/kitware-archive-keyring.gpg >/dev/null echo 'deb [signed-by=/usr/share/keyrings/kitware-archive-keyring.gpg] https://apt.kitware.com/ubuntu/ noble main' | sudo tee /etc/apt/sources.list.d/kitware.list >/dev/null sudo apt-get update && sudo apt-get install -y cmake From 3541172a526a56087224815107ba7925dbf664cf Mon Sep 17 00:00:00 2001 From: River <26424577+wusatosi@users.noreply.github.com> Date: Tue, 29 Apr 2025 21:33:17 +0000 Subject: [PATCH 081/199] Add more gnu versions --- .github/workflows/build_devcontainer.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/build_devcontainer.yml b/.github/workflows/build_devcontainer.yml index ffc01ae..d49055e 100644 --- a/.github/workflows/build_devcontainer.yml +++ b/.github/workflows/build_devcontainer.yml @@ -27,8 +27,14 @@ jobs: fail-fast: false matrix: compilers: + - kind: gnu + version: 15 - kind: gnu version: 14 + - kind: gnu + version: 13 + - kind: gnu + version: 12 - kind: llvm version: 19 usage: [dev, test] From c39122190953aebb33a1e40d5d8f153640d8f31d Mon Sep 17 00:00:00 2001 From: River <26424577+wusatosi@users.noreply.github.com> Date: Tue, 29 Apr 2025 21:45:52 +0000 Subject: [PATCH 082/199] constrain to latest 4 gnu versions --- .github/workflows/build_devcontainer.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build_devcontainer.yml b/.github/workflows/build_devcontainer.yml index d49055e..1ddd4e5 100644 --- a/.github/workflows/build_devcontainer.yml +++ b/.github/workflows/build_devcontainer.yml @@ -27,14 +27,14 @@ jobs: fail-fast: false matrix: compilers: - - kind: gnu - version: 15 - kind: gnu version: 14 - kind: gnu version: 13 - kind: gnu version: 12 + - kind: gnu + version: 11 - kind: llvm version: 19 usage: [dev, test] From d3452a01fcd0b14e28c6341e9b0b159e1eb66074 Mon Sep 17 00:00:00 2001 From: River <26424577+wusatosi@users.noreply.github.com> Date: Tue, 29 Apr 2025 21:48:56 +0000 Subject: [PATCH 083/199] more llvm versions --- .github/workflows/build_devcontainer.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/build_devcontainer.yml b/.github/workflows/build_devcontainer.yml index 1ddd4e5..afc762a 100644 --- a/.github/workflows/build_devcontainer.yml +++ b/.github/workflows/build_devcontainer.yml @@ -35,8 +35,14 @@ jobs: version: 12 - kind: gnu version: 11 + - kind: llvm + version: 20 - kind: llvm version: 19 + - kind: llvm + version: 18 + - kind: llvm + version: 17 usage: [dev, test] name: "${{ matrix.usage }}: ${{ matrix.compilers.kind }}-${{ matrix.compilers.version }}" steps: From c02aa343dc416fc11f21c1057f4d526e5936ae6b Mon Sep 17 00:00:00 2001 From: River <26424577+wusatosi@users.noreply.github.com> Date: Tue, 29 Apr 2025 21:54:04 +0000 Subject: [PATCH 084/199] Update CI workflow name --- .github/workflows/build_devcontainer.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build_devcontainer.yml b/.github/workflows/build_devcontainer.yml index afc762a..4d91463 100644 --- a/.github/workflows/build_devcontainer.yml +++ b/.github/workflows/build_devcontainer.yml @@ -1,6 +1,6 @@ # SPDX-License-Identifier: 2.0 license with LLVM exceptions -name: Publish Beman devcontainers +name: Publish Beman Containers on: push: From 2e92ac60df125195b69a9f4df38061d50ad2ccb7 Mon Sep 17 00:00:00 2001 From: River <26424577+wusatosi@users.noreply.github.com> Date: Wed, 30 Apr 2025 15:35:38 +0000 Subject: [PATCH 085/199] add ninja build --- containers/Dockerfile | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/containers/Dockerfile b/containers/Dockerfile index b5b7dbb..5d69029 100644 --- a/containers/Dockerfile +++ b/containers/Dockerfile @@ -14,7 +14,7 @@ EOF USER vscode WORKDIR /tmp -# Install basic utilities and CMake. +# Install basic utilities, CMake and Ninja. # Latest CMake needed for most of the beman libraries, # so we need to install via kitware's apt repo RUN bash </dev/null | gpg --dearmor - | sudo tee /usr/share/keyrings/kitware-archive-keyring.gpg >/dev/null echo 'deb [signed-by=/usr/share/keyrings/kitware-archive-keyring.gpg] https://apt.kitware.com/ubuntu/ noble main' | sudo tee /etc/apt/sources.list.d/kitware.list >/dev/null sudo apt-get update && sudo apt-get install -y cmake + + sudo apt-get install -y ninja-build EOF # Newer gcc/ llvm is needed to avoid ASAN Stalling, which is turned on by default across beman projects. From 666d23ada66b4cc31fa3944d54d337b71532d76b Mon Sep 17 00:00:00 2001 From: River <26424577+wusatosi@users.noreply.github.com> Date: Wed, 30 Apr 2025 15:42:47 +0000 Subject: [PATCH 086/199] add libc++ --- containers/install_compiler.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/containers/install_compiler.sh b/containers/install_compiler.sh index ec53dec..1c097e7 100644 --- a/containers/install_compiler.sh +++ b/containers/install_compiler.sh @@ -34,3 +34,6 @@ else clang --version fi + +# Install libc++ +sudo apt-get install libc++-dev libc++abi-dev From f72a7ada5f12f55cbd9bd812e503ea4667ea2206 Mon Sep 17 00:00:00 2001 From: River <26424577+wusatosi@users.noreply.github.com> Date: Wed, 30 Apr 2025 15:48:49 +0000 Subject: [PATCH 087/199] fix install --- containers/install_compiler.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/containers/install_compiler.sh b/containers/install_compiler.sh index 1c097e7..4642cb3 100644 --- a/containers/install_compiler.sh +++ b/containers/install_compiler.sh @@ -36,4 +36,4 @@ else fi # Install libc++ -sudo apt-get install libc++-dev libc++abi-dev +sudo apt-get install -y libc++-dev libc++abi-dev From f2268abc5bbe74a07a35df2c3e606701d95cd21c Mon Sep 17 00:00:00 2001 From: River <26424577+wusatosi@users.noreply.github.com> Date: Fri, 2 May 2025 20:48:07 +0000 Subject: [PATCH 088/199] refactor installation --- containers/Dockerfile | 13 ++----------- containers/install_sys.sh | 10 ++++++++++ 2 files changed, 12 insertions(+), 11 deletions(-) create mode 100644 containers/install_sys.sh diff --git a/containers/Dockerfile b/containers/Dockerfile index 5d69029..74bd6cb 100644 --- a/containers/Dockerfile +++ b/containers/Dockerfile @@ -14,17 +14,8 @@ EOF USER vscode WORKDIR /tmp -# Install basic utilities, CMake and Ninja. -# Latest CMake needed for most of the beman libraries, -# so we need to install via kitware's apt repo -RUN bash </dev/null | gpg --dearmor - | sudo tee /usr/share/keyrings/kitware-archive-keyring.gpg >/dev/null - echo 'deb [signed-by=/usr/share/keyrings/kitware-archive-keyring.gpg] https://apt.kitware.com/ubuntu/ noble main' | sudo tee /etc/apt/sources.list.d/kitware.list >/dev/null - sudo apt-get update && sudo apt-get install -y cmake - - sudo apt-get install -y ninja-build -EOF +COPY install_sys.sh . +RUN bash install_sys.sh # Newer gcc/ llvm is needed to avoid ASAN Stalling, which is turned on by default across beman projects. # See: https://github.com/google/sanitizers/issues/1614 diff --git a/containers/install_sys.sh b/containers/install_sys.sh new file mode 100644 index 0000000..272ab7b --- /dev/null +++ b/containers/install_sys.sh @@ -0,0 +1,10 @@ +# Install Basic utilities +sudo apt-get install -y ca-certificates gpg wget git curl + +# Install Latest CMake +wget -O - https://apt.kitware.com/keys/kitware-archive-latest.asc 2>/dev/null | gpg --dearmor - | sudo tee /usr/share/keyrings/kitware-archive-keyring.gpg >/dev/null +echo 'deb [signed-by=/usr/share/keyrings/kitware-archive-keyring.gpg] https://apt.kitware.com/ubuntu/ noble main' | sudo tee /etc/apt/sources.list.d/kitware.list >/dev/null +sudo apt-get update && sudo apt-get install -y cmake + +# Install Ninja +sudo apt-get install -y ninja-build \ No newline at end of file From 607bc0e69e910083ab22caa79f30e3eb9529d6fe Mon Sep 17 00:00:00 2001 From: River <26424577+wusatosi@users.noreply.github.com> Date: Fri, 2 May 2025 20:49:28 +0000 Subject: [PATCH 089/199] specify libc --- containers/install_compiler.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/containers/install_compiler.sh b/containers/install_compiler.sh index 4642cb3..c76f0b3 100644 --- a/containers/install_compiler.sh +++ b/containers/install_compiler.sh @@ -25,6 +25,7 @@ else wget https://apt.llvm.org/llvm.sh sudo bash llvm.sh "${VERSION}" + sudo apt-get install -y libc++-"$VERSION"-dev sudo rm -f /usr/bin/clang sudo rm -f /usr/bin/clang++ @@ -35,5 +36,3 @@ else clang --version fi -# Install libc++ -sudo apt-get install -y libc++-dev libc++abi-dev From 39d4fdb50132d77fb0de414184a9758f02ba84d7 Mon Sep 17 00:00:00 2001 From: Edward Nolan Date: Mon, 5 May 2025 17:48:41 -0400 Subject: [PATCH 090/199] Fix SPDX-License-Identifiers "2.0 license with LLVM exceptions" seems to be a typo for "Apache-2.0 WITH LLVM-exception". --- .github/workflows/build_devcontainer.yml | 2 +- devcontainer/README.md | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build_devcontainer.yml b/.github/workflows/build_devcontainer.yml index 811f874..5de39ed 100644 --- a/.github/workflows/build_devcontainer.yml +++ b/.github/workflows/build_devcontainer.yml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: 2.0 license with LLVM exceptions +# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception name: Publish Beman devcontainers diff --git a/devcontainer/README.md b/devcontainer/README.md index df60dc5..d6e632f 100644 --- a/devcontainer/README.md +++ b/devcontainer/README.md @@ -1,6 +1,6 @@ # Devcontainer - + This folder contains the infrastructure for Beman project's generic devcontainer image. You can checkout available images in beman's @@ -19,7 +19,7 @@ The image includes: ## Example devcontainer setup ```json -// SPDX-License-Identifier: 2.0 license with LLVM exceptions +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception { "name": "Beman Generic Devcontainer", "image": "ghcr.io/bemanproject/devcontainers:gnu-14", From 55eb6250beae9dde77cc4482401aad30a75291c0 Mon Sep 17 00:00:00 2001 From: River <26424577+wusatosi@users.noreply.github.com> Date: Wed, 7 May 2025 01:24:33 +0000 Subject: [PATCH 091/199] Link gcov --- containers/install_compiler.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/containers/install_compiler.sh b/containers/install_compiler.sh index c76f0b3..eefcab4 100644 --- a/containers/install_compiler.sh +++ b/containers/install_compiler.sh @@ -18,6 +18,7 @@ if [ "$TOOL" = "gnu" ]; then sudo ln -s "$(which gcc-"$VERSION")" /usr/bin/gcc sudo ln -s "$(which g++-"$VERSION")" /usr/bin/g++ + sudo ln -s "$(which gcov-"$VERSION")" /usr/bin/gcov gcc --version else From d7b99359b96932287d014bcbe63066f79dd8874c Mon Sep 17 00:00:00 2001 From: River <26424577+wusatosi@users.noreply.github.com> Date: Wed, 7 May 2025 18:03:12 +0000 Subject: [PATCH 092/199] Add coverage tool --- containers/install_compiler.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/containers/install_compiler.sh b/containers/install_compiler.sh index eefcab4..bff9531 100644 --- a/containers/install_compiler.sh +++ b/containers/install_compiler.sh @@ -8,6 +8,9 @@ VERSION=$2 echo "Install ${TOOL} at: ${VERSION}" +# Install coverage tools +sudo apt-get install -y lcov + shopt -s nocasematch if [ "$TOOL" = "gnu" ]; then sudo apt-get remove -y gcc-"$VERSION" g++-"$VERSION" gcc g++ From cd36fc50bfbd28e696dab57b828f3c1805b2065e Mon Sep 17 00:00:00 2001 From: River <26424577+wusatosi@users.noreply.github.com> Date: Wed, 7 May 2025 18:15:13 +0000 Subject: [PATCH 093/199] move lcov install to after compiler --- containers/install_compiler.sh | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/containers/install_compiler.sh b/containers/install_compiler.sh index bff9531..f5c420f 100644 --- a/containers/install_compiler.sh +++ b/containers/install_compiler.sh @@ -8,13 +8,10 @@ VERSION=$2 echo "Install ${TOOL} at: ${VERSION}" -# Install coverage tools -sudo apt-get install -y lcov - shopt -s nocasematch if [ "$TOOL" = "gnu" ]; then sudo apt-get remove -y gcc-"$VERSION" g++-"$VERSION" gcc g++ - sudo apt-get install -y gcc-"$VERSION" g++-"$VERSION" + sudo apt-get install -y gcc-"$VERSION" g++-"$VERSION" lcov sudo rm -f /usr/bin/gcc sudo rm -f /usr/bin/g++ @@ -29,7 +26,7 @@ else wget https://apt.llvm.org/llvm.sh sudo bash llvm.sh "${VERSION}" - sudo apt-get install -y libc++-"$VERSION"-dev + sudo apt-get install -y libc++-"$VERSION"-dev lcov sudo rm -f /usr/bin/clang sudo rm -f /usr/bin/clang++ From 670225697615ab3534346e80c1cb71a4013ff14c Mon Sep 17 00:00:00 2001 From: River <26424577+wusatosi@users.noreply.github.com> Date: Wed, 7 May 2025 18:16:37 +0000 Subject: [PATCH 094/199] remove gcov link --- containers/install_compiler.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/containers/install_compiler.sh b/containers/install_compiler.sh index f5c420f..6f684be 100644 --- a/containers/install_compiler.sh +++ b/containers/install_compiler.sh @@ -18,7 +18,6 @@ if [ "$TOOL" = "gnu" ]; then sudo ln -s "$(which gcc-"$VERSION")" /usr/bin/gcc sudo ln -s "$(which g++-"$VERSION")" /usr/bin/g++ - sudo ln -s "$(which gcov-"$VERSION")" /usr/bin/gcov gcc --version else From d38f0c491847d80bbabba25a2e2f6f3d01c04fde Mon Sep 17 00:00:00 2001 From: River <26424577+wusatosi@users.noreply.github.com> Date: Wed, 7 May 2025 18:21:15 +0000 Subject: [PATCH 095/199] relink gcov --- containers/install_compiler.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/containers/install_compiler.sh b/containers/install_compiler.sh index 6f684be..b90a6f8 100644 --- a/containers/install_compiler.sh +++ b/containers/install_compiler.sh @@ -15,9 +15,11 @@ if [ "$TOOL" = "gnu" ]; then sudo rm -f /usr/bin/gcc sudo rm -f /usr/bin/g++ + sudo rm -f /usr/bin/gcov sudo ln -s "$(which gcc-"$VERSION")" /usr/bin/gcc sudo ln -s "$(which g++-"$VERSION")" /usr/bin/g++ + sudo ln -s "$(which gcov-"$VERSION")" /usr/bin/gcov gcc --version else From 3e0ed775f2803644fa2b67849f8501c2046e771f Mon Sep 17 00:00:00 2001 From: River <26424577+wusatosi@users.noreply.github.com> Date: Wed, 7 May 2025 18:45:28 +0000 Subject: [PATCH 096/199] Add llvm 21 --- .github/workflows/build_devcontainer.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/build_devcontainer.yml b/.github/workflows/build_devcontainer.yml index 4d91463..01942d7 100644 --- a/.github/workflows/build_devcontainer.yml +++ b/.github/workflows/build_devcontainer.yml @@ -35,6 +35,8 @@ jobs: version: 12 - kind: gnu version: 11 + - kind: llvm + version: 21 - kind: llvm version: 20 - kind: llvm From 4fe91eb7fa9ce97eeb7bef7e7bf5e593d6a1957a Mon Sep 17 00:00:00 2001 From: River <26424577+wusatosi@users.noreply.github.com> Date: Sat, 10 May 2025 22:07:22 +0000 Subject: [PATCH 097/199] change naming for gnu, llvm --- .github/workflows/build_devcontainer.yml | 18 +++++++++--------- containers/Dockerfile | 4 ++-- containers/README.md | 4 ++-- containers/install_compiler.sh | 4 ++-- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/.github/workflows/build_devcontainer.yml b/.github/workflows/build_devcontainer.yml index 01942d7..59b4d78 100644 --- a/.github/workflows/build_devcontainer.yml +++ b/.github/workflows/build_devcontainer.yml @@ -27,23 +27,23 @@ jobs: fail-fast: false matrix: compilers: - - kind: gnu + - kind: gcc version: 14 - - kind: gnu + - kind: gcc version: 13 - - kind: gnu + - kind: gcc version: 12 - - kind: gnu + - kind: gcc version: 11 - - kind: llvm + - kind: clang version: 21 - - kind: llvm + - kind: clang version: 20 - - kind: llvm + - kind: clang version: 19 - - kind: llvm + - kind: clang version: 18 - - kind: llvm + - kind: clang version: 17 usage: [dev, test] name: "${{ matrix.usage }}: ${{ matrix.compilers.kind }}-${{ matrix.compilers.version }}" diff --git a/containers/Dockerfile b/containers/Dockerfile index 74bd6cb..f5f5f9d 100644 --- a/containers/Dockerfile +++ b/containers/Dockerfile @@ -17,10 +17,10 @@ WORKDIR /tmp COPY install_sys.sh . RUN bash install_sys.sh -# Newer gcc/ llvm is needed to avoid ASAN Stalling, which is turned on by default across beman projects. +# Newer gcc/ clang is needed to avoid ASAN Stalling, which is turned on by default across beman projects. # See: https://github.com/google/sanitizers/issues/1614 # Minimal version: clang-18.1.3, gcc-13.2 -ARG compiler_kind=gnu +ARG compiler_kind=gcc ARG compiler_version=14 COPY install_compiler.sh . diff --git a/containers/README.md b/containers/README.md index 3e30133..8a9e7fc 100644 --- a/containers/README.md +++ b/containers/README.md @@ -9,7 +9,7 @@ generic container images. You can checkout available images in beman's These images includes: - The latest CMake from kitware's apt repository -- Latest compiler based on build args (gnu or llvm) installed from the universe repository +- Latest compiler based on build args (gcc or clang) installed from the universe repository - [pre-commit](https://pre-commit.com/), the standard linter manager across Beman @@ -25,7 +25,7 @@ for Ubuntu 24.04. // SPDX-License-Identifier: 2.0 license with LLVM exceptions { "name": "Beman Generic Devcontainer", - "image": "ghcr.io/bemanproject/devcontainers:gnu-14", + "image": "ghcr.io/bemanproject/devcontainers:gcc-14", "postCreateCommand": "pre-commit", "customizations": { "vscode": { diff --git a/containers/install_compiler.sh b/containers/install_compiler.sh index b90a6f8..1cd7797 100644 --- a/containers/install_compiler.sh +++ b/containers/install_compiler.sh @@ -9,7 +9,7 @@ VERSION=$2 echo "Install ${TOOL} at: ${VERSION}" shopt -s nocasematch -if [ "$TOOL" = "gnu" ]; then +if [ "$TOOL" = "gcc" ]; then sudo apt-get remove -y gcc-"$VERSION" g++-"$VERSION" gcc g++ sudo apt-get install -y gcc-"$VERSION" g++-"$VERSION" lcov @@ -23,7 +23,7 @@ if [ "$TOOL" = "gnu" ]; then gcc --version else - sudo apt-get install -y lsb-release wget software-properties-common gnupg + sudo apt-get install -y lsb-release wget software-properties-common gccpg wget https://apt.llvm.org/llvm.sh sudo bash llvm.sh "${VERSION}" From a2436e7b48be4a2c0e9cb43287169c5bf4941e28 Mon Sep 17 00:00:00 2001 From: River <26424577+wusatosi@users.noreply.github.com> Date: Sat, 10 May 2025 22:11:35 +0000 Subject: [PATCH 098/199] gccpg -> gnupg --- containers/install_compiler.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/containers/install_compiler.sh b/containers/install_compiler.sh index 1cd7797..d2f96cc 100644 --- a/containers/install_compiler.sh +++ b/containers/install_compiler.sh @@ -23,7 +23,7 @@ if [ "$TOOL" = "gcc" ]; then gcc --version else - sudo apt-get install -y lsb-release wget software-properties-common gccpg + sudo apt-get install -y lsb-release wget software-properties-common gnupg wget https://apt.llvm.org/llvm.sh sudo bash llvm.sh "${VERSION}" From dec1832b2b0c77ebea8a66e4a638d092181bbd83 Mon Sep 17 00:00:00 2001 From: River <26424577+wusatosi@users.noreply.github.com> Date: Sat, 10 May 2025 22:22:50 +0000 Subject: [PATCH 099/199] update naming script --- .github/workflows/build_devcontainer.yml | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/.github/workflows/build_devcontainer.yml b/.github/workflows/build_devcontainer.yml index 59b4d78..be46406 100644 --- a/.github/workflows/build_devcontainer.yml +++ b/.github/workflows/build_devcontainer.yml @@ -11,9 +11,9 @@ on: env: REGISTRY: ghcr.io - DEBUG_IMAGE_NAME: ${{ github.repository }} - DEPLOY_DEV_IMAGE_NAME: bemanproject/devcontainers - DEPLOY_TESTING_IMAGE_NAME: bemanproject/testing-images + DEBUG_NAME: ${{ github.repository }} + DEPLOY_DEV_NAME_PREFIX: bemanproject/devcontainers + DEPLOY_TESTING_NAME_PREFIX: bemanproject/testingcontainers BASE_IMAGE_DEV: mcr.microsoft.com/devcontainers/cpp:1-ubuntu-24.04 BASE_IMAGE_TEST: ubuntu:24.04 @@ -52,16 +52,19 @@ jobs: id: image_name run: | if [ "${{ github.repository }}/${{ github.ref }}" != "bemanproject/infra/refs/heads/main" ]; then - image_name="${{ env.DEBUG_IMAGE_NAME }}" + image_name="${{ env.DEBUG_NAME }}" tag="${{ matrix.usage }}-${{ matrix.compilers.kind }}-${{ matrix.compilers.version }}" else if [ "${{ matrix.usage }}" = "dev" ]; then - image_name="${{ env.DEPLOY_DEV_IMAGE_NAME }}" + image_name="${{ env.DEPLOY_DEV_NAME_PREFIX }}-${{ matrix.compilers.kind }}" else - image_name="${{ env.DEPLOY_TESTING_IMAGE_NAME }}" + image_name="${{ env.DEPLOY_TESTING_NAME_PREFIX }}-${{ matrix.compilers.kind }}" fi - tag="${{ matrix.compilers.kind }}-${{ matrix.compilers.version }}" + tag="${{ matrix.compilers.version }}" fi + + echo "Image Name: $image_name, Tag: $tag" + echo "image_name=$image_name" >> "$GITHUB_OUTPUT" echo "tag=$tag" >> "$GITHUB_OUTPUT" - name: Compute Image base From a8666ff4bef515419d8fca16f456b86ba197702d Mon Sep 17 00:00:00 2001 From: River <26424577+wusatosi@users.noreply.github.com> Date: Sat, 10 May 2025 21:10:16 -0400 Subject: [PATCH 100/199] Update docs --- containers/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/containers/README.md b/containers/README.md index 8a9e7fc..e16131b 100644 --- a/containers/README.md +++ b/containers/README.md @@ -25,7 +25,7 @@ for Ubuntu 24.04. // SPDX-License-Identifier: 2.0 license with LLVM exceptions { "name": "Beman Generic Devcontainer", - "image": "ghcr.io/bemanproject/devcontainers:gcc-14", + "image": "ghcr.io/bemanproject/devcontainers-gcc:14", "postCreateCommand": "pre-commit", "customizations": { "vscode": { From b40482d786be907e74bf7f45107e3581cbdb4e8c Mon Sep 17 00:00:00 2001 From: Vito Gamberini Date: Mon, 2 Jun 2025 13:27:20 -0400 Subject: [PATCH 101/199] grab clang tools from upstream llvm --- containers/install_compiler.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/containers/install_compiler.sh b/containers/install_compiler.sh index d2f96cc..bef0e1c 100644 --- a/containers/install_compiler.sh +++ b/containers/install_compiler.sh @@ -27,7 +27,7 @@ else wget https://apt.llvm.org/llvm.sh sudo bash llvm.sh "${VERSION}" - sudo apt-get install -y libc++-"$VERSION"-dev lcov + sudo apt-get install -y libc++-"$VERSION"-dev clang-tools-"$VERSION" lcov sudo rm -f /usr/bin/clang sudo rm -f /usr/bin/clang++ @@ -37,4 +37,3 @@ else clang --version fi - From 22c4122528eea0fb67f6c3012c682cf8835ceba2 Mon Sep 17 00:00:00 2001 From: Vito Gamberini Date: Tue, 3 Jun 2025 14:02:36 -0400 Subject: [PATCH 102/199] Invoke AppleClang via system compiler shims Fixes #171 --- cmake/appleclang-toolchain.cmake | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/cmake/appleclang-toolchain.cmake b/cmake/appleclang-toolchain.cmake index bc12103..5f44e80 100644 --- a/cmake/appleclang-toolchain.cmake +++ b/cmake/appleclang-toolchain.cmake @@ -16,8 +16,10 @@ include_guard(GLOBAL) -set(CMAKE_C_COMPILER clang) -set(CMAKE_CXX_COMPILER clang++) +# Prevent PATH collision with an LLVM clang installation by using the system +# compiler shims +set(CMAKE_C_COMPILER cc) +set(CMAKE_CXX_COMPILER c++) if(BEMAN_BUILDSYS_SANITIZER STREQUAL "MaxSan") set(SANITIZER_FLAGS From e37f10c2724a123fbfa96749aad986405149452c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Darius=20Nea=C8=9Bu?= Date: Fri, 6 Jun 2025 23:04:56 +0300 Subject: [PATCH 103/199] Apply Beman Standard recommended license - LICENSE.APACHE_LLVM --- LICENSE | 230 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 230 insertions(+) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..111a208 --- /dev/null +++ b/LICENSE @@ -0,0 +1,230 @@ + 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. From 801ad52141ade9e4b21aff03d534150e105a6498 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Darius=20Nea=C8=9Bu?= Date: Fri, 6 Jun 2025 23:05:18 +0300 Subject: [PATCH 104/199] Add basic MD linter config --- .markdownlint.yaml | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 .markdownlint.yaml diff --git a/.markdownlint.yaml b/.markdownlint.yaml new file mode 100644 index 0000000..81f5fcd --- /dev/null +++ b/.markdownlint.yaml @@ -0,0 +1,9 @@ +# MD033/no-inline-html : Inline HTML : https://github.com/DavidAnson/markdownlint/blob/v0.35.0/doc/md033.md +# Disable inline html linter is needed for
+MD033: false + +# MD013/line-length : Line length : https://github.com/DavidAnson/markdownlint/blob/v0.35.0/doc/md013.md +# Conforms to .clang-format ColumnLimit +# Update the comment in .clang-format if we no-longer tie these two column limits. +MD013: + line_length: 119 From 3b94a8be9360ffc6fca4cb9f1b5c704e268aba9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Darius=20Nea=C8=9Bu?= Date: Fri, 6 Jun 2025 23:05:32 +0300 Subject: [PATCH 105/199] Add basic docs --- README.md | 12 ++++++++++-- containers/README.md | 1 - 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 58da0f6..4d31a49 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,11 @@ -# infra +# Beman Project Infrastructure Repository -Internal Beman Project infrastructure repo + + +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 + +* `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.). diff --git a/containers/README.md b/containers/README.md index d85f6ec..83b357d 100644 --- a/containers/README.md +++ b/containers/README.md @@ -12,7 +12,6 @@ These images includes: - Latest compiler based on build args (gcc or clang) installed from the universe repository - [pre-commit](https://pre-commit.com/), the standard linter manager across Beman - ## Devcontainer The image is build on top of GitHub's From e4384383ebc52ad501ce9e2beee0ef0163a39860 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Darius=20Nea=C8=9Bu?= Date: Sat, 7 Jun 2025 04:03:11 +0300 Subject: [PATCH 106/199] beman-tidy: write tests for README.TITLE --- .gitignore | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/.gitignore b/.gitignore index 259148f..e97d597 100644 --- a/.gitignore +++ b/.gitignore @@ -30,3 +30,16 @@ *.exe *.out *.app + +# Python +__pycache__/ +.pytest_cache/ +*.pyc +*.pyo +*.pyd +*.pyw +*.pyz +*.pywz +*.pyzw +*.pyzwz +*.delete_me From b48b6978bf5578f36bb6aaae2afcfe63e4cd9b87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Darius=20Nea=C8=9Bu?= Date: Sat, 7 Jun 2025 10:59:45 +0300 Subject: [PATCH 107/199] beman-tidy: enable tests on CI --- .github/workflows/beman-tidy.yml | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 .github/workflows/beman-tidy.yml diff --git a/.github/workflows/beman-tidy.yml b/.github/workflows/beman-tidy.yml new file mode 100644 index 0000000..7327ab0 --- /dev/null +++ b/.github/workflows/beman-tidy.yml @@ -0,0 +1,27 @@ +# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + +name: Run Beman Tidy Tests + +# Run the tests for the beman-tidy tool. +on: + workflow_dispatch: + pull_request: + +jobs: + tests: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Install dependencies (production) + run: | + make -C tools/beman-tidy install + + - name: Install dependencies (development) + run: | + make -C tools/beman-tidy install-dev + + - name: Run tests + run: | + make -C tools/beman-tidy test From c8c823e57d63b50db9074a72bbc9244a0d232481 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Darius=20Nea=C8=9Bu?= Date: Sat, 7 Jun 2025 11:09:58 +0300 Subject: [PATCH 108/199] beman-tidy: add linter for Python code --- .github/workflows/beman-tidy.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/beman-tidy.yml b/.github/workflows/beman-tidy.yml index 7327ab0..65c7149 100644 --- a/.github/workflows/beman-tidy.yml +++ b/.github/workflows/beman-tidy.yml @@ -22,6 +22,11 @@ jobs: run: | make -C tools/beman-tidy install-dev + - name: Run linter + run: | + echo "Running linter..." + make -C tools/beman-tidy lint + - name: Run tests run: | make -C tools/beman-tidy test From c348698d93addfcc2a81d5a8749bd72022459c4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Darius=20Nea=C8=9Bu?= Date: Sat, 7 Jun 2025 11:22:52 +0300 Subject: [PATCH 109/199] beman-tidy: fix broken CI flow --- .github/workflows/beman-tidy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/beman-tidy.yml b/.github/workflows/beman-tidy.yml index 65c7149..7abb048 100644 --- a/.github/workflows/beman-tidy.yml +++ b/.github/workflows/beman-tidy.yml @@ -25,7 +25,7 @@ jobs: - name: Run linter run: | echo "Running linter..." - make -C tools/beman-tidy lint + make -C tools/beman-tidy self-lint - name: Run tests run: | From 253a8529496df1781efc7282b70a73809e1cbbc7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Darius=20Nea=C8=9Bu?= Date: Sat, 7 Jun 2025 11:38:05 +0300 Subject: [PATCH 110/199] beman-tidy: add SPDX license identifier --- .github/workflows/beman-tidy.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/beman-tidy.yml b/.github/workflows/beman-tidy.yml index 7abb048..f5eec8d 100644 --- a/.github/workflows/beman-tidy.yml +++ b/.github/workflows/beman-tidy.yml @@ -2,7 +2,6 @@ name: Run Beman Tidy Tests -# Run the tests for the beman-tidy tool. on: workflow_dispatch: pull_request: From 617461a5e2fe2ebe761fd426f8c74755c4ce7e0c Mon Sep 17 00:00:00 2001 From: Edward Nolan Date: Mon, 9 Jun 2025 11:33:55 -0400 Subject: [PATCH 111/199] Fix missing EOF at end of containers/install_sys.sh This is flagged by the pre-commit linter in exemplar. --- containers/install_sys.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/containers/install_sys.sh b/containers/install_sys.sh index 272ab7b..0e31aca 100644 --- a/containers/install_sys.sh +++ b/containers/install_sys.sh @@ -7,4 +7,4 @@ echo 'deb [signed-by=/usr/share/keyrings/kitware-archive-keyring.gpg] https://ap sudo apt-get update && sudo apt-get install -y cmake # Install Ninja -sudo apt-get install -y ninja-build \ No newline at end of file +sudo apt-get install -y ninja-build From 1fc41fb9539fcdf9e4fae00b60fdd01b2640ff41 Mon Sep 17 00:00:00 2001 From: Edward Nolan Date: Wed, 30 Apr 2025 22:55:46 -0400 Subject: [PATCH 112/199] Add toolchain files and beman-submodule This pull request adds a new script, beman-submodule, which provides some of the features of git submodule but without git submodule's disadvantage that users need to be aware of it to clone the repository. More information can be found in tools/beman-submodule/README.md. It also pulls in the toolchain files from exemplar, preserving history, using a git filter-branch. --- .github/workflows/beman-submodule.yml | 30 ++ cmake/use-fetch-content.cmake | 2 +- tools/beman-submodule/README.md | 63 +++ tools/beman-submodule/beman-submodule | 212 +++++++++++ .../test/test_beman_submodule.py | 359 ++++++++++++++++++ 5 files changed, 665 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/beman-submodule.yml create mode 100644 tools/beman-submodule/README.md create mode 100755 tools/beman-submodule/beman-submodule create mode 100644 tools/beman-submodule/test/test_beman_submodule.py diff --git a/.github/workflows/beman-submodule.yml b/.github/workflows/beman-submodule.yml new file mode 100644 index 0000000..d18dd7f --- /dev/null +++ b/.github/workflows/beman-submodule.yml @@ -0,0 +1,30 @@ +# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + +name: beman-submodule tests + +on: + push: + pull_request: + workflow_dispatch: + +jobs: + beman-submodule-script-ci: + name: beman_module.py ci + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: 3.13 + + - name: Install pytest + run: | + python3 -m pip install pytest + + - name: Run pytest + run: | + cd tools/beman-submodule/ + pytest diff --git a/cmake/use-fetch-content.cmake b/cmake/use-fetch-content.cmake index a913052..82c5db2 100644 --- a/cmake/use-fetch-content.cmake +++ b/cmake/use-fetch-content.cmake @@ -10,7 +10,7 @@ if(NOT BEMAN_EXEMPLAR_LOCKFILE) ) endif() -set(BemanExemplar_projectDir "${CMAKE_CURRENT_LIST_DIR}/..") +set(BemanExemplar_projectDir "${CMAKE_CURRENT_LIST_DIR}/../..") message(TRACE "BemanExemplar_projectDir=\"${BemanExemplar_projectDir}\"") message(TRACE "BEMAN_EXEMPLAR_LOCKFILE=\"${BEMAN_EXEMPLAR_LOCKFILE}\"") diff --git a/tools/beman-submodule/README.md b/tools/beman-submodule/README.md new file mode 100644 index 0000000..36883ad --- /dev/null +++ b/tools/beman-submodule/README.md @@ -0,0 +1,63 @@ +# beman-submodule + + + +## 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: + + +```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. diff --git a/tools/beman-submodule/beman-submodule b/tools/beman-submodule/beman-submodule new file mode 100755 index 0000000..2007fc4 --- /dev/null +++ b/tools/beman-submodule/beman-submodule @@ -0,0 +1,212 @@ +#!/usr/bin/env python3 + +# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + +import argparse +import configparser +import filecmp +import os +import pathlib +import shutil +import subprocess +import sys +import tempfile + +def directory_compare(dir1, dir2, ignore): + compared = filecmp.dircmp(dir1, dir2, ignore=ignore) + if compared.left_only or compared.right_only or compared.diff_files: + return False + for common_dir in compared.common_dirs: + path1 = os.path.join(dir1, common_dir) + path2 = os.path.join(dir2, common_dir) + if not directory_compare(path1, path2, ignore): + return False + return True + +class BemanSubmodule: + def __init__(self, dirpath, remote, commit_hash): + self.dirpath = dirpath + self.remote = remote + self.commit_hash = commit_hash + +def parse_beman_submodule_file(path): + config = configparser.ConfigParser() + read_result = config.read(path) + def fail(): + raise Exception(f'Failed to parse {path} as a .beman_submodule file') + if not read_result: + fail() + if not 'beman_submodule' in config: + fail() + if not 'remote' in config['beman_submodule']: + fail() + if not 'commit_hash' in config['beman_submodule']: + fail() + return BemanSubmodule( + str(pathlib.Path(path).resolve().parent), + config['beman_submodule']['remote'], config['beman_submodule']['commit_hash']) + +def get_beman_submodule(dir): + beman_submodule_filepath = os.path.join(dir, '.beman_submodule') + if os.path.isfile(beman_submodule_filepath): + return parse_beman_submodule_file(beman_submodule_filepath) + else: + return None + +def find_beman_submodules_in(dir): + assert os.path.isdir(dir) + result = [] + for dirpath, _, filenames in os.walk(dir): + if '.beman_submodule' in filenames: + result.append(parse_beman_submodule_file(os.path.join(dirpath, '.beman_submodule'))) + return sorted(result, key=lambda module: module.dirpath) + +def cwd_git_repository_path(): + process = subprocess.run( + ['git', 'rev-parse', '--show-toplevel'], capture_output=True, text=True, + check=False) + if process.returncode == 0: + return process.stdout.strip() + elif "fatal: not a git repository" in process.stderr: + return None + else: + raise Exception("git rev-parse --show-toplevel failed") + +def clone_beman_submodule_into_tmpdir(beman_submodule, remote): + tmpdir = tempfile.TemporaryDirectory() + subprocess.run( + ['git', 'clone', beman_submodule.remote, tmpdir.name], capture_output=True, + check=True) + if not remote: + subprocess.run( + ['git', '-C', tmpdir.name, 'reset', '--hard', beman_submodule.commit_hash], + capture_output=True, check=True) + return tmpdir + +def beman_submodule_status(beman_submodule): + tmpdir = clone_beman_submodule_into_tmpdir(beman_submodule, False) + if directory_compare(tmpdir.name, beman_submodule.dirpath, ['.beman_submodule', '.git']): + status_character=' ' + else: + status_character='+' + parent_repo_path = cwd_git_repository_path() + if not parent_repo_path: + raise Exception('this is not a git repository') + relpath = pathlib.Path( + beman_submodule.dirpath).relative_to(pathlib.Path(parent_repo_path)) + return status_character + ' ' + beman_submodule.commit_hash + ' ' + str(relpath) + +def beman_submodule_update(beman_submodule, remote): + tmpdir = clone_beman_submodule_into_tmpdir(beman_submodule, remote) + shutil.rmtree(beman_submodule.dirpath) + with open(os.path.join(tmpdir.name, '.beman_submodule'), 'w') as f: + f.write('[beman_submodule]\n') + f.write(f'remote={beman_submodule.remote}\n') + f.write(f'commit_hash={beman_submodule.commit_hash}\n') + shutil.rmtree(os.path.join(tmpdir.name, '.git')) + shutil.copytree(tmpdir.name, beman_submodule.dirpath) + +def update_command(remote, path): + if not path: + parent_repo_path = cwd_git_repository_path() + if not parent_repo_path: + raise Exception('this is not a git repository') + beman_submodules = find_beman_submodules_in(parent_repo_path) + else: + beman_submodule = get_beman_submodule(path) + if not beman_submodule: + raise Exception(f'{path} is not a beman_submodule') + beman_submodules = [beman_submodule] + for beman_submodule in beman_submodules: + beman_submodule_update(beman_submodule, remote) + +def add_command(repository, path): + tmpdir = tempfile.TemporaryDirectory() + subprocess.run( + ['git', 'clone', repository], capture_output=True, check=True, cwd=tmpdir.name) + repository_name = os.listdir(tmpdir.name)[0] + if not path: + path = repository_name + if os.path.exists(path): + raise Exception(f'{path} exists') + os.makedirs(path) + tmpdir_repo = os.path.join(tmpdir.name, repository_name) + sha_process = subprocess.run( + ['git', 'rev-parse', 'HEAD'], capture_output=True, check=True, text=True, + cwd=tmpdir_repo) + with open(os.path.join(tmpdir_repo, '.beman_submodule'), 'w') as f: + f.write('[beman_submodule]\n') + f.write(f'remote={repository}\n') + f.write(f'commit_hash={sha_process.stdout.strip()}\n') + shutil.rmtree(os.path.join(tmpdir_repo, '.git')) + shutil.copytree(tmpdir_repo, path, dirs_exist_ok=True) + +def status_command(paths): + if not paths: + parent_repo_path = cwd_git_repository_path() + if not parent_repo_path: + raise Exception('this is not a git repository') + beman_submodules = find_beman_submodules_in(parent_repo_path) + else: + beman_submodules = [] + for path in paths: + beman_submodule = get_beman_submodule(path) + if not beman_submodule: + raise Exception(f'{path} is not a beman_submodule') + beman_submodules.append(beman_submodule) + for beman_submodule in beman_submodules: + print(beman_submodule_status(beman_submodule)) + +def get_parser(): + parser = argparse.ArgumentParser(description='Beman pseudo-submodule tool') + subparsers = parser.add_subparsers(dest='command', help='available commands') + parser_update = subparsers.add_parser('update', help='update beman_submodules') + parser_update.add_argument( + '--remote', action='store_true', + help='update a beman_submodule to its latest from upstream') + parser_update.add_argument( + 'beman_submodule_path', nargs='?', + help='relative path to the beman_submodule to update') + parser_add = subparsers.add_parser('add', help='add a new beman_submodule') + parser_add.add_argument('repository', help='git repository to add') + parser_add.add_argument( + 'path', nargs='?', help='path where the repository will be added') + parser_status = subparsers.add_parser( + 'status', help='show the status of beman_submodules') + parser_status.add_argument('paths', nargs='*') + return parser + +def parse_args(args): + return get_parser().parse_args(args); + +def usage(): + return get_parser().format_help() + +def run_command(args): + if args.command == 'update': + update_command(args.remote, args.beman_submodule_path) + elif args.command == 'add': + add_command(args.repository, args.path) + elif args.command == 'status': + status_command(args.paths) + else: + raise Exception(usage()) + +def check_for_git(path): + env = os.environ.copy() + if path is not None: + env["PATH"] = path + return shutil.which("git", path=env.get("PATH")) is not None + +def main(): + try: + if not check_for_git(None): + raise Exception('git not found in PATH') + args = parse_args(sys.argv[1:]) + run_command(args) + except Exception as e: + print("Error:", e, file=sys.stderr) + sys.exit(1) + +if __name__ == '__main__': + main() diff --git a/tools/beman-submodule/test/test_beman_submodule.py b/tools/beman-submodule/test/test_beman_submodule.py new file mode 100644 index 0000000..47e2303 --- /dev/null +++ b/tools/beman-submodule/test/test_beman_submodule.py @@ -0,0 +1,359 @@ +# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + +import os +import pathlib +import pytest +import shutil +import stat +import subprocess +import tempfile + +# https://stackoverflow.com/a/19011259 +import types +import importlib.machinery +loader = importlib.machinery.SourceFileLoader( + 'beman_submodule', + os.path.join(os.path.dirname(os.path.realpath(__file__)), '../beman-submodule')) +beman_submodule = types.ModuleType(loader.name) +loader.exec_module(beman_submodule) + +def create_test_git_repository(): + tmpdir = tempfile.TemporaryDirectory() + subprocess.run(['git', 'init'], check=True, cwd=tmpdir.name, capture_output=True) + def make_commit(a_txt_contents): + with open(os.path.join(tmpdir.name, 'a.txt'), 'w') as f: + f.write(a_txt_contents) + subprocess.run( + ['git', 'add', 'a.txt'], check=True, cwd=tmpdir.name, capture_output=True) + subprocess.run( + ['git', '-c', 'user.name=test', '-c', 'user.email=test@example.com', 'commit', + '--author="test "', '-m', 'test'], + check=True, cwd=tmpdir.name, capture_output=True) + make_commit('A') + make_commit('a') + return tmpdir + +def test_directory_compare(): + def create_dir_structure(dir_path): + bar_path = os.path.join(dir_path, 'bar') + os.makedirs(bar_path) + + with open(os.path.join(dir_path, 'foo.txt'), 'w') as f: + f.write('foo') + with open(os.path.join(bar_path, 'baz.txt'), 'w') as f: + f.write('baz') + + with tempfile.TemporaryDirectory() as dir_a, \ + tempfile.TemporaryDirectory() as dir_b: + + create_dir_structure(dir_a) + create_dir_structure(dir_b) + + assert beman_submodule.directory_compare(dir_a, dir_b, []) + + with open(os.path.join(os.path.join(dir_a, 'bar'), 'quux.txt'), 'w') as f: + f.write('quux') + + assert not beman_submodule.directory_compare(dir_a, dir_b, []) + assert beman_submodule.directory_compare(dir_a, dir_b, ['quux.txt']) + +def test_parse_beman_submodule_file(): + def valid_file(): + tmpfile = tempfile.NamedTemporaryFile() + tmpfile.write('[beman_submodule]\n'.encode('utf-8')) + tmpfile.write( + 'remote=git@github.com:bemanproject/infra.git\n'.encode('utf-8')) + tmpfile.write( + 'commit_hash=9b88395a86c4290794e503e94d8213b6c442ae77\n'.encode('utf-8')) + tmpfile.flush() + module = beman_submodule.parse_beman_submodule_file(tmpfile.name) + assert module.dirpath == str(pathlib.Path(tmpfile.name).resolve().parent) + assert module.remote == 'git@github.com:bemanproject/infra.git' + assert module.commit_hash == '9b88395a86c4290794e503e94d8213b6c442ae77' + valid_file() + def invalid_file_missing_remote(): + threw = False + try: + tmpfile = tempfile.NamedTemporaryFile() + tmpfile.write('[beman_submodule]\n'.encode('utf-8')) + tmpfile.write( + 'commit_hash=9b88395a86c4290794e503e94d8213b6c442ae77\n'.encode('utf-8')) + tmpfile.flush() + beman_submodule.parse_beman_submodule_file(tmpfile.name) + except: + threw = True + assert threw + invalid_file_missing_remote() + def invalid_file_missing_commit_hash(): + threw = False + try: + tmpfile = tempfile.NamedTemporaryFile() + tmpfile.write('[beman_submodule]\n'.encode('utf-8')) + tmpfile.write( + 'remote=git@github.com:bemanproject/infra.git\n'.encode('utf-8')) + tmpfile.flush() + beman_submodule.parse_beman_submodule_file(tmpfile.name) + except: + threw = True + assert threw + invalid_file_missing_commit_hash() + def invalid_file_wrong_section(): + threw = False + try: + tmpfile = tempfile.NamedTemporaryFile() + tmpfile.write('[invalid]\n'.encode('utf-8')) + tmpfile.write( + 'remote=git@github.com:bemanproject/infra.git\n'.encode('utf-8')) + tmpfile.write( + 'commit_hash=9b88395a86c4290794e503e94d8213b6c442ae77\n'.encode('utf-8')) + tmpfile.flush() + beman_submodule.parse_beman_submodule_file(tmpfile.name) + except: + threw = True + assert threw + invalid_file_wrong_section() + +def test_get_beman_submodule(): + tmpdir = create_test_git_repository() + tmpdir2 = create_test_git_repository() + original_cwd = os.getcwd() + os.chdir(tmpdir2.name) + beman_submodule.add_command(tmpdir.name, 'foo') + assert beman_submodule.get_beman_submodule('foo') + os.remove('foo/.beman_submodule') + assert not beman_submodule.get_beman_submodule('foo') + os.chdir(original_cwd) + +def test_find_beman_submodules_in(): + tmpdir = create_test_git_repository() + tmpdir2 = create_test_git_repository() + original_cwd = os.getcwd() + os.chdir(tmpdir2.name) + beman_submodule.add_command(tmpdir.name, 'foo') + beman_submodule.add_command(tmpdir.name, 'bar') + beman_submodules = beman_submodule.find_beman_submodules_in(tmpdir2.name) + sha_process = subprocess.run( + ['git', 'rev-parse', 'HEAD'], capture_output=True, check=True, text=True, + cwd=tmpdir.name) + sha = sha_process.stdout.strip() + assert beman_submodules[0].dirpath == os.path.join(tmpdir2.name, 'bar') + assert beman_submodules[0].remote == tmpdir.name + assert beman_submodules[0].commit_hash == sha + assert beman_submodules[1].dirpath == os.path.join(tmpdir2.name, 'foo') + assert beman_submodules[1].remote == tmpdir.name + assert beman_submodules[1].commit_hash == sha + os.chdir(original_cwd) + +def test_cwd_git_repository_path(): + original_cwd = os.getcwd() + tmpdir = tempfile.TemporaryDirectory() + os.chdir(tmpdir.name) + assert not beman_submodule.cwd_git_repository_path() + subprocess.run(['git', 'init']) + assert beman_submodule.cwd_git_repository_path() == tmpdir.name + os.chdir(original_cwd) + +def test_clone_beman_submodule_into_tmpdir(): + tmpdir = create_test_git_repository() + tmpdir2 = create_test_git_repository() + original_cwd = os.getcwd() + os.chdir(tmpdir2.name) + sha_process = subprocess.run( + ['git', 'rev-parse', 'HEAD^'], capture_output=True, check=True, text=True, + cwd=tmpdir.name) + sha = sha_process.stdout.strip() + beman_submodule.add_command(tmpdir.name, 'foo') + module = beman_submodule.get_beman_submodule(os.path.join(tmpdir2.name, 'foo')) + module.commit_hash = sha + tmpdir3 = beman_submodule.clone_beman_submodule_into_tmpdir(module, False) + assert not beman_submodule.directory_compare(tmpdir.name, tmpdir3.name, ['.git']) + tmpdir4 = beman_submodule.clone_beman_submodule_into_tmpdir(module, True) + assert beman_submodule.directory_compare(tmpdir.name, tmpdir4.name, ['.git']) + subprocess.run( + ['git', 'reset', '--hard', sha], capture_output=True, check=True, + cwd=tmpdir.name) + assert beman_submodule.directory_compare(tmpdir.name, tmpdir3.name, ['.git']) + os.chdir(original_cwd) + +def test_beman_submodule_status(): + tmpdir = create_test_git_repository() + tmpdir2 = create_test_git_repository() + original_cwd = os.getcwd() + os.chdir(tmpdir2.name) + beman_submodule.add_command(tmpdir.name, 'foo') + sha_process = subprocess.run( + ['git', 'rev-parse', 'HEAD'], capture_output=True, check=True, text=True, + cwd=tmpdir.name) + sha = sha_process.stdout.strip() + assert ' ' + sha + ' foo' == beman_submodule.beman_submodule_status( + beman_submodule.get_beman_submodule(os.path.join(tmpdir2.name, 'foo'))) + with open(os.path.join(os.path.join(tmpdir2.name, 'foo'), 'a.txt'), 'w') as f: + f.write('b') + assert '+ ' + sha + ' foo' == beman_submodule.beman_submodule_status( + beman_submodule.get_beman_submodule(os.path.join(tmpdir2.name, 'foo'))) + os.chdir(original_cwd) + +def test_update_command_no_paths(): + tmpdir = create_test_git_repository() + tmpdir2 = create_test_git_repository() + original_cwd = os.getcwd() + os.chdir(tmpdir2.name) + beman_submodule.add_command(tmpdir.name, 'foo') + beman_submodule.add_command(tmpdir.name, 'bar') + sha_process = subprocess.run( + ['git', 'rev-parse', 'HEAD^'], capture_output=True, check=True, text=True, + cwd=tmpdir.name) + sha = sha_process.stdout.strip() + subprocess.run( + ['git', 'reset', '--hard', sha], capture_output=True, check=True, + cwd=tmpdir.name) + with open(os.path.join(os.path.join(tmpdir2.name, 'foo'), '.beman_submodule'), 'w') as f: + f.write(f'[beman_submodule]\nremote={tmpdir.name}\ncommit_hash={sha}\n') + with open(os.path.join(os.path.join(tmpdir2.name, 'bar'), '.beman_submodule'), 'w') as f: + f.write(f'[beman_submodule]\nremote={tmpdir.name}\ncommit_hash={sha}\n') + beman_submodule.update_command(tmpdir.name, None) + assert beman_submodule.directory_compare( + tmpdir.name, os.path.join(tmpdir2.name, 'foo'), ['.git', '.beman_submodule']) + assert beman_submodule.directory_compare( + tmpdir.name, os.path.join(tmpdir2.name, 'bar'), ['.git', '.beman_submodule']) + os.chdir(original_cwd) + +def test_update_command_with_path(): + tmpdir = create_test_git_repository() + tmpdir2 = create_test_git_repository() + tmpdir_copy1 = tempfile.TemporaryDirectory() + shutil.copytree(tmpdir.name, tmpdir_copy1.name, dirs_exist_ok=True) + original_cwd = os.getcwd() + os.chdir(tmpdir2.name) + beman_submodule.add_command(tmpdir.name, 'foo') + beman_submodule.add_command(tmpdir.name, 'bar') + sha_process = subprocess.run( + ['git', 'rev-parse', 'HEAD^'], capture_output=True, check=True, text=True, + cwd=tmpdir.name) + sha = sha_process.stdout.strip() + subprocess.run( + ['git', 'reset', '--hard', sha], capture_output=True, check=True, + cwd=tmpdir.name) + with open(os.path.join(os.path.join(tmpdir2.name, 'foo'), '.beman_submodule'), 'w') as f: + f.write(f'[beman_submodule]\nremote={tmpdir.name}\ncommit_hash={sha}\n') + with open(os.path.join(os.path.join(tmpdir2.name, 'bar'), '.beman_submodule'), 'w') as f: + f.write(f'[beman_submodule]\nremote={tmpdir.name}\ncommit_hash={sha}\n') + beman_submodule.update_command(tmpdir.name, 'foo') + assert beman_submodule.directory_compare( + tmpdir.name, os.path.join(tmpdir2.name, 'foo'), ['.git', '.beman_submodule']) + assert beman_submodule.directory_compare( + tmpdir_copy1.name, os.path.join(tmpdir2.name, 'bar'), ['.git', '.beman_submodule']) + os.chdir(original_cwd) + +def test_add_command(): + tmpdir = create_test_git_repository() + tmpdir2 = create_test_git_repository() + original_cwd = os.getcwd() + os.chdir(tmpdir2.name) + beman_submodule.add_command(tmpdir.name, 'foo') + sha_process = subprocess.run( + ['git', 'rev-parse', 'HEAD'], capture_output=True, check=True, text=True, + cwd=tmpdir.name) + sha = sha_process.stdout.strip() + assert beman_submodule.directory_compare( + tmpdir.name, os.path.join(tmpdir2.name, 'foo'), ['.git', '.beman_submodule']) + with open(os.path.join(os.path.join(tmpdir2.name, 'foo'), '.beman_submodule'), 'r') as f: + assert f.read() == f'[beman_submodule]\nremote={tmpdir.name}\ncommit_hash={sha}\n' + os.chdir(original_cwd) + +def test_status_command_no_paths(capsys): + tmpdir = create_test_git_repository() + tmpdir2 = create_test_git_repository() + original_cwd = os.getcwd() + os.chdir(tmpdir2.name) + beman_submodule.add_command(tmpdir.name, 'foo') + beman_submodule.add_command(tmpdir.name, 'bar') + sha_process = subprocess.run( + ['git', 'rev-parse', 'HEAD'], capture_output=True, check=True, text=True, + cwd=tmpdir.name) + with open(os.path.join(os.path.join(tmpdir2.name, 'bar'), 'a.txt'), 'w') as f: + f.write('b') + beman_submodule.status_command([]) + sha = sha_process.stdout.strip() + assert capsys.readouterr().out == '+ ' + sha + ' bar\n' + ' ' + sha + ' foo\n' + os.chdir(original_cwd) + +def test_status_command_with_path(capsys): + tmpdir = create_test_git_repository() + tmpdir2 = create_test_git_repository() + original_cwd = os.getcwd() + os.chdir(tmpdir2.name) + beman_submodule.add_command(tmpdir.name, 'foo') + beman_submodule.add_command(tmpdir.name, 'bar') + sha_process = subprocess.run( + ['git', 'rev-parse', 'HEAD'], capture_output=True, check=True, text=True, + cwd=tmpdir.name) + with open(os.path.join(os.path.join(tmpdir2.name, 'bar'), 'a.txt'), 'w') as f: + f.write('b') + beman_submodule.status_command(['bar']) + sha = sha_process.stdout.strip() + assert capsys.readouterr().out == '+ ' + sha + ' bar\n' + os.chdir(original_cwd) + +def test_check_for_git(): + tmpdir = tempfile.TemporaryDirectory() + assert not beman_submodule.check_for_git(tmpdir.name) + fake_git_path = os.path.join(tmpdir.name, 'git') + with open(fake_git_path, 'w'): + pass + os.chmod(fake_git_path, stat.S_IRWXU) + assert beman_submodule.check_for_git(tmpdir.name) + +def test_parse_args(): + def plain_update(): + args = beman_submodule.parse_args(['update']) + assert args.command == 'update' + assert not args.remote + assert not args.beman_submodule_path + plain_update() + def update_remote(): + args = beman_submodule.parse_args(['update', '--remote']) + assert args.command == 'update' + assert args.remote + assert not args.beman_submodule_path + update_remote() + def update_path(): + args = beman_submodule.parse_args(['update', 'infra/']) + assert args.command == 'update' + assert not args.remote + assert args.beman_submodule_path == 'infra/' + update_path() + def update_path_remote(): + args = beman_submodule.parse_args(['update', '--remote', 'infra/']) + assert args.command == 'update' + assert args.remote + assert args.beman_submodule_path == 'infra/' + update_path_remote() + def plain_add(): + args = beman_submodule.parse_args(['add', 'git@github.com:bemanproject/infra.git']) + assert args.command == 'add' + assert args.repository == 'git@github.com:bemanproject/infra.git' + assert not args.path + plain_add() + def add_path(): + args = beman_submodule.parse_args( + ['add', 'git@github.com:bemanproject/infra.git', 'infra/']) + assert args.command == 'add' + assert args.repository == 'git@github.com:bemanproject/infra.git' + assert args.path == 'infra/' + add_path() + def plain_status(): + args = beman_submodule.parse_args(['status']) + assert args.command == 'status' + assert args.paths == [] + plain_status() + def status_one_module(): + args = beman_submodule.parse_args(['status', 'infra/']) + assert args.command == 'status' + assert args.paths == ['infra/'] + status_one_module() + def status_multiple_modules(): + args = beman_submodule.parse_args(['status', 'infra/', 'foobar/']) + assert args.command == 'status' + assert args.paths == ['infra/', 'foobar/'] + status_multiple_modules() From 92c7fce22d3984ae9d961f67703a7a0ec0d7537a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Darius=20Nea=C8=9Bu?= Date: Thu, 12 Jun 2025 00:27:06 +0300 Subject: [PATCH 113/199] Update CODEOWNERS: add explicit owners --- .github/CODEOWNERS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index d3be6f1..4db7c07 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1 +1 @@ -* @bemanproject/core-reviewers +* @ednolan @neatudarius @wusatosi @bemanproject/core-reviewers From dde360b447da44c32f78323b4e27e4a1595ce7a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Darius=20Nea=C8=9Bu?= Date: Mon, 16 Jun 2025 13:14:21 +0300 Subject: [PATCH 114/199] beman-tidy: run the tool from any path --- .pre-commit-config.yaml | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 .pre-commit-config.yaml diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..41efdcf --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,9 @@ +repos: + - repo: local + hooks: + - id: beman-tidy + name: Run beman-tidy on repo + entry: ./tools/beman-tidy/beman-tidy . + language: system + pass_filenames: false + always_run: true From afa9204ecb4977d3ef3d40d9053eee8524045df1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Darius=20Nea=C8=9Bu?= Date: Mon, 16 Jun 2025 13:49:32 +0300 Subject: [PATCH 115/199] beman-tidy: expose as precommit hooks --- .pre-commit-config.yaml | 9 --------- .pre-commit-hooks.yaml | 6 ++++++ 2 files changed, 6 insertions(+), 9 deletions(-) delete mode 100644 .pre-commit-config.yaml create mode 100644 .pre-commit-hooks.yaml diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml deleted file mode 100644 index 41efdcf..0000000 --- a/.pre-commit-config.yaml +++ /dev/null @@ -1,9 +0,0 @@ -repos: - - repo: local - hooks: - - id: beman-tidy - name: Run beman-tidy on repo - entry: ./tools/beman-tidy/beman-tidy . - language: system - pass_filenames: false - always_run: true diff --git a/.pre-commit-hooks.yaml b/.pre-commit-hooks.yaml new file mode 100644 index 0000000..1746115 --- /dev/null +++ b/.pre-commit-hooks.yaml @@ -0,0 +1,6 @@ +- id: beman-tidy + name: Run beman-tidy on repo + entry: ./tools/beman-tidy/beman-tidy . + language: system + pass_filenames: false + always_run: true From f8b7f2c5baf15526e18377f5d2b5cd63d98780b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Darius=20Nea=C8=9Bu?= Date: Mon, 16 Jun 2025 14:01:50 +0300 Subject: [PATCH 116/199] beman-tidy: cleanup --- .pre-commit-hooks.yaml | 6 ------ 1 file changed, 6 deletions(-) delete mode 100644 .pre-commit-hooks.yaml diff --git a/.pre-commit-hooks.yaml b/.pre-commit-hooks.yaml deleted file mode 100644 index 1746115..0000000 --- a/.pre-commit-hooks.yaml +++ /dev/null @@ -1,6 +0,0 @@ -- id: beman-tidy - name: Run beman-tidy on repo - entry: ./tools/beman-tidy/beman-tidy . - language: system - pass_filenames: false - always_run: true From c05ab2ef2d1266502233e0838c74670623f0c7cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Darius=20Nea=C8=9Bu?= Date: Mon, 16 Jun 2025 15:07:45 +0300 Subject: [PATCH 117/199] beman-tidy: expose as precommit hooks --- .pre-commit-hooks.yaml | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 .pre-commit-hooks.yaml diff --git a/.pre-commit-hooks.yaml b/.pre-commit-hooks.yaml new file mode 100644 index 0000000..c30aa0d --- /dev/null +++ b/.pre-commit-hooks.yaml @@ -0,0 +1,7 @@ +- id: beman-tidy + name: Run beman-tidy on repo + entry: ./tools/beman-tidy/beman-tidy + language: script + pass_filenames: false + always_run: true + args: [".", "--verbose"] From 3a77acb9d3e2fb6552489e131cb4eb821a97a455 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Darius=20Nea=C8=9Bu?= Date: Mon, 16 Jun 2025 15:15:27 +0300 Subject: [PATCH 118/199] beman-tidy: rename precommit hook --- .pre-commit-hooks.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-hooks.yaml b/.pre-commit-hooks.yaml index c30aa0d..d327587 100644 --- a/.pre-commit-hooks.yaml +++ b/.pre-commit-hooks.yaml @@ -1,5 +1,5 @@ - id: beman-tidy - name: Run beman-tidy on repo + name: "beman-tidy: bemanification your repo" entry: ./tools/beman-tidy/beman-tidy language: script pass_filenames: false From e4193071443a4c4453847011a3a2d3a852640207 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Darius=20Nea=C8=9Bu?= Date: Mon, 16 Jun 2025 16:11:08 +0300 Subject: [PATCH 119/199] beman-tidy: rename CI job --- .github/workflows/beman-tidy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/beman-tidy.yml b/.github/workflows/beman-tidy.yml index f5eec8d..651b6d5 100644 --- a/.github/workflows/beman-tidy.yml +++ b/.github/workflows/beman-tidy.yml @@ -1,6 +1,6 @@ # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -name: Run Beman Tidy Tests +name: beman-tidy tests on: workflow_dispatch: From 36e78f4a9051cd3ac24e21052119308e33fb5d83 Mon Sep 17 00:00:00 2001 From: rishyak Date: Mon, 9 Jun 2025 16:56:14 -0400 Subject: [PATCH 120/199] beman-tidy: support for pyproject.toml and uv - We no longer need Makefiles - No need for requirements.txt files, better lockfiles instead Signed-off-by: rishyak --- .github/workflows/beman-tidy.yml | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/.github/workflows/beman-tidy.yml b/.github/workflows/beman-tidy.yml index 651b6d5..7458262 100644 --- a/.github/workflows/beman-tidy.yml +++ b/.github/workflows/beman-tidy.yml @@ -3,29 +3,32 @@ name: beman-tidy tests on: - workflow_dispatch: + push: pull_request: + workflow_dispatch: jobs: tests: runs-on: ubuntu-latest + defaults: + run: + working-directory: tools/beman-tidy steps: - name: Checkout code uses: actions/checkout@v4 - - name: Install dependencies (production) - run: | - make -C tools/beman-tidy install + - name: Install uv + uses: astral-sh/setup-uv@v5 - - name: Install dependencies (development) + - name: Sync environment run: | - make -C tools/beman-tidy install-dev + uv sync - - name: Run linter - run: | - echo "Running linter..." - make -C tools/beman-tidy self-lint + # - name: Run linter + # run: | + # echo "Running linter" + # uv run ruff check --diff - name: Run tests run: | - make -C tools/beman-tidy test + uv run pytest tests/ -v From 6a1ad9e3fe00fe71f69d6d64ee69452767314245 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Darius=20Nea=C8=9Bu?= Date: Mon, 16 Jun 2025 13:43:13 +0300 Subject: [PATCH 121/199] beman-tidy: ruff linter tweaks (#1) --- .github/workflows/beman-tidy.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/beman-tidy.yml b/.github/workflows/beman-tidy.yml index 7458262..4fc7369 100644 --- a/.github/workflows/beman-tidy.yml +++ b/.github/workflows/beman-tidy.yml @@ -24,10 +24,10 @@ jobs: run: | uv sync - # - name: Run linter - # run: | - # echo "Running linter" - # uv run ruff check --diff + - name: Run linter + run: | + echo "Running linter" + uv run ruff check --diff - name: Run tests run: | From 53534e7348acbee817357bdbb1c42cfd8c84a8b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Darius=20Nea=C8=9Bu?= Date: Tue, 17 Jun 2025 14:50:29 +0300 Subject: [PATCH 122/199] [beman-tidy] beman-tidy: improve docs and examples (#2) --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index e97d597..a64e398 100644 --- a/.gitignore +++ b/.gitignore @@ -43,3 +43,6 @@ __pycache__/ *.pyzw *.pyzwz *.delete_me + +# MAC OS +*.DS_Store From e41e239703b71792c4b61a7f6e483894d2f66214 Mon Sep 17 00:00:00 2001 From: rishyak Date: Tue, 17 Jun 2025 23:05:18 -0400 Subject: [PATCH 123/199] chore(gitignore): add editor config files --- .gitignore | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitignore b/.gitignore index a64e398..e5fda7e 100644 --- a/.gitignore +++ b/.gitignore @@ -46,3 +46,7 @@ __pycache__/ # MAC OS *.DS_Store + +# editor files +.vscode/ +.idea/ From 6bd41ecaa388c9cebb01ea93aa836bc4047fed59 Mon Sep 17 00:00:00 2001 From: rishyak Date: Wed, 18 Jun 2025 00:54:54 -0400 Subject: [PATCH 124/199] chore: add @rishyak to codeowners --- .github/CODEOWNERS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 4db7c07..67d9e9b 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1 +1 @@ -* @ednolan @neatudarius @wusatosi @bemanproject/core-reviewers +* @ednolan @neatudarius @rishyak @wusatosi @bemanproject/core-reviewers From bec9a864927f9429a3c9b3312e0e0076415022c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Darius=20Nea=C8=9Bu?= Date: Wed, 18 Jun 2025 08:21:29 +0300 Subject: [PATCH 125/199] [beman-tidy] exclude build artifacts --- .gitignore | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.gitignore b/.gitignore index e5fda7e..a7236db 100644 --- a/.gitignore +++ b/.gitignore @@ -50,3 +50,8 @@ __pycache__/ # editor files .vscode/ .idea/ + +# Python +infra.egg-info +beman_tidy.egg-info +*.egg-info From ea5ada9628562fe33e46a8e7bc586b7e7d0a17c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Darius=20Nea=C8=9Bu?= Date: Wed, 18 Jun 2025 08:27:40 +0300 Subject: [PATCH 126/199] Exclude more build artifacts --- .gitignore | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index e5fda7e..7389e9e 100644 --- a/.gitignore +++ b/.gitignore @@ -47,6 +47,14 @@ __pycache__/ # MAC OS *.DS_Store -# editor files +# Editor files .vscode/ .idea/ + +# Build directories +infra.egg-info/ +beman_tidy.egg-info/ +*.egg-info/ +build/ +dist/ + From 2b182c5eb17a1f976d8c2ceea02988ebfd80a249 Mon Sep 17 00:00:00 2001 From: Tsche Date: Thu, 19 Jun 2025 08:11:07 +0200 Subject: [PATCH 127/199] [beman-tidy] consistently use pathlib.Path rather than os.path --- tools/beman-submodule/beman-submodule | 64 ++++++++------ .../test/test_beman_submodule.py | 88 ++++++++++--------- 2 files changed, 84 insertions(+), 68 deletions(-) diff --git a/tools/beman-submodule/beman-submodule b/tools/beman-submodule/beman-submodule index 2007fc4..9fe09aa 100755 --- a/tools/beman-submodule/beman-submodule +++ b/tools/beman-submodule/beman-submodule @@ -6,26 +6,29 @@ import argparse import configparser import filecmp import os -import pathlib import shutil import subprocess import sys import tempfile +from pathlib import Path + + +def directory_compare(dir1: str | Path, dir2: str | Path, ignore): + dir1, dir2 = Path(dir1), Path(dir2) -def directory_compare(dir1, dir2, ignore): compared = filecmp.dircmp(dir1, dir2, ignore=ignore) if compared.left_only or compared.right_only or compared.diff_files: return False for common_dir in compared.common_dirs: - path1 = os.path.join(dir1, common_dir) - path2 = os.path.join(dir2, common_dir) + path1 = dir1 / common_dir + path2 = dir2 / common_dir if not directory_compare(path1, path2, ignore): return False return True class BemanSubmodule: - def __init__(self, dirpath, remote, commit_hash): - self.dirpath = dirpath + def __init__(self, dirpath: str | Path, remote: str, commit_hash: str): + self.dirpath = Path(dirpath) self.remote = remote self.commit_hash = commit_hash @@ -43,22 +46,26 @@ def parse_beman_submodule_file(path): if not 'commit_hash' in config['beman_submodule']: fail() return BemanSubmodule( - str(pathlib.Path(path).resolve().parent), - config['beman_submodule']['remote'], config['beman_submodule']['commit_hash']) + Path(path).resolve().parent, + config['beman_submodule']['remote'], + config['beman_submodule']['commit_hash']) -def get_beman_submodule(dir): - beman_submodule_filepath = os.path.join(dir, '.beman_submodule') - if os.path.isfile(beman_submodule_filepath): +def get_beman_submodule(path: str | Path): + beman_submodule_filepath = Path(path) / '.beman_submodule' + + if beman_submodule_filepath.is_file(): return parse_beman_submodule_file(beman_submodule_filepath) else: return None -def find_beman_submodules_in(dir): - assert os.path.isdir(dir) +def find_beman_submodules_in(path): + path = Path(path) + assert path.is_dir() + result = [] - for dirpath, _, filenames in os.walk(dir): + for dirpath, _, filenames in path.walk(): if '.beman_submodule' in filenames: - result.append(parse_beman_submodule_file(os.path.join(dirpath, '.beman_submodule'))) + result.append(parse_beman_submodule_file(dirpath / '.beman_submodule')) return sorted(result, key=lambda module: module.dirpath) def cwd_git_repository_path(): @@ -92,19 +99,22 @@ def beman_submodule_status(beman_submodule): parent_repo_path = cwd_git_repository_path() if not parent_repo_path: raise Exception('this is not a git repository') - relpath = pathlib.Path( - beman_submodule.dirpath).relative_to(pathlib.Path(parent_repo_path)) + relpath = Path(beman_submodule.dirpath).relative_to(Path(parent_repo_path)) return status_character + ' ' + beman_submodule.commit_hash + ' ' + str(relpath) def beman_submodule_update(beman_submodule, remote): tmpdir = clone_beman_submodule_into_tmpdir(beman_submodule, remote) + tmp_path = Path(tmpdir.name) + shutil.rmtree(beman_submodule.dirpath) - with open(os.path.join(tmpdir.name, '.beman_submodule'), 'w') as f: + + submodule_path = tmp_path / '.beman_submodule' + with open(submodule_path, 'w') as f: f.write('[beman_submodule]\n') f.write(f'remote={beman_submodule.remote}\n') f.write(f'commit_hash={beman_submodule.commit_hash}\n') - shutil.rmtree(os.path.join(tmpdir.name, '.git')) - shutil.copytree(tmpdir.name, beman_submodule.dirpath) + shutil.rmtree(tmp_path / '.git') + shutil.copytree(tmp_path, beman_submodule.dirpath) def update_command(remote, path): if not path: @@ -126,19 +136,21 @@ def add_command(repository, path): ['git', 'clone', repository], capture_output=True, check=True, cwd=tmpdir.name) repository_name = os.listdir(tmpdir.name)[0] if not path: - path = repository_name - if os.path.exists(path): + path = Path(repository_name) + else: + path = Path(path) + if path.exists(): raise Exception(f'{path} exists') - os.makedirs(path) - tmpdir_repo = os.path.join(tmpdir.name, repository_name) + path.mkdir() + tmpdir_repo = Path(tmpdir.name) / repository_name sha_process = subprocess.run( ['git', 'rev-parse', 'HEAD'], capture_output=True, check=True, text=True, cwd=tmpdir_repo) - with open(os.path.join(tmpdir_repo, '.beman_submodule'), 'w') as f: + with open(tmpdir_repo / '.beman_submodule', 'w') as f: f.write('[beman_submodule]\n') f.write(f'remote={repository}\n') f.write(f'commit_hash={sha_process.stdout.strip()}\n') - shutil.rmtree(os.path.join(tmpdir_repo, '.git')) + shutil.rmtree(tmpdir_repo /'.git') shutil.copytree(tmpdir_repo, path, dirs_exist_ok=True) def status_command(paths): diff --git a/tools/beman-submodule/test/test_beman_submodule.py b/tools/beman-submodule/test/test_beman_submodule.py index 47e2303..5010b8a 100644 --- a/tools/beman-submodule/test/test_beman_submodule.py +++ b/tools/beman-submodule/test/test_beman_submodule.py @@ -1,27 +1,29 @@ # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception import os -import pathlib import pytest import shutil import stat import subprocess import tempfile +from pathlib import Path # https://stackoverflow.com/a/19011259 import types import importlib.machinery loader = importlib.machinery.SourceFileLoader( 'beman_submodule', - os.path.join(os.path.dirname(os.path.realpath(__file__)), '../beman-submodule')) + str(Path(__file__).parent.resolve().parent / 'beman-submodule')) beman_submodule = types.ModuleType(loader.name) loader.exec_module(beman_submodule) def create_test_git_repository(): tmpdir = tempfile.TemporaryDirectory() + tmp_path = Path(tmpdir.name) + subprocess.run(['git', 'init'], check=True, cwd=tmpdir.name, capture_output=True) def make_commit(a_txt_contents): - with open(os.path.join(tmpdir.name, 'a.txt'), 'w') as f: + with open(tmp_path / 'a.txt', 'w') as f: f.write(a_txt_contents) subprocess.run( ['git', 'add', 'a.txt'], check=True, cwd=tmpdir.name, capture_output=True) @@ -34,28 +36,30 @@ def make_commit(a_txt_contents): return tmpdir def test_directory_compare(): - def create_dir_structure(dir_path): - bar_path = os.path.join(dir_path, 'bar') + def create_dir_structure(dir_path: Path): + bar_path = dir_path / 'bar' os.makedirs(bar_path) - with open(os.path.join(dir_path, 'foo.txt'), 'w') as f: + with open(dir_path / 'foo.txt', 'w') as f: f.write('foo') - with open(os.path.join(bar_path, 'baz.txt'), 'w') as f: + with open(bar_path / 'baz.txt', 'w') as f: f.write('baz') with tempfile.TemporaryDirectory() as dir_a, \ tempfile.TemporaryDirectory() as dir_b: + path_a = Path(dir_a) + path_b = Path(dir_b) - create_dir_structure(dir_a) - create_dir_structure(dir_b) + create_dir_structure(path_a) + create_dir_structure(path_b) assert beman_submodule.directory_compare(dir_a, dir_b, []) - with open(os.path.join(os.path.join(dir_a, 'bar'), 'quux.txt'), 'w') as f: + with open(path_a / 'bar' / 'quux.txt', 'w') as f: f.write('quux') - assert not beman_submodule.directory_compare(dir_a, dir_b, []) - assert beman_submodule.directory_compare(dir_a, dir_b, ['quux.txt']) + assert not beman_submodule.directory_compare(path_a, path_b, []) + assert beman_submodule.directory_compare(path_a, path_b, ['quux.txt']) def test_parse_beman_submodule_file(): def valid_file(): @@ -67,7 +71,7 @@ def valid_file(): 'commit_hash=9b88395a86c4290794e503e94d8213b6c442ae77\n'.encode('utf-8')) tmpfile.flush() module = beman_submodule.parse_beman_submodule_file(tmpfile.name) - assert module.dirpath == str(pathlib.Path(tmpfile.name).resolve().parent) + assert module.dirpath == Path(tmpfile.name).resolve().parent assert module.remote == 'git@github.com:bemanproject/infra.git' assert module.commit_hash == '9b88395a86c4290794e503e94d8213b6c442ae77' valid_file() @@ -116,7 +120,7 @@ def invalid_file_wrong_section(): def test_get_beman_submodule(): tmpdir = create_test_git_repository() tmpdir2 = create_test_git_repository() - original_cwd = os.getcwd() + original_cwd = Path.cwd() os.chdir(tmpdir2.name) beman_submodule.add_command(tmpdir.name, 'foo') assert beman_submodule.get_beman_submodule('foo') @@ -127,7 +131,7 @@ def test_get_beman_submodule(): def test_find_beman_submodules_in(): tmpdir = create_test_git_repository() tmpdir2 = create_test_git_repository() - original_cwd = os.getcwd() + original_cwd = Path.cwd() os.chdir(tmpdir2.name) beman_submodule.add_command(tmpdir.name, 'foo') beman_submodule.add_command(tmpdir.name, 'bar') @@ -136,16 +140,16 @@ def test_find_beman_submodules_in(): ['git', 'rev-parse', 'HEAD'], capture_output=True, check=True, text=True, cwd=tmpdir.name) sha = sha_process.stdout.strip() - assert beman_submodules[0].dirpath == os.path.join(tmpdir2.name, 'bar') + assert beman_submodules[0].dirpath == Path(tmpdir2.name) / 'bar' assert beman_submodules[0].remote == tmpdir.name assert beman_submodules[0].commit_hash == sha - assert beman_submodules[1].dirpath == os.path.join(tmpdir2.name, 'foo') + assert beman_submodules[1].dirpath == Path(tmpdir2.name) / 'foo' assert beman_submodules[1].remote == tmpdir.name assert beman_submodules[1].commit_hash == sha os.chdir(original_cwd) def test_cwd_git_repository_path(): - original_cwd = os.getcwd() + original_cwd = Path.cwd() tmpdir = tempfile.TemporaryDirectory() os.chdir(tmpdir.name) assert not beman_submodule.cwd_git_repository_path() @@ -156,14 +160,14 @@ def test_cwd_git_repository_path(): def test_clone_beman_submodule_into_tmpdir(): tmpdir = create_test_git_repository() tmpdir2 = create_test_git_repository() - original_cwd = os.getcwd() + original_cwd = Path.cwd() os.chdir(tmpdir2.name) sha_process = subprocess.run( ['git', 'rev-parse', 'HEAD^'], capture_output=True, check=True, text=True, cwd=tmpdir.name) sha = sha_process.stdout.strip() beman_submodule.add_command(tmpdir.name, 'foo') - module = beman_submodule.get_beman_submodule(os.path.join(tmpdir2.name, 'foo')) + module = beman_submodule.get_beman_submodule(Path(tmpdir2.name) / 'foo') module.commit_hash = sha tmpdir3 = beman_submodule.clone_beman_submodule_into_tmpdir(module, False) assert not beman_submodule.directory_compare(tmpdir.name, tmpdir3.name, ['.git']) @@ -178,7 +182,7 @@ def test_clone_beman_submodule_into_tmpdir(): def test_beman_submodule_status(): tmpdir = create_test_git_repository() tmpdir2 = create_test_git_repository() - original_cwd = os.getcwd() + original_cwd = Path.cwd() os.chdir(tmpdir2.name) beman_submodule.add_command(tmpdir.name, 'foo') sha_process = subprocess.run( @@ -186,17 +190,17 @@ def test_beman_submodule_status(): cwd=tmpdir.name) sha = sha_process.stdout.strip() assert ' ' + sha + ' foo' == beman_submodule.beman_submodule_status( - beman_submodule.get_beman_submodule(os.path.join(tmpdir2.name, 'foo'))) - with open(os.path.join(os.path.join(tmpdir2.name, 'foo'), 'a.txt'), 'w') as f: + beman_submodule.get_beman_submodule(Path(tmpdir2.name) / 'foo')) + with open(Path(tmpdir2.name) / 'foo' / 'a.txt', 'w') as f: f.write('b') assert '+ ' + sha + ' foo' == beman_submodule.beman_submodule_status( - beman_submodule.get_beman_submodule(os.path.join(tmpdir2.name, 'foo'))) + beman_submodule.get_beman_submodule(Path(tmpdir2.name) / 'foo')) os.chdir(original_cwd) def test_update_command_no_paths(): tmpdir = create_test_git_repository() tmpdir2 = create_test_git_repository() - original_cwd = os.getcwd() + original_cwd = Path.cwd() os.chdir(tmpdir2.name) beman_submodule.add_command(tmpdir.name, 'foo') beman_submodule.add_command(tmpdir.name, 'bar') @@ -207,15 +211,15 @@ def test_update_command_no_paths(): subprocess.run( ['git', 'reset', '--hard', sha], capture_output=True, check=True, cwd=tmpdir.name) - with open(os.path.join(os.path.join(tmpdir2.name, 'foo'), '.beman_submodule'), 'w') as f: + with open(Path(tmpdir2.name) / 'foo' / '.beman_submodule', 'w') as f: f.write(f'[beman_submodule]\nremote={tmpdir.name}\ncommit_hash={sha}\n') - with open(os.path.join(os.path.join(tmpdir2.name, 'bar'), '.beman_submodule'), 'w') as f: + with open(Path(tmpdir2.name) / 'bar' / '.beman_submodule', 'w') as f: f.write(f'[beman_submodule]\nremote={tmpdir.name}\ncommit_hash={sha}\n') beman_submodule.update_command(tmpdir.name, None) assert beman_submodule.directory_compare( - tmpdir.name, os.path.join(tmpdir2.name, 'foo'), ['.git', '.beman_submodule']) + tmpdir.name, Path(tmpdir2.name) / 'foo', ['.git', '.beman_submodule']) assert beman_submodule.directory_compare( - tmpdir.name, os.path.join(tmpdir2.name, 'bar'), ['.git', '.beman_submodule']) + tmpdir.name, Path(tmpdir2.name) / 'bar', ['.git', '.beman_submodule']) os.chdir(original_cwd) def test_update_command_with_path(): @@ -223,7 +227,7 @@ def test_update_command_with_path(): tmpdir2 = create_test_git_repository() tmpdir_copy1 = tempfile.TemporaryDirectory() shutil.copytree(tmpdir.name, tmpdir_copy1.name, dirs_exist_ok=True) - original_cwd = os.getcwd() + original_cwd = Path.cwd() os.chdir(tmpdir2.name) beman_submodule.add_command(tmpdir.name, 'foo') beman_submodule.add_command(tmpdir.name, 'bar') @@ -234,21 +238,21 @@ def test_update_command_with_path(): subprocess.run( ['git', 'reset', '--hard', sha], capture_output=True, check=True, cwd=tmpdir.name) - with open(os.path.join(os.path.join(tmpdir2.name, 'foo'), '.beman_submodule'), 'w') as f: + with open(Path(tmpdir2.name) / 'foo' / '.beman_submodule', 'w') as f: f.write(f'[beman_submodule]\nremote={tmpdir.name}\ncommit_hash={sha}\n') - with open(os.path.join(os.path.join(tmpdir2.name, 'bar'), '.beman_submodule'), 'w') as f: + with open(Path(tmpdir2.name) / 'bar' / '.beman_submodule', 'w') as f: f.write(f'[beman_submodule]\nremote={tmpdir.name}\ncommit_hash={sha}\n') beman_submodule.update_command(tmpdir.name, 'foo') assert beman_submodule.directory_compare( - tmpdir.name, os.path.join(tmpdir2.name, 'foo'), ['.git', '.beman_submodule']) + tmpdir.name, Path(tmpdir2.name) / 'foo', ['.git', '.beman_submodule']) assert beman_submodule.directory_compare( - tmpdir_copy1.name, os.path.join(tmpdir2.name, 'bar'), ['.git', '.beman_submodule']) + tmpdir_copy1.name, Path(tmpdir2.name) / 'bar', ['.git', '.beman_submodule']) os.chdir(original_cwd) def test_add_command(): tmpdir = create_test_git_repository() tmpdir2 = create_test_git_repository() - original_cwd = os.getcwd() + original_cwd = Path.cwd() os.chdir(tmpdir2.name) beman_submodule.add_command(tmpdir.name, 'foo') sha_process = subprocess.run( @@ -256,22 +260,22 @@ def test_add_command(): cwd=tmpdir.name) sha = sha_process.stdout.strip() assert beman_submodule.directory_compare( - tmpdir.name, os.path.join(tmpdir2.name, 'foo'), ['.git', '.beman_submodule']) - with open(os.path.join(os.path.join(tmpdir2.name, 'foo'), '.beman_submodule'), 'r') as f: + tmpdir.name, Path(tmpdir2.name) / 'foo', ['.git', '.beman_submodule']) + with open(Path(tmpdir2.name) / 'foo' / '.beman_submodule', 'r') as f: assert f.read() == f'[beman_submodule]\nremote={tmpdir.name}\ncommit_hash={sha}\n' os.chdir(original_cwd) def test_status_command_no_paths(capsys): tmpdir = create_test_git_repository() tmpdir2 = create_test_git_repository() - original_cwd = os.getcwd() + original_cwd = Path.cwd() os.chdir(tmpdir2.name) beman_submodule.add_command(tmpdir.name, 'foo') beman_submodule.add_command(tmpdir.name, 'bar') sha_process = subprocess.run( ['git', 'rev-parse', 'HEAD'], capture_output=True, check=True, text=True, cwd=tmpdir.name) - with open(os.path.join(os.path.join(tmpdir2.name, 'bar'), 'a.txt'), 'w') as f: + with open(Path(tmpdir2.name) / 'bar' / 'a.txt', 'w') as f: f.write('b') beman_submodule.status_command([]) sha = sha_process.stdout.strip() @@ -281,14 +285,14 @@ def test_status_command_no_paths(capsys): def test_status_command_with_path(capsys): tmpdir = create_test_git_repository() tmpdir2 = create_test_git_repository() - original_cwd = os.getcwd() + original_cwd = Path.cwd() os.chdir(tmpdir2.name) beman_submodule.add_command(tmpdir.name, 'foo') beman_submodule.add_command(tmpdir.name, 'bar') sha_process = subprocess.run( ['git', 'rev-parse', 'HEAD'], capture_output=True, check=True, text=True, cwd=tmpdir.name) - with open(os.path.join(os.path.join(tmpdir2.name, 'bar'), 'a.txt'), 'w') as f: + with open(Path(tmpdir2.name) / 'bar' / 'a.txt', 'w') as f: f.write('b') beman_submodule.status_command(['bar']) sha = sha_process.stdout.strip() @@ -298,7 +302,7 @@ def test_status_command_with_path(capsys): def test_check_for_git(): tmpdir = tempfile.TemporaryDirectory() assert not beman_submodule.check_for_git(tmpdir.name) - fake_git_path = os.path.join(tmpdir.name, 'git') + fake_git_path = Path(tmpdir.name) / 'git' with open(fake_git_path, 'w'): pass os.chmod(fake_git_path, stat.S_IRWXU) From 9e1177a83470fd5110f81eeeeac187371cb4857e Mon Sep 17 00:00:00 2001 From: Edward Nolan Date: Mon, 23 Jun 2025 15:10:51 +0100 Subject: [PATCH 128/199] Remove Docker infrastructure files moved to bemanproject/containers The new repository, bemanproject/containers (https://github.com/bemanproject/containers), is the new home for the part of the infra repository that handles building the CI test and devcontainer Docker images used by Beman repositories. The git history of these files has been transferred over as well, using a git filter-repo command. --- .../docker_dev_container/devcontainer.json | 13 --- .github/workflows/build_devcontainer.yml | 97 ------------------- containers/Dockerfile | 37 ------- containers/README.md | 46 --------- containers/install_compiler.sh | 39 -------- containers/install_sys.sh | 10 -- 6 files changed, 242 deletions(-) delete mode 100644 .devcontainer/docker_dev_container/devcontainer.json delete mode 100644 .github/workflows/build_devcontainer.yml delete mode 100644 containers/Dockerfile delete mode 100644 containers/README.md delete mode 100644 containers/install_compiler.sh delete mode 100644 containers/install_sys.sh diff --git a/.devcontainer/docker_dev_container/devcontainer.json b/.devcontainer/docker_dev_container/devcontainer.json deleted file mode 100644 index 6707a25..0000000 --- a/.devcontainer/docker_dev_container/devcontainer.json +++ /dev/null @@ -1,13 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -{ - "name": "beman.infra Docker Devcontainer", - "image": "mcr.microsoft.com/devcontainers/base:ubuntu", - "features": { - "ghcr.io/devcontainers/features/docker-in-docker:2": { - "version": "latest", - "enableNonRootDocker": true, - "moby": false - }, - "ghcr.io/devcontainers-extra/features/pre-commit:2": {} - } -} diff --git a/.github/workflows/build_devcontainer.yml b/.github/workflows/build_devcontainer.yml deleted file mode 100644 index 1f26fc7..0000000 --- a/.github/workflows/build_devcontainer.yml +++ /dev/null @@ -1,97 +0,0 @@ -# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception - -name: Publish Beman Containers - -on: - push: - paths: - - ".github/workflows/build_devcontainer.yml" - - "containers/**" - workflow_dispatch: - -env: - REGISTRY: ghcr.io - DEBUG_NAME: ${{ github.repository }} - DEPLOY_DEV_NAME_PREFIX: bemanproject/devcontainers - DEPLOY_TESTING_NAME_PREFIX: bemanproject/testingcontainers - BASE_IMAGE_DEV: mcr.microsoft.com/devcontainers/cpp:1-ubuntu-24.04 - BASE_IMAGE_TEST: ubuntu:24.04 - -permissions: - packages: write - -jobs: - containers: - runs-on: ubuntu-latest - strategy: - fail-fast: false - matrix: - compilers: - - kind: gcc - version: 14 - - kind: gcc - version: 13 - - kind: gcc - version: 12 - - kind: gcc - version: 11 - - kind: clang - version: 21 - - kind: clang - version: 20 - - kind: clang - version: 19 - - kind: clang - version: 18 - - kind: clang - version: 17 - usage: [dev, test] - name: "${{ matrix.usage }}: ${{ matrix.compilers.kind }}-${{ matrix.compilers.version }}" - steps: - - name: Compute Image Name - id: image_name - run: | - if [ "${{ github.repository }}/${{ github.ref }}" != "bemanproject/infra/refs/heads/main" ]; then - image_name="${{ env.DEBUG_NAME }}" - tag="${{ matrix.usage }}-${{ matrix.compilers.kind }}-${{ matrix.compilers.version }}" - else - if [ "${{ matrix.usage }}" = "dev" ]; then - image_name="${{ env.DEPLOY_DEV_NAME_PREFIX }}-${{ matrix.compilers.kind }}" - else - image_name="${{ env.DEPLOY_TESTING_NAME_PREFIX }}-${{ matrix.compilers.kind }}" - fi - tag="${{ matrix.compilers.version }}" - fi - - echo "Image Name: $image_name, Tag: $tag" - - echo "image_name=$image_name" >> "$GITHUB_OUTPUT" - echo "tag=$tag" >> "$GITHUB_OUTPUT" - - name: Compute Image base - id: image_base - run: | - if [ "${{ matrix.usage }}" == "dev" ]; then - echo "image=${{ env.BASE_IMAGE_DEV }}" >> "$GITHUB_OUTPUT" - else - echo "image=${{ env.BASE_IMAGE_TEST }}" >> "$GITHUB_OUTPUT" - fi - - name: Checkout repository - uses: actions/checkout@v4 - - name: Log in to the Container registry - uses: docker/login-action@v3 - with: - registry: ${{ env.REGISTRY }} - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - name: Build and push Docker image - uses: docker/build-push-action@v6 - with: - context: containers - build-args: | - base_image=${{ steps.image_base.outputs.image }} - compiler_kind=${{ matrix.compilers.kind }} - compiler_version=${{ matrix.compilers.version }} - push: true - tags: ${{ env.REGISTRY }}/${{ steps.image_name.outputs.image_name }}:${{ steps.image_name.outputs.tag }} - # https://github.com/docker/build-push-action/issues/894 - provenance: false diff --git a/containers/Dockerfile b/containers/Dockerfile deleted file mode 100644 index f5f5f9d..0000000 --- a/containers/Dockerfile +++ /dev/null @@ -1,37 +0,0 @@ -# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception - -ARG base_image=mcr.microsoft.com/devcontainers/cpp:1-ubuntu-24.04 -FROM ${base_image} - -# Create the vscode user -RUN bash </dev/null; then - apt-get update && apt-get install -y sudo adduser - useradd -ms /bin/bash -p "" vscode && usermod -aG sudo vscode - fi -EOF - -USER vscode -WORKDIR /tmp - -COPY install_sys.sh . -RUN bash install_sys.sh - -# Newer gcc/ clang is needed to avoid ASAN Stalling, which is turned on by default across beman projects. -# See: https://github.com/google/sanitizers/issues/1614 -# Minimal version: clang-18.1.3, gcc-13.2 -ARG compiler_kind=gcc -ARG compiler_version=14 - -COPY install_compiler.sh . -RUN bash install_compiler.sh ${compiler_kind} ${compiler_version} - -# Common dependency: google-test -RUN sudo apt-get install -y libgtest-dev - -# Pre-commit is beman library's standard linting tool -RUN sudo apt-get install -y pipx -RUN pipx install pre-commit -ENV PATH="/home/vscode/.local/bin:${PATH}" - -ENTRYPOINT ["/usr/bin/bash"] diff --git a/containers/README.md b/containers/README.md deleted file mode 100644 index 83b357d..0000000 --- a/containers/README.md +++ /dev/null @@ -1,46 +0,0 @@ -# Containers - - - -This folder contains the infrastructure for Beman project's -generic container images. You can checkout available images in beman's -[GitHub Packages page](https://github.com/orgs/bemanproject/packages). - -These images includes: - -- The latest CMake from kitware's apt repository -- Latest compiler based on build args (gcc or clang) installed from the universe repository -- [pre-commit](https://pre-commit.com/), the standard linter manager across Beman - -## Devcontainer - -The image is build on top of GitHub's -[C++ devcontainer image](https://github.com/devcontainers/images/tree/main/src/cpp) -for Ubuntu 24.04. - -### Example devcontainer setup - -```json -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -{ - "name": "Beman Generic Devcontainer", - "image": "ghcr.io/bemanproject/devcontainers-gcc:14", - "postCreateCommand": "pre-commit", - "customizations": { - "vscode": { - "extensions": [ - "ms-vscode.cpptools", - "ms-vscode.cmake-tools" - ] - } - } -} -``` - -### Building your own image - -You can build your own Beman devcontainer image with: - -```bash -docker build devcontainer/ -``` diff --git a/containers/install_compiler.sh b/containers/install_compiler.sh deleted file mode 100644 index bef0e1c..0000000 --- a/containers/install_compiler.sh +++ /dev/null @@ -1,39 +0,0 @@ -#!/bin/bash -# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception - -set -e -set +x -TOOL=$1 -VERSION=$2 - -echo "Install ${TOOL} at: ${VERSION}" - -shopt -s nocasematch -if [ "$TOOL" = "gcc" ]; then - sudo apt-get remove -y gcc-"$VERSION" g++-"$VERSION" gcc g++ - sudo apt-get install -y gcc-"$VERSION" g++-"$VERSION" lcov - - sudo rm -f /usr/bin/gcc - sudo rm -f /usr/bin/g++ - sudo rm -f /usr/bin/gcov - - sudo ln -s "$(which gcc-"$VERSION")" /usr/bin/gcc - sudo ln -s "$(which g++-"$VERSION")" /usr/bin/g++ - sudo ln -s "$(which gcov-"$VERSION")" /usr/bin/gcov - - gcc --version -else - sudo apt-get install -y lsb-release wget software-properties-common gnupg - wget https://apt.llvm.org/llvm.sh - - sudo bash llvm.sh "${VERSION}" - sudo apt-get install -y libc++-"$VERSION"-dev clang-tools-"$VERSION" lcov - - sudo rm -f /usr/bin/clang - sudo rm -f /usr/bin/clang++ - - sudo ln -s "$(which clang-"$VERSION")" /usr/bin/clang - sudo ln -s "$(which clang++-"$VERSION")" /usr/bin/clang++ - - clang --version -fi diff --git a/containers/install_sys.sh b/containers/install_sys.sh deleted file mode 100644 index 0e31aca..0000000 --- a/containers/install_sys.sh +++ /dev/null @@ -1,10 +0,0 @@ -# Install Basic utilities -sudo apt-get install -y ca-certificates gpg wget git curl - -# Install Latest CMake -wget -O - https://apt.kitware.com/keys/kitware-archive-latest.asc 2>/dev/null | gpg --dearmor - | sudo tee /usr/share/keyrings/kitware-archive-keyring.gpg >/dev/null -echo 'deb [signed-by=/usr/share/keyrings/kitware-archive-keyring.gpg] https://apt.kitware.com/ubuntu/ noble main' | sudo tee /etc/apt/sources.list.d/kitware.list >/dev/null -sudo apt-get update && sudo apt-get install -y cmake - -# Install Ninja -sudo apt-get install -y ninja-build From 9b8b17a4a39ec7702b9c98bf40471d86ccd04661 Mon Sep 17 00:00:00 2001 From: Edward Nolan Date: Wed, 25 Jun 2025 10:45:28 +0100 Subject: [PATCH 129/199] markdownlint: Don't include code blocks in line length check Code blocks can include output from tools that should be displayed exactly as the tool produced it, and which also exceeds the configured line length that we want to use for prose. --- .markdownlint.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.markdownlint.yaml b/.markdownlint.yaml index 81f5fcd..21c2849 100644 --- a/.markdownlint.yaml +++ b/.markdownlint.yaml @@ -7,3 +7,4 @@ MD033: false # Update the comment in .clang-format if we no-longer tie these two column limits. MD013: line_length: 119 + code_blocks: false From 6167b77fad8426a008c0996ea044185099fdf385 Mon Sep 17 00:00:00 2001 From: Edward Nolan Date: Wed, 25 Jun 2025 10:35:32 +0100 Subject: [PATCH 130/199] pre-commit: Add exemplar's checks, make them pass, add them to CI Previously, although infra provided beman-tidy as a pre-commit hook to consumers of the repository, it did not use pre-commit checks on its own source. This commit addresses this by adding all of the same pre-commit checks as are used in exemplar, except for clang-format and CMake linting, since those aren't relevant here. It fixes all of the failed checks and adds pre-commit checking to CI so they don't recur. --- .github/workflows/pre-commit.yml | 78 +++++++++++++++++++++++++++ .gitignore | 1 - .pre-commit-config.yaml | 20 +++++++ tools/beman-submodule/beman-submodule | 2 +- 4 files changed, 99 insertions(+), 2 deletions(-) create mode 100644 .github/workflows/pre-commit.yml create mode 100644 .pre-commit-config.yaml diff --git a/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml new file mode 100644 index 0000000..9646831 --- /dev/null +++ b/.github/workflows/pre-commit.yml @@ -0,0 +1,78 @@ +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-push: + name: Pre-Commit check on Push + runs-on: ubuntu-latest + if: ${{ github.event_name == 'push' }} + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: 3.13 + + # We wish to run pre-commit on all files instead of the changes + # only made in the push commit. + # + # So linting error persists when there's formatting problem. + - uses: pre-commit/action@v3.0.1 + + pre-commit-pr: + name: Pre-Commit check on PR + runs-on: ubuntu-latest + if: ${{ github.event_name == 'pull_request_target' }} + + permissions: + contents: read + checks: write + issues: write + pull-requests: write + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + # pull_request_target checkout the base of the repo + # We need to checkout the actual pr to lint the changes. + - name: Checkout pr + run: gh pr checkout ${{ github.event.number }} + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: 3.13 + + # we only lint on the changed file in PR. + - name: Get Changed Files + id: changed-files + uses: tj-actions/changed-files@v45 + + # See: + # https://github.com/tj-actions/changed-files?tab=readme-ov-file#using-local-git-directory- + - uses: pre-commit/action@v3.0.1 + id: run-pre-commit + with: + extra_args: --files ${{ steps.changed-files.outputs.all_changed_files }} + + # Review dog posts the suggested change from pre-commit to the pr. + - name: suggester / pre-commit + uses: reviewdog/action-suggester@v1 + if: ${{ failure() && steps.run-pre-commit.conclusion == 'failure' }} + with: + tool_name: pre-commit + level: warning + reviewdog_flags: "-fail-level=error" diff --git a/.gitignore b/.gitignore index 7389e9e..b7cdbb5 100644 --- a/.gitignore +++ b/.gitignore @@ -57,4 +57,3 @@ beman_tidy.egg-info/ *.egg-info/ build/ dist/ - diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..9e8c452 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,20 @@ +repos: + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v5.0.0 + hooks: + - id: trailing-whitespace + - id: end-of-file-fixer + - id: check-yaml + - id: check-added-large-files + + # Markdown linting + # Config file: .markdownlint.yaml + - repo: https://github.com/igorshubovych/markdownlint-cli + rev: v0.42.0 + hooks: + - id: markdownlint + + - repo: https://github.com/codespell-project/codespell + rev: v2.3.0 + hooks: + - id: codespell diff --git a/tools/beman-submodule/beman-submodule b/tools/beman-submodule/beman-submodule index 9fe09aa..0553dca 100755 --- a/tools/beman-submodule/beman-submodule +++ b/tools/beman-submodule/beman-submodule @@ -47,7 +47,7 @@ def parse_beman_submodule_file(path): fail() return BemanSubmodule( Path(path).resolve().parent, - config['beman_submodule']['remote'], + config['beman_submodule']['remote'], config['beman_submodule']['commit_hash']) def get_beman_submodule(path: str | Path): From e30b8222db56ebd60b616443d033bb48d5834d32 Mon Sep 17 00:00:00 2001 From: Edward Nolan Date: Wed, 25 Jun 2025 12:39:25 +0100 Subject: [PATCH 131/199] Fix duplicative CI runs when updating a pull request When updating the branch associated with a pull request, previously, CI would trigger twice: once for the update to the branch, and another time for the update to the pull request itself. This commit addresses the issue by restricting CI runs for updates to branches to those that update the main branch itself. --- .github/workflows/beman-submodule.yml | 2 ++ .github/workflows/beman-tidy.yml | 2 ++ 2 files changed, 4 insertions(+) diff --git a/.github/workflows/beman-submodule.yml b/.github/workflows/beman-submodule.yml index d18dd7f..8435086 100644 --- a/.github/workflows/beman-submodule.yml +++ b/.github/workflows/beman-submodule.yml @@ -4,6 +4,8 @@ name: beman-submodule tests on: push: + branches: + - main pull_request: workflow_dispatch: diff --git a/.github/workflows/beman-tidy.yml b/.github/workflows/beman-tidy.yml index 4fc7369..d5611f8 100644 --- a/.github/workflows/beman-tidy.yml +++ b/.github/workflows/beman-tidy.yml @@ -4,6 +4,8 @@ name: beman-tidy tests on: push: + branches: + - main pull_request: workflow_dispatch: From 3b7c1dcdd36798dcaa524be07d9598ec642f7c7c Mon Sep 17 00:00:00 2001 From: Edward Nolan Date: Wed, 25 Jun 2025 16:23:50 +0100 Subject: [PATCH 132/199] beman-submodule: Fix beman-submodule update --remote Previously, this command did not update the commit_hash in the .beman_submodule file when updating the beman submodule to the latest version. This commit fixes the bug and adds reproducing tests. --- tools/beman-submodule/beman-submodule | 5 +- .../test/test_beman_submodule.py | 98 +++++++++++++++---- 2 files changed, 83 insertions(+), 20 deletions(-) diff --git a/tools/beman-submodule/beman-submodule b/tools/beman-submodule/beman-submodule index 0553dca..2558e55 100755 --- a/tools/beman-submodule/beman-submodule +++ b/tools/beman-submodule/beman-submodule @@ -105,6 +105,9 @@ def beman_submodule_status(beman_submodule): def beman_submodule_update(beman_submodule, remote): tmpdir = clone_beman_submodule_into_tmpdir(beman_submodule, remote) tmp_path = Path(tmpdir.name) + sha_process = subprocess.run( + ['git', 'rev-parse', 'HEAD'], capture_output=True, check=True, text=True, + cwd=tmp_path) shutil.rmtree(beman_submodule.dirpath) @@ -112,7 +115,7 @@ def beman_submodule_update(beman_submodule, remote): with open(submodule_path, 'w') as f: f.write('[beman_submodule]\n') f.write(f'remote={beman_submodule.remote}\n') - f.write(f'commit_hash={beman_submodule.commit_hash}\n') + f.write(f'commit_hash={sha_process.stdout.strip()}\n') shutil.rmtree(tmp_path / '.git') shutil.copytree(tmp_path, beman_submodule.dirpath) diff --git a/tools/beman-submodule/test/test_beman_submodule.py b/tools/beman-submodule/test/test_beman_submodule.py index 5010b8a..746e08d 100644 --- a/tools/beman-submodule/test/test_beman_submodule.py +++ b/tools/beman-submodule/test/test_beman_submodule.py @@ -202,20 +202,50 @@ def test_update_command_no_paths(): tmpdir2 = create_test_git_repository() original_cwd = Path.cwd() os.chdir(tmpdir2.name) - beman_submodule.add_command(tmpdir.name, 'foo') - beman_submodule.add_command(tmpdir.name, 'bar') - sha_process = subprocess.run( + orig_sha_process = subprocess.run( + ['git', 'rev-parse', 'HEAD'], capture_output=True, check=True, text=True, + cwd=tmpdir.name) + orig_sha = orig_sha_process.stdout.strip() + parent_sha_process = subprocess.run( ['git', 'rev-parse', 'HEAD^'], capture_output=True, check=True, text=True, cwd=tmpdir.name) - sha = sha_process.stdout.strip() + parent_sha = parent_sha_process.stdout.strip() + parent_parent_sha_process = subprocess.run( + ['git', 'rev-parse', 'HEAD^'], capture_output=True, check=True, text=True, + cwd=tmpdir.name) + parent_parent_sha = parent_parent_sha_process.stdout.strip() subprocess.run( - ['git', 'reset', '--hard', sha], capture_output=True, check=True, + ['git', 'reset', '--hard', parent_parent_sha], capture_output=True, check=True, + cwd=tmpdir.name) + beman_submodule.add_command(tmpdir.name, 'foo') + beman_submodule.add_command(tmpdir.name, 'bar') + subprocess.run( + ['git', 'reset', '--hard', orig_sha], capture_output=True, check=True, cwd=tmpdir.name) with open(Path(tmpdir2.name) / 'foo' / '.beman_submodule', 'w') as f: - f.write(f'[beman_submodule]\nremote={tmpdir.name}\ncommit_hash={sha}\n') + f.write(f'[beman_submodule]\nremote={tmpdir.name}\ncommit_hash={parent_sha}\n') with open(Path(tmpdir2.name) / 'bar' / '.beman_submodule', 'w') as f: - f.write(f'[beman_submodule]\nremote={tmpdir.name}\ncommit_hash={sha}\n') - beman_submodule.update_command(tmpdir.name, None) + f.write(f'[beman_submodule]\nremote={tmpdir.name}\ncommit_hash={parent_sha}\n') + beman_submodule.update_command(False, None) + with open(Path(tmpdir2.name) / 'foo' / '.beman_submodule', 'r') as f: + assert f.read() == f'[beman_submodule]\nremote={tmpdir.name}\ncommit_hash={parent_sha}\n' + with open(Path(tmpdir2.name) / 'bar' / '.beman_submodule', 'r') as f: + assert f.read() == f'[beman_submodule]\nremote={tmpdir.name}\ncommit_hash={parent_sha}\n' + subprocess.run( + ['git', 'reset', '--hard', parent_sha], capture_output=True, check=True, + cwd=tmpdir.name) + assert beman_submodule.directory_compare( + tmpdir.name, Path(tmpdir2.name) / 'foo', ['.git', '.beman_submodule']) + assert beman_submodule.directory_compare( + tmpdir.name, Path(tmpdir2.name) / 'bar', ['.git', '.beman_submodule']) + subprocess.run( + ['git', 'reset', '--hard', orig_sha], capture_output=True, check=True, + cwd=tmpdir.name) + beman_submodule.update_command(True, None) + with open(Path(tmpdir2.name) / 'foo' / '.beman_submodule', 'r') as f: + assert f.read() == f'[beman_submodule]\nremote={tmpdir.name}\ncommit_hash={orig_sha}\n' + with open(Path(tmpdir2.name) / 'bar' / '.beman_submodule', 'r') as f: + assert f.read() == f'[beman_submodule]\nremote={tmpdir.name}\ncommit_hash={orig_sha}\n' assert beman_submodule.directory_compare( tmpdir.name, Path(tmpdir2.name) / 'foo', ['.git', '.beman_submodule']) assert beman_submodule.directory_compare( @@ -225,28 +255,58 @@ def test_update_command_no_paths(): def test_update_command_with_path(): tmpdir = create_test_git_repository() tmpdir2 = create_test_git_repository() - tmpdir_copy1 = tempfile.TemporaryDirectory() - shutil.copytree(tmpdir.name, tmpdir_copy1.name, dirs_exist_ok=True) original_cwd = Path.cwd() os.chdir(tmpdir2.name) - beman_submodule.add_command(tmpdir.name, 'foo') - beman_submodule.add_command(tmpdir.name, 'bar') - sha_process = subprocess.run( + orig_sha_process = subprocess.run( + ['git', 'rev-parse', 'HEAD'], capture_output=True, check=True, text=True, + cwd=tmpdir.name) + orig_sha = orig_sha_process.stdout.strip() + parent_sha_process = subprocess.run( ['git', 'rev-parse', 'HEAD^'], capture_output=True, check=True, text=True, cwd=tmpdir.name) - sha = sha_process.stdout.strip() + parent_sha = parent_sha_process.stdout.strip() + parent_parent_sha_process = subprocess.run( + ['git', 'rev-parse', 'HEAD^'], capture_output=True, check=True, text=True, + cwd=tmpdir.name) + parent_parent_sha = parent_parent_sha_process.stdout.strip() subprocess.run( - ['git', 'reset', '--hard', sha], capture_output=True, check=True, + ['git', 'reset', '--hard', parent_parent_sha], capture_output=True, check=True, + cwd=tmpdir.name) + tmpdir_parent_parent_copy = tempfile.TemporaryDirectory() + shutil.copytree(tmpdir.name, tmpdir_parent_parent_copy.name, dirs_exist_ok=True) + beman_submodule.add_command(tmpdir.name, 'foo') + beman_submodule.add_command(tmpdir.name, 'bar') + subprocess.run( + ['git', 'reset', '--hard', orig_sha], capture_output=True, check=True, cwd=tmpdir.name) with open(Path(tmpdir2.name) / 'foo' / '.beman_submodule', 'w') as f: - f.write(f'[beman_submodule]\nremote={tmpdir.name}\ncommit_hash={sha}\n') + f.write(f'[beman_submodule]\nremote={tmpdir.name}\ncommit_hash={parent_sha}\n') with open(Path(tmpdir2.name) / 'bar' / '.beman_submodule', 'w') as f: - f.write(f'[beman_submodule]\nremote={tmpdir.name}\ncommit_hash={sha}\n') - beman_submodule.update_command(tmpdir.name, 'foo') + f.write(f'[beman_submodule]\nremote={tmpdir.name}\ncommit_hash={parent_sha}\n') + beman_submodule.update_command(False, 'foo') + with open(Path(tmpdir2.name) / 'foo' / '.beman_submodule', 'r') as f: + assert f.read() == f'[beman_submodule]\nremote={tmpdir.name}\ncommit_hash={parent_sha}\n' + with open(Path(tmpdir2.name) / 'bar' / '.beman_submodule', 'r') as f: + assert f.read() == f'[beman_submodule]\nremote={tmpdir.name}\ncommit_hash={parent_sha}\n' + subprocess.run( + ['git', 'reset', '--hard', parent_sha], capture_output=True, check=True, + cwd=tmpdir.name) + assert beman_submodule.directory_compare( + tmpdir.name, Path(tmpdir2.name) / 'foo', ['.git', '.beman_submodule']) + assert beman_submodule.directory_compare( + tmpdir_parent_parent_copy.name, Path(tmpdir2.name) / 'bar', ['.git', '.beman_submodule']) + subprocess.run( + ['git', 'reset', '--hard', orig_sha], capture_output=True, check=True, + cwd=tmpdir.name) + beman_submodule.update_command(True, 'foo') + with open(Path(tmpdir2.name) / 'foo' / '.beman_submodule', 'r') as f: + assert f.read() == f'[beman_submodule]\nremote={tmpdir.name}\ncommit_hash={orig_sha}\n' + with open(Path(tmpdir2.name) / 'bar' / '.beman_submodule', 'r') as f: + assert f.read() == f'[beman_submodule]\nremote={tmpdir.name}\ncommit_hash={parent_sha}\n' assert beman_submodule.directory_compare( tmpdir.name, Path(tmpdir2.name) / 'foo', ['.git', '.beman_submodule']) assert beman_submodule.directory_compare( - tmpdir_copy1.name, Path(tmpdir2.name) / 'bar', ['.git', '.beman_submodule']) + tmpdir_parent_parent_copy.name, Path(tmpdir2.name) / 'bar', ['.git', '.beman_submodule']) os.chdir(original_cwd) def test_add_command(): From debcb14d810341d43fa10ec4ae51b8ae241904e1 Mon Sep 17 00:00:00 2001 From: Edward Nolan Date: Mon, 30 Jun 2025 13:15:29 -0400 Subject: [PATCH 133/199] Disable Markdown linting Due to feedback from Beman developers complaining about the noisiness of the warnings produced by markdownlint, at the 2025-06-30 Beman weekly sync the decision was made to disable Markdown linting by default in exemplar. Unlike in exemplar, this commit removes markdown linting entirely from infra, since infra is not a template. --- .markdownlint.yaml | 10 ---------- .pre-commit-config.yaml | 7 ------- 2 files changed, 17 deletions(-) delete mode 100644 .markdownlint.yaml diff --git a/.markdownlint.yaml b/.markdownlint.yaml deleted file mode 100644 index 21c2849..0000000 --- a/.markdownlint.yaml +++ /dev/null @@ -1,10 +0,0 @@ -# MD033/no-inline-html : Inline HTML : https://github.com/DavidAnson/markdownlint/blob/v0.35.0/doc/md033.md -# Disable inline html linter is needed for
-MD033: false - -# MD013/line-length : Line length : https://github.com/DavidAnson/markdownlint/blob/v0.35.0/doc/md013.md -# Conforms to .clang-format ColumnLimit -# Update the comment in .clang-format if we no-longer tie these two column limits. -MD013: - line_length: 119 - code_blocks: false diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 9e8c452..0923411 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -7,13 +7,6 @@ repos: - id: check-yaml - id: check-added-large-files - # Markdown linting - # Config file: .markdownlint.yaml - - repo: https://github.com/igorshubovych/markdownlint-cli - rev: v0.42.0 - hooks: - - id: markdownlint - - repo: https://github.com/codespell-project/codespell rev: v2.3.0 hooks: From f859d0b14438c9d37b6aea59c740b01a58f1a417 Mon Sep 17 00:00:00 2001 From: Edward Nolan Date: Mon, 30 Jun 2025 13:19:34 -0400 Subject: [PATCH 134/199] CODEOWNERS: remove @bemanproject/core-reviewers core-reviewers is deprecated. --- .github/CODEOWNERS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 67d9e9b..856bd53 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1 +1 @@ -* @ednolan @neatudarius @rishyak @wusatosi @bemanproject/core-reviewers +* @ednolan @neatudarius @rishyak @wusatosi From 93706a9d50d07e4646b1cf6d389d1fd636d2ab24 Mon Sep 17 00:00:00 2001 From: rishyak Date: Sat, 28 Jun 2025 19:58:03 -0400 Subject: [PATCH 135/199] style: add linting and formatting to pre-commit for python - this will just affect beman-tidy and won't hurt other folders. --- .pre-commit-config.yaml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 0923411..6df2685 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -11,3 +11,14 @@ repos: rev: v2.3.0 hooks: - id: codespell + + # Python linting and formatting + # config file: ruff.toml (not currently present but add if needed) + # https://docs.astral.sh/ruff/configuration/ + - repo: https://github.com/astral-sh/ruff-pre-commit + rev: v0.12.1 + hooks: + - id: ruff-check + files: ^tools/beman-tidy/ + - id: ruff-format + files: ^tools/beman-tidy/ From fe8d41ef5ee4559aa8cb204058704735712723f1 Mon Sep 17 00:00:00 2001 From: Edward Nolan Date: Mon, 30 Jun 2025 18:33:49 -0400 Subject: [PATCH 136/199] Revert "style: add linting and formatting to pre-commit for python" This reverts commit 93706a9d50d07e4646b1cf6d389d1fd636d2ab24. This commit passed CI for its pull request but broke CI for main, because the pre-commit CI check only runs on files that differ, whereas the on-merge CI check for main checks all the files in the repository, and some of the files in beman-tidy fail the linter. This commit should be reapplied when `pre-commit run --all-files` succeeds. --- .pre-commit-config.yaml | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 6df2685..0923411 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -11,14 +11,3 @@ repos: rev: v2.3.0 hooks: - id: codespell - - # Python linting and formatting - # config file: ruff.toml (not currently present but add if needed) - # https://docs.astral.sh/ruff/configuration/ - - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.12.1 - hooks: - - id: ruff-check - files: ^tools/beman-tidy/ - - id: ruff-format - files: ^tools/beman-tidy/ From 679b3bb162ff43b17d4e36674213e980ce890f84 Mon Sep 17 00:00:00 2001 From: rishyak Date: Mon, 30 Jun 2025 18:51:25 -0400 Subject: [PATCH 137/199] style: add linting and formatting to pre-commit for python - this will just affect beman-tidy and won't hurt other folders. --- .pre-commit-config.yaml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 0923411..6df2685 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -11,3 +11,14 @@ repos: rev: v2.3.0 hooks: - id: codespell + + # Python linting and formatting + # config file: ruff.toml (not currently present but add if needed) + # https://docs.astral.sh/ruff/configuration/ + - repo: https://github.com/astral-sh/ruff-pre-commit + rev: v0.12.1 + hooks: + - id: ruff-check + files: ^tools/beman-tidy/ + - id: ruff-format + files: ^tools/beman-tidy/ From 458b0a7e7fa0c7460966b10d553b8114ae9b8eb5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Darius=20Nea=C8=9Bu?= Date: Thu, 3 Jul 2025 21:48:39 +0300 Subject: [PATCH 138/199] Update docs --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4d31a49..512b4b7 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ 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. +respect the usual structure of a Beman library repository nor The Beman Standard! ## Description From 209f39ab22ddd61b4b765e4ba2b585a4eda3206e Mon Sep 17 00:00:00 2001 From: Edward Nolan Date: Sat, 5 Jul 2025 23:37:19 -0400 Subject: [PATCH 139/199] Add toolchain for Clang with libc++ This inherits from the non-libc++ Clang toolchain file, but adds a -stdlib=libc++ parameter. --- cmake/llvm-libc++-toolchain.cmake | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 cmake/llvm-libc++-toolchain.cmake diff --git a/cmake/llvm-libc++-toolchain.cmake b/cmake/llvm-libc++-toolchain.cmake new file mode 100644 index 0000000..55fce9c --- /dev/null +++ b/cmake/llvm-libc++-toolchain.cmake @@ -0,0 +1,18 @@ +# SPDX-License-Identifier: BSL-1.0 + +# This toolchain file is not meant to be used directly, +# but to be invoked by CMake preset and GitHub CI. +# +# This toolchain file configures for LLVM family of compiler. +# +# BEMAN_BUILDSYS_SANITIZER: +# This optional CMake parameter is not meant for public use and is subject to +# change. +# Possible values: +# - MaxSan: configures clang and clang++ to use all available non-conflicting +# sanitizers. +# - TSan: configures clang and clang++ to enable the use of thread sanitizer. + +include(${CMAKE_CURRENT_LIST_DIR}/llvm-toolchain.cmake) + +set(CMAKE_CXX_FLAGS_INIT "-stdlib=libc++" CACHE STRING "" FORCE) From 73dfacacbce917c31edfaf44d59097c6646a742d Mon Sep 17 00:00:00 2001 From: Edward Nolan Date: Mon, 7 Jul 2025 10:00:17 -0400 Subject: [PATCH 140/199] Implement allow_untracked_files This parameter allows beman submodules to be installed into a subdirectory without being the exclusive occupant of that subdirectory; it can contain other files which the beman submodule will clobber if they conflict with the submodule's repository, but it will not automatically remove those files. It is not enabled by default because it carries the risk that a file that was removed from the beman submodule's upstream will not be removed from the subdirectory. --- tools/beman-submodule/beman-submodule | 45 +++++++-- .../test/test_beman_submodule.py | 99 ++++++++++++++++--- 2 files changed, 122 insertions(+), 22 deletions(-) diff --git a/tools/beman-submodule/beman-submodule b/tools/beman-submodule/beman-submodule index 2558e55..281d20b 100755 --- a/tools/beman-submodule/beman-submodule +++ b/tools/beman-submodule/beman-submodule @@ -5,6 +5,7 @@ import argparse import configparser import filecmp +import glob import os import shutil import subprocess @@ -27,10 +28,13 @@ def directory_compare(dir1: str | Path, dir2: str | Path, ignore): return True class BemanSubmodule: - def __init__(self, dirpath: str | Path, remote: str, commit_hash: str): + def __init__( + self, dirpath: str | Path, remote: str, commit_hash: str, + allow_untracked_files: bool): self.dirpath = Path(dirpath) self.remote = remote self.commit_hash = commit_hash + self.allow_untracked_files = allow_untracked_files def parse_beman_submodule_file(path): config = configparser.ConfigParser() @@ -45,10 +49,13 @@ def parse_beman_submodule_file(path): fail() if not 'commit_hash' in config['beman_submodule']: fail() + allow_untracked_files = config.getboolean( + 'beman_submodule', 'allow_untracked_files', fallback=False) return BemanSubmodule( Path(path).resolve().parent, config['beman_submodule']['remote'], - config['beman_submodule']['commit_hash']) + config['beman_submodule']['commit_hash'], + allow_untracked_files) def get_beman_submodule(path: str | Path): beman_submodule_filepath = Path(path) / '.beman_submodule' @@ -90,6 +97,12 @@ def clone_beman_submodule_into_tmpdir(beman_submodule, remote): capture_output=True, check=True) return tmpdir +def get_paths(beman_submodule): + tmpdir = clone_beman_submodule_into_tmpdir(beman_submodule, False) + paths = set(glob.glob('*', root_dir=Path(tmpdir.name), include_hidden=True)) + paths.remove('.git') + return paths + def beman_submodule_status(beman_submodule): tmpdir = clone_beman_submodule_into_tmpdir(beman_submodule, False) if directory_compare(tmpdir.name, beman_submodule.dirpath, ['.beman_submodule', '.git']): @@ -109,15 +122,26 @@ def beman_submodule_update(beman_submodule, remote): ['git', 'rev-parse', 'HEAD'], capture_output=True, check=True, text=True, cwd=tmp_path) - shutil.rmtree(beman_submodule.dirpath) + if beman_submodule.allow_untracked_files: + for path in get_paths(beman_submodule): + path2 = Path(beman_submodule.dirpath) / path + print("removing", path2) + if Path(path2).is_dir(): + shutil.rmtree(path2) + elif Path(path2).is_file(): + os.remove(path2) + else: + shutil.rmtree(beman_submodule.dirpath) submodule_path = tmp_path / '.beman_submodule' with open(submodule_path, 'w') as f: f.write('[beman_submodule]\n') f.write(f'remote={beman_submodule.remote}\n') f.write(f'commit_hash={sha_process.stdout.strip()}\n') + if beman_submodule.allow_untracked_files: + f.write(f'allow_untracked_files=True') shutil.rmtree(tmp_path / '.git') - shutil.copytree(tmp_path, beman_submodule.dirpath) + shutil.copytree(tmp_path, beman_submodule.dirpath, dirs_exist_ok=True) def update_command(remote, path): if not path: @@ -133,7 +157,7 @@ def update_command(remote, path): for beman_submodule in beman_submodules: beman_submodule_update(beman_submodule, remote) -def add_command(repository, path): +def add_command(repository, path, allow_untracked_files): tmpdir = tempfile.TemporaryDirectory() subprocess.run( ['git', 'clone', repository], capture_output=True, check=True, cwd=tmpdir.name) @@ -142,9 +166,9 @@ def add_command(repository, path): path = Path(repository_name) else: path = Path(path) - if path.exists(): + if not allow_untracked_files and path.exists(): raise Exception(f'{path} exists') - path.mkdir() + path.mkdir(exist_ok=allow_untracked_files) tmpdir_repo = Path(tmpdir.name) / repository_name sha_process = subprocess.run( ['git', 'rev-parse', 'HEAD'], capture_output=True, check=True, text=True, @@ -153,6 +177,8 @@ def add_command(repository, path): f.write('[beman_submodule]\n') f.write(f'remote={repository}\n') f.write(f'commit_hash={sha_process.stdout.strip()}\n') + if allow_untracked_files: + f.write(f'allow_untracked_files=True') shutil.rmtree(tmpdir_repo /'.git') shutil.copytree(tmpdir_repo, path, dirs_exist_ok=True) @@ -186,6 +212,9 @@ def get_parser(): parser_add.add_argument('repository', help='git repository to add') parser_add.add_argument( 'path', nargs='?', help='path where the repository will be added') + parser_add.add_argument( + '--allow-untracked-files', action='store_true', + help='the beman_submodule will not occupy the subdirectory exclusively') parser_status = subparsers.add_parser( 'status', help='show the status of beman_submodules') parser_status.add_argument('paths', nargs='*') @@ -201,7 +230,7 @@ def run_command(args): if args.command == 'update': update_command(args.remote, args.beman_submodule_path) elif args.command == 'add': - add_command(args.repository, args.path) + add_command(args.repository, args.path, args.allow_untracked_files) elif args.command == 'status': status_command(args.paths) else: diff --git a/tools/beman-submodule/test/test_beman_submodule.py b/tools/beman-submodule/test/test_beman_submodule.py index 746e08d..fa7513f 100644 --- a/tools/beman-submodule/test/test_beman_submodule.py +++ b/tools/beman-submodule/test/test_beman_submodule.py @@ -1,5 +1,6 @@ # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +import glob import os import pytest import shutil @@ -35,6 +36,32 @@ def make_commit(a_txt_contents): make_commit('a') return tmpdir +def create_test_git_repository2(): + tmpdir = tempfile.TemporaryDirectory() + tmp_path = Path(tmpdir.name) + + subprocess.run(['git', 'init'], check=True, cwd=tmpdir.name, capture_output=True) + with open(tmp_path / 'a.txt', 'w') as f: + f.write('a') + subprocess.run( + ['git', 'add', 'a.txt'], check=True, cwd=tmpdir.name, capture_output=True) + subprocess.run( + ['git', '-c', 'user.name=test', '-c', 'user.email=test@example.com', 'commit', + '--author="test "', '-m', 'test'], + check=True, cwd=tmpdir.name, capture_output=True) + os.remove(tmp_path / 'a.txt') + subprocess.run( + ['git', 'rm', 'a.txt'], check=True, cwd=tmpdir.name, capture_output=True) + with open(tmp_path / 'b.txt', 'w') as f: + f.write('b') + subprocess.run( + ['git', 'add', 'b.txt'], check=True, cwd=tmpdir.name, capture_output=True) + subprocess.run( + ['git', '-c', 'user.name=test', '-c', 'user.email=test@example.com', 'commit', + '--author="test "', '-m', 'test'], + check=True, cwd=tmpdir.name, capture_output=True) + return tmpdir + def test_directory_compare(): def create_dir_structure(dir_path: Path): bar_path = dir_path / 'bar' @@ -122,7 +149,7 @@ def test_get_beman_submodule(): tmpdir2 = create_test_git_repository() original_cwd = Path.cwd() os.chdir(tmpdir2.name) - beman_submodule.add_command(tmpdir.name, 'foo') + beman_submodule.add_command(tmpdir.name, 'foo', False) assert beman_submodule.get_beman_submodule('foo') os.remove('foo/.beman_submodule') assert not beman_submodule.get_beman_submodule('foo') @@ -133,8 +160,8 @@ def test_find_beman_submodules_in(): tmpdir2 = create_test_git_repository() original_cwd = Path.cwd() os.chdir(tmpdir2.name) - beman_submodule.add_command(tmpdir.name, 'foo') - beman_submodule.add_command(tmpdir.name, 'bar') + beman_submodule.add_command(tmpdir.name, 'foo', False) + beman_submodule.add_command(tmpdir.name, 'bar', False) beman_submodules = beman_submodule.find_beman_submodules_in(tmpdir2.name) sha_process = subprocess.run( ['git', 'rev-parse', 'HEAD'], capture_output=True, check=True, text=True, @@ -166,7 +193,7 @@ def test_clone_beman_submodule_into_tmpdir(): ['git', 'rev-parse', 'HEAD^'], capture_output=True, check=True, text=True, cwd=tmpdir.name) sha = sha_process.stdout.strip() - beman_submodule.add_command(tmpdir.name, 'foo') + beman_submodule.add_command(tmpdir.name, 'foo', False) module = beman_submodule.get_beman_submodule(Path(tmpdir2.name) / 'foo') module.commit_hash = sha tmpdir3 = beman_submodule.clone_beman_submodule_into_tmpdir(module, False) @@ -179,12 +206,22 @@ def test_clone_beman_submodule_into_tmpdir(): assert beman_submodule.directory_compare(tmpdir.name, tmpdir3.name, ['.git']) os.chdir(original_cwd) +def test_get_paths(): + tmpdir = create_test_git_repository() + tmpdir2 = create_test_git_repository() + original_cwd = Path.cwd() + os.chdir(tmpdir2.name) + beman_submodule.add_command(tmpdir.name, 'foo', False) + module = beman_submodule.get_beman_submodule(Path(tmpdir2.name) / 'foo') + assert beman_submodule.get_paths(module) == set(['a.txt']) + os.chdir(original_cwd) + def test_beman_submodule_status(): tmpdir = create_test_git_repository() tmpdir2 = create_test_git_repository() original_cwd = Path.cwd() os.chdir(tmpdir2.name) - beman_submodule.add_command(tmpdir.name, 'foo') + beman_submodule.add_command(tmpdir.name, 'foo', False) sha_process = subprocess.run( ['git', 'rev-parse', 'HEAD'], capture_output=True, check=True, text=True, cwd=tmpdir.name) @@ -217,8 +254,8 @@ def test_update_command_no_paths(): subprocess.run( ['git', 'reset', '--hard', parent_parent_sha], capture_output=True, check=True, cwd=tmpdir.name) - beman_submodule.add_command(tmpdir.name, 'foo') - beman_submodule.add_command(tmpdir.name, 'bar') + beman_submodule.add_command(tmpdir.name, 'foo', False) + beman_submodule.add_command(tmpdir.name, 'bar', False) subprocess.run( ['git', 'reset', '--hard', orig_sha], capture_output=True, check=True, cwd=tmpdir.name) @@ -274,8 +311,8 @@ def test_update_command_with_path(): cwd=tmpdir.name) tmpdir_parent_parent_copy = tempfile.TemporaryDirectory() shutil.copytree(tmpdir.name, tmpdir_parent_parent_copy.name, dirs_exist_ok=True) - beman_submodule.add_command(tmpdir.name, 'foo') - beman_submodule.add_command(tmpdir.name, 'bar') + beman_submodule.add_command(tmpdir.name, 'foo', False) + beman_submodule.add_command(tmpdir.name, 'bar', False) subprocess.run( ['git', 'reset', '--hard', orig_sha], capture_output=True, check=True, cwd=tmpdir.name) @@ -309,12 +346,35 @@ def test_update_command_with_path(): tmpdir_parent_parent_copy.name, Path(tmpdir2.name) / 'bar', ['.git', '.beman_submodule']) os.chdir(original_cwd) +def test_update_command_untracked_files(): + tmpdir = create_test_git_repository2() + tmpdir2 = create_test_git_repository() + original_cwd = Path.cwd(); + os.chdir(tmpdir2.name) + orig_sha_process = subprocess.run( + ['git', 'rev-parse', 'HEAD'], capture_output=True, check=True, text=True, + cwd=tmpdir.name) + orig_sha = orig_sha_process.stdout.strip() + parent_sha_process = subprocess.run( + ['git', 'rev-parse', 'HEAD^'], capture_output=True, check=True, text=True, + cwd=tmpdir.name) + parent_sha = parent_sha_process.stdout.strip() + os.makedirs(Path(tmpdir2.name) / 'foo') + (Path(tmpdir2.name) / 'foo' / 'c.txt').touch() + with open(Path(tmpdir2.name) / 'foo' / '.beman_submodule', 'w') as f: + f.write(f'[beman_submodule]\nremote={tmpdir.name}\ncommit_hash={parent_sha}\nallow_untracked_files=True') + beman_submodule.update_command(False, 'foo') + assert set(['./foo/a.txt', './foo/c.txt']) == set(glob.glob('./foo/*.txt')) + beman_submodule.update_command(True, 'foo') + assert set(['./foo/b.txt', './foo/c.txt']) == set(glob.glob('./foo/*.txt')) + os.chdir(original_cwd) + def test_add_command(): tmpdir = create_test_git_repository() tmpdir2 = create_test_git_repository() original_cwd = Path.cwd() os.chdir(tmpdir2.name) - beman_submodule.add_command(tmpdir.name, 'foo') + beman_submodule.add_command(tmpdir.name, 'foo', False) sha_process = subprocess.run( ['git', 'rev-parse', 'HEAD'], capture_output=True, check=True, text=True, cwd=tmpdir.name) @@ -325,13 +385,24 @@ def test_add_command(): assert f.read() == f'[beman_submodule]\nremote={tmpdir.name}\ncommit_hash={sha}\n' os.chdir(original_cwd) +def test_add_command_untracked_files(): + tmpdir = create_test_git_repository() + tmpdir2 = create_test_git_repository() + original_cwd = Path.cwd() + os.chdir(tmpdir2.name) + os.makedirs(Path(tmpdir2.name) / 'foo') + (Path(tmpdir2.name) / 'foo' / 'c.txt').touch() + beman_submodule.add_command(tmpdir.name, 'foo', True) + assert set(['./foo/a.txt', './foo/c.txt']) == set(glob.glob('./foo/*.txt')) + os.chdir(original_cwd) + def test_status_command_no_paths(capsys): tmpdir = create_test_git_repository() tmpdir2 = create_test_git_repository() original_cwd = Path.cwd() os.chdir(tmpdir2.name) - beman_submodule.add_command(tmpdir.name, 'foo') - beman_submodule.add_command(tmpdir.name, 'bar') + beman_submodule.add_command(tmpdir.name, 'foo', False) + beman_submodule.add_command(tmpdir.name, 'bar', False) sha_process = subprocess.run( ['git', 'rev-parse', 'HEAD'], capture_output=True, check=True, text=True, cwd=tmpdir.name) @@ -347,8 +418,8 @@ def test_status_command_with_path(capsys): tmpdir2 = create_test_git_repository() original_cwd = Path.cwd() os.chdir(tmpdir2.name) - beman_submodule.add_command(tmpdir.name, 'foo') - beman_submodule.add_command(tmpdir.name, 'bar') + beman_submodule.add_command(tmpdir.name, 'foo', False) + beman_submodule.add_command(tmpdir.name, 'bar', False) sha_process = subprocess.run( ['git', 'rev-parse', 'HEAD'], capture_output=True, check=True, text=True, cwd=tmpdir.name) From 7e7cbd39da211ee4a25ea495d49e9d79cb7f0891 Mon Sep 17 00:00:00 2001 From: Edward Nolan Date: Mon, 7 Jul 2025 10:24:09 -0400 Subject: [PATCH 141/199] [beman-submodule] Fix status command with untracked files 73dfacacbce917c31edfaf44d59097c6646a742d implemented the allow_untracked_files parameter, but beman submodules with untracked files would still appear as "modified" in the status command. This commit addresses the bug and adds reproducing unit tests. --- tools/beman-submodule/beman-submodule | 21 ++++-- .../test/test_beman_submodule.py | 75 +++++++++++++++---- 2 files changed, 73 insertions(+), 23 deletions(-) diff --git a/tools/beman-submodule/beman-submodule b/tools/beman-submodule/beman-submodule index 281d20b..394a10e 100755 --- a/tools/beman-submodule/beman-submodule +++ b/tools/beman-submodule/beman-submodule @@ -14,16 +14,19 @@ import tempfile from pathlib import Path -def directory_compare(dir1: str | Path, dir2: str | Path, ignore): - dir1, dir2 = Path(dir1), Path(dir2) +def directory_compare( + reference: str | Path, actual: str | Path, ignore, allow_untracked_files: bool): + reference, actual = Path(reference), Path(actual) - compared = filecmp.dircmp(dir1, dir2, ignore=ignore) - if compared.left_only or compared.right_only or compared.diff_files: + compared = filecmp.dircmp(reference, actual, ignore=ignore) + if (compared.left_only + or (compared.right_only and not allow_untracked_files) + or compared.diff_files): return False for common_dir in compared.common_dirs: - path1 = dir1 / common_dir - path2 = dir2 / common_dir - if not directory_compare(path1, path2, ignore): + path1 = reference / common_dir + path2 = actual / common_dir + if not directory_compare(path1, path2, ignore, allow_untracked_files): return False return True @@ -105,7 +108,9 @@ def get_paths(beman_submodule): def beman_submodule_status(beman_submodule): tmpdir = clone_beman_submodule_into_tmpdir(beman_submodule, False) - if directory_compare(tmpdir.name, beman_submodule.dirpath, ['.beman_submodule', '.git']): + if directory_compare( + tmpdir.name, beman_submodule.dirpath, ['.beman_submodule', '.git'], + beman_submodule.allow_untracked_files): status_character=' ' else: status_character='+' diff --git a/tools/beman-submodule/test/test_beman_submodule.py b/tools/beman-submodule/test/test_beman_submodule.py index fa7513f..600fc07 100644 --- a/tools/beman-submodule/test/test_beman_submodule.py +++ b/tools/beman-submodule/test/test_beman_submodule.py @@ -80,13 +80,40 @@ def create_dir_structure(dir_path: Path): create_dir_structure(path_a) create_dir_structure(path_b) - assert beman_submodule.directory_compare(dir_a, dir_b, []) + assert beman_submodule.directory_compare(dir_a, dir_b, [], False) with open(path_a / 'bar' / 'quux.txt', 'w') as f: f.write('quux') - assert not beman_submodule.directory_compare(path_a, path_b, []) - assert beman_submodule.directory_compare(path_a, path_b, ['quux.txt']) + assert not beman_submodule.directory_compare(path_a, path_b, [], False) + assert beman_submodule.directory_compare(path_a, path_b, ['quux.txt'], False) + +def test_directory_compare_untracked_files(): + def create_dir_structure(dir_path: Path): + bar_path = dir_path / 'bar' + os.makedirs(bar_path) + + with open(dir_path / 'foo.txt', 'w') as f: + f.write('foo') + with open(bar_path / 'baz.txt', 'w') as f: + f.write('baz') + + with tempfile.TemporaryDirectory() as reference, \ + tempfile.TemporaryDirectory() as actual: + path_a = Path(reference) + path_b = Path(actual) + + create_dir_structure(path_a) + create_dir_structure(path_b) + (path_b / 'c.txt').touch() + + assert beman_submodule.directory_compare(reference, actual, [], True) + + with open(path_a / 'bar' / 'quux.txt', 'w') as f: + f.write('quux') + + assert not beman_submodule.directory_compare(path_a, path_b, [], True) + assert beman_submodule.directory_compare(path_a, path_b, ['quux.txt'], True) def test_parse_beman_submodule_file(): def valid_file(): @@ -197,13 +224,14 @@ def test_clone_beman_submodule_into_tmpdir(): module = beman_submodule.get_beman_submodule(Path(tmpdir2.name) / 'foo') module.commit_hash = sha tmpdir3 = beman_submodule.clone_beman_submodule_into_tmpdir(module, False) - assert not beman_submodule.directory_compare(tmpdir.name, tmpdir3.name, ['.git']) + assert not beman_submodule.directory_compare( + tmpdir.name, tmpdir3.name, ['.git'], False) tmpdir4 = beman_submodule.clone_beman_submodule_into_tmpdir(module, True) - assert beman_submodule.directory_compare(tmpdir.name, tmpdir4.name, ['.git']) + assert beman_submodule.directory_compare(tmpdir.name, tmpdir4.name, ['.git'], False) subprocess.run( ['git', 'reset', '--hard', sha], capture_output=True, check=True, cwd=tmpdir.name) - assert beman_submodule.directory_compare(tmpdir.name, tmpdir3.name, ['.git']) + assert beman_submodule.directory_compare(tmpdir.name, tmpdir3.name, ['.git'], False) os.chdir(original_cwd) def test_get_paths(): @@ -272,9 +300,9 @@ def test_update_command_no_paths(): ['git', 'reset', '--hard', parent_sha], capture_output=True, check=True, cwd=tmpdir.name) assert beman_submodule.directory_compare( - tmpdir.name, Path(tmpdir2.name) / 'foo', ['.git', '.beman_submodule']) + tmpdir.name, Path(tmpdir2.name) / 'foo', ['.git', '.beman_submodule'], False) assert beman_submodule.directory_compare( - tmpdir.name, Path(tmpdir2.name) / 'bar', ['.git', '.beman_submodule']) + tmpdir.name, Path(tmpdir2.name) / 'bar', ['.git', '.beman_submodule'], False) subprocess.run( ['git', 'reset', '--hard', orig_sha], capture_output=True, check=True, cwd=tmpdir.name) @@ -284,9 +312,9 @@ def test_update_command_no_paths(): with open(Path(tmpdir2.name) / 'bar' / '.beman_submodule', 'r') as f: assert f.read() == f'[beman_submodule]\nremote={tmpdir.name}\ncommit_hash={orig_sha}\n' assert beman_submodule.directory_compare( - tmpdir.name, Path(tmpdir2.name) / 'foo', ['.git', '.beman_submodule']) + tmpdir.name, Path(tmpdir2.name) / 'foo', ['.git', '.beman_submodule'], False) assert beman_submodule.directory_compare( - tmpdir.name, Path(tmpdir2.name) / 'bar', ['.git', '.beman_submodule']) + tmpdir.name, Path(tmpdir2.name) / 'bar', ['.git', '.beman_submodule'], False) os.chdir(original_cwd) def test_update_command_with_path(): @@ -329,9 +357,10 @@ def test_update_command_with_path(): ['git', 'reset', '--hard', parent_sha], capture_output=True, check=True, cwd=tmpdir.name) assert beman_submodule.directory_compare( - tmpdir.name, Path(tmpdir2.name) / 'foo', ['.git', '.beman_submodule']) + tmpdir.name, Path(tmpdir2.name) / 'foo', ['.git', '.beman_submodule'], False) assert beman_submodule.directory_compare( - tmpdir_parent_parent_copy.name, Path(tmpdir2.name) / 'bar', ['.git', '.beman_submodule']) + tmpdir_parent_parent_copy.name, + Path(tmpdir2.name) / 'bar', ['.git', '.beman_submodule'], False) subprocess.run( ['git', 'reset', '--hard', orig_sha], capture_output=True, check=True, cwd=tmpdir.name) @@ -341,9 +370,10 @@ def test_update_command_with_path(): with open(Path(tmpdir2.name) / 'bar' / '.beman_submodule', 'r') as f: assert f.read() == f'[beman_submodule]\nremote={tmpdir.name}\ncommit_hash={parent_sha}\n' assert beman_submodule.directory_compare( - tmpdir.name, Path(tmpdir2.name) / 'foo', ['.git', '.beman_submodule']) + tmpdir.name, Path(tmpdir2.name) / 'foo', ['.git', '.beman_submodule'], False) assert beman_submodule.directory_compare( - tmpdir_parent_parent_copy.name, Path(tmpdir2.name) / 'bar', ['.git', '.beman_submodule']) + tmpdir_parent_parent_copy.name, + Path(tmpdir2.name) / 'bar', ['.git', '.beman_submodule'], False) os.chdir(original_cwd) def test_update_command_untracked_files(): @@ -380,7 +410,7 @@ def test_add_command(): cwd=tmpdir.name) sha = sha_process.stdout.strip() assert beman_submodule.directory_compare( - tmpdir.name, Path(tmpdir2.name) / 'foo', ['.git', '.beman_submodule']) + tmpdir.name, Path(tmpdir2.name) / 'foo', ['.git', '.beman_submodule'], False) with open(Path(tmpdir2.name) / 'foo' / '.beman_submodule', 'r') as f: assert f.read() == f'[beman_submodule]\nremote={tmpdir.name}\ncommit_hash={sha}\n' os.chdir(original_cwd) @@ -430,6 +460,21 @@ def test_status_command_with_path(capsys): assert capsys.readouterr().out == '+ ' + sha + ' bar\n' os.chdir(original_cwd) +def test_status_command_untracked_files(capsys): + tmpdir = create_test_git_repository() + tmpdir2 = create_test_git_repository() + original_cwd = Path.cwd() + os.chdir(tmpdir2.name) + beman_submodule.add_command(tmpdir.name, 'foo', True) + sha_process = subprocess.run( + ['git', 'rev-parse', 'HEAD'], capture_output=True, check=True, text=True, + cwd=tmpdir.name) + (Path(tmpdir2.name) / 'foo' / 'c.txt').touch() + beman_submodule.status_command(['foo']) + sha = sha_process.stdout.strip() + assert capsys.readouterr().out == ' ' + sha + ' foo\n' + os.chdir(original_cwd) + def test_check_for_git(): tmpdir = tempfile.TemporaryDirectory() assert not beman_submodule.check_for_git(tmpdir.name) From 63e319625c87cb13d4bf64e7e52dc3a008fbe62e Mon Sep 17 00:00:00 2001 From: Edward Nolan Date: Mon, 7 Jul 2025 11:01:19 -0400 Subject: [PATCH 142/199] [beman-submodule] Fix missing newline at end of file with allow_untracked_files --- tools/beman-submodule/beman-submodule | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/beman-submodule/beman-submodule b/tools/beman-submodule/beman-submodule index 394a10e..9e851d3 100755 --- a/tools/beman-submodule/beman-submodule +++ b/tools/beman-submodule/beman-submodule @@ -183,7 +183,7 @@ def add_command(repository, path, allow_untracked_files): f.write(f'remote={repository}\n') f.write(f'commit_hash={sha_process.stdout.strip()}\n') if allow_untracked_files: - f.write(f'allow_untracked_files=True') + f.write(f'allow_untracked_files=True\n') shutil.rmtree(tmpdir_repo /'.git') shutil.copytree(tmpdir_repo, path, dirs_exist_ok=True) From ddb0588f2625c8c45eb8384955b3bef1ec7feb66 Mon Sep 17 00:00:00 2001 From: Edward Nolan Date: Mon, 7 Jul 2025 19:09:47 -0400 Subject: [PATCH 143/199] [beman-submodule] Fix debug print in update function This debug print was not removed before the new functionality was merged. --- tools/beman-submodule/beman-submodule | 1 - 1 file changed, 1 deletion(-) diff --git a/tools/beman-submodule/beman-submodule b/tools/beman-submodule/beman-submodule index 9e851d3..97c4461 100755 --- a/tools/beman-submodule/beman-submodule +++ b/tools/beman-submodule/beman-submodule @@ -130,7 +130,6 @@ def beman_submodule_update(beman_submodule, remote): if beman_submodule.allow_untracked_files: for path in get_paths(beman_submodule): path2 = Path(beman_submodule.dirpath) / path - print("removing", path2) if Path(path2).is_dir(): shutil.rmtree(path2) elif Path(path2).is_file(): From 73ea580f541d105057c4c45bcbd94fbfe6d7acb7 Mon Sep 17 00:00:00 2001 From: Edward Nolan Date: Mon, 7 Jul 2025 19:19:58 -0400 Subject: [PATCH 144/199] [beman-submodule] Fix another missing newline 63e319625c87cb13d4bf64e7e52dc3a008fbe62e missed a spot. --- tools/beman-submodule/beman-submodule | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/beman-submodule/beman-submodule b/tools/beman-submodule/beman-submodule index 97c4461..66cb96e 100755 --- a/tools/beman-submodule/beman-submodule +++ b/tools/beman-submodule/beman-submodule @@ -143,7 +143,7 @@ def beman_submodule_update(beman_submodule, remote): f.write(f'remote={beman_submodule.remote}\n') f.write(f'commit_hash={sha_process.stdout.strip()}\n') if beman_submodule.allow_untracked_files: - f.write(f'allow_untracked_files=True') + f.write(f'allow_untracked_files=True\n') shutil.rmtree(tmp_path / '.git') shutil.copytree(tmp_path, beman_submodule.dirpath, dirs_exist_ok=True) From 70615468e834ead82523f4f72043d83e225084ff Mon Sep 17 00:00:00 2001 From: Edward Nolan Date: Mon, 7 Jul 2025 21:15:27 -0400 Subject: [PATCH 145/199] use-fetch-content.cmake: Support lockfiles with zero dependencies Previously, configuration would error out upon encountering this lockfile: { "dependencies": [] } --- cmake/use-fetch-content.cmake | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cmake/use-fetch-content.cmake b/cmake/use-fetch-content.cmake index 82c5db2..8e5cbac 100644 --- a/cmake/use-fetch-content.cmake +++ b/cmake/use-fetch-content.cmake @@ -59,6 +59,10 @@ function(BemanExemplar_provideDependency method package_name) message(FATAL_ERROR "${BemanExemplar_lockfile}: ${BemanExemplar_error}") endif() + if(BemanExemplar_numDependencies EQUAL 0) + return() + endif() + # Loop over each dependency object math(EXPR BemanExemplar_maxIndex "${BemanExemplar_numDependencies} - 1") foreach(BemanExemplar_index RANGE "${BemanExemplar_maxIndex}") From d65bfbac27dd4632ded2200d56c30b2a26e45b9f Mon Sep 17 00:00:00 2001 From: Edward Nolan Date: Mon, 7 Jul 2025 21:22:53 -0400 Subject: [PATCH 146/199] Indentation fix and add CMake linter to pre-commit --- .pre-commit-config.yaml | 7 +++++++ cmake/use-fetch-content.cmake | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 6df2685..3c22d57 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -12,6 +12,13 @@ repos: hooks: - id: codespell + # CMake linting and formatting + - repo: https://github.com/BlankSpruce/gersemi + rev: 0.15.1 + hooks: + - id: gersemi + name: CMake linting + # Python linting and formatting # config file: ruff.toml (not currently present but add if needed) # https://docs.astral.sh/ruff/configuration/ diff --git a/cmake/use-fetch-content.cmake b/cmake/use-fetch-content.cmake index 8e5cbac..07c1a15 100644 --- a/cmake/use-fetch-content.cmake +++ b/cmake/use-fetch-content.cmake @@ -60,7 +60,7 @@ function(BemanExemplar_provideDependency method package_name) endif() if(BemanExemplar_numDependencies EQUAL 0) - return() + return() endif() # Loop over each dependency object From 1cb74836e2047eba01eb17de75774bc83046ab64 Mon Sep 17 00:00:00 2001 From: Edward Nolan Date: Mon, 7 Jul 2025 22:56:31 -0400 Subject: [PATCH 147/199] Fix libc++ toolchain file Previously, when a user specified -DCMAKE_CXX_FLAGS on the command line, it would blow away the -stdlib=libc++ parameter. --- cmake/llvm-libc++-toolchain.cmake | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cmake/llvm-libc++-toolchain.cmake b/cmake/llvm-libc++-toolchain.cmake index 55fce9c..027e467 100644 --- a/cmake/llvm-libc++-toolchain.cmake +++ b/cmake/llvm-libc++-toolchain.cmake @@ -15,4 +15,6 @@ include(${CMAKE_CURRENT_LIST_DIR}/llvm-toolchain.cmake) -set(CMAKE_CXX_FLAGS_INIT "-stdlib=libc++" CACHE STRING "" FORCE) +if(NOT CMAKE_CXX_FLAGS MATCHES "-stdlib=libc\\+\\+") + string(APPEND CMAKE_CXX_FLAGS " -stdlib=libc++") +endif() From df2c66c66f45845e3152af8ce5ad36c4ebc9be8d Mon Sep 17 00:00:00 2001 From: Eddie Nolan Date: Mon, 7 Jul 2025 22:58:17 -0400 Subject: [PATCH 148/199] Update cmake/llvm-libc++-toolchain.cmake Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- cmake/llvm-libc++-toolchain.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/llvm-libc++-toolchain.cmake b/cmake/llvm-libc++-toolchain.cmake index 027e467..76264c6 100644 --- a/cmake/llvm-libc++-toolchain.cmake +++ b/cmake/llvm-libc++-toolchain.cmake @@ -16,5 +16,5 @@ include(${CMAKE_CURRENT_LIST_DIR}/llvm-toolchain.cmake) if(NOT CMAKE_CXX_FLAGS MATCHES "-stdlib=libc\\+\\+") - string(APPEND CMAKE_CXX_FLAGS " -stdlib=libc++") + string(APPEND CMAKE_CXX_FLAGS " -stdlib=libc++") endif() From 8e81f1d38c784aa266d364584ad71a63b5e86a48 Mon Sep 17 00:00:00 2001 From: Sava Victor Date: Thu, 10 Jul 2025 13:45:05 +0300 Subject: [PATCH 149/199] [beman-tidy] Added 'exclude' rule for the CMake linter --- .pre-commit-config.yaml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 3c22d57..08795de 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -2,10 +2,10 @@ repos: - repo: https://github.com/pre-commit/pre-commit-hooks rev: v5.0.0 hooks: - - id: trailing-whitespace - - id: end-of-file-fixer - - id: check-yaml - - id: check-added-large-files + - id: trailing-whitespace + - id: end-of-file-fixer + - id: check-yaml + - id: check-added-large-files - repo: https://github.com/codespell-project/codespell rev: v2.3.0 @@ -16,9 +16,9 @@ repos: - repo: https://github.com/BlankSpruce/gersemi rev: 0.15.1 hooks: - - id: gersemi - name: CMake linting - + - id: gersemi + name: CMake linting + exclude: ^infra/tools/beman-tidy/tests/lib/checks/beman_standard/toplevel/data/invalid/.*CMakeLists\.txt$ # Python linting and formatting # config file: ruff.toml (not currently present but add if needed) # https://docs.astral.sh/ruff/configuration/ From f87e7b807d711df5c3bb4ae606c0b1a8d99df00c Mon Sep 17 00:00:00 2001 From: Sava Victor Date: Thu, 10 Jul 2025 14:03:51 +0300 Subject: [PATCH 150/199] [beman-tidy] Added newlines for the dummy CMake files and refined the 'exclude' rule for CMake linter --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 08795de..7a0ab0a 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -18,7 +18,7 @@ repos: hooks: - id: gersemi name: CMake linting - exclude: ^infra/tools/beman-tidy/tests/lib/checks/beman_standard/toplevel/data/invalid/.*CMakeLists\.txt$ + exclude: ^infra/tools/beman-tidy/tests/lib/checks/beman_standard/toplevel/data/invalid/invalid-CMAKE1/.*CMakeLists\.txt$ # Python linting and formatting # config file: ruff.toml (not currently present but add if needed) # https://docs.astral.sh/ruff/configuration/ From 64c73badc5121109e95a1a7815255013d2c1ab24 Mon Sep 17 00:00:00 2001 From: Sava Victor Date: Thu, 10 Jul 2025 14:10:31 +0300 Subject: [PATCH 151/199] [beman-tidy] Removed 'exclude' rule for CMake linter and added a space in the CMake file --- .pre-commit-config.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 7a0ab0a..93bacb4 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -18,7 +18,6 @@ repos: hooks: - id: gersemi name: CMake linting - exclude: ^infra/tools/beman-tidy/tests/lib/checks/beman_standard/toplevel/data/invalid/invalid-CMAKE1/.*CMakeLists\.txt$ # Python linting and formatting # config file: ruff.toml (not currently present but add if needed) # https://docs.astral.sh/ruff/configuration/ From 2a73d16bd5f61f52afa7957ebc1a71d1fc0ec128 Mon Sep 17 00:00:00 2001 From: Sava Victor Date: Thu, 10 Jul 2025 14:17:20 +0300 Subject: [PATCH 152/199] [beman-tidy] Fixed 'exclude' rule for CMake linter --- .pre-commit-config.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 93bacb4..e90f5b5 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -18,6 +18,7 @@ repos: hooks: - id: gersemi name: CMake linting + exclude: ^tools/beman-tidy/tests/lib/checks/beman_standard/toplevel/data/invalid/invalid-CMAKE1/CMakeLists\.txt$ # Python linting and formatting # config file: ruff.toml (not currently present but add if needed) # https://docs.astral.sh/ruff/configuration/ From 9559c52ee70033a63cd29fb4588524daa964c39f Mon Sep 17 00:00:00 2001 From: Sava Victor Date: Fri, 11 Jul 2025 00:27:04 +0300 Subject: [PATCH 153/199] [beman-tidy] Reverted changes in pre-commit config file and added .cmake-lint.yaml file to exclude CMake Linter check for particular internal test --- .pre-commit-config.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index e90f5b5..93bacb4 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -18,7 +18,6 @@ repos: hooks: - id: gersemi name: CMake linting - exclude: ^tools/beman-tidy/tests/lib/checks/beman_standard/toplevel/data/invalid/invalid-CMAKE1/CMakeLists\.txt$ # Python linting and formatting # config file: ruff.toml (not currently present but add if needed) # https://docs.astral.sh/ruff/configuration/ From 78a7665b1101cb5dfbe10468333e4811dbcdb2c6 Mon Sep 17 00:00:00 2001 From: Sava Victor Date: Fri, 11 Jul 2025 16:11:50 +0300 Subject: [PATCH 154/199] [beman-tidy] Reverted changes in pre commit config file --- .pre-commit-config.yaml | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 93bacb4..3c22d57 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -2,10 +2,10 @@ repos: - repo: https://github.com/pre-commit/pre-commit-hooks rev: v5.0.0 hooks: - - id: trailing-whitespace - - id: end-of-file-fixer - - id: check-yaml - - id: check-added-large-files + - id: trailing-whitespace + - id: end-of-file-fixer + - id: check-yaml + - id: check-added-large-files - repo: https://github.com/codespell-project/codespell rev: v2.3.0 @@ -16,8 +16,9 @@ repos: - repo: https://github.com/BlankSpruce/gersemi rev: 0.15.1 hooks: - - id: gersemi - name: CMake linting + - id: gersemi + name: CMake linting + # Python linting and formatting # config file: ruff.toml (not currently present but add if needed) # https://docs.astral.sh/ruff/configuration/ From 840213161eecc6affdb6a2bda0024e89486f2005 Mon Sep 17 00:00:00 2001 From: Sava Victor Date: Fri, 11 Jul 2025 19:02:54 +0300 Subject: [PATCH 155/199] [beman-tidy] Added 'exclude' rule for CMake linter to exclude test data directories --- .pre-commit-config.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 3c22d57..8641cfa 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -18,6 +18,7 @@ repos: hooks: - id: gersemi name: CMake linting + exclude: ^.*/tests/.*/data/ # Exclude test data directories # Python linting and formatting # config file: ruff.toml (not currently present but add if needed) From 999fb54f19901c902d59f0e01aecd29ceb5c53a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Darius=20Nea=C8=9Bu?= Date: Mon, 14 Jul 2025 16:41:08 +0300 Subject: [PATCH 156/199] Update CODEOWNERS --- .github/CODEOWNERS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 856bd53..4ff90a4 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1 +1 @@ -* @ednolan @neatudarius @rishyak @wusatosi +* @ednolan @neatudarius @rishyak @wusatosi @JeffGarland From 86ed4dc5b6e530d2970fc4186249f210c037dade Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Darius=20Nea=C8=9Bu?= Date: Wed, 16 Jul 2025 16:45:12 +0300 Subject: [PATCH 157/199] Sync LICENSE with exemplar/LICENSE --- LICENSE | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/LICENSE b/LICENSE index 111a208..0873f35 100644 --- a/LICENSE +++ b/LICENSE @@ -1,3 +1,7 @@ +============================================================================== +The Beman Project is under the Apache License v2.0 with LLVM Exceptions: +============================================================================== + Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ From f13fd929ded1aadfdbd33693e0cc58a2a6fd0492 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Darius=20Nea=C8=9Bu?= Date: Sun, 20 Jul 2025 12:39:14 +0300 Subject: [PATCH 158/199] [beman-tidy] CI flows should build, install and run beman-tidy --- .github/workflows/beman-tidy.yml | 41 +++++++++++++++++-- ...reusable-beman-create-issue-when-fault.yml | 27 ++++++++++++ 2 files changed, 65 insertions(+), 3 deletions(-) create mode 100644 .github/workflows/reusable-beman-create-issue-when-fault.yml diff --git a/.github/workflows/beman-tidy.yml b/.github/workflows/beman-tidy.yml index d5611f8..96d9583 100644 --- a/.github/workflows/beman-tidy.yml +++ b/.github/workflows/beman-tidy.yml @@ -1,6 +1,6 @@ # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -name: beman-tidy tests +name: beman-tidy lint, testing and installing on: push: @@ -8,9 +8,11 @@ on: - main pull_request: workflow_dispatch: + schedule: + - cron: '0 5 * * *' # 08:00AM EEST (@neatudarius' timezone) -> 05:00AM UTC jobs: - tests: + run_tests: runs-on: ubuntu-latest defaults: run: @@ -28,9 +30,42 @@ jobs: - name: Run linter run: | - echo "Running linter" uv run ruff check --diff - name: Run tests run: | uv run pytest tests/ -v + + build_and_install: + runs-on: ubuntu-latest + defaults: + run: + working-directory: tools/beman-tidy + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Install uv + uses: astral-sh/setup-uv@v5 + + - name: Sync environment + run: | + uv sync + + - name: Build and install beman-tidy + run: | + uv clean + uv build + python3 -m pip install dist/beman_tidy-0.1.0-py3-none-any.whl --force-reinstall + beman-tidy --help + + - name: Run installed beman-tidy on exemplar repo + run: | + git clone https://github.com/bemanproject/exemplar.git + cd exemplar/ # Testing that beman-tidy can be run from any path, e.g. from the exemplar repo. + beman-tidy --verbose --require-all . + + create-issue-when-fault: + needs: [run_tests, build_and_install] + if: failure() && github.event.schedule == '0 5 * * *' # 08:00AM EEST (@neatudarius' timezone) -> 05:00AM UTC + uses: ./.github/workflows/reusable-beman-create-issue-when-fault.yml \ No newline at end of file diff --git a/.github/workflows/reusable-beman-create-issue-when-fault.yml b/.github/workflows/reusable-beman-create-issue-when-fault.yml new file mode 100644 index 0000000..b6efeaf --- /dev/null +++ b/.github/workflows/reusable-beman-create-issue-when-fault.yml @@ -0,0 +1,27 @@ +# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + +name: 'Beman issue creation workflow' +on: + workflow_call: +jobs: + create-issue: + runs-on: ubuntu-latest + steps: + # See https://github.com/cli/cli/issues/5075 + - uses: actions/checkout@v4 + - name: Create issue + run: | + issue_num=$(gh issue list -s open -S "[SCHEDULED-BUILD] Build & Test failure" -L 1 --json number | jq 'if length == 0 then -1 else .[0].number end') + body="**Build-and-Test Failure Report** + - **Time of Failure**: $(date -u '+%B %d, %Y, %H:%M %Z') + - **Commit**: [${{ github.sha }}](${{ github.server_url }}/${{ github.repository }}/commit/${{ github.sha }}) + - **Action Run**: [View logs](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}) + The scheduled build-and-test triggered by cron has failed. + Please investigate the logs and recent changes associated with this commit or rerun the workflow if you believe this is an error." + if [[ $issue_num -eq -1 ]]; then + gh issue create --repo ${{ github.repository }} --title "[SCHEDULED-BUILD] Build & Test failure" --body "$body" + else + gh issue comment --repo ${{ github.repository }} $issue_num --body "$body" + fi + env: + GH_TOKEN: ${{ github.token }} \ No newline at end of file From b22bf577d03968ecf3809ea9e34ee42e6a71f7b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Darius=20Nea=C8=9Bu?= Date: Sun, 20 Jul 2025 13:11:54 +0300 Subject: [PATCH 159/199] [beman-tidy] CI flows: split in run_linter, run_tests, build_and_install, run_beman_tidy_on_exemplar --- .github/workflows/beman-tidy.yml | 50 +++++++++++++++++-- ...reusable-beman-create-issue-when-fault.yml | 11 ++-- README.md | 2 + 3 files changed, 53 insertions(+), 10 deletions(-) diff --git a/.github/workflows/beman-tidy.yml b/.github/workflows/beman-tidy.yml index 96d9583..99e6417 100644 --- a/.github/workflows/beman-tidy.yml +++ b/.github/workflows/beman-tidy.yml @@ -1,18 +1,19 @@ # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -name: beman-tidy lint, testing and installing +name: beman-tidy tests on: push: branches: - main pull_request: + workflow_call: workflow_dispatch: schedule: - cron: '0 5 * * *' # 08:00AM EEST (@neatudarius' timezone) -> 05:00AM UTC jobs: - run_tests: + run_linter: runs-on: ubuntu-latest defaults: run: @@ -32,6 +33,22 @@ jobs: run: | uv run ruff check --diff + run_tests: + runs-on: ubuntu-latest + defaults: + run: + working-directory: tools/beman-tidy + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Install uv + uses: astral-sh/setup-uv@v5 + + - name: Sync environment + run: | + uv sync + - name: Run tests run: | uv run pytest tests/ -v @@ -59,6 +76,29 @@ jobs: python3 -m pip install dist/beman_tidy-0.1.0-py3-none-any.whl --force-reinstall beman-tidy --help + run_on_exemplar: + runs-on: ubuntu-latest + defaults: + run: + working-directory: tools/beman-tidy + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Install uv + uses: astral-sh/setup-uv@v5 + + - name: Sync environment + run: | + uv sync + + - name: Build and install beman-tidy + run: | + uv clean + uv build + python3 -m pip install dist/beman_tidy-0.1.0-py3-none-any.whl --force-reinstall + beman-tidy --help + - name: Run installed beman-tidy on exemplar repo run: | git clone https://github.com/bemanproject/exemplar.git @@ -66,6 +106,6 @@ jobs: beman-tidy --verbose --require-all . create-issue-when-fault: - needs: [run_tests, build_and_install] - if: failure() && github.event.schedule == '0 5 * * *' # 08:00AM EEST (@neatudarius' timezone) -> 05:00AM UTC - uses: ./.github/workflows/reusable-beman-create-issue-when-fault.yml \ No newline at end of file + needs: [run_linter, run_tests, build_and_install, run_on_exemplar] + if: failure() && (github.event_name == 'workflow_call' || github.event_name == 'schedule') + uses: ./.github/workflows/reusable-beman-create-issue-when-fault.yml diff --git a/.github/workflows/reusable-beman-create-issue-when-fault.yml b/.github/workflows/reusable-beman-create-issue-when-fault.yml index b6efeaf..024a51f 100644 --- a/.github/workflows/reusable-beman-create-issue-when-fault.yml +++ b/.github/workflows/reusable-beman-create-issue-when-fault.yml @@ -3,6 +3,7 @@ name: 'Beman issue creation workflow' on: workflow_call: + workflow_dispatch: jobs: create-issue: runs-on: ubuntu-latest @@ -11,17 +12,17 @@ jobs: - uses: actions/checkout@v4 - name: Create issue run: | - issue_num=$(gh issue list -s open -S "[SCHEDULED-BUILD] Build & Test failure" -L 1 --json number | jq 'if length == 0 then -1 else .[0].number end') - body="**Build-and-Test Failure Report** + issue_num=$(gh issue list -s open -S "[SCHEDULED-BUILD] infra repo CI job failure" -L 1 --json number | jq 'if length == 0 then -1 else .[0].number end') + body="**CI job failure Report** - **Time of Failure**: $(date -u '+%B %d, %Y, %H:%M %Z') - **Commit**: [${{ github.sha }}](${{ github.server_url }}/${{ github.repository }}/commit/${{ github.sha }}) - **Action Run**: [View logs](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}) - The scheduled build-and-test triggered by cron has failed. + The scheduled job triggered by cron has failed. Please investigate the logs and recent changes associated with this commit or rerun the workflow if you believe this is an error." if [[ $issue_num -eq -1 ]]; then - gh issue create --repo ${{ github.repository }} --title "[SCHEDULED-BUILD] Build & Test failure" --body "$body" + gh issue create --repo ${{ github.repository }} --title "[SCHEDULED-BUILD] infra repo CI job failure" --body "$body" --assignee ${{ github.actor }} else gh issue comment --repo ${{ github.repository }} $issue_num --body "$body" fi env: - GH_TOKEN: ${{ github.token }} \ No newline at end of file + GH_TOKEN: ${{ github.token }} diff --git a/README.md b/README.md index 512b4b7..6f749b6 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,8 @@ +[![beman-tidy tests](https://github.com/bemanproject/infra/actions/workflows/beman-tidy.yml/badge.svg)](https://github.com/bemanproject/infra/actions/workflows/beman-tidy.yml) + 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! From 9ed55913fcd82924fb73dcece0d49f0fab82fd99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Darius=20Nea=C8=9Bu?= Date: Tue, 22 Jul 2025 08:40:23 +0300 Subject: [PATCH 160/199] [beman-tidy] CI tests should run on schedule and on demand. --- .github/workflows/beman-tidy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/beman-tidy.yml b/.github/workflows/beman-tidy.yml index 99e6417..714a653 100644 --- a/.github/workflows/beman-tidy.yml +++ b/.github/workflows/beman-tidy.yml @@ -107,5 +107,5 @@ jobs: create-issue-when-fault: needs: [run_linter, run_tests, build_and_install, run_on_exemplar] - if: failure() && (github.event_name == 'workflow_call' || github.event_name == 'schedule') + if: failure() && (github.event_name == 'workflow_call' || github.event_name == 'workflow_dispatch' || github.event_name == 'schedule') uses: ./.github/workflows/reusable-beman-create-issue-when-fault.yml From 72de34be3bd61bf59512627dc5da8541b84bad53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Darius=20Nea=C8=9Bu?= Date: Tue, 22 Jul 2025 08:45:49 +0300 Subject: [PATCH 161/199] [beman-tidy] Set CI tests run schedule --- .github/workflows/beman-tidy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/beman-tidy.yml b/.github/workflows/beman-tidy.yml index 714a653..46221e6 100644 --- a/.github/workflows/beman-tidy.yml +++ b/.github/workflows/beman-tidy.yml @@ -10,7 +10,7 @@ on: workflow_call: workflow_dispatch: schedule: - - cron: '0 5 * * *' # 08:00AM EEST (@neatudarius' timezone) -> 05:00AM UTC + - cron: '0 6 * * *' # 09:00AM EEST (@neatudarius' timezone) jobs: run_linter: From 47411c1d39f91e766498a36415fa2b193d5f9fe5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Darius=20Nea=C8=9Bu?= Date: Tue, 22 Jul 2025 11:21:49 +0300 Subject: [PATCH 162/199] Tweaks in docs --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 6f749b6..f40ebc1 100644 --- a/README.md +++ b/README.md @@ -4,8 +4,8 @@ [![beman-tidy tests](https://github.com/bemanproject/infra/actions/workflows/beman-tidy.yml/badge.svg)](https://github.com/bemanproject/infra/actions/workflows/beman-tidy.yml) -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! +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 From 345e889f430f56ad552af23efcc759c516449857 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Darius=20Nea=C8=9Bu?= Date: Fri, 25 Jul 2025 12:26:27 +0300 Subject: [PATCH 163/199] [beman-tidy] Apply Beman Standard updates: LICENSE.APPROVED changed --- LICENSE | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/LICENSE b/LICENSE index 0873f35..f6db814 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,3 @@ -============================================================================== -The Beman Project is under the Apache License v2.0 with LLVM Exceptions: -============================================================================== Apache License Version 2.0, January 2004 @@ -220,15 +217,3 @@ 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. From 1d2453a22da3e50cc1a398102ee71dac376c93f6 Mon Sep 17 00:00:00 2001 From: Bret Brown Date: Mon, 4 Aug 2025 13:55:57 +0000 Subject: [PATCH 164/199] Add a beman_install_library CMake function Problem ------- It requires to much code with too many accurate details to install a Beman library. Also, repeating those lines of code across many libraries makes it too difficult to maintain installation logic across the project. Solution -------- Create beman_install_library, a CMake function for installing a Beman library. This function uses Beman Standard assumptions to make it simple for Beman libraries to mark themselves for installation. --- cmake/appleclang-toolchain.cmake | 3 + cmake/beman-install-library-config.cmake | 147 +++++++++++++++++++++++ cmake/gnu-toolchain.cmake | 3 + cmake/llvm-toolchain.cmake | 3 + cmake/msvc-toolchain.cmake | 3 + cmake/use-fetch-content.cmake | 9 +- 6 files changed, 167 insertions(+), 1 deletion(-) create mode 100644 cmake/beman-install-library-config.cmake diff --git a/cmake/appleclang-toolchain.cmake b/cmake/appleclang-toolchain.cmake index 5f44e80..70ef548 100644 --- a/cmake/appleclang-toolchain.cmake +++ b/cmake/appleclang-toolchain.cmake @@ -39,3 +39,6 @@ set(CMAKE_CXX_FLAGS_RELWITHDEBINFO_INIT "${RELEASE_FLAGS}") set(CMAKE_C_FLAGS_RELEASE_INIT "${RELEASE_FLAGS}") set(CMAKE_CXX_FLAGS_RELEASE_INIT "${RELEASE_FLAGS}") + +# Add this dir to the module path so that `find_package(beman-install-library)` works +list(APPEND CMAKE_PREFIX_PATH "${CMAKE_CURRENT_LIST_DIR}") diff --git a/cmake/beman-install-library-config.cmake b/cmake/beman-install-library-config.cmake new file mode 100644 index 0000000..55395fd --- /dev/null +++ b/cmake/beman-install-library-config.cmake @@ -0,0 +1,147 @@ +# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +include_guard(GLOBAL) + +# This file defines the function `beman_install_library` which is used to +# install a library target and its headers, along with optional CMake +# configuration files. +# +# The function is designed to be reusable across different Beman libraries. + +function(beman_install_library name) + # Usage + # ----- + # + # beman_install_library(NAME) + # + # Brief + # ----- + # + # This function installs the specified library target and its headers. + # It also handles the installation of the CMake configuration files if needed. + # + # CMake variables + # --------------- + # + # Note that configuration of the installation is generally controlled by CMake + # cache variables so that they can be controlled by the user or tool running the + # `cmake` command. Neither `CMakeLists.txt` nor `*.cmake` files should set these + # variables directly. + # + # - BEMAN_INSTALL_CONFIG_FILE_PACKAGES: + # List of packages that require config file installation. + # If the package name is in this list, it will install the config file. + # + # - _INSTALL_CONFIG_FILE_PACKAGE: + # Boolean to control config file installation for the specific library. + # The prefix `` is the uppercased name of the library with dots + # replaced by underscores. + # + if(NOT TARGET "${name}") + message(FATAL_ERROR "Target '${name}' does not exist.") + endif() + + if(NOT ARGN STREQUAL "") + message( + FATAL_ERROR + "beman_install_library does not accept extra arguments: ${ARGN}" + ) + endif() + + # Given foo.bar, the component name is bar + string(REPLACE "." ";" name_parts "${name}") + # 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 expects a name of the form 'beman.', got '${name}'" + ) + endif() + + set(target_name "${name}") + set(install_component_name "${name}") + set(export_name "${name}") + set(package_name "${name}") + list(GET name_parts -1 component_name) + + install( + TARGETS "${target_name}" COMPONENT "${install_component_name}" + EXPORT "${export_name}" + FILE_SET HEADERS + ) + + set_target_properties( + "${target_name}" + PROPERTIES EXPORT_NAME "${component_name}" + ) + + include(GNUInstallDirs) + + # Determine the prefix for project-specific variables + string(TOUPPER "${name}" project_prefix) + string(REPLACE "." "_" project_prefix "${project_prefix}") + + if( + "${name}" IN_LIST BEMAN_INSTALL_CONFIG_FILE_PACKAGES + OR "${project_prefix}_INSTALL_CONFIG_FILE_PACKAGE" + ) + set(install_config_package ON) + endif() + + if(install_config_package) + message( + DEBUG + "beman-install-library: Installing a config package for '${name}'" + ) + + include(CMakePackageConfigHelpers) + + find_file( + config_file_template + NAMES "${package_name}-config.cmake.in" + PATHS "${CMAKE_CURRENT_SOURCE_DIR}" + NO_DEFAULT_PATH + NO_CACHE + REQUIRED + ) + set(config_package_file + "${CMAKE_CURRENT_BINARY_DIR}/${package_name}-config.cmake" + ) + set(package_install_dir "${CMAKE_INSTALL_LIBDIR}/cmake/${package_name}") + configure_package_config_file( + "${config_file_template}" + "${config_package_file}" + INSTALL_DESTINATION "${package_install_dir}" + PATH_VARS PROJECT_NAME PROJECT_VERSION + ) + + set(config_version_file + "${CMAKE_CURRENT_BINARY_DIR}/${package_name}-config-version.cmake" + ) + write_basic_package_version_file( + "${config_version_file}" + VERSION "${PROJECT_VERSION}" + COMPATIBILITY ExactVersion + ) + + install( + FILES "${config_package_file}" "${config_version_file}" + DESTINATION "${package_install_dir}" + COMPONENT "${install_component_name}" + ) + + set(config_targets_file "${package_name}-targets.cmake") + install( + EXPORT "${export_name}" + DESTINATION "${package_install_dir}" + NAMESPACE beman:: + FILE "${config_targets_file}" + COMPONENT "${install_component_name}" + ) + else() + message( + DEBUG + "beman-install-library: Not installing a config package for '${name}'" + ) + endif() +endfunction() diff --git a/cmake/gnu-toolchain.cmake b/cmake/gnu-toolchain.cmake index b6dddf6..d3b9f92 100644 --- a/cmake/gnu-toolchain.cmake +++ b/cmake/gnu-toolchain.cmake @@ -36,3 +36,6 @@ set(CMAKE_CXX_FLAGS_RELWITHDEBINFO_INIT "${RELEASE_FLAGS}") set(CMAKE_C_FLAGS_RELEASE_INIT "${RELEASE_FLAGS}") set(CMAKE_CXX_FLAGS_RELEASE_INIT "${RELEASE_FLAGS}") + +# Add this dir to the module path so that `find_package(beman-install-library)` works +list(APPEND CMAKE_PREFIX_PATH "${CMAKE_CURRENT_LIST_DIR}") diff --git a/cmake/llvm-toolchain.cmake b/cmake/llvm-toolchain.cmake index 5f5ee4b..f1623b7 100644 --- a/cmake/llvm-toolchain.cmake +++ b/cmake/llvm-toolchain.cmake @@ -36,3 +36,6 @@ set(CMAKE_CXX_FLAGS_RELWITHDEBINFO_INIT "${RELEASE_FLAGS}") set(CMAKE_C_FLAGS_RELEASE_INIT "${RELEASE_FLAGS}") set(CMAKE_CXX_FLAGS_RELEASE_INIT "${RELEASE_FLAGS}") + +# Add this dir to the module path so that `find_package(beman-install-library)` works +list(APPEND CMAKE_PREFIX_PATH "${CMAKE_CURRENT_LIST_DIR}") diff --git a/cmake/msvc-toolchain.cmake b/cmake/msvc-toolchain.cmake index c2fffa7..bdc24de 100644 --- a/cmake/msvc-toolchain.cmake +++ b/cmake/msvc-toolchain.cmake @@ -36,3 +36,6 @@ set(CMAKE_CXX_FLAGS_RELWITHDEBINFO_INIT "${RELEASE_FLAGS}") set(CMAKE_C_FLAGS_RELEASE_INIT "${RELEASE_FLAGS}") set(CMAKE_CXX_FLAGS_RELEASE_INIT "${RELEASE_FLAGS}") + +# Add this dir to the module path so that `find_package(beman-install-library)` works +list(APPEND CMAKE_PREFIX_PATH "${CMAKE_CURRENT_LIST_DIR}") diff --git a/cmake/use-fetch-content.cmake b/cmake/use-fetch-content.cmake index 07c1a15..737c65f 100644 --- a/cmake/use-fetch-content.cmake +++ b/cmake/use-fetch-content.cmake @@ -152,7 +152,11 @@ function(BemanExemplar_provideDependency method package_name) APPEND BemanExemplar_debug "Redirecting find_package calls for ${BemanExemplar_pkgName} " - "to FetchContent logic fetching ${BemanExemplar_repo} at " + "to FetchContent logic.\n" + string + APPEND + BemanExemplar_debug + "Fetching ${BemanExemplar_repo} at " "${BemanExemplar_tag} according to ${BemanExemplar_lockfile}." ) message(DEBUG "${BemanExemplar_debug}") @@ -177,3 +181,6 @@ cmake_language( SET_DEPENDENCY_PROVIDER BemanExemplar_provideDependency SUPPORTED_METHODS FIND_PACKAGE ) + +# Add this dir to the module path so that `find_package(beman-install-library)` works +list(APPEND CMAKE_PREFIX_PATH "${CMAKE_CURRENT_LIST_DIR}") From 9bc97108bde14f5422d1ff9b817471553ed9a724 Mon Sep 17 00:00:00 2001 From: Bret Brown Date: Sun, 7 Sep 2025 16:52:11 -0400 Subject: [PATCH 165/199] Polish beman_install_library This commit: * Changes defaults such that one must opt out of installing CMake config packages for beman libraries using beman_install_library. This is because if one is installing a beman library, it is more likely than not that they would want to support potential CMake consumers using those libraries. * Fixes a bug that caused the `__INSTALL_CONFIG_FILE_PACKAGE` option to not work as designed. This is because of incorrect quoting in the relevant CMake conditional statement in the implementation of `beman_install_library`. * Adds detail the the `README.md` such that the existence of the `cmake/` subdirectory is documented. API documentation for `beman_install_library` was also added. --- README.md | 44 ++++++++++++++++++++++++ cmake/beman-install-library-config.cmake | 23 ++++++++++--- 2 files changed, 63 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index f40ebc1..c273968 100644 --- a/README.md +++ b/README.md @@ -9,5 +9,49 @@ so it does not respect the usual structure of a Beman library repository nor The ## 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) +* `_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`. diff --git a/cmake/beman-install-library-config.cmake b/cmake/beman-install-library-config.cmake index 55395fd..3cbd649 100644 --- a/cmake/beman-install-library-config.cmake +++ b/cmake/beman-install-library-config.cmake @@ -81,11 +81,26 @@ function(beman_install_library name) string(TOUPPER "${name}" project_prefix) string(REPLACE "." "_" project_prefix "${project_prefix}") - if( - "${name}" IN_LIST BEMAN_INSTALL_CONFIG_FILE_PACKAGES - OR "${project_prefix}_INSTALL_CONFIG_FILE_PACKAGE" + option( + ${project_prefix}_INSTALL_CONFIG_FILE_PACKAGE + "Enable building examples. Default: ${PROJECT_IS_TOP_LEVEL}. Values: { ON, OFF }." + ${PROJECT_IS_TOP_LEVEL} ) - set(install_config_package ON) + + # By default, install the config package + set(install_config_package ON) + + # Turn OFF installation of config package by default if, + # in order of precedence: + # 1. The specific package variable is set to OFF + # 2. The package name is not in the list of packages to install config files + if(DEFINED BEMAN_INSTALL_CONFIG_FILE_PACKAGES) + if (NOT "${install_component_name}" IN_LIST BEMAN_INSTALL_CONFIG_FILE_PACKAGES) + set(install_config_package OFF) + endif() + endif() + if(DEFINED ${project_prefix}_INSTALL_CONFIG_FILE_PACKAGE) + set(install_config_package ${${project_prefix}_INSTALL_CONFIG_FILE_PACKAGE}) endif() if(install_config_package) From e98506f1ee027989b3fd6daf152041e47fca4097 Mon Sep 17 00:00:00 2001 From: Bret Brown Date: Sun, 7 Sep 2025 17:12:30 -0400 Subject: [PATCH 166/199] Fix CMake formatting Per suggestions from pre-commit and reviewdog. Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- cmake/beman-install-library-config.cmake | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/cmake/beman-install-library-config.cmake b/cmake/beman-install-library-config.cmake index 3cbd649..619078c 100644 --- a/cmake/beman-install-library-config.cmake +++ b/cmake/beman-install-library-config.cmake @@ -95,12 +95,18 @@ function(beman_install_library name) # 1. The specific package variable is set to OFF # 2. The package name is not in the list of packages to install config files if(DEFINED BEMAN_INSTALL_CONFIG_FILE_PACKAGES) - if (NOT "${install_component_name}" IN_LIST BEMAN_INSTALL_CONFIG_FILE_PACKAGES) + if( + NOT "${install_component_name}" + IN_LIST + BEMAN_INSTALL_CONFIG_FILE_PACKAGES + ) set(install_config_package OFF) endif() endif() if(DEFINED ${project_prefix}_INSTALL_CONFIG_FILE_PACKAGE) - set(install_config_package ${${project_prefix}_INSTALL_CONFIG_FILE_PACKAGE}) + set(install_config_package + ${${project_prefix}_INSTALL_CONFIG_FILE_PACKAGE} + ) endif() if(install_config_package) From 92993bd6623781f9ea152bf436f5568a0f8e320c Mon Sep 17 00:00:00 2001 From: Bo Rydberg <2945606+bolry@users.noreply.github.com> Date: Tue, 16 Sep 2025 17:52:56 +0200 Subject: [PATCH 167/199] Wrong content in debug string for use-fetch-content.cmake The `BemanExemplar_debug` string variable accidentally includes the literal string "string(APPEND BemanExemplar_debug" itself in the `BemanExemplar_debug` variable. --- cmake/use-fetch-content.cmake | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cmake/use-fetch-content.cmake b/cmake/use-fetch-content.cmake index 737c65f..4ed4839 100644 --- a/cmake/use-fetch-content.cmake +++ b/cmake/use-fetch-content.cmake @@ -153,7 +153,8 @@ function(BemanExemplar_provideDependency method package_name) BemanExemplar_debug "Redirecting find_package calls for ${BemanExemplar_pkgName} " "to FetchContent logic.\n" - string + ) + string( APPEND BemanExemplar_debug "Fetching ${BemanExemplar_repo} at " From ec701785a8106c2b7088c7928d6fe861e27d67bc Mon Sep 17 00:00:00 2001 From: Edward Nolan Date: Sat, 27 Sep 2025 22:52:46 -0400 Subject: [PATCH 168/199] Update pre-commit hooks Also modify formatting in beman-install-library-config.cmake as requested by gersemi. --- .pre-commit-config.yaml | 8 ++++---- cmake/beman-install-library-config.cmake | 3 ++- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 8641cfa..e806e59 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,6 +1,6 @@ repos: - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v5.0.0 + rev: v6.0.0 hooks: - id: trailing-whitespace - id: end-of-file-fixer @@ -8,13 +8,13 @@ repos: - id: check-added-large-files - repo: https://github.com/codespell-project/codespell - rev: v2.3.0 + rev: v2.4.1 hooks: - id: codespell # CMake linting and formatting - repo: https://github.com/BlankSpruce/gersemi - rev: 0.15.1 + rev: 0.22.3 hooks: - id: gersemi name: CMake linting @@ -24,7 +24,7 @@ repos: # config file: ruff.toml (not currently present but add if needed) # https://docs.astral.sh/ruff/configuration/ - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.12.1 + rev: v0.13.2 hooks: - id: ruff-check files: ^tools/beman-tidy/ diff --git a/cmake/beman-install-library-config.cmake b/cmake/beman-install-library-config.cmake index 619078c..e7fd0ad 100644 --- a/cmake/beman-install-library-config.cmake +++ b/cmake/beman-install-library-config.cmake @@ -65,7 +65,8 @@ function(beman_install_library name) list(GET name_parts -1 component_name) install( - TARGETS "${target_name}" COMPONENT "${install_component_name}" + TARGETS "${target_name}" + COMPONENT "${install_component_name}" EXPORT "${export_name}" FILE_SET HEADERS ) From bb58b2a1cc894d58a55bf745be78f5d27029e245 Mon Sep 17 00:00:00 2001 From: wusatosi <26424577+wusatosi@users.noreply.github.com> Date: Sat, 27 Sep 2025 20:33:53 -0700 Subject: [PATCH 169/199] remove beman-tidy artifact --- .github/workflows/beman-tidy.yml | 111 ------------------------------- README.md | 2 - 2 files changed, 113 deletions(-) delete mode 100644 .github/workflows/beman-tidy.yml diff --git a/.github/workflows/beman-tidy.yml b/.github/workflows/beman-tidy.yml deleted file mode 100644 index 46221e6..0000000 --- a/.github/workflows/beman-tidy.yml +++ /dev/null @@ -1,111 +0,0 @@ -# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception - -name: beman-tidy tests - -on: - push: - branches: - - main - pull_request: - workflow_call: - workflow_dispatch: - schedule: - - cron: '0 6 * * *' # 09:00AM EEST (@neatudarius' timezone) - -jobs: - run_linter: - runs-on: ubuntu-latest - defaults: - run: - working-directory: tools/beman-tidy - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Install uv - uses: astral-sh/setup-uv@v5 - - - name: Sync environment - run: | - uv sync - - - name: Run linter - run: | - uv run ruff check --diff - - run_tests: - runs-on: ubuntu-latest - defaults: - run: - working-directory: tools/beman-tidy - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Install uv - uses: astral-sh/setup-uv@v5 - - - name: Sync environment - run: | - uv sync - - - name: Run tests - run: | - uv run pytest tests/ -v - - build_and_install: - runs-on: ubuntu-latest - defaults: - run: - working-directory: tools/beman-tidy - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Install uv - uses: astral-sh/setup-uv@v5 - - - name: Sync environment - run: | - uv sync - - - name: Build and install beman-tidy - run: | - uv clean - uv build - python3 -m pip install dist/beman_tidy-0.1.0-py3-none-any.whl --force-reinstall - beman-tidy --help - - run_on_exemplar: - runs-on: ubuntu-latest - defaults: - run: - working-directory: tools/beman-tidy - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Install uv - uses: astral-sh/setup-uv@v5 - - - name: Sync environment - run: | - uv sync - - - name: Build and install beman-tidy - run: | - uv clean - uv build - python3 -m pip install dist/beman_tidy-0.1.0-py3-none-any.whl --force-reinstall - beman-tidy --help - - - name: Run installed beman-tidy on exemplar repo - run: | - git clone https://github.com/bemanproject/exemplar.git - cd exemplar/ # Testing that beman-tidy can be run from any path, e.g. from the exemplar repo. - beman-tidy --verbose --require-all . - - create-issue-when-fault: - needs: [run_linter, run_tests, build_and_install, run_on_exemplar] - if: failure() && (github.event_name == 'workflow_call' || github.event_name == 'workflow_dispatch' || github.event_name == 'schedule') - uses: ./.github/workflows/reusable-beman-create-issue-when-fault.yml diff --git a/README.md b/README.md index c273968..16b2672 100644 --- a/README.md +++ b/README.md @@ -2,8 +2,6 @@ -[![beman-tidy tests](https://github.com/bemanproject/infra/actions/workflows/beman-tidy.yml/badge.svg)](https://github.com/bemanproject/infra/actions/workflows/beman-tidy.yml) - 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! From 7fb7c282e0fa50f8447b5873c69acd57854fb6ac Mon Sep 17 00:00:00 2001 From: rishyak Date: Mon, 29 Sep 2025 15:19:41 -0400 Subject: [PATCH 170/199] chore: remove tidy hook && python precommit linting --- .pre-commit-config.yaml | 11 ----------- .pre-commit-hooks.yaml | 7 ------- 2 files changed, 18 deletions(-) delete mode 100644 .pre-commit-hooks.yaml diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index e806e59..bc4dd84 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -19,14 +19,3 @@ repos: - id: gersemi name: CMake linting exclude: ^.*/tests/.*/data/ # Exclude test data directories - - # Python linting and formatting - # config file: ruff.toml (not currently present but add if needed) - # https://docs.astral.sh/ruff/configuration/ - - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.13.2 - hooks: - - id: ruff-check - files: ^tools/beman-tidy/ - - id: ruff-format - files: ^tools/beman-tidy/ diff --git a/.pre-commit-hooks.yaml b/.pre-commit-hooks.yaml deleted file mode 100644 index d327587..0000000 --- a/.pre-commit-hooks.yaml +++ /dev/null @@ -1,7 +0,0 @@ -- id: beman-tidy - name: "beman-tidy: bemanification your repo" - entry: ./tools/beman-tidy/beman-tidy - language: script - pass_filenames: false - always_run: true - args: [".", "--verbose"] From 9f89e813b844915267b783289d386a09c69560d1 Mon Sep 17 00:00:00 2001 From: Edward Nolan Date: Sun, 4 Jan 2026 10:31:12 -0500 Subject: [PATCH 171/199] Expect config file template in cmake/ directory rather than src/ This is the new pattern for Beman libraries and allows us to support both header-only and source-based libraries. --- cmake/beman-install-library-config.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/beman-install-library-config.cmake b/cmake/beman-install-library-config.cmake index e7fd0ad..6fa4fa8 100644 --- a/cmake/beman-install-library-config.cmake +++ b/cmake/beman-install-library-config.cmake @@ -121,7 +121,7 @@ function(beman_install_library name) find_file( config_file_template NAMES "${package_name}-config.cmake.in" - PATHS "${CMAKE_CURRENT_SOURCE_DIR}" + PATHS "${PROJECT_SOURCE_DIR}/cmake" NO_DEFAULT_PATH NO_CACHE REQUIRED From b3545a45640abd1fedc01441ca3f220d9ac5a8e3 Mon Sep 17 00:00:00 2001 From: Edward Nolan Date: Sun, 4 Jan 2026 18:20:38 -0500 Subject: [PATCH 172/199] Fix incorrect default for project_INSTALL_CONFIG_FILE_PACKAGE The default for this option was supposed to be set to ON by https://github.com/bemanproject/exemplar/commit/19d99a467d2bbd9fde1ad08ea5565f1cc0b34b73, hence the commit title "Default generation of CMake config packages to ON". However, due to what I believe is a copypaste bug, that commit set the default to ${PROJECT_IS_TOP_LEVEL} rather than ON, which broke the ability to consume Beman libraries as dependencies. This commit changes the default to ON, which has been tested to address the issue. It also fixes the doc. --- cmake/beman-install-library-config.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmake/beman-install-library-config.cmake b/cmake/beman-install-library-config.cmake index 6fa4fa8..c40959d 100644 --- a/cmake/beman-install-library-config.cmake +++ b/cmake/beman-install-library-config.cmake @@ -84,8 +84,8 @@ function(beman_install_library name) option( ${project_prefix}_INSTALL_CONFIG_FILE_PACKAGE - "Enable building examples. Default: ${PROJECT_IS_TOP_LEVEL}. Values: { ON, OFF }." - ${PROJECT_IS_TOP_LEVEL} + "Enable creating and installing a CMake config-file package. Default: ON. Values: { ON, OFF }." + ON ) # By default, install the config package From 57db20af72c8b6f3eaae741d65006109c9293493 Mon Sep 17 00:00:00 2001 From: Paul Tsouchlos Date: Tue, 27 Jan 2026 11:55:26 -0500 Subject: [PATCH 173/199] chore: address Ruff python lints --- tools/beman-submodule/beman-submodule | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tools/beman-submodule/beman-submodule b/tools/beman-submodule/beman-submodule index 66cb96e..5a4095e 100755 --- a/tools/beman-submodule/beman-submodule +++ b/tools/beman-submodule/beman-submodule @@ -46,11 +46,11 @@ def parse_beman_submodule_file(path): raise Exception(f'Failed to parse {path} as a .beman_submodule file') if not read_result: fail() - if not 'beman_submodule' in config: + if 'beman_submodule' not in config: fail() - if not 'remote' in config['beman_submodule']: + if 'remote' not in config['beman_submodule']: fail() - if not 'commit_hash' in config['beman_submodule']: + if 'commit_hash' not in config['beman_submodule']: fail() allow_untracked_files = config.getboolean( 'beman_submodule', 'allow_untracked_files', fallback=False) @@ -143,7 +143,7 @@ def beman_submodule_update(beman_submodule, remote): f.write(f'remote={beman_submodule.remote}\n') f.write(f'commit_hash={sha_process.stdout.strip()}\n') if beman_submodule.allow_untracked_files: - f.write(f'allow_untracked_files=True\n') + f.write('allow_untracked_files=True\n') shutil.rmtree(tmp_path / '.git') shutil.copytree(tmp_path, beman_submodule.dirpath, dirs_exist_ok=True) @@ -182,7 +182,7 @@ def add_command(repository, path, allow_untracked_files): f.write(f'remote={repository}\n') f.write(f'commit_hash={sha_process.stdout.strip()}\n') if allow_untracked_files: - f.write(f'allow_untracked_files=True\n') + f.write('allow_untracked_files=True\n') shutil.rmtree(tmpdir_repo /'.git') shutil.copytree(tmpdir_repo, path, dirs_exist_ok=True) @@ -225,7 +225,7 @@ def get_parser(): return parser def parse_args(args): - return get_parser().parse_args(args); + return get_parser().parse_args(args) def usage(): return get_parser().format_help() From 322f31d5af0e4c17878ddaba9d3fa6bcca31a7df Mon Sep 17 00:00:00 2001 From: Edward Nolan Date: Sat, 7 Feb 2026 15:07:41 -0500 Subject: [PATCH 174/199] Remove beman-submodule since it's been migrated to bemanproject/beman-submodule --- .github/workflows/beman-submodule.yml | 32 -- README.md | 3 +- tools/beman-submodule/README.md | 63 -- tools/beman-submodule/beman-submodule | 260 --------- .../test/test_beman_submodule.py | 539 ------------------ 5 files changed, 1 insertion(+), 896 deletions(-) delete mode 100644 .github/workflows/beman-submodule.yml delete mode 100644 tools/beman-submodule/README.md delete mode 100755 tools/beman-submodule/beman-submodule delete mode 100644 tools/beman-submodule/test/test_beman_submodule.py diff --git a/.github/workflows/beman-submodule.yml b/.github/workflows/beman-submodule.yml deleted file mode 100644 index 8435086..0000000 --- a/.github/workflows/beman-submodule.yml +++ /dev/null @@ -1,32 +0,0 @@ -# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception - -name: beman-submodule tests - -on: - push: - branches: - - main - pull_request: - workflow_dispatch: - -jobs: - beman-submodule-script-ci: - name: beman_module.py ci - runs-on: ubuntu-latest - steps: - - name: Checkout repository - uses: actions/checkout@v4 - - - name: Set up Python - uses: actions/setup-python@v5 - with: - python-version: 3.13 - - - name: Install pytest - run: | - python3 -m pip install pytest - - - name: Run pytest - run: | - cd tools/beman-submodule/ - pytest diff --git a/README.md b/README.md index 16b2672..a869e46 100644 --- a/README.md +++ b/README.md @@ -9,12 +9,11 @@ so it does not respect the usual structure of a Beman library repository nor The * `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. +[the beman-submodule documentation](https://github.com/bemanproject/beman-submodule) for details. ### CMake Modules diff --git a/tools/beman-submodule/README.md b/tools/beman-submodule/README.md deleted file mode 100644 index 36883ad..0000000 --- a/tools/beman-submodule/README.md +++ /dev/null @@ -1,63 +0,0 @@ -# beman-submodule - - - -## 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: - - -```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. diff --git a/tools/beman-submodule/beman-submodule b/tools/beman-submodule/beman-submodule deleted file mode 100755 index 5a4095e..0000000 --- a/tools/beman-submodule/beman-submodule +++ /dev/null @@ -1,260 +0,0 @@ -#!/usr/bin/env python3 - -# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception - -import argparse -import configparser -import filecmp -import glob -import os -import shutil -import subprocess -import sys -import tempfile -from pathlib import Path - - -def directory_compare( - reference: str | Path, actual: str | Path, ignore, allow_untracked_files: bool): - reference, actual = Path(reference), Path(actual) - - compared = filecmp.dircmp(reference, actual, ignore=ignore) - if (compared.left_only - or (compared.right_only and not allow_untracked_files) - or compared.diff_files): - return False - for common_dir in compared.common_dirs: - path1 = reference / common_dir - path2 = actual / common_dir - if not directory_compare(path1, path2, ignore, allow_untracked_files): - return False - return True - -class BemanSubmodule: - def __init__( - self, dirpath: str | Path, remote: str, commit_hash: str, - allow_untracked_files: bool): - self.dirpath = Path(dirpath) - self.remote = remote - self.commit_hash = commit_hash - self.allow_untracked_files = allow_untracked_files - -def parse_beman_submodule_file(path): - config = configparser.ConfigParser() - read_result = config.read(path) - def fail(): - raise Exception(f'Failed to parse {path} as a .beman_submodule file') - if not read_result: - fail() - if 'beman_submodule' not in config: - fail() - if 'remote' not in config['beman_submodule']: - fail() - if 'commit_hash' not in config['beman_submodule']: - fail() - allow_untracked_files = config.getboolean( - 'beman_submodule', 'allow_untracked_files', fallback=False) - return BemanSubmodule( - Path(path).resolve().parent, - config['beman_submodule']['remote'], - config['beman_submodule']['commit_hash'], - allow_untracked_files) - -def get_beman_submodule(path: str | Path): - beman_submodule_filepath = Path(path) / '.beman_submodule' - - if beman_submodule_filepath.is_file(): - return parse_beman_submodule_file(beman_submodule_filepath) - else: - return None - -def find_beman_submodules_in(path): - path = Path(path) - assert path.is_dir() - - result = [] - for dirpath, _, filenames in path.walk(): - if '.beman_submodule' in filenames: - result.append(parse_beman_submodule_file(dirpath / '.beman_submodule')) - return sorted(result, key=lambda module: module.dirpath) - -def cwd_git_repository_path(): - process = subprocess.run( - ['git', 'rev-parse', '--show-toplevel'], capture_output=True, text=True, - check=False) - if process.returncode == 0: - return process.stdout.strip() - elif "fatal: not a git repository" in process.stderr: - return None - else: - raise Exception("git rev-parse --show-toplevel failed") - -def clone_beman_submodule_into_tmpdir(beman_submodule, remote): - tmpdir = tempfile.TemporaryDirectory() - subprocess.run( - ['git', 'clone', beman_submodule.remote, tmpdir.name], capture_output=True, - check=True) - if not remote: - subprocess.run( - ['git', '-C', tmpdir.name, 'reset', '--hard', beman_submodule.commit_hash], - capture_output=True, check=True) - return tmpdir - -def get_paths(beman_submodule): - tmpdir = clone_beman_submodule_into_tmpdir(beman_submodule, False) - paths = set(glob.glob('*', root_dir=Path(tmpdir.name), include_hidden=True)) - paths.remove('.git') - return paths - -def beman_submodule_status(beman_submodule): - tmpdir = clone_beman_submodule_into_tmpdir(beman_submodule, False) - if directory_compare( - tmpdir.name, beman_submodule.dirpath, ['.beman_submodule', '.git'], - beman_submodule.allow_untracked_files): - status_character=' ' - else: - status_character='+' - parent_repo_path = cwd_git_repository_path() - if not parent_repo_path: - raise Exception('this is not a git repository') - relpath = Path(beman_submodule.dirpath).relative_to(Path(parent_repo_path)) - return status_character + ' ' + beman_submodule.commit_hash + ' ' + str(relpath) - -def beman_submodule_update(beman_submodule, remote): - tmpdir = clone_beman_submodule_into_tmpdir(beman_submodule, remote) - tmp_path = Path(tmpdir.name) - sha_process = subprocess.run( - ['git', 'rev-parse', 'HEAD'], capture_output=True, check=True, text=True, - cwd=tmp_path) - - if beman_submodule.allow_untracked_files: - for path in get_paths(beman_submodule): - path2 = Path(beman_submodule.dirpath) / path - if Path(path2).is_dir(): - shutil.rmtree(path2) - elif Path(path2).is_file(): - os.remove(path2) - else: - shutil.rmtree(beman_submodule.dirpath) - - submodule_path = tmp_path / '.beman_submodule' - with open(submodule_path, 'w') as f: - f.write('[beman_submodule]\n') - f.write(f'remote={beman_submodule.remote}\n') - f.write(f'commit_hash={sha_process.stdout.strip()}\n') - if beman_submodule.allow_untracked_files: - f.write('allow_untracked_files=True\n') - shutil.rmtree(tmp_path / '.git') - shutil.copytree(tmp_path, beman_submodule.dirpath, dirs_exist_ok=True) - -def update_command(remote, path): - if not path: - parent_repo_path = cwd_git_repository_path() - if not parent_repo_path: - raise Exception('this is not a git repository') - beman_submodules = find_beman_submodules_in(parent_repo_path) - else: - beman_submodule = get_beman_submodule(path) - if not beman_submodule: - raise Exception(f'{path} is not a beman_submodule') - beman_submodules = [beman_submodule] - for beman_submodule in beman_submodules: - beman_submodule_update(beman_submodule, remote) - -def add_command(repository, path, allow_untracked_files): - tmpdir = tempfile.TemporaryDirectory() - subprocess.run( - ['git', 'clone', repository], capture_output=True, check=True, cwd=tmpdir.name) - repository_name = os.listdir(tmpdir.name)[0] - if not path: - path = Path(repository_name) - else: - path = Path(path) - if not allow_untracked_files and path.exists(): - raise Exception(f'{path} exists') - path.mkdir(exist_ok=allow_untracked_files) - tmpdir_repo = Path(tmpdir.name) / repository_name - sha_process = subprocess.run( - ['git', 'rev-parse', 'HEAD'], capture_output=True, check=True, text=True, - cwd=tmpdir_repo) - with open(tmpdir_repo / '.beman_submodule', 'w') as f: - f.write('[beman_submodule]\n') - f.write(f'remote={repository}\n') - f.write(f'commit_hash={sha_process.stdout.strip()}\n') - if allow_untracked_files: - f.write('allow_untracked_files=True\n') - shutil.rmtree(tmpdir_repo /'.git') - shutil.copytree(tmpdir_repo, path, dirs_exist_ok=True) - -def status_command(paths): - if not paths: - parent_repo_path = cwd_git_repository_path() - if not parent_repo_path: - raise Exception('this is not a git repository') - beman_submodules = find_beman_submodules_in(parent_repo_path) - else: - beman_submodules = [] - for path in paths: - beman_submodule = get_beman_submodule(path) - if not beman_submodule: - raise Exception(f'{path} is not a beman_submodule') - beman_submodules.append(beman_submodule) - for beman_submodule in beman_submodules: - print(beman_submodule_status(beman_submodule)) - -def get_parser(): - parser = argparse.ArgumentParser(description='Beman pseudo-submodule tool') - subparsers = parser.add_subparsers(dest='command', help='available commands') - parser_update = subparsers.add_parser('update', help='update beman_submodules') - parser_update.add_argument( - '--remote', action='store_true', - help='update a beman_submodule to its latest from upstream') - parser_update.add_argument( - 'beman_submodule_path', nargs='?', - help='relative path to the beman_submodule to update') - parser_add = subparsers.add_parser('add', help='add a new beman_submodule') - parser_add.add_argument('repository', help='git repository to add') - parser_add.add_argument( - 'path', nargs='?', help='path where the repository will be added') - parser_add.add_argument( - '--allow-untracked-files', action='store_true', - help='the beman_submodule will not occupy the subdirectory exclusively') - parser_status = subparsers.add_parser( - 'status', help='show the status of beman_submodules') - parser_status.add_argument('paths', nargs='*') - return parser - -def parse_args(args): - return get_parser().parse_args(args) - -def usage(): - return get_parser().format_help() - -def run_command(args): - if args.command == 'update': - update_command(args.remote, args.beman_submodule_path) - elif args.command == 'add': - add_command(args.repository, args.path, args.allow_untracked_files) - elif args.command == 'status': - status_command(args.paths) - else: - raise Exception(usage()) - -def check_for_git(path): - env = os.environ.copy() - if path is not None: - env["PATH"] = path - return shutil.which("git", path=env.get("PATH")) is not None - -def main(): - try: - if not check_for_git(None): - raise Exception('git not found in PATH') - args = parse_args(sys.argv[1:]) - run_command(args) - except Exception as e: - print("Error:", e, file=sys.stderr) - sys.exit(1) - -if __name__ == '__main__': - main() diff --git a/tools/beman-submodule/test/test_beman_submodule.py b/tools/beman-submodule/test/test_beman_submodule.py deleted file mode 100644 index 600fc07..0000000 --- a/tools/beman-submodule/test/test_beman_submodule.py +++ /dev/null @@ -1,539 +0,0 @@ -# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception - -import glob -import os -import pytest -import shutil -import stat -import subprocess -import tempfile -from pathlib import Path - -# https://stackoverflow.com/a/19011259 -import types -import importlib.machinery -loader = importlib.machinery.SourceFileLoader( - 'beman_submodule', - str(Path(__file__).parent.resolve().parent / 'beman-submodule')) -beman_submodule = types.ModuleType(loader.name) -loader.exec_module(beman_submodule) - -def create_test_git_repository(): - tmpdir = tempfile.TemporaryDirectory() - tmp_path = Path(tmpdir.name) - - subprocess.run(['git', 'init'], check=True, cwd=tmpdir.name, capture_output=True) - def make_commit(a_txt_contents): - with open(tmp_path / 'a.txt', 'w') as f: - f.write(a_txt_contents) - subprocess.run( - ['git', 'add', 'a.txt'], check=True, cwd=tmpdir.name, capture_output=True) - subprocess.run( - ['git', '-c', 'user.name=test', '-c', 'user.email=test@example.com', 'commit', - '--author="test "', '-m', 'test'], - check=True, cwd=tmpdir.name, capture_output=True) - make_commit('A') - make_commit('a') - return tmpdir - -def create_test_git_repository2(): - tmpdir = tempfile.TemporaryDirectory() - tmp_path = Path(tmpdir.name) - - subprocess.run(['git', 'init'], check=True, cwd=tmpdir.name, capture_output=True) - with open(tmp_path / 'a.txt', 'w') as f: - f.write('a') - subprocess.run( - ['git', 'add', 'a.txt'], check=True, cwd=tmpdir.name, capture_output=True) - subprocess.run( - ['git', '-c', 'user.name=test', '-c', 'user.email=test@example.com', 'commit', - '--author="test "', '-m', 'test'], - check=True, cwd=tmpdir.name, capture_output=True) - os.remove(tmp_path / 'a.txt') - subprocess.run( - ['git', 'rm', 'a.txt'], check=True, cwd=tmpdir.name, capture_output=True) - with open(tmp_path / 'b.txt', 'w') as f: - f.write('b') - subprocess.run( - ['git', 'add', 'b.txt'], check=True, cwd=tmpdir.name, capture_output=True) - subprocess.run( - ['git', '-c', 'user.name=test', '-c', 'user.email=test@example.com', 'commit', - '--author="test "', '-m', 'test'], - check=True, cwd=tmpdir.name, capture_output=True) - return tmpdir - -def test_directory_compare(): - def create_dir_structure(dir_path: Path): - bar_path = dir_path / 'bar' - os.makedirs(bar_path) - - with open(dir_path / 'foo.txt', 'w') as f: - f.write('foo') - with open(bar_path / 'baz.txt', 'w') as f: - f.write('baz') - - with tempfile.TemporaryDirectory() as dir_a, \ - tempfile.TemporaryDirectory() as dir_b: - path_a = Path(dir_a) - path_b = Path(dir_b) - - create_dir_structure(path_a) - create_dir_structure(path_b) - - assert beman_submodule.directory_compare(dir_a, dir_b, [], False) - - with open(path_a / 'bar' / 'quux.txt', 'w') as f: - f.write('quux') - - assert not beman_submodule.directory_compare(path_a, path_b, [], False) - assert beman_submodule.directory_compare(path_a, path_b, ['quux.txt'], False) - -def test_directory_compare_untracked_files(): - def create_dir_structure(dir_path: Path): - bar_path = dir_path / 'bar' - os.makedirs(bar_path) - - with open(dir_path / 'foo.txt', 'w') as f: - f.write('foo') - with open(bar_path / 'baz.txt', 'w') as f: - f.write('baz') - - with tempfile.TemporaryDirectory() as reference, \ - tempfile.TemporaryDirectory() as actual: - path_a = Path(reference) - path_b = Path(actual) - - create_dir_structure(path_a) - create_dir_structure(path_b) - (path_b / 'c.txt').touch() - - assert beman_submodule.directory_compare(reference, actual, [], True) - - with open(path_a / 'bar' / 'quux.txt', 'w') as f: - f.write('quux') - - assert not beman_submodule.directory_compare(path_a, path_b, [], True) - assert beman_submodule.directory_compare(path_a, path_b, ['quux.txt'], True) - -def test_parse_beman_submodule_file(): - def valid_file(): - tmpfile = tempfile.NamedTemporaryFile() - tmpfile.write('[beman_submodule]\n'.encode('utf-8')) - tmpfile.write( - 'remote=git@github.com:bemanproject/infra.git\n'.encode('utf-8')) - tmpfile.write( - 'commit_hash=9b88395a86c4290794e503e94d8213b6c442ae77\n'.encode('utf-8')) - tmpfile.flush() - module = beman_submodule.parse_beman_submodule_file(tmpfile.name) - assert module.dirpath == Path(tmpfile.name).resolve().parent - assert module.remote == 'git@github.com:bemanproject/infra.git' - assert module.commit_hash == '9b88395a86c4290794e503e94d8213b6c442ae77' - valid_file() - def invalid_file_missing_remote(): - threw = False - try: - tmpfile = tempfile.NamedTemporaryFile() - tmpfile.write('[beman_submodule]\n'.encode('utf-8')) - tmpfile.write( - 'commit_hash=9b88395a86c4290794e503e94d8213b6c442ae77\n'.encode('utf-8')) - tmpfile.flush() - beman_submodule.parse_beman_submodule_file(tmpfile.name) - except: - threw = True - assert threw - invalid_file_missing_remote() - def invalid_file_missing_commit_hash(): - threw = False - try: - tmpfile = tempfile.NamedTemporaryFile() - tmpfile.write('[beman_submodule]\n'.encode('utf-8')) - tmpfile.write( - 'remote=git@github.com:bemanproject/infra.git\n'.encode('utf-8')) - tmpfile.flush() - beman_submodule.parse_beman_submodule_file(tmpfile.name) - except: - threw = True - assert threw - invalid_file_missing_commit_hash() - def invalid_file_wrong_section(): - threw = False - try: - tmpfile = tempfile.NamedTemporaryFile() - tmpfile.write('[invalid]\n'.encode('utf-8')) - tmpfile.write( - 'remote=git@github.com:bemanproject/infra.git\n'.encode('utf-8')) - tmpfile.write( - 'commit_hash=9b88395a86c4290794e503e94d8213b6c442ae77\n'.encode('utf-8')) - tmpfile.flush() - beman_submodule.parse_beman_submodule_file(tmpfile.name) - except: - threw = True - assert threw - invalid_file_wrong_section() - -def test_get_beman_submodule(): - tmpdir = create_test_git_repository() - tmpdir2 = create_test_git_repository() - original_cwd = Path.cwd() - os.chdir(tmpdir2.name) - beman_submodule.add_command(tmpdir.name, 'foo', False) - assert beman_submodule.get_beman_submodule('foo') - os.remove('foo/.beman_submodule') - assert not beman_submodule.get_beman_submodule('foo') - os.chdir(original_cwd) - -def test_find_beman_submodules_in(): - tmpdir = create_test_git_repository() - tmpdir2 = create_test_git_repository() - original_cwd = Path.cwd() - os.chdir(tmpdir2.name) - beman_submodule.add_command(tmpdir.name, 'foo', False) - beman_submodule.add_command(tmpdir.name, 'bar', False) - beman_submodules = beman_submodule.find_beman_submodules_in(tmpdir2.name) - sha_process = subprocess.run( - ['git', 'rev-parse', 'HEAD'], capture_output=True, check=True, text=True, - cwd=tmpdir.name) - sha = sha_process.stdout.strip() - assert beman_submodules[0].dirpath == Path(tmpdir2.name) / 'bar' - assert beman_submodules[0].remote == tmpdir.name - assert beman_submodules[0].commit_hash == sha - assert beman_submodules[1].dirpath == Path(tmpdir2.name) / 'foo' - assert beman_submodules[1].remote == tmpdir.name - assert beman_submodules[1].commit_hash == sha - os.chdir(original_cwd) - -def test_cwd_git_repository_path(): - original_cwd = Path.cwd() - tmpdir = tempfile.TemporaryDirectory() - os.chdir(tmpdir.name) - assert not beman_submodule.cwd_git_repository_path() - subprocess.run(['git', 'init']) - assert beman_submodule.cwd_git_repository_path() == tmpdir.name - os.chdir(original_cwd) - -def test_clone_beman_submodule_into_tmpdir(): - tmpdir = create_test_git_repository() - tmpdir2 = create_test_git_repository() - original_cwd = Path.cwd() - os.chdir(tmpdir2.name) - sha_process = subprocess.run( - ['git', 'rev-parse', 'HEAD^'], capture_output=True, check=True, text=True, - cwd=tmpdir.name) - sha = sha_process.stdout.strip() - beman_submodule.add_command(tmpdir.name, 'foo', False) - module = beman_submodule.get_beman_submodule(Path(tmpdir2.name) / 'foo') - module.commit_hash = sha - tmpdir3 = beman_submodule.clone_beman_submodule_into_tmpdir(module, False) - assert not beman_submodule.directory_compare( - tmpdir.name, tmpdir3.name, ['.git'], False) - tmpdir4 = beman_submodule.clone_beman_submodule_into_tmpdir(module, True) - assert beman_submodule.directory_compare(tmpdir.name, tmpdir4.name, ['.git'], False) - subprocess.run( - ['git', 'reset', '--hard', sha], capture_output=True, check=True, - cwd=tmpdir.name) - assert beman_submodule.directory_compare(tmpdir.name, tmpdir3.name, ['.git'], False) - os.chdir(original_cwd) - -def test_get_paths(): - tmpdir = create_test_git_repository() - tmpdir2 = create_test_git_repository() - original_cwd = Path.cwd() - os.chdir(tmpdir2.name) - beman_submodule.add_command(tmpdir.name, 'foo', False) - module = beman_submodule.get_beman_submodule(Path(tmpdir2.name) / 'foo') - assert beman_submodule.get_paths(module) == set(['a.txt']) - os.chdir(original_cwd) - -def test_beman_submodule_status(): - tmpdir = create_test_git_repository() - tmpdir2 = create_test_git_repository() - original_cwd = Path.cwd() - os.chdir(tmpdir2.name) - beman_submodule.add_command(tmpdir.name, 'foo', False) - sha_process = subprocess.run( - ['git', 'rev-parse', 'HEAD'], capture_output=True, check=True, text=True, - cwd=tmpdir.name) - sha = sha_process.stdout.strip() - assert ' ' + sha + ' foo' == beman_submodule.beman_submodule_status( - beman_submodule.get_beman_submodule(Path(tmpdir2.name) / 'foo')) - with open(Path(tmpdir2.name) / 'foo' / 'a.txt', 'w') as f: - f.write('b') - assert '+ ' + sha + ' foo' == beman_submodule.beman_submodule_status( - beman_submodule.get_beman_submodule(Path(tmpdir2.name) / 'foo')) - os.chdir(original_cwd) - -def test_update_command_no_paths(): - tmpdir = create_test_git_repository() - tmpdir2 = create_test_git_repository() - original_cwd = Path.cwd() - os.chdir(tmpdir2.name) - orig_sha_process = subprocess.run( - ['git', 'rev-parse', 'HEAD'], capture_output=True, check=True, text=True, - cwd=tmpdir.name) - orig_sha = orig_sha_process.stdout.strip() - parent_sha_process = subprocess.run( - ['git', 'rev-parse', 'HEAD^'], capture_output=True, check=True, text=True, - cwd=tmpdir.name) - parent_sha = parent_sha_process.stdout.strip() - parent_parent_sha_process = subprocess.run( - ['git', 'rev-parse', 'HEAD^'], capture_output=True, check=True, text=True, - cwd=tmpdir.name) - parent_parent_sha = parent_parent_sha_process.stdout.strip() - subprocess.run( - ['git', 'reset', '--hard', parent_parent_sha], capture_output=True, check=True, - cwd=tmpdir.name) - beman_submodule.add_command(tmpdir.name, 'foo', False) - beman_submodule.add_command(tmpdir.name, 'bar', False) - subprocess.run( - ['git', 'reset', '--hard', orig_sha], capture_output=True, check=True, - cwd=tmpdir.name) - with open(Path(tmpdir2.name) / 'foo' / '.beman_submodule', 'w') as f: - f.write(f'[beman_submodule]\nremote={tmpdir.name}\ncommit_hash={parent_sha}\n') - with open(Path(tmpdir2.name) / 'bar' / '.beman_submodule', 'w') as f: - f.write(f'[beman_submodule]\nremote={tmpdir.name}\ncommit_hash={parent_sha}\n') - beman_submodule.update_command(False, None) - with open(Path(tmpdir2.name) / 'foo' / '.beman_submodule', 'r') as f: - assert f.read() == f'[beman_submodule]\nremote={tmpdir.name}\ncommit_hash={parent_sha}\n' - with open(Path(tmpdir2.name) / 'bar' / '.beman_submodule', 'r') as f: - assert f.read() == f'[beman_submodule]\nremote={tmpdir.name}\ncommit_hash={parent_sha}\n' - subprocess.run( - ['git', 'reset', '--hard', parent_sha], capture_output=True, check=True, - cwd=tmpdir.name) - assert beman_submodule.directory_compare( - tmpdir.name, Path(tmpdir2.name) / 'foo', ['.git', '.beman_submodule'], False) - assert beman_submodule.directory_compare( - tmpdir.name, Path(tmpdir2.name) / 'bar', ['.git', '.beman_submodule'], False) - subprocess.run( - ['git', 'reset', '--hard', orig_sha], capture_output=True, check=True, - cwd=tmpdir.name) - beman_submodule.update_command(True, None) - with open(Path(tmpdir2.name) / 'foo' / '.beman_submodule', 'r') as f: - assert f.read() == f'[beman_submodule]\nremote={tmpdir.name}\ncommit_hash={orig_sha}\n' - with open(Path(tmpdir2.name) / 'bar' / '.beman_submodule', 'r') as f: - assert f.read() == f'[beman_submodule]\nremote={tmpdir.name}\ncommit_hash={orig_sha}\n' - assert beman_submodule.directory_compare( - tmpdir.name, Path(tmpdir2.name) / 'foo', ['.git', '.beman_submodule'], False) - assert beman_submodule.directory_compare( - tmpdir.name, Path(tmpdir2.name) / 'bar', ['.git', '.beman_submodule'], False) - os.chdir(original_cwd) - -def test_update_command_with_path(): - tmpdir = create_test_git_repository() - tmpdir2 = create_test_git_repository() - original_cwd = Path.cwd() - os.chdir(tmpdir2.name) - orig_sha_process = subprocess.run( - ['git', 'rev-parse', 'HEAD'], capture_output=True, check=True, text=True, - cwd=tmpdir.name) - orig_sha = orig_sha_process.stdout.strip() - parent_sha_process = subprocess.run( - ['git', 'rev-parse', 'HEAD^'], capture_output=True, check=True, text=True, - cwd=tmpdir.name) - parent_sha = parent_sha_process.stdout.strip() - parent_parent_sha_process = subprocess.run( - ['git', 'rev-parse', 'HEAD^'], capture_output=True, check=True, text=True, - cwd=tmpdir.name) - parent_parent_sha = parent_parent_sha_process.stdout.strip() - subprocess.run( - ['git', 'reset', '--hard', parent_parent_sha], capture_output=True, check=True, - cwd=tmpdir.name) - tmpdir_parent_parent_copy = tempfile.TemporaryDirectory() - shutil.copytree(tmpdir.name, tmpdir_parent_parent_copy.name, dirs_exist_ok=True) - beman_submodule.add_command(tmpdir.name, 'foo', False) - beman_submodule.add_command(tmpdir.name, 'bar', False) - subprocess.run( - ['git', 'reset', '--hard', orig_sha], capture_output=True, check=True, - cwd=tmpdir.name) - with open(Path(tmpdir2.name) / 'foo' / '.beman_submodule', 'w') as f: - f.write(f'[beman_submodule]\nremote={tmpdir.name}\ncommit_hash={parent_sha}\n') - with open(Path(tmpdir2.name) / 'bar' / '.beman_submodule', 'w') as f: - f.write(f'[beman_submodule]\nremote={tmpdir.name}\ncommit_hash={parent_sha}\n') - beman_submodule.update_command(False, 'foo') - with open(Path(tmpdir2.name) / 'foo' / '.beman_submodule', 'r') as f: - assert f.read() == f'[beman_submodule]\nremote={tmpdir.name}\ncommit_hash={parent_sha}\n' - with open(Path(tmpdir2.name) / 'bar' / '.beman_submodule', 'r') as f: - assert f.read() == f'[beman_submodule]\nremote={tmpdir.name}\ncommit_hash={parent_sha}\n' - subprocess.run( - ['git', 'reset', '--hard', parent_sha], capture_output=True, check=True, - cwd=tmpdir.name) - assert beman_submodule.directory_compare( - tmpdir.name, Path(tmpdir2.name) / 'foo', ['.git', '.beman_submodule'], False) - assert beman_submodule.directory_compare( - tmpdir_parent_parent_copy.name, - Path(tmpdir2.name) / 'bar', ['.git', '.beman_submodule'], False) - subprocess.run( - ['git', 'reset', '--hard', orig_sha], capture_output=True, check=True, - cwd=tmpdir.name) - beman_submodule.update_command(True, 'foo') - with open(Path(tmpdir2.name) / 'foo' / '.beman_submodule', 'r') as f: - assert f.read() == f'[beman_submodule]\nremote={tmpdir.name}\ncommit_hash={orig_sha}\n' - with open(Path(tmpdir2.name) / 'bar' / '.beman_submodule', 'r') as f: - assert f.read() == f'[beman_submodule]\nremote={tmpdir.name}\ncommit_hash={parent_sha}\n' - assert beman_submodule.directory_compare( - tmpdir.name, Path(tmpdir2.name) / 'foo', ['.git', '.beman_submodule'], False) - assert beman_submodule.directory_compare( - tmpdir_parent_parent_copy.name, - Path(tmpdir2.name) / 'bar', ['.git', '.beman_submodule'], False) - os.chdir(original_cwd) - -def test_update_command_untracked_files(): - tmpdir = create_test_git_repository2() - tmpdir2 = create_test_git_repository() - original_cwd = Path.cwd(); - os.chdir(tmpdir2.name) - orig_sha_process = subprocess.run( - ['git', 'rev-parse', 'HEAD'], capture_output=True, check=True, text=True, - cwd=tmpdir.name) - orig_sha = orig_sha_process.stdout.strip() - parent_sha_process = subprocess.run( - ['git', 'rev-parse', 'HEAD^'], capture_output=True, check=True, text=True, - cwd=tmpdir.name) - parent_sha = parent_sha_process.stdout.strip() - os.makedirs(Path(tmpdir2.name) / 'foo') - (Path(tmpdir2.name) / 'foo' / 'c.txt').touch() - with open(Path(tmpdir2.name) / 'foo' / '.beman_submodule', 'w') as f: - f.write(f'[beman_submodule]\nremote={tmpdir.name}\ncommit_hash={parent_sha}\nallow_untracked_files=True') - beman_submodule.update_command(False, 'foo') - assert set(['./foo/a.txt', './foo/c.txt']) == set(glob.glob('./foo/*.txt')) - beman_submodule.update_command(True, 'foo') - assert set(['./foo/b.txt', './foo/c.txt']) == set(glob.glob('./foo/*.txt')) - os.chdir(original_cwd) - -def test_add_command(): - tmpdir = create_test_git_repository() - tmpdir2 = create_test_git_repository() - original_cwd = Path.cwd() - os.chdir(tmpdir2.name) - beman_submodule.add_command(tmpdir.name, 'foo', False) - sha_process = subprocess.run( - ['git', 'rev-parse', 'HEAD'], capture_output=True, check=True, text=True, - cwd=tmpdir.name) - sha = sha_process.stdout.strip() - assert beman_submodule.directory_compare( - tmpdir.name, Path(tmpdir2.name) / 'foo', ['.git', '.beman_submodule'], False) - with open(Path(tmpdir2.name) / 'foo' / '.beman_submodule', 'r') as f: - assert f.read() == f'[beman_submodule]\nremote={tmpdir.name}\ncommit_hash={sha}\n' - os.chdir(original_cwd) - -def test_add_command_untracked_files(): - tmpdir = create_test_git_repository() - tmpdir2 = create_test_git_repository() - original_cwd = Path.cwd() - os.chdir(tmpdir2.name) - os.makedirs(Path(tmpdir2.name) / 'foo') - (Path(tmpdir2.name) / 'foo' / 'c.txt').touch() - beman_submodule.add_command(tmpdir.name, 'foo', True) - assert set(['./foo/a.txt', './foo/c.txt']) == set(glob.glob('./foo/*.txt')) - os.chdir(original_cwd) - -def test_status_command_no_paths(capsys): - tmpdir = create_test_git_repository() - tmpdir2 = create_test_git_repository() - original_cwd = Path.cwd() - os.chdir(tmpdir2.name) - beman_submodule.add_command(tmpdir.name, 'foo', False) - beman_submodule.add_command(tmpdir.name, 'bar', False) - sha_process = subprocess.run( - ['git', 'rev-parse', 'HEAD'], capture_output=True, check=True, text=True, - cwd=tmpdir.name) - with open(Path(tmpdir2.name) / 'bar' / 'a.txt', 'w') as f: - f.write('b') - beman_submodule.status_command([]) - sha = sha_process.stdout.strip() - assert capsys.readouterr().out == '+ ' + sha + ' bar\n' + ' ' + sha + ' foo\n' - os.chdir(original_cwd) - -def test_status_command_with_path(capsys): - tmpdir = create_test_git_repository() - tmpdir2 = create_test_git_repository() - original_cwd = Path.cwd() - os.chdir(tmpdir2.name) - beman_submodule.add_command(tmpdir.name, 'foo', False) - beman_submodule.add_command(tmpdir.name, 'bar', False) - sha_process = subprocess.run( - ['git', 'rev-parse', 'HEAD'], capture_output=True, check=True, text=True, - cwd=tmpdir.name) - with open(Path(tmpdir2.name) / 'bar' / 'a.txt', 'w') as f: - f.write('b') - beman_submodule.status_command(['bar']) - sha = sha_process.stdout.strip() - assert capsys.readouterr().out == '+ ' + sha + ' bar\n' - os.chdir(original_cwd) - -def test_status_command_untracked_files(capsys): - tmpdir = create_test_git_repository() - tmpdir2 = create_test_git_repository() - original_cwd = Path.cwd() - os.chdir(tmpdir2.name) - beman_submodule.add_command(tmpdir.name, 'foo', True) - sha_process = subprocess.run( - ['git', 'rev-parse', 'HEAD'], capture_output=True, check=True, text=True, - cwd=tmpdir.name) - (Path(tmpdir2.name) / 'foo' / 'c.txt').touch() - beman_submodule.status_command(['foo']) - sha = sha_process.stdout.strip() - assert capsys.readouterr().out == ' ' + sha + ' foo\n' - os.chdir(original_cwd) - -def test_check_for_git(): - tmpdir = tempfile.TemporaryDirectory() - assert not beman_submodule.check_for_git(tmpdir.name) - fake_git_path = Path(tmpdir.name) / 'git' - with open(fake_git_path, 'w'): - pass - os.chmod(fake_git_path, stat.S_IRWXU) - assert beman_submodule.check_for_git(tmpdir.name) - -def test_parse_args(): - def plain_update(): - args = beman_submodule.parse_args(['update']) - assert args.command == 'update' - assert not args.remote - assert not args.beman_submodule_path - plain_update() - def update_remote(): - args = beman_submodule.parse_args(['update', '--remote']) - assert args.command == 'update' - assert args.remote - assert not args.beman_submodule_path - update_remote() - def update_path(): - args = beman_submodule.parse_args(['update', 'infra/']) - assert args.command == 'update' - assert not args.remote - assert args.beman_submodule_path == 'infra/' - update_path() - def update_path_remote(): - args = beman_submodule.parse_args(['update', '--remote', 'infra/']) - assert args.command == 'update' - assert args.remote - assert args.beman_submodule_path == 'infra/' - update_path_remote() - def plain_add(): - args = beman_submodule.parse_args(['add', 'git@github.com:bemanproject/infra.git']) - assert args.command == 'add' - assert args.repository == 'git@github.com:bemanproject/infra.git' - assert not args.path - plain_add() - def add_path(): - args = beman_submodule.parse_args( - ['add', 'git@github.com:bemanproject/infra.git', 'infra/']) - assert args.command == 'add' - assert args.repository == 'git@github.com:bemanproject/infra.git' - assert args.path == 'infra/' - add_path() - def plain_status(): - args = beman_submodule.parse_args(['status']) - assert args.command == 'status' - assert args.paths == [] - plain_status() - def status_one_module(): - args = beman_submodule.parse_args(['status', 'infra/']) - assert args.command == 'status' - assert args.paths == ['infra/'] - status_one_module() - def status_multiple_modules(): - args = beman_submodule.parse_args(['status', 'infra/', 'foobar/']) - assert args.command == 'status' - assert args.paths == ['infra/', 'foobar/'] - status_multiple_modules() From a09c5ce64bdb8df269ab2d745f8c39530a8b37ed Mon Sep 17 00:00:00 2001 From: ClausKlein Date: Mon, 16 Feb 2026 12:31:15 +0100 Subject: [PATCH 175/199] Refactory beman-install-library cmake module --- cmake/Config.cmake.in | 12 ++ cmake/beman-install-library.cmake | 348 ++++++++++++++++++++++++++++++ 2 files changed, 360 insertions(+) create mode 100644 cmake/Config.cmake.in create mode 100644 cmake/beman-install-library.cmake diff --git a/cmake/Config.cmake.in b/cmake/Config.cmake.in new file mode 100644 index 0000000..81adf80 --- /dev/null +++ b/cmake/Config.cmake.in @@ -0,0 +1,12 @@ +# cmake/Config.cmake.in -*-makefile-*- +# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + +include(CMakeFindDependencyMacro) + +@BEMAN_FIND_DEPENDENCIES@ + +@PACKAGE_INIT@ + +include(${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@-targets.cmake) + +check_required_components(@PROJECT_NAME@) diff --git a/cmake/beman-install-library.cmake b/cmake/beman-install-library.cmake new file mode 100644 index 0000000..5581bdd --- /dev/null +++ b/cmake/beman-install-library.cmake @@ -0,0 +1,348 @@ +# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + +cmake_minimum_required(VERSION 3.30) + +include_guard(GLOBAL) + +include(CMakePackageConfigHelpers) +include(GNUInstallDirs) + +# beman_install_library +# ===================== +# +# Installs a library (or set of targets) along with headers, C++ modules, +# and optional CMake package configuration files. +# +# Usage: +# ------ +# beman_install_library( +# 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 + # 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) From c41f9bfb8e3943f6abcf6b991a7051ee77654ac7 Mon Sep 17 00:00:00 2001 From: ClausKlein Date: Mon, 9 Mar 2026 09:24:34 +0100 Subject: [PATCH 176/199] install CXX_MODULES_BMI too --- cmake/beman-install-library.cmake | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/cmake/beman-install-library.cmake b/cmake/beman-install-library.cmake index 5581bdd..9b01af3 100644 --- a/cmake/beman-install-library.cmake +++ b/cmake/beman-install-library.cmake @@ -116,6 +116,10 @@ function(beman_install_library name) 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}") @@ -232,8 +236,9 @@ function(beman_install_library name) 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" + DESTINATION + ${_config_install_dir}/bmi-${CMAKE_CXX_COMPILER_ID}_$ + COMPONENT "${install_component_name}_Development" ) else() install( @@ -304,7 +309,7 @@ function(beman_install_library name) # expand dependencies # ---------------------------------------- set(_beman_find_deps "") - foreach(dep IN ITEMS ${BEMAN_DEPENDENCIES}) + foreach(dep IN LISTS BEMAN_DEPENDENCIES) message( VERBOSE "beman-install-library(${name}): Add find_dependency(${dep})" From 08da99a878c680754649c100b8a8a8f873937b3a Mon Sep 17 00:00:00 2001 From: Edward Nolan Date: Sun, 1 Mar 2026 21:19:30 -0500 Subject: [PATCH 177/199] Remove cmake_minimum_required directive from beman-install-library.cmake This statement affects a project-wide setting, so it doesn't belong here. Instead we should ensure that all the individual libraries use correct cmake_minimum_required versions. See beman/exemplar commit f296dd51ba592a25c6453f19284208c2147599ce, which bumps the minimum CMake version to 3.30. --- cmake/beman-install-library.cmake | 2 -- 1 file changed, 2 deletions(-) diff --git a/cmake/beman-install-library.cmake b/cmake/beman-install-library.cmake index 9b01af3..c68b4e7 100644 --- a/cmake/beman-install-library.cmake +++ b/cmake/beman-install-library.cmake @@ -1,7 +1,5 @@ # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -cmake_minimum_required(VERSION 3.30) - include_guard(GLOBAL) include(CMakePackageConfigHelpers) From 32efddb2bed16ad85970beefb74ad8648ec7ae59 Mon Sep 17 00:00:00 2001 From: Edward Nolan Date: Mon, 2 Mar 2026 02:41:51 +0000 Subject: [PATCH 178/199] Remove dead _lib_install_dir/_bin_install_dir references These variables were commented out and never set, but still referenced in both install(TARGETS) blocks. Without VERSION_SUFFIX, they expanded to empty strings, silently falling through to CMake defaults. Remove the dead definitions and the dangling references so the code matches its actual behavior. Co-Authored-By: Claude Opus 4.6 --- cmake/beman-install-library.cmake | 25 ++++--------------------- 1 file changed, 4 insertions(+), 21 deletions(-) diff --git a/cmake/beman-install-library.cmake b/cmake/beman-install-library.cmake index c68b4e7..b667499 100644 --- a/cmake/beman-install-library.cmake +++ b/cmake/beman-install-library.cmake @@ -114,16 +114,9 @@ function(beman_install_library name) 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 @@ -218,16 +211,11 @@ function(beman_install_library name) install( TARGETS "${_tgt}" EXPORT ${BEMAN_EXPORT_NAME} - ARCHIVE - ${_lib_install_dir} - COMPONENT "${install_component_name}_Development" + ARCHIVE 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" + RUNTIME COMPONENT "${install_component_name}_Runtime" ${_install_header_set_args} FILE_SET ${_module_sets} DESTINATION "${BEMAN_DESTINATION}" @@ -242,16 +230,11 @@ function(beman_install_library name) install( TARGETS "${_tgt}" EXPORT ${BEMAN_EXPORT_NAME} - ARCHIVE - ${_lib_install_dir} - COMPONENT "${install_component_name}_Development" + ARCHIVE 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" + RUNTIME COMPONENT "${install_component_name}_Runtime" ${_install_header_set_args} ) endif() From 14f9d4b88c4069e7327cd2a01e127b10e9511962 Mon Sep 17 00:00:00 2001 From: Edward Nolan Date: Mon, 2 Mar 2026 02:53:34 +0000 Subject: [PATCH 179/199] Fix config file installation precedence MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The previous logic used option() to create a per-package cache variable defaulting to ON, then checked it in an if/elseif chain before the allow-list. Since option() always defined the variable, the allow-list branch was unreachable — BEMAN_INSTALL_CONFIG_FILE_PACKAGES was silently ignored. Restore the original precedence: 1. Per-package var (if user explicitly set it, wins in either direction) 2. Allow-list (if defined, packages not in it are excluded) 3. Default: ON Also removes the option() call and dead "if(NOT DEFINED)" block that obscured the logic. Users who need the per-package override can pass it directly via -D on the command line. Co-Authored-By: Claude Opus 4.6 --- cmake/beman-install-library.cmake | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/cmake/beman-install-library.cmake b/cmake/beman-install-library.cmake index b667499..1b921d5 100644 --- a/cmake/beman-install-library.cmake +++ b/cmake/beman-install-library.cmake @@ -255,6 +255,11 @@ function(beman_install_library name) # ---------------------------------------- # Config file installation logic + # + # Precedence (highest to lowest): + # 1. Per-package variable _INSTALL_CONFIG_FILE_PACKAGE + # 2. Allow-list BEMAN_INSTALL_CONFIG_FILE_PACKAGES (if defined) + # 3. Default: ON # ---------------------------------------- string(TOUPPER "${name}" _pkg_upper) string(REPLACE "." "_" _pkg_prefix "${_pkg_upper}") @@ -267,25 +272,21 @@ function(beman_install_library name) 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) + # Default: install config files + set(_install_config ON) - 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) + # If the allow-list is defined, only install for packages in the list + if(DEFINED BEMAN_INSTALL_CONFIG_FILE_PACKAGES) + if(NOT "${name}" IN_LIST BEMAN_INSTALL_CONFIG_FILE_PACKAGES) + set(_install_config OFF) endif() endif() + # Per-package override takes highest precedence + if(DEFINED ${_pkg_var}) + set(_install_config ${${_pkg_var}}) + endif() + # ---------------------------------------- # expand dependencies # ---------------------------------------- From 5ab1d7be7a39783653a96eb031b42c3c0fe053c2 Mon Sep 17 00:00:00 2001 From: Edward Nolan Date: Mon, 2 Mar 2026 03:02:47 +0000 Subject: [PATCH 180/199] Remove VERSION_SUFFIX mechanism Versioned install destinations (e.g. include/beman-0.1.0/) are a package manager concern, not something the build system should attempt. Supporting it here creates a combinatorial explosion of configurations without solving the underlying problem. Removes the VERSION_SUFFIX option, its keyword parsing, the conditional _version_suffix/_include_install_dir logic, and all references. Co-Authored-By: Claude Opus 4.6 --- cmake/beman-install-library.cmake | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/cmake/beman-install-library.cmake b/cmake/beman-install-library.cmake index 1b921d5..8a6c5a1 100644 --- a/cmake/beman-install-library.cmake +++ b/cmake/beman-install-library.cmake @@ -19,7 +19,6 @@ include(GNUInstallDirs) # [NAMESPACE ] # [EXPORT_NAME ] # [DESTINATION ] -# [VERSION_SUFFIX] # ) # # Arguments: @@ -50,9 +49,6 @@ include(GNUInstallDirs) # 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 # ----- # @@ -86,7 +82,6 @@ function(beman_install_library name) # ---------------------------- # Argument parsing # ---------------------------- - set(options VERSION_SUFFIX) set(oneValueArgs NAMESPACE EXPORT_NAME DESTINATION) set(multiValueArgs TARGETS DEPENDENCIES) @@ -113,13 +108,7 @@ function(beman_install_library name) return() endif() - # gersemi: off - if(BEMAN_VERSION_SUFFIX) - set(_version_suffix "-${PROJECT_VERSION}") - set(_include_install_dir DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/beman${_version_suffix}) - endif() - set(_config_install_dir "${CMAKE_INSTALL_LIBDIR}/cmake/${name}${_version_suffix}") - # gersemi: on + set(_config_install_dir "${CMAKE_INSTALL_LIBDIR}/cmake/${name}") # ---------------------------- # Defaults @@ -192,7 +181,6 @@ function(beman_install_library name) _install_header_set_args FILE_SET "${_install_header_set}" - ${_include_install_dir} COMPONENT "${install_component_name}_Development" ) From 63cb577f6484f13ce3349de49ad5ce27e20bf1da Mon Sep 17 00:00:00 2001 From: beman-dev Date: Sun, 15 Mar 2026 16:30:35 -0400 Subject: [PATCH 181/199] Remove beman-install-library-config.cmake This is superseded by beman-install-library.cmake. --- cmake/beman-install-library-config.cmake | 169 ----------------------- 1 file changed, 169 deletions(-) delete mode 100644 cmake/beman-install-library-config.cmake diff --git a/cmake/beman-install-library-config.cmake b/cmake/beman-install-library-config.cmake deleted file mode 100644 index c40959d..0000000 --- a/cmake/beman-install-library-config.cmake +++ /dev/null @@ -1,169 +0,0 @@ -# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -include_guard(GLOBAL) - -# This file defines the function `beman_install_library` which is used to -# install a library target and its headers, along with optional CMake -# configuration files. -# -# The function is designed to be reusable across different Beman libraries. - -function(beman_install_library name) - # Usage - # ----- - # - # beman_install_library(NAME) - # - # Brief - # ----- - # - # This function installs the specified library target and its headers. - # It also handles the installation of the CMake configuration files if needed. - # - # CMake variables - # --------------- - # - # Note that configuration of the installation is generally controlled by CMake - # cache variables so that they can be controlled by the user or tool running the - # `cmake` command. Neither `CMakeLists.txt` nor `*.cmake` files should set these - # variables directly. - # - # - BEMAN_INSTALL_CONFIG_FILE_PACKAGES: - # List of packages that require config file installation. - # If the package name is in this list, it will install the config file. - # - # - _INSTALL_CONFIG_FILE_PACKAGE: - # Boolean to control config file installation for the specific library. - # The prefix `` is the uppercased name of the library with dots - # replaced by underscores. - # - if(NOT TARGET "${name}") - message(FATAL_ERROR "Target '${name}' does not exist.") - endif() - - if(NOT ARGN STREQUAL "") - message( - FATAL_ERROR - "beman_install_library does not accept extra arguments: ${ARGN}" - ) - endif() - - # Given foo.bar, the component name is bar - string(REPLACE "." ";" name_parts "${name}") - # 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 expects a name of the form 'beman.', got '${name}'" - ) - endif() - - set(target_name "${name}") - set(install_component_name "${name}") - set(export_name "${name}") - set(package_name "${name}") - list(GET name_parts -1 component_name) - - install( - TARGETS "${target_name}" - COMPONENT "${install_component_name}" - EXPORT "${export_name}" - FILE_SET HEADERS - ) - - set_target_properties( - "${target_name}" - PROPERTIES EXPORT_NAME "${component_name}" - ) - - include(GNUInstallDirs) - - # Determine the prefix for project-specific variables - string(TOUPPER "${name}" project_prefix) - string(REPLACE "." "_" project_prefix "${project_prefix}") - - option( - ${project_prefix}_INSTALL_CONFIG_FILE_PACKAGE - "Enable creating and installing a CMake config-file package. Default: ON. Values: { ON, OFF }." - ON - ) - - # By default, install the config package - set(install_config_package ON) - - # Turn OFF installation of config package by default if, - # in order of precedence: - # 1. The specific package variable is set to OFF - # 2. The package name is not in the list of packages to install config files - if(DEFINED BEMAN_INSTALL_CONFIG_FILE_PACKAGES) - if( - NOT "${install_component_name}" - IN_LIST - BEMAN_INSTALL_CONFIG_FILE_PACKAGES - ) - set(install_config_package OFF) - endif() - endif() - if(DEFINED ${project_prefix}_INSTALL_CONFIG_FILE_PACKAGE) - set(install_config_package - ${${project_prefix}_INSTALL_CONFIG_FILE_PACKAGE} - ) - endif() - - if(install_config_package) - message( - DEBUG - "beman-install-library: Installing a config package for '${name}'" - ) - - include(CMakePackageConfigHelpers) - - find_file( - config_file_template - NAMES "${package_name}-config.cmake.in" - PATHS "${PROJECT_SOURCE_DIR}/cmake" - NO_DEFAULT_PATH - NO_CACHE - REQUIRED - ) - set(config_package_file - "${CMAKE_CURRENT_BINARY_DIR}/${package_name}-config.cmake" - ) - set(package_install_dir "${CMAKE_INSTALL_LIBDIR}/cmake/${package_name}") - configure_package_config_file( - "${config_file_template}" - "${config_package_file}" - INSTALL_DESTINATION "${package_install_dir}" - PATH_VARS PROJECT_NAME PROJECT_VERSION - ) - - set(config_version_file - "${CMAKE_CURRENT_BINARY_DIR}/${package_name}-config-version.cmake" - ) - write_basic_package_version_file( - "${config_version_file}" - VERSION "${PROJECT_VERSION}" - COMPATIBILITY ExactVersion - ) - - install( - FILES "${config_package_file}" "${config_version_file}" - DESTINATION "${package_install_dir}" - COMPONENT "${install_component_name}" - ) - - set(config_targets_file "${package_name}-targets.cmake") - install( - EXPORT "${export_name}" - DESTINATION "${package_install_dir}" - NAMESPACE beman:: - FILE "${config_targets_file}" - COMPONENT "${install_component_name}" - ) - else() - message( - DEBUG - "beman-install-library: Not installing a config package for '${name}'" - ) - endif() -endfunction() From 4af649a890557a655a47af11ed69844bb9b3d4e5 Mon Sep 17 00:00:00 2001 From: ClausKlein Date: Wed, 25 Mar 2026 19:10:42 +0100 Subject: [PATCH 182/199] Use INTERFACE_CXX_MODULE_SETS to install only a PUBLIC module --- cmake/beman-install-library.cmake | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/cmake/beman-install-library.cmake b/cmake/beman-install-library.cmake index 8a6c5a1..a77ee1a 100644 --- a/cmake/beman-install-library.cmake +++ b/cmake/beman-install-library.cmake @@ -56,7 +56,7 @@ include(GNUInstallDirs) # 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 +# needed. If the given targets has a PUBLIC FILE_SET CXX_MODULE, it will also # installed to the given DESTINATION # # Cache variables: @@ -72,7 +72,7 @@ include(GNUInstallDirs) # Caveats # ------- # -# **Only one `FILE_SET CXX_MODULES` is yet supported to install with this +# **Only one `PUBLIC 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 @@ -189,12 +189,12 @@ function(beman_install_library name) 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) + # Detect presence of PUBLIC C++ module file sets. Note: exact one is expected! + get_target_property(_module_sets "${_tgt}" INTERFACE_CXX_MODULE_SETS) if(_module_sets) message( VERBOSE - "beman-install-library(${name}): '${_tgt}' has CXX_MODULE_SETS=${_module_sets}" + "beman-install-library(${name}): '${_tgt}' has INTERFACE_CXX_MODULE_SETS=${_module_sets}" ) install( TARGETS "${_tgt}" From 54dcdad8b661a405a6ac06453f0f06da5d30ba5c Mon Sep 17 00:00:00 2001 From: Edward Nolan Date: Wed, 1 Apr 2026 12:43:33 -0400 Subject: [PATCH 183/199] Add workaround for Catch2 to use-fetch-content.cmake Previously, when the library was brought in via FetchContent, users would need to add this line: list(APPEND CMAKE_MODULE_PATH ${Catch2_SOURCE_DIR}/extras) This commit isolates the workaround to use-fetch-content.cmake, as it's not needed when Catch2 is installed on the system or brought in via another, non-FetchContent-based method. Co-Authored-By: Claude Opus 4.6 --- cmake/use-fetch-content.cmake | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/cmake/use-fetch-content.cmake b/cmake/use-fetch-content.cmake index 4ed4839..eb22be4 100644 --- a/cmake/use-fetch-content.cmake +++ b/cmake/use-fetch-content.cmake @@ -170,6 +170,18 @@ function(BemanExemplar_provideDependency method package_name) set(INSTALL_GTEST OFF) # Disable GoogleTest installation FetchContent_MakeAvailable("${BemanExemplar_name}") + # Catch2's CTest integration module isn't on CMAKE_MODULE_PATH + # when brought in via FetchContent. Add it so that + # `include(Catch)` works. + if(BemanExemplar_pkgName STREQUAL "Catch2") + list( + APPEND + CMAKE_MODULE_PATH + "${${BemanExemplar_name}_SOURCE_DIR}/extras" + ) + set(CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH}" PARENT_SCOPE) + endif() + # Important! _FOUND tells CMake that `find_package` is # not needed for this package anymore set("${BemanExemplar_pkgName}_FOUND" TRUE PARENT_SCOPE) From 752a065a7a0c4cef7f1fe844a5c08d73f3d9bc7d Mon Sep 17 00:00:00 2001 From: Steve Downey Date: Thu, 9 Apr 2026 13:01:42 +0100 Subject: [PATCH 184/199] Installation tweaks for library Name option variables after module. Install based on package name rather than project name. --- cmake/Config.cmake.in | 4 ++-- cmake/beman-install-library.cmake | 38 +++++++++++++++---------------- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/cmake/Config.cmake.in b/cmake/Config.cmake.in index 81adf80..c1add3e 100644 --- a/cmake/Config.cmake.in +++ b/cmake/Config.cmake.in @@ -7,6 +7,6 @@ include(CMakeFindDependencyMacro) @PACKAGE_INIT@ -include(${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@-targets.cmake) +include(${CMAKE_CURRENT_LIST_DIR}/@BEMAN_INSTALL_BASE_PKG_NAME@-targets.cmake) -check_required_components(@PROJECT_NAME@) +check_required_components(@BEMAN_INSTALL_BASE_PKG_NAME@) diff --git a/cmake/beman-install-library.cmake b/cmake/beman-install-library.cmake index a77ee1a..dc5a4d1 100644 --- a/cmake/beman-install-library.cmake +++ b/cmake/beman-install-library.cmake @@ -86,14 +86,14 @@ function(beman_install_library name) set(multiValueArgs TARGETS DEPENDENCIES) cmake_parse_arguments( - BEMAN + BEMAN_INSTALL "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN} ) - if(NOT BEMAN_TARGETS) + if(NOT BEMAN_INSTALL_TARGETS) message( FATAL_ERROR "beman_install_library(${name}): TARGETS must be specified" @@ -103,7 +103,7 @@ function(beman_install_library name) if(CMAKE_SKIP_INSTALL_RULES) message( WARNING - "beman_install_library(${name}): not installing targets '${BEMAN_TARGETS}' due to CMAKE_SKIP_INSTALL_RULES" + "beman_install_library(${name}): not installing targets '${BEMAN_INSTALL_TARGETS}' due to CMAKE_SKIP_INSTALL_RULES" ) return() endif() @@ -113,16 +113,16 @@ function(beman_install_library name) # ---------------------------- # Defaults # ---------------------------- - if(NOT BEMAN_NAMESPACE) - set(BEMAN_NAMESPACE "beman::") + if(NOT BEMAN_INSTALL_NAMESPACE) + set(BEMAN_INSTALL_NAMESPACE "beman::") endif() - if(NOT BEMAN_EXPORT_NAME) - set(BEMAN_EXPORT_NAME "${name}-targets") + if(NOT BEMAN_INSTALL_EXPORT_NAME) + set(BEMAN_INSTALL_EXPORT_NAME "${name}-targets") endif() - if(NOT BEMAN_DESTINATION) - set(BEMAN_DESTINATION "${_config_install_dir}/modules") + if(NOT BEMAN_INSTALL_DESTINATION) + set(BEMAN_INSTALL_DESTINATION "${_config_install_dir}/modules") endif() string(REPLACE "beman." "" install_component_name "${name}") @@ -134,7 +134,7 @@ function(beman_install_library name) # -------------------------------------------------- # Install each target with all of its file sets # -------------------------------------------------- - foreach(_tgt IN LISTS BEMAN_TARGETS) + foreach(_tgt IN LISTS BEMAN_INSTALL_TARGETS) if(NOT TARGET "${_tgt}") message( WARNING @@ -177,8 +177,7 @@ function(beman_install_library name) ) foreach(_install_header_set IN LISTS _available_header_sets) list( - APPEND - _install_header_set_args + APPEND _install_header_set_args FILE_SET "${_install_header_set}" COMPONENT @@ -198,7 +197,7 @@ function(beman_install_library name) ) install( TARGETS "${_tgt}" - EXPORT ${BEMAN_EXPORT_NAME} + EXPORT ${BEMAN_INSTALL_EXPORT_NAME} ARCHIVE COMPONENT "${install_component_name}_Development" LIBRARY COMPONENT "${install_component_name}_Runtime" @@ -206,7 +205,7 @@ function(beman_install_library name) RUNTIME COMPONENT "${install_component_name}_Runtime" ${_install_header_set_args} FILE_SET ${_module_sets} - DESTINATION "${BEMAN_DESTINATION}" + DESTINATION "${BEMAN_INSTALL_DESTINATION}" COMPONENT "${install_component_name}_Development" # NOTE: There's currently no convention for this location! CK CXX_MODULES_BMI @@ -217,7 +216,7 @@ function(beman_install_library name) else() install( TARGETS "${_tgt}" - EXPORT ${BEMAN_EXPORT_NAME} + EXPORT ${BEMAN_INSTALL_EXPORT_NAME} ARCHIVE COMPONENT "${install_component_name}_Development" LIBRARY COMPONENT "${install_component_name}_Runtime" @@ -233,8 +232,8 @@ function(beman_install_library name) # -------------------------------------------------- # gersemi: off install( - EXPORT ${BEMAN_EXPORT_NAME} - NAMESPACE ${BEMAN_NAMESPACE} + EXPORT ${BEMAN_INSTALL_EXPORT_NAME} + NAMESPACE ${BEMAN_INSTALL_NAMESPACE} CXX_MODULES_DIRECTORY cxx-modules DESTINATION ${_config_install_dir} COMPONENT "${install_component_name}_Development" @@ -279,19 +278,20 @@ function(beman_install_library name) # expand dependencies # ---------------------------------------- set(_beman_find_deps "") - foreach(dep IN LISTS BEMAN_DEPENDENCIES) + foreach(dep IN LISTS BEMAN_INSTALL_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}") + set(BEMAN_INSTALL_FIND_DEPENDENCIES "${_beman_find_deps}") # ---------------------------------------- # Generate + install config files # ---------------------------------------- if(_install_config) + set(BEMAN_INSTALL_BASE_PKG_NAME ${name}) configure_package_config_file( "${CMAKE_CURRENT_FUNCTION_LIST_DIR}/Config.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/${name}-config.cmake" From a8006d61c64cb5ba7461529ef83c85ce9eb91ea5 Mon Sep 17 00:00:00 2001 From: Steve Downey Date: Thu, 9 Apr 2026 18:42:54 +0100 Subject: [PATCH 185/199] Update cmake/beman-install-library.cmake I have no real opinion about cmake formatting at this point other than wishing it was automated everywhere. Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- cmake/beman-install-library.cmake | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cmake/beman-install-library.cmake b/cmake/beman-install-library.cmake index dc5a4d1..96305fa 100644 --- a/cmake/beman-install-library.cmake +++ b/cmake/beman-install-library.cmake @@ -177,7 +177,8 @@ function(beman_install_library name) ) foreach(_install_header_set IN LISTS _available_header_sets) list( - APPEND _install_header_set_args + APPEND + _install_header_set_args FILE_SET "${_install_header_set}" COMPONENT From d095e60ecabc477e8e81a23156b194bf4a38c080 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 12 Apr 2026 05:43:06 +0000 Subject: [PATCH 186/199] Bump the github-actions group with 2 updates Bumps the github-actions group with 2 updates: [step-security/harden-runner](https://github.com/step-security/harden-runner) and [step-security/changed-files](https://github.com/step-security/changed-files). Updates `step-security/harden-runner` from 2.16.1 to 2.17.0 - [Release notes](https://github.com/step-security/harden-runner/releases) - [Commits](https://github.com/step-security/harden-runner/compare/fe104658747b27e96e4f7e80cd0a94068e53901d...f808768d1510423e83855289c910610ca9b43176) Updates `step-security/changed-files` from 47.0.1 to 47.0.5 - [Release notes](https://github.com/step-security/changed-files/releases) - [Commits](https://github.com/step-security/changed-files/compare/60967b822d3001fa82242f8d6b4ed46bc3600a68...2e07db73e5ccdb319b9a6c7766bd46d39d304bad) --- updated-dependencies: - dependency-name: step-security/harden-runner dependency-version: 2.17.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: github-actions - dependency-name: step-security/changed-files dependency-version: 47.0.5 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: github-actions ... Signed-off-by: dependabot[bot] --- .github/workflows/ci.yml | 4 ++-- .github/workflows/codeql.yml | 2 +- .github/workflows/doxygen-gh-pages.yml | 2 +- .github/workflows/ossf-scorecard-analysis.yml | 2 +- .github/workflows/pre-commit.yml | 6 +++--- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d74f9e4..ec9b1d2 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -36,7 +36,7 @@ jobs: - {name: "Ubuntu GCC 12", tag: "gcc:12", toolchain: "gcc-12", cmake_args: "-G \"Ninja Multi-Config\" -DCMAKE_CONFIGURATION_TYPES=\"RelWithDebInfo;Asan\" -DCMAKE_PREFIX_PATH=\"./infra/cmake\" "} steps: - name: Harden the runner (Audit all outbound calls) - uses: step-security/harden-runner@fe104658747b27e96e4f7e80cd0a94068e53901d # v2.16.1 + uses: step-security/harden-runner@f808768d1510423e83855289c910610ca9b43176 # v2.17.0 with: egress-policy: audit @@ -128,7 +128,7 @@ jobs: steps: # See https://github.com/cli/cli/issues/5075 - name: Harden the runner (Audit all outbound calls) - uses: step-security/harden-runner@fe104658747b27e96e4f7e80cd0a94068e53901d # v2.16.1 + uses: step-security/harden-runner@f808768d1510423e83855289c910610ca9b43176 # v2.17.0 with: egress-policy: audit diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index ca17635..e421108 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -59,7 +59,7 @@ jobs: # your codebase is analyzed, see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages steps: - name: Harden the runner (Audit all outbound calls) - uses: step-security/harden-runner@fe104658747b27e96e4f7e80cd0a94068e53901d # v2.16.1 + uses: step-security/harden-runner@f808768d1510423e83855289c910610ca9b43176 # v2.17.0 with: egress-policy: audit diff --git a/.github/workflows/doxygen-gh-pages.yml b/.github/workflows/doxygen-gh-pages.yml index e3df8ec..0ee57b9 100644 --- a/.github/workflows/doxygen-gh-pages.yml +++ b/.github/workflows/doxygen-gh-pages.yml @@ -16,7 +16,7 @@ jobs: contents: write steps: - name: Harden the runner (Audit all outbound calls) - uses: step-security/harden-runner@fe104658747b27e96e4f7e80cd0a94068e53901d # v2.16.1 + uses: step-security/harden-runner@f808768d1510423e83855289c910610ca9b43176 # v2.17.0 with: egress-policy: audit diff --git a/.github/workflows/ossf-scorecard-analysis.yml b/.github/workflows/ossf-scorecard-analysis.yml index f71a547..7fc4ffc 100644 --- a/.github/workflows/ossf-scorecard-analysis.yml +++ b/.github/workflows/ossf-scorecard-analysis.yml @@ -22,7 +22,7 @@ jobs: steps: - name: Harden the runner (Audit all outbound calls) - uses: step-security/harden-runner@fe104658747b27e96e4f7e80cd0a94068e53901d # v2.16.1 + uses: step-security/harden-runner@f808768d1510423e83855289c910610ca9b43176 # v2.17.0 with: egress-policy: audit diff --git a/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml index 592143d..f6da40b 100644 --- a/.github/workflows/pre-commit.yml +++ b/.github/workflows/pre-commit.yml @@ -19,7 +19,7 @@ jobs: steps: - name: Harden the runner (Audit all outbound calls) - uses: step-security/harden-runner@fe104658747b27e96e4f7e80cd0a94068e53901d # v2.16.1 + uses: step-security/harden-runner@f808768d1510423e83855289c910610ca9b43176 # v2.17.0 with: egress-policy: audit @@ -50,7 +50,7 @@ jobs: steps: - name: Harden the runner (Audit all outbound calls) - uses: step-security/harden-runner@fe104658747b27e96e4f7e80cd0a94068e53901d # v2.16.1 + uses: step-security/harden-runner@f808768d1510423e83855289c910610ca9b43176 # v2.17.0 with: egress-policy: audit @@ -72,7 +72,7 @@ jobs: # we only lint on the changed file in PR. - name: Get Changed Files id: changed-files - uses: step-security/changed-files@60967b822d3001fa82242f8d6b4ed46bc3600a68 # v47.0.1 + uses: step-security/changed-files@2e07db73e5ccdb319b9a6c7766bd46d39d304bad # v47.0.5 - uses: pre-commit/action@2c7b3805fd2a0fd8c1884dcaebf91fc102a13ecd # v3.0.1 id: run-pre-commit From f6318dd99163879b86a769f2a30c62acf843c829 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 12 Apr 2026 05:43:22 +0000 Subject: [PATCH 187/199] Bump actions/upload-artifact in the github-owned-actions group Bumps the github-owned-actions group with 1 update: [actions/upload-artifact](https://github.com/actions/upload-artifact). Updates `actions/upload-artifact` from 7.0.0 to 7.0.1 - [Release notes](https://github.com/actions/upload-artifact/releases) - [Commits](https://github.com/actions/upload-artifact/compare/bbbca2ddaa5d8feaa63e36b76fdaad77386f024f...043fb46d1a93c77aae656e7c1c64a875d1fc6a0a) --- updated-dependencies: - dependency-name: actions/upload-artifact dependency-version: 7.0.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: github-owned-actions ... Signed-off-by: dependabot[bot] --- .github/workflows/ossf-scorecard-analysis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ossf-scorecard-analysis.yml b/.github/workflows/ossf-scorecard-analysis.yml index f71a547..de2c3d6 100644 --- a/.github/workflows/ossf-scorecard-analysis.yml +++ b/.github/workflows/ossf-scorecard-analysis.yml @@ -47,7 +47,7 @@ jobs: # uploads of run results in SARIF format to the repository Actions tab. # https://docs.github.com/en/actions/advanced-guides/storing-workflow-data-as-artifacts - name: "Upload artifact" - uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: SARIF file path: results.sarif From 0ed07f656f0a752db1aaa0d28fcd7dedac7efe9f Mon Sep 17 00:00:00 2001 From: beman-dev Date: Sun, 12 Apr 2026 14:55:00 +0000 Subject: [PATCH 188/199] Fix BEMAN_FIND_DEPENDENCIES variable name in Config.cmake.in Commit 752a065 renamed the BEMAN prefix to BEMAN_INSTALL in beman-install-library.cmake but did not apply the rename to Config.cmake.in, causing @BEMAN_FIND_DEPENDENCIES@ to expand to an empty string and silently dropping all dependency declarations. Fixes #43 Co-Authored-By: Claude Opus 4.6 --- cmake/Config.cmake.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/Config.cmake.in b/cmake/Config.cmake.in index c1add3e..3f1341c 100644 --- a/cmake/Config.cmake.in +++ b/cmake/Config.cmake.in @@ -3,7 +3,7 @@ include(CMakeFindDependencyMacro) -@BEMAN_FIND_DEPENDENCIES@ +@BEMAN_INSTALL_FIND_DEPENDENCIES@ @PACKAGE_INIT@ From 4684dc7fbbc45e1005b9d29f6b388a8aa91ab445 Mon Sep 17 00:00:00 2001 From: Steve Downey Date: Sat, 7 Feb 2026 14:46:13 -0500 Subject: [PATCH 189/199] Add BuildTelemetry cmake module Add tools for configuring and using the cmake_instrumentation available as an experimental feature in CMake 4.2. https://cmake.org/cmake/help/latest/command/cmake_instrumentation.html This module sets the CMAKE_EXPERIMENTAL_INSTRUMENTATION gate with the GUID for CMake 4.2. It sets a single callback script and processes all current HOOKs copying the Google Trace format json files to a known location for further processing. --- README.md | 20 ++++++ cmake/BuildTelemetry.cmake | 6 ++ cmake/BuildTelemetryConfig.cmake | 29 ++++++++ cmake/telemetry.sh | 118 +++++++++++++++++++++++++++++++ docs/tracing_example.png | Bin 0 -> 447985 bytes 5 files changed, 173 insertions(+) create mode 100755 cmake/BuildTelemetry.cmake create mode 100755 cmake/BuildTelemetryConfig.cmake create mode 100755 cmake/telemetry.sh create mode 100755 docs/tracing_example.png diff --git a/README.md b/README.md index a869e46..333628f 100644 --- a/README.md +++ b/README.md @@ -52,3 +52,23 @@ 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) * `_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`. + +# BuildTelemetry + +The cmake modules in this library provide access to CMake instrumentation data in Google Trace format which is visualizable with chrome://tracing and https://ui.perfetto.dev. + +Telemetry may be enabled either by adding to the CMAKE_PROJECT_TOP_LEVEL_INCLUDES +```sh +-DCMAKE_PROJECT_TOP_LEVEL_INCLUDES=infra/cmake/BuildTelemetry.cmake +``` +or by calling explicitly within the CMakeList.txt file. +```cmake +find_package(BuildTelemetry) +configure_build_telemetry() +``` + +In either form, CMake will call `telemetry.sh` which will copy the trace data in json format into a `.trace` subdirectory within the build directory. + +Multiple calls to `configure_build_telemetry` will only configure the callback hooks once, so it is safe to include multiple times, including by TOP_LEVEL_INCLUDE. + +![Example of Visualization](docs/tracing_example.png) diff --git a/cmake/BuildTelemetry.cmake b/cmake/BuildTelemetry.cmake new file mode 100755 index 0000000..d298877 --- /dev/null +++ b/cmake/BuildTelemetry.cmake @@ -0,0 +1,6 @@ +include_guard(GLOBAL) + +cmake_minimum_required (VERSION 4.2) + +include(${CMAKE_CURRENT_LIST_DIR}/BuildTelemetryConfig.cmake) +configure_build_telemetry() diff --git a/cmake/BuildTelemetryConfig.cmake b/cmake/BuildTelemetryConfig.cmake new file mode 100755 index 0000000..faacc1d --- /dev/null +++ b/cmake/BuildTelemetryConfig.cmake @@ -0,0 +1,29 @@ +include_guard(GLOBAL) + +cmake_minimum_required (VERSION 4.2) + +set(BUILD_TELEMETRY_DIR ${CMAKE_CURRENT_LIST_DIR}) + +function(configure_build_telemetry) + if(NOT BUILD_TELEMETRY_CONFIGURATION) + message(WARNING "Configuring Bloomberg Build Telemetry") + + # Enable experimental feature!! + set(CMAKE_EXPERIMENTAL_INSTRUMENTATION ec7aa2dc-b87f-45a3-8022-fe01c5f59984) + + # Telemetry query + cmake_instrumentation( + API_VERSION 1 + DATA_VERSION 1 + + OPTIONS staticSystemInformation dynamicSystemInformation trace + HOOKS postGenerate preBuild postBuild preCMakeBuild postCMakeBuild postCMakeInstall postCTest + CALLBACK ${BUILD_TELEMETRY_DIR}/telemetry.sh + ) + message(WARNING "using callback script ${BUILD_TELEMETRY_DIR}/telemetry.sh") + + # Mark task as done in cache + set(BUILD_TELEMETRY_CONFIGURATION TRUE CACHE INTERNAL "Flag to ensure Bloomberg Build Telemetry configured only once") + endif() + +endfunction(configure_build_telemetry) diff --git a/cmake/telemetry.sh b/cmake/telemetry.sh new file mode 100755 index 0000000..307cc94 --- /dev/null +++ b/cmake/telemetry.sh @@ -0,0 +1,118 @@ +#!/usr/bin/env bash + +set -o nounset +set -o errexit +trap 'echo "Aborting due to errexit on line $LINENO. Exit code: $?" >&2' ERR +set -o errtrace +set -o pipefail +IFS=$'\n\t' + +############################################################################### +# Environment +############################################################################### + +# $_ME +# +# This program's basename. +_ME="$(basename "${0}")" + +############################################################################### +# Help +############################################################################### + +# _print_help() +# +# Usage: +# _print_help +# +# Print the program help information. +_print_help() { + cat <] + ${_ME} -h | --help + +Options: + -h --help Show this screen. + +Environment: + Setting DEBUG_TELEMETRY in the environment will enable DEBUG logging +HEREDOC +} + +############################################################################### +# Program Functions +############################################################################### +_debug_print() { + if [[ -n "${DEBUG_TELEMETRY:-}" ]]; then + printf "[DEBUG] $(date +'%H:%M:%S'): %s \n" "$1" >&2 + fi +} + +_check_file_exists() { + local file="$1" + if [[ ! -f "${file}" ]]; then + echo "Error: File not found: ${file}" >&2 + exit 1 # Exit the entire script with a non-zero status + fi +} + +_process_index() { + indexFile=${1:-} + _check_file_exists "${indexFile}" + _debug_print "$(cat "${indexFile}")" + + local buildDir + buildDir=$(jq -r '.buildDir' "${1:-}") + _debug_print "$(printf "buildDir is |%q|" "${buildDir}")" + + local dataDir + dataDir=$(jq -r '.dataDir' "${1:-}") + _debug_print "$(printf "dataDir is |%q|" "${dataDir}")" + + local hook + hook=$(jq -r '.hook' "${1:-}") + _debug_print "$(printf "hook is |%q|" "${hook}")" + + local trace + trace=$(jq -r '.trace' "${1:-}") + _debug_print "$(printf "trace is |%q|" "${trace}")" + + local outputDir + outputDir="${buildDir}/.trace" + _debug_print "$(printf "Copy trace to |%q|" "${outputDir}")" + mkdir -p "${outputDir}" + + local traceDestFile + traceDestFile="${outputDir}/${hook}-$(basename "${trace}")" + _debug_print "$(printf "traceDestFile: |%q|" "${traceDestFile}")" + cp "${dataDir}/${trace}" "${outputDir}/${hook}-$(basename "${trace}")" +} + +############################################################################### +# Main +############################################################################### + +# _main() +# +# Usage: +# _main [] [] +# +# Description: +# Entry point for the program, handling basic option parsing and dispatching. +_main() { + # Avoid complex option parsing when only one program option is expected. + if [[ "${1:-}" =~ ^-h|--help$ ]] + then + _print_help + else + _process_index "$@" + fi +} + +# Call `_main` after everything has been defined. +_main "$@" diff --git a/docs/tracing_example.png b/docs/tracing_example.png new file mode 100755 index 0000000000000000000000000000000000000000..04575a39335714e2e9cb5f9d278cc478758d5bed GIT binary patch literal 447985 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

y)q?8A6507C`SBb(QH~pG3)n;IsKTOQskx z_xeSP`hn<3rRD_`|TfDrooe(+6Rk#QY%5a2CmrhIgC0mM@FKgj# z0U(YzDZ!Rng%zy!Z^q2)6_wVGk#yc^+AnQV(E_NT!tL z5qkF%Bdr)}s5wLw+U}aoneqg)ZZj0Ol@GfiqLgfEK+(6yWk+EyZ>MqgtShAHj00nOw5tvpT2vQJ^o_BtAsuw5 zk{s#a(!t{pb0fkj&^f|IT;W3i5+v+9ed)^5=tiIZlX~@#P@aLR*D~z9(YLwxHTa~5 zvpXp+oOQE27FNL^V59$)dy=CH?`G`w=X`uD)QhW~+;Xn7mgf=S`?MBDHu~(+@yhoy zaQL4tT4npYv;bfNfwf7O4(>+yP?}R@w`qI9-4He83l1`8Y>!?28BB{MPlSxdMOMtU z)}@_Ah(-qZo%k$yE0m9K<&}379530Z^y9FJD&sKysy^MhoCu>KfulJj|U}i4Msy4n-#0Ag4 zAmND1HpNC~k;>rUudl;`tRZC&=f(%rz0#1b4uM^Hy_1t zCj(&l@3|)e+b!`k6Yed=Ns6827T1mSV)g;S1uvtu_+6Nc!k!GEoh_>0Jc%+ofmTth zAdbe9ms`+{S4@l1r&x3<{JhJcbx{7&*+SJ^?FL8T>246jma?TgT+Ao7=feD_#k#1p zgFx8>Z{x#`8-fY>4|?nOwR|eu+0Dz_p=|A0WLZCW3-S@AlD|j%CPZ1W$rr71pbU>q z0-;)5n+p@HvybgTr@ph#rYI@pxO8NJSsg*ML~^og+M#<~TUqNq$aYjDL_zN2y zidwFC|0$Lz4<3H={vAw9vB_W};O!*EJErw41M9l@G^xW|&*m4~6l)|9{BWgudQ_Kh zI*5C^2Y!Cqas0#Jh7PlvWo8!AZUoYvMcS<5uF=5L!-IM}h`T@48XPyYw;$GAYHG&r z630g1vVDPSx7IdzAZfWxtT=BiZeOEy zo|lbb(y3modX*={Mx9;=-=ktVz)lg6#X-xA8_EVsoCzphvwF#`=4xKt2OII{&G#zj z(H@wo_egs59X(==K0RHck9zlV6S?2&#;d@OYll>Q$99Qdn`Lq&qM32y1K5N-OzkC* z-PenQ4`THZ_X#dnd)@l)H|VCI7bkKfj1Kx!QvhPp9+Kma9&j2I^|P?`FURH%wW)8t zx7FNiUm2+aZ;O!RNM#aRei%f7BO*FRjjJ~^na(M|NFJ9DNI|ll+Hi%qC@F7KXGjZ0YWD!YszwKN8S$R7vu$m9P za`?&^Gs6SFbuC9hA40dgK!oL=&fx{cpC2dD#=AJZE{LPI-!K58=ZI#oU*I-}UdfyA zMfM0HIw4A>|3gqN*xI}m&WwMnK3So+v_yb60zvl)6RI>;x=0o;pKCLSe9U@0PW-I*ZGM^vGQ*xOAj+z4#AK`2} z;yw2l^|?*D9c>&9XOq=59BQAw2}bxg?|x`;(t!`xUaeswK&ex{y^e3Uz*vW{&OZtu zb^Dg%rP4w(?QNsf4hnT&wqccA>@nRh2;m7{U`@hA62TfK3>58|B#w>-9V4zU-7mbj+hn{!R0SK`^<8c-dxbaSFQ!^(l z7|nDpT8h$%5!W2yka?(NZlkc{tdWW|8)X6IOkhN8

q-29;xxB1|cB9OnKe$q#o} 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

|nRUx8J?(5XVf_ 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 literal 0 HcmV?d00001 From edf2b2e9354b6ebf4064a80e10334e5e2885ebce Mon Sep 17 00:00:00 2001 From: Steve Downey Date: Sun, 8 Feb 2026 16:13:18 -0500 Subject: [PATCH 190/199] Update cmake/BuildTelemetry.cmake lint Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- cmake/BuildTelemetry.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/BuildTelemetry.cmake b/cmake/BuildTelemetry.cmake index d298877..672ce0f 100755 --- a/cmake/BuildTelemetry.cmake +++ b/cmake/BuildTelemetry.cmake @@ -1,6 +1,6 @@ include_guard(GLOBAL) -cmake_minimum_required (VERSION 4.2) +cmake_minimum_required(VERSION 4.2) include(${CMAKE_CURRENT_LIST_DIR}/BuildTelemetryConfig.cmake) configure_build_telemetry() From 544050662eeb244cbb9428eaf2be0ca5fdaa29b6 Mon Sep 17 00:00:00 2001 From: Steve Downey Date: Sun, 8 Feb 2026 16:13:32 -0500 Subject: [PATCH 191/199] Update cmake/BuildTelemetryConfig.cmake lint Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- cmake/BuildTelemetryConfig.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/BuildTelemetryConfig.cmake b/cmake/BuildTelemetryConfig.cmake index faacc1d..6e8ad5f 100755 --- a/cmake/BuildTelemetryConfig.cmake +++ b/cmake/BuildTelemetryConfig.cmake @@ -1,6 +1,6 @@ include_guard(GLOBAL) -cmake_minimum_required (VERSION 4.2) +cmake_minimum_required(VERSION 4.2) set(BUILD_TELEMETRY_DIR ${CMAKE_CURRENT_LIST_DIR}) From 3cd8fca21f64eea78dc3161536257e3501324591 Mon Sep 17 00:00:00 2001 From: Steve Downey Date: Sun, 8 Feb 2026 16:13:58 -0500 Subject: [PATCH 192/199] Update cmake/BuildTelemetryConfig.cmake reformat Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- cmake/BuildTelemetryConfig.cmake | 50 ++++++++++++++++++-------------- 1 file changed, 29 insertions(+), 21 deletions(-) diff --git a/cmake/BuildTelemetryConfig.cmake b/cmake/BuildTelemetryConfig.cmake index 6e8ad5f..348098e 100755 --- a/cmake/BuildTelemetryConfig.cmake +++ b/cmake/BuildTelemetryConfig.cmake @@ -5,25 +5,33 @@ cmake_minimum_required(VERSION 4.2) set(BUILD_TELEMETRY_DIR ${CMAKE_CURRENT_LIST_DIR}) function(configure_build_telemetry) - if(NOT BUILD_TELEMETRY_CONFIGURATION) - message(WARNING "Configuring Bloomberg Build Telemetry") - - # Enable experimental feature!! - set(CMAKE_EXPERIMENTAL_INSTRUMENTATION ec7aa2dc-b87f-45a3-8022-fe01c5f59984) - - # Telemetry query - cmake_instrumentation( - API_VERSION 1 - DATA_VERSION 1 - - OPTIONS staticSystemInformation dynamicSystemInformation trace - HOOKS postGenerate preBuild postBuild preCMakeBuild postCMakeBuild postCMakeInstall postCTest - CALLBACK ${BUILD_TELEMETRY_DIR}/telemetry.sh - ) - message(WARNING "using callback script ${BUILD_TELEMETRY_DIR}/telemetry.sh") - - # Mark task as done in cache - set(BUILD_TELEMETRY_CONFIGURATION TRUE CACHE INTERNAL "Flag to ensure Bloomberg Build Telemetry configured only once") - endif() - + if(NOT BUILD_TELEMETRY_CONFIGURATION) + message(WARNING "Configuring Bloomberg Build Telemetry") + + # Enable experimental feature!! + set(CMAKE_EXPERIMENTAL_INSTRUMENTATION + ec7aa2dc-b87f-45a3-8022-fe01c5f59984 + ) + + # Telemetry query + cmake_instrumentation( + API_VERSION 1 + DATA_VERSION 1 + + OPTIONS staticSystemInformation dynamicSystemInformation trace + HOOKS postGenerate preBuild postBuild preCMakeBuild postCMakeBuild postCMakeInstall postCTest + CALLBACK ${BUILD_TELEMETRY_DIR}/telemetry.sh + ) + message( + WARNING + "using callback script ${BUILD_TELEMETRY_DIR}/telemetry.sh" + ) + + # Mark task as done in cache + set(BUILD_TELEMETRY_CONFIGURATION + TRUE + CACHE INTERNAL + "Flag to ensure Bloomberg Build Telemetry configured only once" + ) + endif() endfunction(configure_build_telemetry) From 28048ff208ae2284b333f670b06f4da10f27135e Mon Sep 17 00:00:00 2001 From: Steve Downey Date: Tue, 17 Feb 2026 16:52:26 -0500 Subject: [PATCH 193/199] Improve diagnostic messages Improve the diagnostic messages for different versions of CMake. Remove the min required call. --- cmake/BuildTelemetry.cmake | 2 -- cmake/BuildTelemetryConfig.cmake | 35 ++++++++++++++++++++++++-------- 2 files changed, 27 insertions(+), 10 deletions(-) diff --git a/cmake/BuildTelemetry.cmake b/cmake/BuildTelemetry.cmake index 672ce0f..c2ff343 100755 --- a/cmake/BuildTelemetry.cmake +++ b/cmake/BuildTelemetry.cmake @@ -1,6 +1,4 @@ include_guard(GLOBAL) -cmake_minimum_required(VERSION 4.2) - include(${CMAKE_CURRENT_LIST_DIR}/BuildTelemetryConfig.cmake) configure_build_telemetry() diff --git a/cmake/BuildTelemetryConfig.cmake b/cmake/BuildTelemetryConfig.cmake index 348098e..9cb8b10 100755 --- a/cmake/BuildTelemetryConfig.cmake +++ b/cmake/BuildTelemetryConfig.cmake @@ -1,17 +1,36 @@ include_guard(GLOBAL) -cmake_minimum_required(VERSION 4.2) - set(BUILD_TELEMETRY_DIR ${CMAKE_CURRENT_LIST_DIR}) function(configure_build_telemetry) if(NOT BUILD_TELEMETRY_CONFIGURATION) - message(WARNING "Configuring Bloomberg Build Telemetry") + message(WARNING "Configuring Build Telemetry") - # Enable experimental feature!! - set(CMAKE_EXPERIMENTAL_INSTRUMENTATION - ec7aa2dc-b87f-45a3-8022-fe01c5f59984 - ) + # Check if the CMake version is at least 4.2 + if(CMAKE_VERSION VERSION_LESS "4.2") + message( + WARNING + "CMake version is less than 4.2, configuring cmake_instrumentation is unavailable." + ) + return() + endif() + + if(CMAKE_MAJOR_VERSION EQUAL 4) + if(CMAKE_MINOR_VERSION EQUAL 2) + # Enable experimental feature for 4.2 + set(CMAKE_EXPERIMENTAL_INSTRUMENTATION + ec7aa2dc-b87f-45a3-8022-fe01c5f59984 + ) + # elseif (CMAKE_MINOR_VERSION EQUAL 3) + # # Enable experimental feature for 4.3 -- ONCE WE HAVE THE GUID + # set(CMAKE_EXPERIMENTAL_INSTRUMENTATION ec7aa2dc-b87f-45a3-8022-fe01c5f59984) + else() + message( + WARNING + "Value for CMAKE_EXPERIMENTAL_INSTRUMENTATION is unknown, attempting to configure without gate set." + ) + endif() + endif() # Telemetry query cmake_instrumentation( @@ -27,7 +46,7 @@ function(configure_build_telemetry) "using callback script ${BUILD_TELEMETRY_DIR}/telemetry.sh" ) - # Mark task as done in cache + # Mark configuration as done in cache set(BUILD_TELEMETRY_CONFIGURATION TRUE CACHE INTERNAL From def83c53e55eff2ffbe6207ae317d0560ff20d93 Mon Sep 17 00:00:00 2001 From: Steve Downey Date: Fri, 10 Apr 2026 22:20:37 +0100 Subject: [PATCH 194/199] CMake 4.3 releases instrumentation --- cmake/BuildTelemetryConfig.cmake | 27 +++++---------------------- 1 file changed, 5 insertions(+), 22 deletions(-) diff --git a/cmake/BuildTelemetryConfig.cmake b/cmake/BuildTelemetryConfig.cmake index 9cb8b10..2d4a648 100755 --- a/cmake/BuildTelemetryConfig.cmake +++ b/cmake/BuildTelemetryConfig.cmake @@ -4,34 +4,17 @@ set(BUILD_TELEMETRY_DIR ${CMAKE_CURRENT_LIST_DIR}) function(configure_build_telemetry) if(NOT BUILD_TELEMETRY_CONFIGURATION) - message(WARNING "Configuring Build Telemetry") + message(STATUS "Configuring Build Telemetry") - # Check if the CMake version is at least 4.2 - if(CMAKE_VERSION VERSION_LESS "4.2") + # Check if the CMake version is at least 4.3 + if(CMAKE_VERSION VERSION_LESS "4.3") message( WARNING - "CMake version is less than 4.2, configuring cmake_instrumentation is unavailable." + "CMake version is less than 4.3, configuring cmake_instrumentation is unavailable." ) return() endif() - if(CMAKE_MAJOR_VERSION EQUAL 4) - if(CMAKE_MINOR_VERSION EQUAL 2) - # Enable experimental feature for 4.2 - set(CMAKE_EXPERIMENTAL_INSTRUMENTATION - ec7aa2dc-b87f-45a3-8022-fe01c5f59984 - ) - # elseif (CMAKE_MINOR_VERSION EQUAL 3) - # # Enable experimental feature for 4.3 -- ONCE WE HAVE THE GUID - # set(CMAKE_EXPERIMENTAL_INSTRUMENTATION ec7aa2dc-b87f-45a3-8022-fe01c5f59984) - else() - message( - WARNING - "Value for CMAKE_EXPERIMENTAL_INSTRUMENTATION is unknown, attempting to configure without gate set." - ) - endif() - endif() - # Telemetry query cmake_instrumentation( API_VERSION 1 @@ -50,7 +33,7 @@ function(configure_build_telemetry) set(BUILD_TELEMETRY_CONFIGURATION TRUE CACHE INTERNAL - "Flag to ensure Bloomberg Build Telemetry configured only once" + "Flag to ensure Build Telemetry configured only once" ) endif() endfunction(configure_build_telemetry) From a26dc81d6956af235e5bfc70ce883634c26dcb5d Mon Sep 17 00:00:00 2001 From: Steve Downey Date: Sun, 12 Apr 2026 22:07:23 +0100 Subject: [PATCH 195/199] Clarify forms of access and remove PNG --- README.md | 28 +++++++++++++++++++++------- docs/tracing_example.png | Bin 447985 -> 0 bytes 2 files changed, 21 insertions(+), 7 deletions(-) delete mode 100755 docs/tracing_example.png diff --git a/README.md b/README.md index 333628f..bf9bbb0 100644 --- a/README.md +++ b/README.md @@ -57,18 +57,32 @@ Some options for the project and target will also be supported: The cmake modules in this library provide access to CMake instrumentation data in Google Trace format which is visualizable with chrome://tracing and https://ui.perfetto.dev. -Telemetry may be enabled either by adding to the CMAKE_PROJECT_TOP_LEVEL_INCLUDES -```sh --DCMAKE_PROJECT_TOP_LEVEL_INCLUDES=infra/cmake/BuildTelemetry.cmake +Telemetry may be enabled in several ways: + +## `include` + +```cmake +include (infra/cmake/BuildTelemetry.cmake) +configure_build_telemetry() ``` -or by calling explicitly within the CMakeList.txt file. + +## `find_package` + ```cmake find_package(BuildTelemetry) configure_build_telemetry() ``` -In either form, CMake will call `telemetry.sh` which will copy the trace data in json format into a `.trace` subdirectory within the build directory. +as long as [BuildTelemetryConfig.cmake](./cmake/BuildTelemetryConfig.cmake) is in your module path. + +## `CMAKE_PROJECT_TOP_LEVEL_INCLUDES` +A non-invasive way to inject this telemetry into a CMake build you do not want to modify. +Add: +```sh +-DCMAKE_PROJECT_TOP_LEVEL_INCLUDES=infra/cmake/BuildTelemetry.cmake +``` +To the cmake invocation. -Multiple calls to `configure_build_telemetry` will only configure the callback hooks once, so it is safe to include multiple times, including by TOP_LEVEL_INCLUDE. +In any form, CMake will call `telemetry.sh` which will copy the trace data in json format into a `.trace` subdirectory within the build directory. -![Example of Visualization](docs/tracing_example.png) +Multiple calls to `configure_build_telemetry` will only configure the callback hooks once, so it is safe to enable multiple times, including by TOP_LEVEL_INCLUDE. diff --git a/docs/tracing_example.png b/docs/tracing_example.png deleted file mode 100755 index 04575a39335714e2e9cb5f9d278cc478758d5bed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 447985 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

y)q?8A6507C`SBb(QH~pG3)n;IsKTOQskx z_xeSP`hn<3rRD_`|TfDrooe(+6Rk#QY%5a2CmrhIgC0mM@FKgj# z0U(YzDZ!Rng%zy!Z^q2)6_wVGk#yc^+AnQV(E_NT!tL z5qkF%Bdr)}s5wLw+U}aoneqg)ZZj0Ol@GfiqLgfEK+(6yWk+EyZ>MqgtShAHj00nOw5tvpT2vQJ^o_BtAsuw5 zk{s#a(!t{pb0fkj&^f|IT;W3i5+v+9ed)^5=tiIZlX~@#P@aLR*D~z9(YLwxHTa~5 zvpXp+oOQE27FNL^V59$)dy=CH?`G`w=X`uD)QhW~+;Xn7mgf=S`?MBDHu~(+@yhoy zaQL4tT4npYv;bfNfwf7O4(>+yP?}R@w`qI9-4He83l1`8Y>!?28BB{MPlSxdMOMtU z)}@_Ah(-qZo%k$yE0m9K<&}379530Z^y9FJD&sKysy^MhoCu>KfulJj|U}i4Msy4n-#0Ag4 zAmND1HpNC~k;>rUudl;`tRZC&=f(%rz0#1b4uM^Hy_1t zCj(&l@3|)e+b!`k6Yed=Ns6827T1mSV)g;S1uvtu_+6Nc!k!GEoh_>0Jc%+ofmTth zAdbe9ms`+{S4@l1r&x3<{JhJcbx{7&*+SJ^?FL8T>246jma?TgT+Ao7=feD_#k#1p zgFx8>Z{x#`8-fY>4|?nOwR|eu+0Dz_p=|A0WLZCW3-S@AlD|j%CPZ1W$rr71pbU>q z0-;)5n+p@HvybgTr@ph#rYI@pxO8NJSsg*ML~^og+M#<~TUqNq$aYjDL_zN2y zidwFC|0$Lz4<3H={vAw9vB_W};O!*EJErw41M9l@G^xW|&*m4~6l)|9{BWgudQ_Kh zI*5C^2Y!Cqas0#Jh7PlvWo8!AZUoYvMcS<5uF=5L!-IM}h`T@48XPyYw;$GAYHG&r z630g1vVDPSx7IdzAZfWxtT=BiZeOEy zo|lbb(y3modX*={Mx9;=-=ktVz)lg6#X-xA8_EVsoCzphvwF#`=4xKt2OII{&G#zj z(H@wo_egs59X(==K0RHck9zlV6S?2&#;d@OYll>Q$99Qdn`Lq&qM32y1K5N-OzkC* z-PenQ4`THZ_X#dnd)@l)H|VCI7bkKfj1Kx!QvhPp9+Kma9&j2I^|P?`FURH%wW)8t zx7FNiUm2+aZ;O!RNM#aRei%f7BO*FRjjJ~^na(M|NFJ9DNI|ll+Hi%qC@F7KXGjZ0YWD!YszwKN8S$R7vu$m9P za`?&^Gs6SFbuC9hA40dgK!oL=&fx{cpC2dD#=AJZE{LPI-!K58=ZI#oU*I-}UdfyA zMfM0HIw4A>|3gqN*xI}m&WwMnK3So+v_yb60zvl)6RI>;x=0o;pKCLSe9U@0PW-I*ZGM^vGQ*xOAj+z4#AK`2} z;yw2l^|?*D9c>&9XOq=59BQAw2}bxg?|x`;(t!`xUaeswK&ex{y^e3Uz*vW{&OZtu zb^Dg%rP4w(?QNsf4hnT&wqccA>@nRh2;m7{U`@hA62TfK3>58|B#w>-9V4zU-7mbj+hn{!R0SK`^<8c-dxbaSFQ!^(l z7|nDpT8h$%5!W2yka?(NZlkc{tdWW|8)X6IOkhN8

q-29;xxB1|cB9OnKe$q#o} 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

|nRUx8J?(5XVf_ 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 From 300e5942b44132f5abaf62e62b4471a0e408579d Mon Sep 17 00:00:00 2001 From: Steve Downey Date: Sat, 11 Apr 2026 09:33:54 +0100 Subject: [PATCH 196/199] Update cmake/BuildTelemetryConfig.cmake Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- cmake/BuildTelemetryConfig.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/BuildTelemetryConfig.cmake b/cmake/BuildTelemetryConfig.cmake index 2d4a648..92b2d41 100755 --- a/cmake/BuildTelemetryConfig.cmake +++ b/cmake/BuildTelemetryConfig.cmake @@ -4,7 +4,7 @@ set(BUILD_TELEMETRY_DIR ${CMAKE_CURRENT_LIST_DIR}) function(configure_build_telemetry) if(NOT BUILD_TELEMETRY_CONFIGURATION) - message(STATUS "Configuring Build Telemetry") + message(STATUS "Configuring Build Telemetry") # Check if the CMake version is at least 4.3 if(CMAKE_VERSION VERSION_LESS "4.3") From 1e994d4e813a013b11737771ca779ea96f66de07 Mon Sep 17 00:00:00 2001 From: Steve Downey Date: Mon, 13 Apr 2026 09:33:42 +0100 Subject: [PATCH 197/199] repoint beman_submodule --- infra/.beman_submodule | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/infra/.beman_submodule b/infra/.beman_submodule index 77d57db..0f96618 100644 --- a/infra/.beman_submodule +++ b/infra/.beman_submodule @@ -1,4 +1,4 @@ [beman_submodule] -remote=https://github.com/bemanproject/infra.git -commit_hash=63cb577f6484f13ce3349de49ad5ce27e20bf1da +remote=https://github.com/steve-downey/infra.git +commit_hash=300e5942b44132f5abaf62e62b4471a0e408579d allow_untracked_files=True From f2cf13f7f2d7367574aa0e74309e449f82f0ff6d Mon Sep 17 00:00:00 2001 From: Steve Downey Date: Mon, 13 Apr 2026 09:36:31 +0100 Subject: [PATCH 198/199] delete infra --- infra/.beman_submodule | 4 - infra/.github/CODEOWNERS | 1 - infra/.github/workflows/pre-commit.yml | 78 ----- ...reusable-beman-create-issue-when-fault.yml | 28 -- infra/.gitignore | 59 ---- infra/.pre-commit-config.yaml | 21 -- infra/LICENSE | 219 ------------ infra/README.md | 72 ---- infra/cmake/Config.cmake.in | 12 - infra/cmake/appleclang-toolchain.cmake | 44 --- infra/cmake/beman-install-library.cmake | 323 ------------------ .../bemancmakeinstrumentation-config.cmake | 29 -- infra/cmake/bemancmakeinstrumentation.cmake | 6 - infra/cmake/gnu-toolchain.cmake | 41 --- infra/cmake/instrumentation.sh | 115 ------- infra/cmake/llvm-libc++-toolchain.cmake | 20 -- infra/cmake/llvm-toolchain.cmake | 41 --- infra/cmake/msvc-toolchain.cmake | 41 --- infra/cmake/use-fetch-content.cmake | 187 ---------- 19 files changed, 1341 deletions(-) delete mode 100644 infra/.beman_submodule delete mode 100644 infra/.github/CODEOWNERS delete mode 100644 infra/.github/workflows/pre-commit.yml delete mode 100644 infra/.github/workflows/reusable-beman-create-issue-when-fault.yml delete mode 100644 infra/.gitignore delete mode 100644 infra/.pre-commit-config.yaml delete mode 100644 infra/LICENSE delete mode 100644 infra/README.md delete mode 100644 infra/cmake/Config.cmake.in delete mode 100644 infra/cmake/appleclang-toolchain.cmake delete mode 100644 infra/cmake/beman-install-library.cmake delete mode 100755 infra/cmake/bemancmakeinstrumentation-config.cmake delete mode 100755 infra/cmake/bemancmakeinstrumentation.cmake delete mode 100644 infra/cmake/gnu-toolchain.cmake delete mode 100755 infra/cmake/instrumentation.sh delete mode 100644 infra/cmake/llvm-libc++-toolchain.cmake delete mode 100644 infra/cmake/llvm-toolchain.cmake delete mode 100644 infra/cmake/msvc-toolchain.cmake delete mode 100644 infra/cmake/use-fetch-content.cmake diff --git a/infra/.beman_submodule b/infra/.beman_submodule deleted file mode 100644 index 0f96618..0000000 --- a/infra/.beman_submodule +++ /dev/null @@ -1,4 +0,0 @@ -[beman_submodule] -remote=https://github.com/steve-downey/infra.git -commit_hash=300e5942b44132f5abaf62e62b4471a0e408579d -allow_untracked_files=True diff --git a/infra/.github/CODEOWNERS b/infra/.github/CODEOWNERS deleted file mode 100644 index 4ff90a4..0000000 --- a/infra/.github/CODEOWNERS +++ /dev/null @@ -1 +0,0 @@ -* @ednolan @neatudarius @rishyak @wusatosi @JeffGarland diff --git a/infra/.github/workflows/pre-commit.yml b/infra/.github/workflows/pre-commit.yml deleted file mode 100644 index 9646831..0000000 --- a/infra/.github/workflows/pre-commit.yml +++ /dev/null @@ -1,78 +0,0 @@ -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-push: - name: Pre-Commit check on Push - runs-on: ubuntu-latest - if: ${{ github.event_name == 'push' }} - - steps: - - name: Checkout repository - uses: actions/checkout@v4 - - - name: Set up Python - uses: actions/setup-python@v5 - with: - python-version: 3.13 - - # We wish to run pre-commit on all files instead of the changes - # only made in the push commit. - # - # So linting error persists when there's formatting problem. - - uses: pre-commit/action@v3.0.1 - - pre-commit-pr: - name: Pre-Commit check on PR - runs-on: ubuntu-latest - if: ${{ github.event_name == 'pull_request_target' }} - - permissions: - contents: read - checks: write - issues: write - pull-requests: write - - steps: - - name: Checkout repository - uses: actions/checkout@v4 - - # pull_request_target checkout the base of the repo - # We need to checkout the actual pr to lint the changes. - - name: Checkout pr - run: gh pr checkout ${{ github.event.number }} - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - - name: Set up Python - uses: actions/setup-python@v5 - with: - python-version: 3.13 - - # we only lint on the changed file in PR. - - name: Get Changed Files - id: changed-files - uses: tj-actions/changed-files@v45 - - # See: - # https://github.com/tj-actions/changed-files?tab=readme-ov-file#using-local-git-directory- - - uses: pre-commit/action@v3.0.1 - id: run-pre-commit - with: - extra_args: --files ${{ steps.changed-files.outputs.all_changed_files }} - - # Review dog posts the suggested change from pre-commit to the pr. - - name: suggester / pre-commit - uses: reviewdog/action-suggester@v1 - if: ${{ failure() && steps.run-pre-commit.conclusion == 'failure' }} - with: - tool_name: pre-commit - level: warning - reviewdog_flags: "-fail-level=error" diff --git a/infra/.github/workflows/reusable-beman-create-issue-when-fault.yml b/infra/.github/workflows/reusable-beman-create-issue-when-fault.yml deleted file mode 100644 index 024a51f..0000000 --- a/infra/.github/workflows/reusable-beman-create-issue-when-fault.yml +++ /dev/null @@ -1,28 +0,0 @@ -# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception - -name: 'Beman issue creation workflow' -on: - workflow_call: - workflow_dispatch: -jobs: - create-issue: - runs-on: ubuntu-latest - steps: - # See https://github.com/cli/cli/issues/5075 - - uses: actions/checkout@v4 - - name: Create issue - run: | - issue_num=$(gh issue list -s open -S "[SCHEDULED-BUILD] infra repo CI job failure" -L 1 --json number | jq 'if length == 0 then -1 else .[0].number end') - body="**CI job failure Report** - - **Time of Failure**: $(date -u '+%B %d, %Y, %H:%M %Z') - - **Commit**: [${{ github.sha }}](${{ github.server_url }}/${{ github.repository }}/commit/${{ github.sha }}) - - **Action Run**: [View logs](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}) - The scheduled job triggered by cron has failed. - Please investigate the logs and recent changes associated with this commit or rerun the workflow if you believe this is an error." - if [[ $issue_num -eq -1 ]]; then - gh issue create --repo ${{ github.repository }} --title "[SCHEDULED-BUILD] infra repo CI job failure" --body "$body" --assignee ${{ github.actor }} - else - gh issue comment --repo ${{ github.repository }} $issue_num --body "$body" - fi - env: - GH_TOKEN: ${{ github.token }} diff --git a/infra/.gitignore b/infra/.gitignore deleted file mode 100644 index b7cdbb5..0000000 --- a/infra/.gitignore +++ /dev/null @@ -1,59 +0,0 @@ -# Prerequisites -*.d - -# Compiled Object files -*.slo -*.lo -*.o -*.obj - -# Precompiled Headers -*.gch -*.pch - -# Compiled Dynamic libraries -*.so -*.dylib -*.dll - -# Fortran module files -*.mod -*.smod - -# Compiled Static libraries -*.lai -*.la -*.a -*.lib - -# Executables -*.exe -*.out -*.app - -# Python -__pycache__/ -.pytest_cache/ -*.pyc -*.pyo -*.pyd -*.pyw -*.pyz -*.pywz -*.pyzw -*.pyzwz -*.delete_me - -# MAC OS -*.DS_Store - -# Editor files -.vscode/ -.idea/ - -# Build directories -infra.egg-info/ -beman_tidy.egg-info/ -*.egg-info/ -build/ -dist/ diff --git a/infra/.pre-commit-config.yaml b/infra/.pre-commit-config.yaml deleted file mode 100644 index bc4dd84..0000000 --- a/infra/.pre-commit-config.yaml +++ /dev/null @@ -1,21 +0,0 @@ -repos: - - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v6.0.0 - hooks: - - id: trailing-whitespace - - id: end-of-file-fixer - - id: check-yaml - - id: check-added-large-files - - - repo: https://github.com/codespell-project/codespell - rev: v2.4.1 - hooks: - - id: codespell - - # CMake linting and formatting - - repo: https://github.com/BlankSpruce/gersemi - rev: 0.22.3 - hooks: - - id: gersemi - name: CMake linting - exclude: ^.*/tests/.*/data/ # Exclude test data directories diff --git a/infra/LICENSE b/infra/LICENSE deleted file mode 100644 index f6db814..0000000 --- a/infra/LICENSE +++ /dev/null @@ -1,219 +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. diff --git a/infra/README.md b/infra/README.md deleted file mode 100644 index eadd9fb..0000000 --- a/infra/README.md +++ /dev/null @@ -1,72 +0,0 @@ -# Beman Project Infrastructure Repository - - - -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. - -## Usage - -This repository is intended to be used as a beman-submodule in other Beman repositories. See -[the beman-submodule documentation](https://github.com/bemanproject/beman-submodule) 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) -* `_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`. - -#### `beman_cmake_instrumentation` - -The cmake modules in this library are intended to provide access to CMake instrumentation data in Google Trace format which is visualizable with chrome://tracing and https://ui.perfetto.dev. - -Instrumentation may be enabled either by adding to the CMAKE_PROJECT_TOP_LEVEL_INCLUDES -```sh --DCMAKE_PROJECT_TOP_LEVEL_INCLUDES=infra/cmake/bemancmakeinstrumentation.cmake -``` -or by calling explicitly within the CMakeList.txt file. -```cmake -find_package(BemanCMakeInstrumentation) -configure_beman_cmake_instrumentation() -``` - -In either form, CMake will call `instrumentation.sh` which will copy the trace data in json format into a `.trace` subdirectory within the build directory. - -Multiple calls to `configure_beman_cmake_instrumentation` will only configure the callback hooks once, so it is safe to include multiple times, including by TOP_LEVEL_INCLUDE. diff --git a/infra/cmake/Config.cmake.in b/infra/cmake/Config.cmake.in deleted file mode 100644 index 81adf80..0000000 --- a/infra/cmake/Config.cmake.in +++ /dev/null @@ -1,12 +0,0 @@ -# cmake/Config.cmake.in -*-makefile-*- -# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception - -include(CMakeFindDependencyMacro) - -@BEMAN_FIND_DEPENDENCIES@ - -@PACKAGE_INIT@ - -include(${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@-targets.cmake) - -check_required_components(@PROJECT_NAME@) diff --git a/infra/cmake/appleclang-toolchain.cmake b/infra/cmake/appleclang-toolchain.cmake deleted file mode 100644 index 70ef548..0000000 --- a/infra/cmake/appleclang-toolchain.cmake +++ /dev/null @@ -1,44 +0,0 @@ -# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception - -# This toolchain file is not meant to be used directly, -# but to be invoked by CMake preset and GitHub CI. -# -# This toolchain file configures for apple clang family of compiler. -# Note this is different from LLVM toolchain. -# -# BEMAN_BUILDSYS_SANITIZER: -# This optional CMake parameter is not meant for public use and is subject to -# change. -# Possible values: -# - MaxSan: configures clang and clang++ to use all available non-conflicting -# sanitizers. Note that apple clang does not support leak sanitizer. -# - TSan: configures clang and clang++ to enable the use of thread sanitizer. - -include_guard(GLOBAL) - -# Prevent PATH collision with an LLVM clang installation by using the system -# compiler shims -set(CMAKE_C_COMPILER cc) -set(CMAKE_CXX_COMPILER c++) - -if(BEMAN_BUILDSYS_SANITIZER STREQUAL "MaxSan") - set(SANITIZER_FLAGS - "-fsanitize=address -fsanitize=pointer-compare -fsanitize=pointer-subtract -fsanitize=undefined" - ) -elseif(BEMAN_BUILDSYS_SANITIZER STREQUAL "TSan") - set(SANITIZER_FLAGS "-fsanitize=thread") -endif() - -set(CMAKE_C_FLAGS_DEBUG_INIT "${SANITIZER_FLAGS}") -set(CMAKE_CXX_FLAGS_DEBUG_INIT "${SANITIZER_FLAGS}") - -set(RELEASE_FLAGS "-O3 ${SANITIZER_FLAGS}") - -set(CMAKE_C_FLAGS_RELWITHDEBINFO_INIT "${RELEASE_FLAGS}") -set(CMAKE_CXX_FLAGS_RELWITHDEBINFO_INIT "${RELEASE_FLAGS}") - -set(CMAKE_C_FLAGS_RELEASE_INIT "${RELEASE_FLAGS}") -set(CMAKE_CXX_FLAGS_RELEASE_INIT "${RELEASE_FLAGS}") - -# Add this dir to the module path so that `find_package(beman-install-library)` works -list(APPEND CMAKE_PREFIX_PATH "${CMAKE_CURRENT_LIST_DIR}") diff --git a/infra/cmake/beman-install-library.cmake b/infra/cmake/beman-install-library.cmake deleted file mode 100644 index 8a6c5a1..0000000 --- a/infra/cmake/beman-install-library.cmake +++ /dev/null @@ -1,323 +0,0 @@ -# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception - -include_guard(GLOBAL) - -include(CMakePackageConfigHelpers) -include(GNUInstallDirs) - -# beman_install_library -# ===================== -# -# Installs a library (or set of targets) along with headers, C++ modules, -# and optional CMake package configuration files. -# -# Usage: -# ------ -# beman_install_library( -# TARGETS [ ...] -# [DEPENDENCIES [ ...]] -# [NAMESPACE ] -# [EXPORT_NAME ] -# [DESTINATION ] -# ) -# -# 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. -# -# 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(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() - - set(_config_install_dir "${CMAKE_INSTALL_LIBDIR}/cmake/${name}") - - # ---------------------------- - # 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}" - 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 COMPONENT "${install_component_name}_Development" - LIBRARY - COMPONENT "${install_component_name}_Runtime" - NAMELINK_COMPONENT "${install_component_name}_Development" - RUNTIME 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 - DESTINATION - ${_config_install_dir}/bmi-${CMAKE_CXX_COMPILER_ID}_$ - COMPONENT "${install_component_name}_Development" - ) - else() - install( - TARGETS "${_tgt}" - EXPORT ${BEMAN_EXPORT_NAME} - ARCHIVE COMPONENT "${install_component_name}_Development" - LIBRARY - COMPONENT "${install_component_name}_Runtime" - NAMELINK_COMPONENT "${install_component_name}_Development" - RUNTIME 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 - # - # Precedence (highest to lowest): - # 1. Per-package variable _INSTALL_CONFIG_FILE_PACKAGE - # 2. Allow-list BEMAN_INSTALL_CONFIG_FILE_PACKAGES (if defined) - # 3. Default: ON - # ---------------------------------------- - 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") - - # Default: install config files - set(_install_config ON) - - # If the allow-list is defined, only install for packages in the list - if(DEFINED BEMAN_INSTALL_CONFIG_FILE_PACKAGES) - if(NOT "${name}" IN_LIST BEMAN_INSTALL_CONFIG_FILE_PACKAGES) - set(_install_config OFF) - endif() - endif() - - # Per-package override takes highest precedence - if(DEFINED ${_pkg_var}) - set(_install_config ${${_pkg_var}}) - endif() - - # ---------------------------------------- - # expand dependencies - # ---------------------------------------- - set(_beman_find_deps "") - foreach(dep IN LISTS 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/infra/cmake/bemancmakeinstrumentation-config.cmake b/infra/cmake/bemancmakeinstrumentation-config.cmake deleted file mode 100755 index 135b492..0000000 --- a/infra/cmake/bemancmakeinstrumentation-config.cmake +++ /dev/null @@ -1,29 +0,0 @@ -include_guard(GLOBAL) - -cmake_minimum_required (VERSION 4.2) - -set(BEMAN_CMAKE_INSTRUMENTATION_DIR ${CMAKE_CURRENT_LIST_DIR}) - -function(configure_beman_cmake_instrumentation) - if(NOT BEMAN_CMAKE_INSTRUMENTATION_CONFIGURATION) - message(WARNING "Configuring Beman CMake Instrumentation") - - # Enable experimental feature!! - set(CMAKE_EXPERIMENTAL_INSTRUMENTATION ec7aa2dc-b87f-45a3-8022-fe01c5f59984) - - # Instrumentation query - cmake_instrumentation( - API_VERSION 1 - DATA_VERSION 1 - - OPTIONS staticSystemInformation dynamicSystemInformation trace - HOOKS postGenerate preBuild postBuild preCMakeBuild postCMakeBuild postCMakeInstall postCTest - CALLBACK ${BEMAN_CMAKE_INSTRUMENTATION_DIR}/instrumentation.sh - ) - message(WARNING "using callback script ${BB_CMAKE_INSTRUMENTATION_DIR}/instrumentation.sh") - - # Mark task as done in cache - set(BEMAN_CMAKE_INSTRUMENTATION_CONFIGURATION TRUE CACHE INTERNAL "Flag to ensure CMake Instrumentation configured only once") - endif() - -endfunction(configure_beman_cmake_instrumentation) diff --git a/infra/cmake/bemancmakeinstrumentation.cmake b/infra/cmake/bemancmakeinstrumentation.cmake deleted file mode 100755 index 7a171bd..0000000 --- a/infra/cmake/bemancmakeinstrumentation.cmake +++ /dev/null @@ -1,6 +0,0 @@ -include_guard(GLOBAL) - -cmake_minimum_required (VERSION 4.2) - -find_package(BemanCMakeInstrumentation) -configure_beman_cmake_instrumentation() diff --git a/infra/cmake/gnu-toolchain.cmake b/infra/cmake/gnu-toolchain.cmake deleted file mode 100644 index d3b9f92..0000000 --- a/infra/cmake/gnu-toolchain.cmake +++ /dev/null @@ -1,41 +0,0 @@ -# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception - -# This toolchain file is not meant to be used directly, -# but to be invoked by CMake preset and GitHub CI. -# -# This toolchain file configures for GNU family of compiler. -# -# BEMAN_BUILDSYS_SANITIZER: -# This optional CMake parameter is not meant for public use and is subject to -# change. -# Possible values: -# - MaxSan: configures gcc and g++ to use all available non-conflicting -# sanitizers. -# - TSan: configures gcc and g++ to enable the use of thread sanitizer - -include_guard(GLOBAL) - -set(CMAKE_C_COMPILER gcc) -set(CMAKE_CXX_COMPILER g++) - -if(BEMAN_BUILDSYS_SANITIZER STREQUAL "MaxSan") - set(SANITIZER_FLAGS - "-fsanitize=address -fsanitize=leak -fsanitize=pointer-compare -fsanitize=pointer-subtract -fsanitize=undefined -fsanitize-undefined-trap-on-error" - ) -elseif(BEMAN_BUILDSYS_SANITIZER STREQUAL "TSan") - set(SANITIZER_FLAGS "-fsanitize=thread") -endif() - -set(CMAKE_C_FLAGS_DEBUG_INIT "${SANITIZER_FLAGS}") -set(CMAKE_CXX_FLAGS_DEBUG_INIT "${SANITIZER_FLAGS}") - -set(RELEASE_FLAGS "-O3 ${SANITIZER_FLAGS}") - -set(CMAKE_C_FLAGS_RELWITHDEBINFO_INIT "${RELEASE_FLAGS}") -set(CMAKE_CXX_FLAGS_RELWITHDEBINFO_INIT "${RELEASE_FLAGS}") - -set(CMAKE_C_FLAGS_RELEASE_INIT "${RELEASE_FLAGS}") -set(CMAKE_CXX_FLAGS_RELEASE_INIT "${RELEASE_FLAGS}") - -# Add this dir to the module path so that `find_package(beman-install-library)` works -list(APPEND CMAKE_PREFIX_PATH "${CMAKE_CURRENT_LIST_DIR}") diff --git a/infra/cmake/instrumentation.sh b/infra/cmake/instrumentation.sh deleted file mode 100755 index a1568bd..0000000 --- a/infra/cmake/instrumentation.sh +++ /dev/null @@ -1,115 +0,0 @@ -#!/usr/bin/env bash - -set -o nounset -set -o errexit -trap 'echo "Aborting due to errexit on line $LINENO. Exit code: $?" >&2' ERR -set -o errtrace -set -o pipefail -IFS=$'\n\t' - -############################################################################### -# Environment -############################################################################### - -# $_ME -# -# This program's basename. -_ME="$(basename "${0}")" - -############################################################################### -# Help -############################################################################### - -# _print_help() -# -# Usage: -# _print_help -# -# Print the program help information. -_print_help() { - cat <] - ${_ME} -h | --help - -Options: - -h --help Show this screen. -HEREDOC -} - -############################################################################### -# Program Functions -############################################################################### -_debug_print() { - if [[ -n "${DEBUG:-}" ]]; then - printf "[DEBUG] $(date +'%H:%M:%S'): %s \n" "$1" >&2 - fi -} - -_check_file_exists() { - local file="$1" - if [[ ! -f "${file}" ]]; then - echo "Error: File not found: ${file}" >&2 - exit 1 # Exit the entire script with a non-zero status - fi -} - -_process_index() { - indexFile=${1:-} - _check_file_exists "${indexFile}" - _debug_print "$(cat "${indexFile}")" - - local buildDir - buildDir=$(jq -r '.buildDir' "${1:-}") - _debug_print "$(printf "buildDir is |%q|" "${buildDir}")" - - local dataDir - dataDir=$(jq -r '.dataDir' "${1:-}") - _debug_print "$(printf "dataDir is |%q|" "${dataDir}")" - - local hook - hook=$(jq -r '.hook' "${1:-}") - _debug_print "$(printf "hook is |%q|" "${hook}")" - - local trace - trace=$(jq -r '.trace' "${1:-}") - _debug_print "$(printf "trace is |%q|" "${trace}")" - - local outputDir - outputDir="${buildDir}/.trace" - _debug_print "$(printf "Copy trace to |%q|" "${outputDir}")" - mkdir -p "${outputDir}" - - local traceDestFile - traceDestFile="${outputDir}/${hook}-$(basename "${trace}")" - _debug_print "$(printf "traceDestFile: |%q|" "${traceDestFile}")" - cp "${dataDir}/${trace}" "${outputDir}/${hook}-$(basename "${trace}")" -} - -############################################################################### -# Main -############################################################################### - -# _main() -# -# Usage: -# _main [] [] -# -# Description: -# Entry point for the program, handling basic option parsing and dispatching. -_main() { - # Avoid complex option parsing when only one program option is expected. - if [[ "${1:-}" =~ ^-h|--help$ ]] - then - _print_help - else - _process_index "$@" - fi -} - -# Call `_main` after everything has been defined. -_main "$@" diff --git a/infra/cmake/llvm-libc++-toolchain.cmake b/infra/cmake/llvm-libc++-toolchain.cmake deleted file mode 100644 index 76264c6..0000000 --- a/infra/cmake/llvm-libc++-toolchain.cmake +++ /dev/null @@ -1,20 +0,0 @@ -# SPDX-License-Identifier: BSL-1.0 - -# This toolchain file is not meant to be used directly, -# but to be invoked by CMake preset and GitHub CI. -# -# This toolchain file configures for LLVM family of compiler. -# -# BEMAN_BUILDSYS_SANITIZER: -# This optional CMake parameter is not meant for public use and is subject to -# change. -# Possible values: -# - MaxSan: configures clang and clang++ to use all available non-conflicting -# sanitizers. -# - TSan: configures clang and clang++ to enable the use of thread sanitizer. - -include(${CMAKE_CURRENT_LIST_DIR}/llvm-toolchain.cmake) - -if(NOT CMAKE_CXX_FLAGS MATCHES "-stdlib=libc\\+\\+") - string(APPEND CMAKE_CXX_FLAGS " -stdlib=libc++") -endif() diff --git a/infra/cmake/llvm-toolchain.cmake b/infra/cmake/llvm-toolchain.cmake deleted file mode 100644 index f1623b7..0000000 --- a/infra/cmake/llvm-toolchain.cmake +++ /dev/null @@ -1,41 +0,0 @@ -# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception - -# This toolchain file is not meant to be used directly, -# but to be invoked by CMake preset and GitHub CI. -# -# This toolchain file configures for LLVM family of compiler. -# -# BEMAN_BUILDSYS_SANITIZER: -# This optional CMake parameter is not meant for public use and is subject to -# change. -# Possible values: -# - MaxSan: configures clang and clang++ to use all available non-conflicting -# sanitizers. -# - TSan: configures clang and clang++ to enable the use of thread sanitizer. - -include_guard(GLOBAL) - -set(CMAKE_C_COMPILER clang) -set(CMAKE_CXX_COMPILER clang++) - -if(BEMAN_BUILDSYS_SANITIZER STREQUAL "MaxSan") - set(SANITIZER_FLAGS - "-fsanitize=address -fsanitize=leak -fsanitize=pointer-compare -fsanitize=pointer-subtract -fsanitize=undefined -fsanitize-undefined-trap-on-error" - ) -elseif(BEMAN_BUILDSYS_SANITIZER STREQUAL "TSan") - set(SANITIZER_FLAGS "-fsanitize=thread") -endif() - -set(CMAKE_C_FLAGS_DEBUG_INIT "${SANITIZER_FLAGS}") -set(CMAKE_CXX_FLAGS_DEBUG_INIT "${SANITIZER_FLAGS}") - -set(RELEASE_FLAGS "-O3 ${SANITIZER_FLAGS}") - -set(CMAKE_C_FLAGS_RELWITHDEBINFO_INIT "${RELEASE_FLAGS}") -set(CMAKE_CXX_FLAGS_RELWITHDEBINFO_INIT "${RELEASE_FLAGS}") - -set(CMAKE_C_FLAGS_RELEASE_INIT "${RELEASE_FLAGS}") -set(CMAKE_CXX_FLAGS_RELEASE_INIT "${RELEASE_FLAGS}") - -# Add this dir to the module path so that `find_package(beman-install-library)` works -list(APPEND CMAKE_PREFIX_PATH "${CMAKE_CURRENT_LIST_DIR}") diff --git a/infra/cmake/msvc-toolchain.cmake b/infra/cmake/msvc-toolchain.cmake deleted file mode 100644 index bdc24de..0000000 --- a/infra/cmake/msvc-toolchain.cmake +++ /dev/null @@ -1,41 +0,0 @@ -# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception - -# This toolchain file is not meant to be used directly, -# but to be invoked by CMake preset and GitHub CI. -# -# This toolchain file configures for MSVC family of compiler. -# -# BEMAN_BUILDSYS_SANITIZER: -# This optional CMake parameter is not meant for public use and is subject to -# change. -# Possible values: -# - MaxSan: configures cl to use all available non-conflicting sanitizers. -# -# Note that in other toolchain files, TSan is also a possible value for -# BEMAN_BUILDSYS_SANITIZER, however, MSVC does not support thread sanitizer, -# thus this value is omitted. - -include_guard(GLOBAL) - -set(CMAKE_C_COMPILER cl) -set(CMAKE_CXX_COMPILER cl) - -if(BEMAN_BUILDSYS_SANITIZER STREQUAL "MaxSan") - # /Zi flag (add debug symbol) is needed when using address sanitizer - # See C5072: https://learn.microsoft.com/en-us/cpp/error-messages/compiler-warnings/compiler-warning-c5072 - set(SANITIZER_FLAGS "/fsanitize=address /Zi") -endif() - -set(CMAKE_CXX_FLAGS_DEBUG_INIT "/EHsc /permissive- ${SANITIZER_FLAGS}") -set(CMAKE_C_FLAGS_DEBUG_INIT "/EHsc /permissive- ${SANITIZER_FLAGS}") - -set(RELEASE_FLAGS "/EHsc /permissive- /O2 ${SANITIZER_FLAGS}") - -set(CMAKE_C_FLAGS_RELWITHDEBINFO_INIT "${RELEASE_FLAGS}") -set(CMAKE_CXX_FLAGS_RELWITHDEBINFO_INIT "${RELEASE_FLAGS}") - -set(CMAKE_C_FLAGS_RELEASE_INIT "${RELEASE_FLAGS}") -set(CMAKE_CXX_FLAGS_RELEASE_INIT "${RELEASE_FLAGS}") - -# Add this dir to the module path so that `find_package(beman-install-library)` works -list(APPEND CMAKE_PREFIX_PATH "${CMAKE_CURRENT_LIST_DIR}") diff --git a/infra/cmake/use-fetch-content.cmake b/infra/cmake/use-fetch-content.cmake deleted file mode 100644 index 4ed4839..0000000 --- a/infra/cmake/use-fetch-content.cmake +++ /dev/null @@ -1,187 +0,0 @@ -cmake_minimum_required(VERSION 3.24) - -include(FetchContent) - -if(NOT BEMAN_EXEMPLAR_LOCKFILE) - set(BEMAN_EXEMPLAR_LOCKFILE - "lockfile.json" - CACHE FILEPATH - "Path to the dependency lockfile for the Beman Exemplar." - ) -endif() - -set(BemanExemplar_projectDir "${CMAKE_CURRENT_LIST_DIR}/../..") -message(TRACE "BemanExemplar_projectDir=\"${BemanExemplar_projectDir}\"") - -message(TRACE "BEMAN_EXEMPLAR_LOCKFILE=\"${BEMAN_EXEMPLAR_LOCKFILE}\"") -file( - REAL_PATH - "${BEMAN_EXEMPLAR_LOCKFILE}" - BemanExemplar_lockfile - BASE_DIRECTORY "${BemanExemplar_projectDir}" - EXPAND_TILDE -) -message(DEBUG "Using lockfile: \"${BemanExemplar_lockfile}\"") - -# Force CMake to reconfigure the project if the lockfile changes -set_property( - DIRECTORY "${BemanExemplar_projectDir}" - APPEND - PROPERTY CMAKE_CONFIGURE_DEPENDS "${BemanExemplar_lockfile}" -) - -# For more on the protocol for this function, see: -# https://cmake.org/cmake/help/latest/command/cmake_language.html#provider-commands -function(BemanExemplar_provideDependency method package_name) - # Read the lockfile - file(READ "${BemanExemplar_lockfile}" BemanExemplar_rootObj) - - # Get the "dependencies" field and store it in BemanExemplar_dependenciesObj - string( - JSON - BemanExemplar_dependenciesObj - ERROR_VARIABLE BemanExemplar_error - GET "${BemanExemplar_rootObj}" - "dependencies" - ) - if(BemanExemplar_error) - message(FATAL_ERROR "${BemanExemplar_lockfile}: ${BemanExemplar_error}") - endif() - - # Get the length of the libraries array and store it in BemanExemplar_dependenciesObj - string( - JSON - BemanExemplar_numDependencies - ERROR_VARIABLE BemanExemplar_error - LENGTH "${BemanExemplar_dependenciesObj}" - ) - if(BemanExemplar_error) - message(FATAL_ERROR "${BemanExemplar_lockfile}: ${BemanExemplar_error}") - endif() - - if(BemanExemplar_numDependencies EQUAL 0) - return() - endif() - - # Loop over each dependency object - math(EXPR BemanExemplar_maxIndex "${BemanExemplar_numDependencies} - 1") - foreach(BemanExemplar_index RANGE "${BemanExemplar_maxIndex}") - set(BemanExemplar_errorPrefix - "${BemanExemplar_lockfile}, dependency ${BemanExemplar_index}" - ) - - # Get the dependency object at BemanExemplar_index - # and store it in BemanExemplar_depObj - string( - JSON - BemanExemplar_depObj - ERROR_VARIABLE BemanExemplar_error - GET "${BemanExemplar_dependenciesObj}" - "${BemanExemplar_index}" - ) - if(BemanExemplar_error) - message( - FATAL_ERROR - "${BemanExemplar_errorPrefix}: ${BemanExemplar_error}" - ) - endif() - - # Get the "name" field and store it in BemanExemplar_name - string( - JSON - BemanExemplar_name - ERROR_VARIABLE BemanExemplar_error - GET "${BemanExemplar_depObj}" - "name" - ) - if(BemanExemplar_error) - message( - FATAL_ERROR - "${BemanExemplar_errorPrefix}: ${BemanExemplar_error}" - ) - endif() - - # Get the "package_name" field and store it in BemanExemplar_pkgName - string( - JSON - BemanExemplar_pkgName - ERROR_VARIABLE BemanExemplar_error - GET "${BemanExemplar_depObj}" - "package_name" - ) - if(BemanExemplar_error) - message( - FATAL_ERROR - "${BemanExemplar_errorPrefix}: ${BemanExemplar_error}" - ) - endif() - - # Get the "git_repository" field and store it in BemanExemplar_repo - string( - JSON - BemanExemplar_repo - ERROR_VARIABLE BemanExemplar_error - GET "${BemanExemplar_depObj}" - "git_repository" - ) - if(BemanExemplar_error) - message( - FATAL_ERROR - "${BemanExemplar_errorPrefix}: ${BemanExemplar_error}" - ) - endif() - - # Get the "git_tag" field and store it in BemanExemplar_tag - string( - JSON - BemanExemplar_tag - ERROR_VARIABLE BemanExemplar_error - GET "${BemanExemplar_depObj}" - "git_tag" - ) - if(BemanExemplar_error) - message( - FATAL_ERROR - "${BemanExemplar_errorPrefix}: ${BemanExemplar_error}" - ) - endif() - - if(method STREQUAL "FIND_PACKAGE") - if(package_name STREQUAL BemanExemplar_pkgName) - string( - APPEND - BemanExemplar_debug - "Redirecting find_package calls for ${BemanExemplar_pkgName} " - "to FetchContent logic.\n" - ) - string( - APPEND - BemanExemplar_debug - "Fetching ${BemanExemplar_repo} at " - "${BemanExemplar_tag} according to ${BemanExemplar_lockfile}." - ) - message(DEBUG "${BemanExemplar_debug}") - FetchContent_Declare( - "${BemanExemplar_name}" - GIT_REPOSITORY "${BemanExemplar_repo}" - GIT_TAG "${BemanExemplar_tag}" - EXCLUDE_FROM_ALL - ) - set(INSTALL_GTEST OFF) # Disable GoogleTest installation - FetchContent_MakeAvailable("${BemanExemplar_name}") - - # Important! _FOUND tells CMake that `find_package` is - # not needed for this package anymore - set("${BemanExemplar_pkgName}_FOUND" TRUE PARENT_SCOPE) - endif() - endif() - endforeach() -endfunction() - -cmake_language( - SET_DEPENDENCY_PROVIDER BemanExemplar_provideDependency - SUPPORTED_METHODS FIND_PACKAGE -) - -# Add this dir to the module path so that `find_package(beman-install-library)` works -list(APPEND CMAKE_PREFIX_PATH "${CMAKE_CURRENT_LIST_DIR}") From 6c2b80decfabae20022ce45183f4d903f465d73e Mon Sep 17 00:00:00 2001 From: Steve Downey Date: Mon, 13 Apr 2026 09:37:19 +0100 Subject: [PATCH 199/199] tag beman infra submodule --- infra/.beman_submodule | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 infra/.beman_submodule diff --git a/infra/.beman_submodule b/infra/.beman_submodule new file mode 100644 index 0000000..0f96618 --- /dev/null +++ b/infra/.beman_submodule @@ -0,0 +1,4 @@ +[beman_submodule] +remote=https://github.com/steve-downey/infra.git +commit_hash=300e5942b44132f5abaf62e62b4471a0e408579d +allow_untracked_files=True