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

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
53 changes: 32 additions & 21 deletions .github/workflows/toolchain.yml
Original file line number Diff line number Diff line change
Expand Up @@ -58,18 +58,6 @@ jobs:
--target laghu_crypto_provider_test
ctest --test-dir "$RUNNER_TEMP/laghu-clang-crypto" --output-on-failure \
-R '^laghu.crypto.provider$'
- name: Verify Clang 19 crypto adapter under ASan and UBSan
if: matrix.name == 'clang-19-libc++'
run: |
cmake -S . -B "$RUNNER_TEMP/laghu-clang-crypto-sanitized" -G Ninja \
-DCMAKE_CXX_COMPILER="${{ matrix.compiler }}" \
-DCMAKE_CXX_FLAGS="${{ matrix.cxxflags }} -fsanitize=address,undefined -fno-omit-frame-pointer" \
-DLAGHU_BUILD_PROFILE=CUSTOM \
-DLAGHU_FEATURES=tls
cmake --build "$RUNNER_TEMP/laghu-clang-crypto-sanitized" \
--target laghu_crypto_provider_test
ctest --test-dir "$RUNNER_TEMP/laghu-clang-crypto-sanitized" --output-on-failure \
-R '^laghu.crypto.provider$'
- name: Verify LibreSSL crypto adapter
if: matrix.name == 'gcc-14-libstdc++'
run: |
Expand Down Expand Up @@ -168,6 +156,34 @@ jobs:
aarch64-linux-gnu-ar t build/linux-aarch64-gcc/liblaghu_core.a
test -f build/linux-aarch64-gcc/liblaghu_crypto.a
aarch64-linux-gnu-ar t build/linux-aarch64-gcc/liblaghu_crypto.a
linux-clang-asan-ubsan:
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v7
- name: Install Linux Clang ASan and UBSan toolchain
run: |
sudo rm -f /etc/apt/sources.list.d/google-chrome.list \
/etc/apt/sources.list.d/google-chrome.sources
sudo apt-get update
sudo apt-get install --yes ninja-build clang-19 libc++-19-dev libc++abi-19-dev
Comment thread
niteshpurohit marked this conversation as resolved.
- name: Run ordinary native suite under ASan and UBSan
run: |
cmake --preset linux-clang-asan-ubsan
cmake --build build/linux-clang-asan-ubsan --target laghu_verify_toolchain
- name: Run TLS crypto adapter under ASan and UBSan
run: |
cmake -S . -B "$RUNNER_TEMP/laghu-asan-crypto" -G Ninja \
-DCMAKE_CXX_COMPILER=clang++-19 \
-DCMAKE_CXX_FLAGS=-stdlib=libc++ \
-DLAGHU_SANITIZER_PROFILE=ASAN_UBSAN \
-DLAGHU_BUILD_PROFILE=CUSTOM \
-DLAGHU_FEATURES=tls
cmake --build "$RUNNER_TEMP/laghu-asan-crypto" \
--target laghu_crypto_provider_test laghu_crypto_entropy_seam_test
ctest --test-dir "$RUNNER_TEMP/laghu-asan-crypto" --output-on-failure \
-R '^laghu.crypto.provider$'
ctest --test-dir "$RUNNER_TEMP/laghu-asan-crypto" --output-on-failure \
-R '^laghu.crypto.entropy_seam$'
linux-clang-tsan:
runs-on: ubuntu-24.04
steps:
Expand All @@ -177,13 +193,8 @@ jobs:
sudo rm -f /etc/apt/sources.list.d/google-chrome.list \
/etc/apt/sources.list.d/google-chrome.sources
sudo apt-get update
sudo apt-get install --yes ninja-build clang-19
- name: Run cancellation races under ThreadSanitizer
sudo apt-get install --yes ninja-build clang-19 libc++-19-dev libc++abi-19-dev
- name: Run concurrency targets under ThreadSanitizer
run: |
cmake -S . -B "$RUNNER_TEMP/laghu-tsan" -G Ninja \
-DCMAKE_CXX_COMPILER=clang++-19 \
-DLAGHU_ENABLE_TSAN=ON
cmake --build "$RUNNER_TEMP/laghu-tsan" \
--target laghu_core_deadlines_cancellation_tsan_test
ctest --test-dir "$RUNNER_TEMP/laghu-tsan" --output-on-failure \
-R '^laghu.core.deadlines_cancellation.tsan$'
cmake --preset linux-clang-tsan
cmake --build build/linux-clang-tsan --target laghu_sanitizer_tsan_tests
26 changes: 11 additions & 15 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,6 @@ cmake_minimum_required(VERSION 3.28)

project(laghu LANGUAGES CXX)

option(LAGHU_ENABLE_TSAN "Build the Linux Clang ThreadSanitizer deadline race target" OFF)

if(CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR)
message(FATAL_ERROR
"Laghu requires an out-of-tree build. Configure with -S <source> -B <build>.")
Expand All @@ -26,12 +24,14 @@ include(cmake/LaghuDependencyDag.cmake)
include(cmake/LaghuApiBoundaries.cmake)
include(cmake/LaghuDependencies.cmake)
include(cmake/LaghuFeatures.cmake)
include(cmake/LaghuSanitizers.cmake)
include(cmake/LaghuBuildVariants.cmake)
include(cmake/LaghuBuildIdentity.cmake)
include(cmake/LaghuTestRegistration.cmake)
include(cmake/LaghuToolchain.cmake)

laghu_configure_toolchain()
laghu_configure_sanitizer_profile()
laghu_configure_build_variant()
laghu_configure_dependency_registry()
laghu_configure_dependency_modes()
Expand Down Expand Up @@ -257,19 +257,7 @@ if(TARGET laghu_crypto)
laghu_add_native_test(laghu.crypto.entropy_seam laghu_crypto_entropy_seam_test)
endif()

if(LAGHU_ENABLE_TSAN)
if(NOT CMAKE_SYSTEM_NAME STREQUAL "Linux" OR NOT CMAKE_CXX_COMPILER_ID MATCHES "Clang")
message(FATAL_ERROR "Laghu TSan target requires Linux Clang")
endif()
add_executable(laghu_core_deadlines_cancellation_tsan_test tests/core/deadlines_cancellation.cpp)
laghu_apply_first_party_contract(laghu_core_deadlines_cancellation_tsan_test)
laghu_configure_api_consumer(laghu_core_deadlines_cancellation_tsan_test core)
target_compile_options(laghu_core_deadlines_cancellation_tsan_test PRIVATE -fsanitize=thread)
target_link_options(laghu_core_deadlines_cancellation_tsan_test PRIVATE -fsanitize=thread)
target_link_libraries(laghu_core_deadlines_cancellation_tsan_test PRIVATE laghu_core Threads::Threads)
laghu_add_native_test(laghu.core.deadlines_cancellation.tsan
laghu_core_deadlines_cancellation_tsan_test)
endif()
laghu_add_sanitizer_fixture_targets()

add_executable(laghu_os_iovec_translation_test tests/os/iovec_translation.cpp)
laghu_apply_first_party_contract(laghu_os_iovec_translation_test)
Expand Down Expand Up @@ -325,9 +313,17 @@ if(TARGET laghu_crypto_provider_test)
list(APPEND laghu_verify_targets
laghu_crypto laghu_crypto_provider_test laghu_crypto_entropy_seam_test)
endif()
foreach(target IN ITEMS laghu_sanitizer_heap_misuse_fixture
laghu_sanitizer_undefined_behavior_fixture)
if(TARGET "${target}")
list(APPEND laghu_verify_targets "${target}")
endif()
endforeach()

add_custom_target(laghu_verify_toolchain
COMMAND "${CMAKE_CTEST_COMMAND}" --output-on-failure
DEPENDS ${laghu_verify_targets}
USES_TERMINAL
COMMENT "Running Laghu's configured toolchain contract")

laghu_add_sanitizer_test_target()
16 changes: 16 additions & 0 deletions CMakePresets.json
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,22 @@
"CMAKE_CXX_FLAGS": "-stdlib=libc++"
}
},
{
"name": "linux-clang-asan-ubsan",
"displayName": "Linux Clang ASan and UBSan",
"inherits": "linux-clang",
"cacheVariables": {
"LAGHU_SANITIZER_PROFILE": "ASAN_UBSAN"
}
},
{
"name": "linux-clang-tsan",
"displayName": "Linux Clang ThreadSanitizer",
"inherits": "linux-clang",
"cacheVariables": {
"LAGHU_SANITIZER_PROFILE": "TSAN"
}
},
{
"name": "macos-appleclang",
"displayName": "macOS Apple Clang",
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ cmake --build build/linux-gcc
ctest --test-dir build/linux-gcc --output-on-failure
```

Other native presets are `linux-clang`, `macos-appleclang`, and `freebsd-clang`. The `linux-aarch64-gcc` preset is compile-only and does not execute target binaries.
Other native presets are `linux-clang`, `macos-appleclang`, and `freebsd-clang`. Linux Clang sanitizer presets are `linux-clang-asan-ubsan` and `linux-clang-tsan`. The `linux-aarch64-gcc` preset is compile-only and does not execute target binaries.

Stage an installation with the standard CMake interface:

Expand Down
8 changes: 8 additions & 0 deletions cmake/ExpectBuildIdentityDeterminism.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,14 @@ set(work "${CMAKE_CURRENT_BINARY_DIR}/build-identity-determinism")
file(REMOVE_RECURSE "${work}")
file(MAKE_DIRECTORY "${work}")
file(GLOB source_entries RELATIVE "${LAGHU_SOURCE}" "${LAGHU_SOURCE}/*")
list(REMOVE_ITEM source_entries build)
file(RELATIVE_PATH active_binary_relative "${LAGHU_SOURCE}" "${CMAKE_CURRENT_BINARY_DIR}")
if(NOT active_binary_relative MATCHES "^\\.\\." AND NOT active_binary_relative STREQUAL ".")
string(REGEX MATCH "^[^/]+" active_binary_root "${active_binary_relative}")
if(NOT active_binary_root STREQUAL "")
list(REMOVE_ITEM source_entries "${active_binary_root}")
endif()
endif()
foreach(copy_name IN ITEMS source-a source-b source-changed)
file(MAKE_DIRECTORY "${work}/${copy_name}")
foreach(entry IN LISTS source_entries)
Expand Down
30 changes: 30 additions & 0 deletions cmake/ExpectSanitizerFailure.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
# SPDX-License-Identifier: AGPL-3.0-only
if(NOT DEFINED EXECUTABLE OR NOT DEFINED EXPECTED)
message(FATAL_ERROR "Laghu sanitizer fixture expectation requires EXECUTABLE and EXPECTED")
endif()

set(command "${CMAKE_COMMAND}" -E env)
foreach(environment IN ITEMS "${ENVIRONMENT_1}" "${ENVIRONMENT_2}")
if(NOT environment STREQUAL "")
list(APPEND command "${environment}")
endif()
endforeach()
list(APPEND command "${EXECUTABLE}")
execute_process(COMMAND ${command}
RESULT_VARIABLE result
OUTPUT_VARIABLE output
ERROR_VARIABLE diagnostics)
set(combined "${output}${diagnostics}")
if(result EQUAL 0)
message(FATAL_ERROR "Laghu sanitizer fixture expectation failed: fixture=${EXPECTED}; result=success")
endif()
if(EXPECTED STREQUAL "heap_misuse" AND
NOT combined MATCHES "ERROR: AddressSanitizer: heap-buffer-overflow")
message(FATAL_ERROR "Laghu sanitizer fixture expectation failed: fixture=heap_misuse; report=missing_heap_buffer_overflow")
elseif(EXPECTED STREQUAL "undefined_behavior" AND
NOT combined MATCHES "runtime error: signed integer overflow")
message(FATAL_ERROR "Laghu sanitizer fixture expectation failed: fixture=undefined_behavior; report=missing_undefined_sanitizer")
elseif(EXPECTED STREQUAL "data_race" AND
NOT combined MATCHES "WARNING: ThreadSanitizer: data race")
message(FATAL_ERROR "Laghu sanitizer fixture expectation failed: fixture=data_race; report=missing_data_race")
endif()
27 changes: 27 additions & 0 deletions cmake/ExpectSanitizerMarkerRejection.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# SPDX-License-Identifier: AGPL-3.0-only
if(NOT DEFINED BUILD_DIRECTORY OR NOT DEFINED MARKER_ARTIFACT OR NOT DEFINED MARKER OR
NOT DEFINED MARKER_PREFIX OR NOT DEFINED MARKER_TARGET OR NOT DEFINED NM)
message(FATAL_ERROR "Laghu sanitizer marker rejection requires BUILD_DIRECTORY MARKER_ARTIFACT MARKER MARKER_PREFIX MARKER_TARGET and NM")
endif()

execute_process(
COMMAND "${CMAKE_COMMAND}"
"-DBUILD_DIRECTORY=${BUILD_DIRECTORY}"
"-DARCHIVE=${MARKER_ARTIFACT}"
"-DEXECUTABLE=${MARKER_ARTIFACT}"
"-DNM=${NM}"
"-DMARKER_ARTIFACT=${MARKER_ARTIFACT}"
"-DMARKER=${MARKER}"
"-DMARKER_PREFIX=${MARKER_PREFIX}"
"-DMARKER_TARGET=${MARKER_TARGET}"
-P "${CMAKE_CURRENT_LIST_DIR}/ExpectSanitizerReleaseExclusion.cmake"
RESULT_VARIABLE result
OUTPUT_VARIABLE output
ERROR_VARIABLE diagnostics)
if(result EQUAL 0)
message(FATAL_ERROR "Laghu sanitizer marker rejection failed: marker=${MARKER}; rejection=missing")
endif()
set(combined "${output}${diagnostics}")
if(NOT combined MATCHES "test_symbol=present")
message(FATAL_ERROR "Laghu sanitizer marker rejection failed: marker=${MARKER}; rejection=unrelated")
endif()
32 changes: 32 additions & 0 deletions cmake/ExpectSanitizerReconfigure.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# SPDX-License-Identifier: AGPL-3.0-only
if(NOT DEFINED LAGHU_SOURCE)
message(FATAL_ERROR "Laghu sanitizer reconfigure expectation requires LAGHU_SOURCE")
endif()

set(CMAKE_SOURCE_DIR "${LAGHU_SOURCE}")
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_CXX_COMPILER_ID Clang)
include("${LAGHU_SOURCE}/cmake/LaghuSanitizers.cmake")

set(LAGHU_SANITIZER_PROFILE ASAN_UBSAN)
laghu_configure_sanitizer_profile()
if(NOT LAGHU_SANITIZER_COMPILE_OPTIONS MATCHES "-fsanitize=address,undefined" OR
NOT LAGHU_SANITIZER_COMPILE_OPTIONS MATCHES "-fno-sanitize-recover=undefined" OR
NOT LAGHU_SANITIZER_LINK_OPTIONS STREQUAL "-fsanitize=address,undefined")
message(FATAL_ERROR "Laghu sanitizer reconfigure expectation failed: asan_ubsan_flags_missing")
endif()

set(LAGHU_SANITIZER_PROFILE NONE)
laghu_configure_sanitizer_profile()
if(NOT LAGHU_SANITIZER_COMPILE_OPTIONS STREQUAL "" OR
NOT LAGHU_SANITIZER_LINK_OPTIONS STREQUAL "")
message(FATAL_ERROR "Laghu sanitizer reconfigure expectation failed: none_retained_stale_flags")
endif()

set(LAGHU_SANITIZER_PROFILE TSAN)
laghu_configure_sanitizer_profile()
if(NOT LAGHU_SANITIZER_COMPILE_OPTIONS MATCHES "-fsanitize=thread" OR
LAGHU_SANITIZER_COMPILE_OPTIONS MATCHES "address" OR
NOT LAGHU_SANITIZER_LINK_OPTIONS STREQUAL "-fsanitize=thread")
message(FATAL_ERROR "Laghu sanitizer reconfigure expectation failed: tsan_retained_stale_flags")
endif()
38 changes: 38 additions & 0 deletions cmake/ExpectSanitizerReleaseExclusion.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
# SPDX-License-Identifier: AGPL-3.0-only
if(NOT DEFINED BUILD_DIRECTORY OR NOT DEFINED ARCHIVE OR NOT DEFINED EXECUTABLE OR NOT DEFINED NM OR
NOT DEFINED MARKER_ARTIFACT OR NOT DEFINED MARKER OR NOT DEFINED MARKER_PREFIX OR NOT DEFINED MARKER_TARGET)
message(FATAL_ERROR "Laghu sanitizer release exclusion requires BUILD_DIRECTORY ARCHIVE EXECUTABLE NM MARKER_ARTIFACT MARKER MARKER_PREFIX and MARKER_TARGET")
endif()

execute_process(COMMAND "${CMAKE_COMMAND}" --build "${BUILD_DIRECTORY}" --target
laghu_core laghu "${MARKER_TARGET}"
RESULT_VARIABLE build_result
OUTPUT_VARIABLE build_output
ERROR_VARIABLE build_diagnostics)
if(NOT build_result EQUAL 0)
message(FATAL_ERROR "Laghu sanitizer release exclusion failed: build=${build_output}${build_diagnostics}")
endif()

execute_process(COMMAND "${NM}" -g "${MARKER_ARTIFACT}"
RESULT_VARIABLE marker_result
OUTPUT_VARIABLE marker_symbols
ERROR_VARIABLE marker_diagnostics)
if(NOT marker_result EQUAL 0)
message(FATAL_ERROR "Laghu sanitizer release exclusion failed: marker_artifact=${MARKER_ARTIFACT}; nm=${marker_diagnostics}")
endif()
if(NOT marker_symbols MATCHES "${MARKER}")
message(FATAL_ERROR "Laghu sanitizer release exclusion failed: marker_artifact=${MARKER_ARTIFACT}; test_symbol=missing")
endif()

foreach(artifact IN ITEMS "${ARCHIVE}" "${EXECUTABLE}")
execute_process(COMMAND "${NM}" -g "${artifact}"
RESULT_VARIABLE result
OUTPUT_VARIABLE symbols
ERROR_VARIABLE diagnostics)
if(NOT result EQUAL 0)
message(FATAL_ERROR "Laghu sanitizer release exclusion failed: artifact=${artifact}; nm=${diagnostics}")
endif()
if(symbols MATCHES "${MARKER_PREFIX}")
message(FATAL_ERROR "Laghu sanitizer release exclusion failed: artifact=${artifact}; test_symbol=present")
endif()
endforeach()
18 changes: 18 additions & 0 deletions cmake/ExpectSanitizerSuppression.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# SPDX-License-Identifier: AGPL-3.0-only
if(NOT DEFINED MANIFEST OR NOT DEFINED SOURCE_ROOT OR NOT DEFINED EXPECTED_DIAGNOSTIC)
message(FATAL_ERROR "Laghu sanitizer suppression expectation requires MANIFEST SOURCE_ROOT and EXPECTED_DIAGNOSTIC")
endif()

execute_process(
COMMAND "${CMAKE_COMMAND}" "-DMANIFEST=${MANIFEST}" "-DSOURCE_ROOT=${SOURCE_ROOT}"
-P "${CMAKE_CURRENT_LIST_DIR}/ValidateSanitizerSuppression.cmake"
RESULT_VARIABLE result
OUTPUT_VARIABLE output
ERROR_VARIABLE diagnostics)
if(result EQUAL 0)
message(FATAL_ERROR "Laghu sanitizer suppression expectation failed: manifest=${MANIFEST}; rejection=missing")
endif()
set(combined "${output}${diagnostics}")
if(NOT combined MATCHES "${EXPECTED_DIAGNOSTIC}")
message(FATAL_ERROR "Laghu sanitizer suppression expectation failed: manifest=${MANIFEST}; diagnostic=${EXPECTED_DIAGNOSTIC}; rejection=unrelated")
endif()
7 changes: 5 additions & 2 deletions cmake/LaghuBuildIdentity.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ function(laghu_build_identity_input_hashes output)
cmake/LaghuDependencies.cmake
cmake/LaghuDependencyDag.cmake
cmake/LaghuFeatures.cmake
cmake/LaghuSanitizers.cmake
cmake/LaghuToolchain.cmake
src/cli/main.cpp
src/cli/private/laghu/cli/internal/build_manifest.hpp
Expand Down Expand Up @@ -59,7 +60,8 @@ function(laghu_build_identity_input_hashes output)
src/core/private/laghu/core/internal/mapping_operations.hpp
src/os/io_operations.cpp
src/os/private/laghu/os/internal/io_operations.hpp
tests/warnings/suppressions.tsv)
tests/warnings/suppressions.tsv
tests/sanitizers/suppressions.tsv)
list(FIND LAGHU_EFFECTIVE_FEATURES tls tls_feature_index)
if(NOT tls_feature_index EQUAL -1)
list(APPEND inputs
Expand Down Expand Up @@ -110,6 +112,7 @@ function(laghu_build_identity_verbose output build_id compiler requested effecti
"product.name=laghu"
"product.version=${LAGHU_PRODUCT_VERSION}"
"profile=${LAGHU_BUILD_PROFILE}"
"sanitizer.profile=${LAGHU_SANITIZER_PROFILE}"
"schema_version=${LAGHU_BUILD_MANIFEST_SCHEMA_VERSION}"
"standard_library.id=${LAGHU_STANDARD_LIBRARY_ID}"
"standard_library.version=${LAGHU_STANDARD_LIBRARY_VERSION}"
Expand Down Expand Up @@ -166,7 +169,7 @@ function(laghu_configure_build_identity)
laghu_build_identity_dependencies(dependencies_json dependency_names)

set(preimage
"{\"schema_version\":\"${LAGHU_BUILD_MANIFEST_SCHEMA_VERSION}\",\"product\":{\"name\":\"laghu\",\"version\":\"${product_version}\"},\"build_inputs\":${inputs_json},\"compiler\":{\"executable\":\"${compiler}\",\"id\":\"${CMAKE_CXX_COMPILER_ID}\",\"version\":\"${CMAKE_CXX_COMPILER_VERSION}\"},\"standard_library\":{\"id\":\"${LAGHU_STANDARD_LIBRARY_ID}\",\"version\":\"${LAGHU_STANDARD_LIBRARY_VERSION}\"},\"target\":{\"os\":\"${CMAKE_SYSTEM_NAME}\",\"architecture\":\"${CMAKE_SYSTEM_PROCESSOR}\"},\"profile\":\"${LAGHU_BUILD_PROFILE}\",\"features\":{\"requested\":${requested_json},\"effective\":${effective_json}},\"dependencies\":${dependencies_json}}")
"{\"schema_version\":\"${LAGHU_BUILD_MANIFEST_SCHEMA_VERSION}\",\"product\":{\"name\":\"laghu\",\"version\":\"${product_version}\"},\"build_inputs\":${inputs_json},\"compiler\":{\"executable\":\"${compiler}\",\"id\":\"${CMAKE_CXX_COMPILER_ID}\",\"version\":\"${CMAKE_CXX_COMPILER_VERSION}\"},\"standard_library\":{\"id\":\"${LAGHU_STANDARD_LIBRARY_ID}\",\"version\":\"${LAGHU_STANDARD_LIBRARY_VERSION}\"},\"target\":{\"os\":\"${CMAKE_SYSTEM_NAME}\",\"architecture\":\"${CMAKE_SYSTEM_PROCESSOR}\"},\"profile\":\"${LAGHU_BUILD_PROFILE}\",\"sanitizer_profile\":\"${LAGHU_SANITIZER_PROFILE}\",\"features\":{\"requested\":${requested_json},\"effective\":${effective_json}},\"dependencies\":${dependencies_json}}")
string(SHA256 build_id "${preimage}")
set(manifest "${preimage}")
string(REGEX REPLACE "}$" ",\"build_id\":\"${build_id}\"}" manifest "${manifest}")
Expand Down
Loading
Loading