Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
76d104b
chore(release): prepare 1.0.35 macOS service release
danwalmsley Sep 21, 2026
0162cd2
build(linux): add reproducible glibc cross-builds
danwalmsley Sep 21, 2026
fff0622
fix(linux): harden reproducible builder execution
danwalmsley Sep 21, 2026
d99c335
ci(release): use self-hosted native runners
danwalmsley Sep 21, 2026
b4d13ae
ci(macos): cross-build x64 on arm64 runner
danwalmsley Sep 21, 2026
7aa52ea
fix(ci): publish builder under repository owner
danwalmsley Sep 21, 2026
bf4990e
fix(ci): install dotnet in runner temp
danwalmsley Sep 21, 2026
0e35ef7
fix(release): support glibc 2.27 arm64 build
danwalmsley Sep 21, 2026
4fb6747
fix(linux): preserve cross configuration in native builds
danwalmsley Sep 21, 2026
e22563e
fix(linux): resolve openssl from target sysroot
danwalmsley Sep 21, 2026
76ef353
fix(linux): expose sysroot multiarch dependencies
danwalmsley Sep 21, 2026
a2562ba
fix(native): align cross-build target toolchains
danwalmsley Sep 21, 2026
f96bb76
fix(macos): bootstrap pinned rust toolchain
danwalmsley Sep 21, 2026
e1746d3
fix(macos): build V8 with system libc++
danwalmsley Sep 21, 2026
e0e345d
fix(macos): parse canvas font sizes on macOS 14
danwalmsley Sep 21, 2026
98f3427
fix(runtime): stabilize cross-platform package builds
danwalmsley Sep 21, 2026
8ad93db
fix(linux): include V8 libc++ configuration
danwalmsley Sep 21, 2026
1e8195d
fix(ci): isolate Linux V8 cache payload
danwalmsley Sep 21, 2026
83a1ad8
fix(linux): align WebScene with V8 toolchain
danwalmsley Sep 21, 2026
09c0de6
fix(linux): correct libc++ embedding flags
danwalmsley Sep 21, 2026
eb56c8b
fix(linux): cache complete libc++ configuration
danwalmsley Sep 21, 2026
5bc54b5
fix(linux): link POSIX thread runtime
danwalmsley Sep 22, 2026
1fdf96a
fix(linux): materialize cached libc++ archives
danwalmsley Sep 22, 2026
8908778
fix(linux): include libc++ PMR runtime
danwalmsley Sep 22, 2026
82ccb43
fix(linux): make runtime dependencies portable
danwalmsley Sep 22, 2026
de924a3
fix(linux): expose build DSO to native tests
danwalmsley Sep 22, 2026
5d3f56e
fix(tests): resolve component fixtures from repository
danwalmsley Sep 22, 2026
cc39976
fix(tests): run compatibility harness on net10
danwalmsley Sep 22, 2026
0ab81c1
fix(linux): install pinned fontconfig runtime
danwalmsley Sep 22, 2026
17b9d27
fix(linux): install pinned test font
danwalmsley Sep 22, 2026
d7c50ac
ci(linux): finalize arm64 packages under qemu
danwalmsley Sep 22, 2026
9b04e2f
fix(ci): update arm64 finalizer package locks
danwalmsley Sep 22, 2026
3f8182a
fix(linux): skip sysroot checks during arm64 finalize
danwalmsley Sep 22, 2026
3dc36ce
Isolate native runtime .NET validation
danwalmsley Sep 22, 2026
f05bee7
Stabilize Linux native runtime validation
danwalmsley Sep 22, 2026
b82bf55
Fix late-stage native package verification
danwalmsley Sep 22, 2026
840d563
Run cross-architecture consumers on available runners
danwalmsley Sep 22, 2026
4a89bd1
Relax async native test polling under emulation
danwalmsley Sep 22, 2026
e01e2ba
Add targeted ARM64 consumer recheck
danwalmsley Sep 22, 2026
4e244fa
Reuse release artifacts for consumer rechecks
danwalmsley Sep 22, 2026
e068e46
Stabilize async save test under Rosetta
danwalmsley Sep 22, 2026
a497339
Merge platform runtime build support from release/1.0.35
danwalmsley Sep 22, 2026
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
2 changes: 1 addition & 1 deletion .github/workflows/CI.yml
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,7 @@ jobs:
- name: Avalonia headless tests
run: dotnet test tests/WebScene.Backend.Avalonia.Tests/WebScene.Backend.Avalonia.Tests.csproj -c Release --no-build
- name: WPT manifest integrity
run: dotnet run --project tests/WebPlatformSubset/runner/WebScene.WebPlatformSubset.Runner.csproj -c Release --no-build -- --selection all --list
run: dotnet run --project tests/WebPlatformSubset/runner/WebScene.WebPlatformSubset.Runner.csproj -c Release -f net10.0 --no-build -- --selection all --list
- name: Native C++ portability build (without V8)
run: >-
cmake
Expand Down
685 changes: 607 additions & 78 deletions .github/workflows/native-runtime-packages.yml

Large diffs are not rendered by default.

52 changes: 36 additions & 16 deletions experiments/WebScene.NativeEngine.Probe/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -486,6 +486,8 @@ option(WEBSCENE_NATIVE_ENGINE_DENSE_LINK
"Dead-strip unused native code and expose only the WebScene C ABI" OFF)
option(WEBSCENE_NATIVE_ENGINE_THIN_LTO
"Enable ThinLTO for the WebScene native engine and its V8 monolith link" OFF)
option(WEBSCENE_NATIVE_ENGINE_DEFER_TARGET_EXECUTION
"Build target executables without running snapshot generation or tests" OFF)
option(WEBSCENE_NATIVE_ENGINE_CERTIFICATION
"Include certification telemetry, diagnostic snapshots, and native profiling hooks" OFF)
option(WEBSCENE_NATIVE_ENGINE_BUILD_HTML_PARSER_BENCHMARK
Expand Down Expand Up @@ -619,20 +621,32 @@ if(WEBSCENE_NATIVE_ENGINE_HTML_PARSER STREQUAL "html5ever")
"${CMAKE_CURRENT_SOURCE_DIR}/native/html_parser/Cargo.toml")
set(WEBSCENE_HTML_PARSER_TARGET_DIR
"${CMAKE_CURRENT_BINARY_DIR}/html-parser-target")
set(WEBSCENE_HTML_PARSER_LIBRARY_DIR
"${WEBSCENE_HTML_PARSER_TARGET_DIR}/release")
set(WEBSCENE_HTML_PARSER_CARGO_TARGET_ARGS)
if(DEFINED WEBSCENE_RUST_TARGET_TRIPLE
AND NOT WEBSCENE_RUST_TARGET_TRIPLE STREQUAL "")
set(WEBSCENE_HTML_PARSER_LIBRARY_DIR
"${WEBSCENE_HTML_PARSER_TARGET_DIR}/${WEBSCENE_RUST_TARGET_TRIPLE}/release")
list(APPEND WEBSCENE_HTML_PARSER_CARGO_TARGET_ARGS
--target "${WEBSCENE_RUST_TARGET_TRIPLE}")
endif()
if(MSVC)
set(WEBSCENE_HTML_PARSER_LIBRARY
"${WEBSCENE_HTML_PARSER_TARGET_DIR}/release/webscene_html_parser.lib")
"${WEBSCENE_HTML_PARSER_LIBRARY_DIR}/webscene_html_parser.lib")
else()
set(WEBSCENE_HTML_PARSER_LIBRARY
"${WEBSCENE_HTML_PARSER_TARGET_DIR}/release/libwebscene_html_parser.a")
"${WEBSCENE_HTML_PARSER_LIBRARY_DIR}/libwebscene_html_parser.a")
endif()
add_custom_command(
OUTPUT "${WEBSCENE_HTML_PARSER_LIBRARY}"
COMMAND ${CMAKE_COMMAND} -E env
"CARGO_TARGET_DIR=${WEBSCENE_HTML_PARSER_TARGET_DIR}"
"${WEBSCENE_CARGO_EXECUTABLE}" build
--manifest-path "${WEBSCENE_HTML_PARSER_MANIFEST}"
--release --locked ${WEBSCENE_HTML_PARSER_CARGO_FEATURES}
--release --locked
${WEBSCENE_HTML_PARSER_CARGO_TARGET_ARGS}
${WEBSCENE_HTML_PARSER_CARGO_FEATURES}
DEPENDS
"${WEBSCENE_HTML_PARSER_MANIFEST}"
"${CMAKE_CURRENT_SOURCE_DIR}/native/html_parser/Cargo.lock"
Expand Down Expand Up @@ -1030,19 +1044,24 @@ if(WEBSCENE_NATIVE_ENGINE_ENABLE_V8)
"${CMAKE_CURRENT_BINARY_DIR}/webscene_bootstrap_snapshot.bin")
set(WEBSCENE_V8_SNAPSHOT_METADATA
"${CMAKE_CURRENT_BINARY_DIR}/webscene_bootstrap_snapshot.meta")
add_custom_command(
OUTPUT "${WEBSCENE_V8_SNAPSHOT_BLOB}" "${WEBSCENE_V8_SNAPSHOT_METADATA}"
COMMAND "$<TARGET_FILE:webscene_v8_snapshot_builder>"
"${WEBSCENE_V8_ICU_DATA}"
"${WEBSCENE_V8_BOOTSTRAP_SOURCE}"
"${WEBSCENE_V8_SNAPSHOT_BLOB}"
"${WEBSCENE_V8_SNAPSHOT_METADATA}"
DEPENDS webscene_v8_snapshot_builder "${WEBSCENE_V8_BOOTSTRAP_SOURCE}"
COMMENT "Creating the WebScene V8 bootstrap snapshot"
VERBATIM)
add_custom_target(webscene_v8_bootstrap_snapshot ALL
DEPENDS "${WEBSCENE_V8_SNAPSHOT_BLOB}" "${WEBSCENE_V8_SNAPSHOT_METADATA}")
add_dependencies(webscene_native_engine webscene_v8_bootstrap_snapshot)
if(NOT WEBSCENE_NATIVE_ENGINE_DEFER_TARGET_EXECUTION)
add_custom_command(
OUTPUT "${WEBSCENE_V8_SNAPSHOT_BLOB}" "${WEBSCENE_V8_SNAPSHOT_METADATA}"
COMMAND "$<TARGET_FILE:webscene_v8_snapshot_builder>"
"${WEBSCENE_V8_ICU_DATA}"
"${WEBSCENE_V8_BOOTSTRAP_SOURCE}"
"${WEBSCENE_V8_SNAPSHOT_BLOB}"
"${WEBSCENE_V8_SNAPSHOT_METADATA}"
DEPENDS webscene_v8_snapshot_builder "${WEBSCENE_V8_BOOTSTRAP_SOURCE}"
COMMENT "Creating the WebScene V8 bootstrap snapshot"
VERBATIM)
add_custom_target(webscene_v8_bootstrap_snapshot ALL
DEPENDS "${WEBSCENE_V8_SNAPSHOT_BLOB}" "${WEBSCENE_V8_SNAPSHOT_METADATA}")
add_dependencies(webscene_native_engine webscene_v8_bootstrap_snapshot)
else()
message(STATUS
"WebScene native engine: target execution deferred for cross-build finalization")
endif()
target_compile_definitions(webscene_native_engine PRIVATE
WEBSCENE_V8_BOOTSTRAP_SNAPSHOT=1
WEBSCENE_V8_SNAPSHOT_FILENAME="webscene_bootstrap_snapshot.bin"
Expand Down Expand Up @@ -1267,6 +1286,7 @@ if(WEBSCENE_NATIVE_ENGINE_ENABLE_V8)
ENVIRONMENT "WEBSCENE_NATIVE_ENGINE_TEST_FILTER=host-driven-close-veto"
LABELS "native;runtime;lifecycle;performance" TIMEOUT 30)
set_tests_properties(webscene_native_engine_tests PROPERTIES
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/../.."
ENVIRONMENT
"WEBSCENE_V8_DETAILED_MEMORY_METRICS=1;WEBSCENE_INTEROP_STRESS=1")
endif()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,7 @@
#include <array>
#include <atomic>
#include <bit>
#include <cerrno>
#include <charconv>
#include <cctype>
#include <chrono>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2390,10 +2390,17 @@
break;
}
const auto number = shorthand.substr(number_start, index - number_start);
const std::string number_text{number};
char* parsed_end = nullptr;
const auto parsed_size = std::strtof(number_text.c_str(), &parsed_end);
if (parsed_end == number_text.c_str() + number_text.size()
// Floating-point std::from_chars is only available from macOS
// 26 in the current Apple SDK. strtof is available on the
// macOS 14 deployment baseline; copy the bounded view so its
// end can still be validated exactly.
const std::string number_text(number);
char* parse_end = nullptr;
errno = 0;
const auto parsed_size = std::strtof(number_text.c_str(), &parse_end);
if (parse_end == number_text.c_str() + number_text.size()
&& parse_end != number_text.c_str()
&& errno != ERANGE
&& std::isfinite(parsed_size)
&& parsed_size > 0.0F) {
result.size = parsed_size;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -954,6 +954,10 @@ void install_navigator(
constexpr auto platform = "Win32";
constexpr auto user_agent_platform = "Windows NT 10.0; Win64; x64";
constexpr auto client_platform = "Windows";
#elif defined(__aarch64__)
constexpr auto platform = "Linux aarch64";
constexpr auto user_agent_platform = "X11; Linux aarch64";
constexpr auto client_platform = "Linux";
#else
constexpr auto platform = "Linux x86_64";
constexpr auto user_agent_platform = "X11; Linux x86_64";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4638,7 +4638,7 @@ void test_async_save_acknowledgement_publishes_without_pointer_input()
state.pending = false;
state.acknowledgements++;
if (!shouldFail) label.textContent = '';
}, 250);
}, 1000);
});
})()
)JS", "async-save-publication-setup.js");
Expand All @@ -4653,6 +4653,21 @@ void test_async_save_acknowledgement_publishes_without_pointer_input()
const auto consumed_before = consumed_input_count(engine);
pointer_button(engine, WEBSCENE_INPUT_POINTER_DOWN, 30, 20, 9102U, true);
pointer_button(engine, WEBSCENE_INPUT_POINTER_UP, 30, 20, 9103U, false);
wait_for_consumed_inputs(
engine,
consumed_before + 2U,
"initial async-save activation was not consumed");
const auto initial_state = evaluate_until_equals(engine, R"JS(({ activations: __saveState.activations,
requests: __saveState.requests,
pending: __saveState.pending
}))JS", "async-save-initial-activation.js",
R"JSON({"activations":1,"requests":1,"pending":true})JSON",
1000);
require(
initial_state
== R"JSON({"activations":1,"requests":1,"pending":true})JSON",
"initial activation did not start an asynchronous save: "
+ initial_state);
pointer_button(engine, WEBSCENE_INPUT_POINTER_DOWN, 30, 20, 9104U, true);
pointer_button(engine, WEBSCENE_INPUT_POINTER_UP, 30, 20, 9105U, false);
wait_for_consumed_inputs(
Expand All @@ -4665,7 +4680,8 @@ void test_async_save_acknowledgement_publishes_without_pointer_input()
pending: __saveState.pending,
label: document.getElementById('label').textContent
}))JS", "async-save-coalescing.js",
R"JSON({"activations":2,"requests":1,"pending":true,"label":"Save"})JSON");
R"JSON({"activations":2,"requests":1,"pending":true,"label":"Save"})JSON",
1000);
require(
coalesced_state
== R"JSON({"activations":2,"requests":1,"pending":true,"label":"Save"})JSON",
Expand All @@ -4675,7 +4691,7 @@ void test_async_save_acknowledgement_publishes_without_pointer_input()
webscene_engine_metrics after_activation{};
webscene_engine_get_metrics(engine, &after_activation);
webscene_engine_metrics after_ack{};
for (auto attempt = 0; attempt < 200; ++attempt) {
for (auto attempt = 0; attempt < 1000; ++attempt) {
webscene_engine_get_metrics(engine, &after_ack);
if (after_ack.published_scenes > after_activation.published_scenes
&& evaluate(engine, "__saveState.acknowledgements",
Expand Down Expand Up @@ -4712,7 +4728,7 @@ void test_async_save_acknowledgement_publishes_without_pointer_input()
engine,
failure_consumed_before + 2U,
"failing save activation was not consumed");
for (auto attempt = 0; attempt < 200; ++attempt) {
for (auto attempt = 0; attempt < 1000; ++attempt) {
if (evaluate(engine, "__saveState.acknowledgements",
"async-save-failure-wait.js") == "2") {
break;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -167,6 +167,8 @@ void test_canvas_text_metrics_use_host_font_axes()
const small = context.measureText('MMMM');
context.font = '20px sans-serif';
const large = context.measureText('MMMM');
context.font = '12.5px sans-serif';
const fractional = context.measureText('MMMM');
context.font = "bold 12px -apple-system, BlinkMacSystemFont, 'Trebuchet MS', sans-serif";
const bold = context.measureText('Label');
context.textBaseline = 'middle';
Expand All @@ -180,6 +182,7 @@ void test_canvas_text_metrics_use_host_font_axes()
bold.fontBoundingBoxDescent
].every(Number.isFinite),
sizeChangesAdvance: large.width > small.width * 1.9,
fractionalSizeParsed: fractional.fontBoundingBoxAscent === 9.375,
ascent: bold.actualBoundingBoxAscent,
descent: bold.actualBoundingBoxDescent,
fontAscent: bold.fontBoundingBoxAscent,
Expand All @@ -195,7 +198,8 @@ void test_canvas_text_metrics_use_host_font_axes()

require(
result.find("\"defaultFieldsAreFinite\":true") != std::string::npos
&& result.find("\"sizeChangesAdvance\":true") != std::string::npos,
&& result.find("\"sizeChangesAdvance\":true") != std::string::npos
&& result.find("\"fractionalSizeParsed\":true") != std::string::npos,
"Canvas TextMetrics did not use finite host font metrics: " + result);
require(
result.find("\"ascent\":7.2") != std::string::npos
Expand All @@ -212,7 +216,7 @@ void test_canvas_text_metrics_use_host_font_axes()
"Canvas TextMetrics did not resolve distances from the active middle baseline: "
+ result);
require(
probe.calls == 3U,
probe.calls == 4U,
"Canvas measureText did not reuse host metrics across baseline-only changes");
require(probe.text == "Label", "Canvas measureText changed the measured text");
require(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2378,6 +2378,10 @@ void test_navigator_platform_and_wheel_modifiers(webscene_engine* engine)
require(
navigator_result.find(R"("platform":"Win32")") != std::string::npos,
"native navigator did not expose Windows platform identity: " + navigator_result);
#elif defined(__aarch64__)
require(
navigator_result.find(R"("platform":"Linux aarch64")") != std::string::npos,
"native navigator did not expose Linux ARM64 platform identity: " + navigator_result);
#else
require(
navigator_result.find(R"("platform":"Linux x86_64")") != std::string::npos,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,12 +61,13 @@ void receive_inspector_test_message(
bool wait_for_inspector_message(
inspector_test_messages& messages,
std::string_view first,
std::string_view second = {})
std::string_view second = {},
std::chrono::steady_clock::duration timeout = std::chrono::seconds(5))
{
std::unique_lock lock(messages.mutex);
return messages.available.wait_for(
lock,
std::chrono::seconds(5),
timeout,
[&] {
return std::any_of(
messages.values.begin(),
Expand Down Expand Up @@ -1391,7 +1392,11 @@ void test_v8_inspector_raw_cdp_session(webscene_engine* engine)
session_id,
R"({"id":68,"method":"Runtime.evaluate","params":{"expression":"globalThis.__websceneCappedRejections = Array.from({ length: 1025 }, (_, index) => Promise.reject(new Error('webscene-inspector-capped-rejection-' + index)));","returnByValue":true}})");
require(
wait_for_inspector_message(messages, R"("id":68)"),
wait_for_inspector_message(
messages,
R"("id":68)",
{},
std::chrono::seconds(30)),
"Inspector rejection-cap fixture did not evaluate");
require(
wait_for_inspector_message_count(
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
FROM mcr.microsoft.com/dotnet/sdk:10.0.302-noble-arm64v8@sha256:683d16913974bf1311381ccd6d6aba55213f313501c39ef964b0458f44c0c4bc

ENV DEBIAN_FRONTEND=noninteractive \
DOTNET_CLI_TELEMETRY_OPTOUT=1 \
DOTNET_NOLOGO=1 \
NUGET_XMLDOC_MODE=skip

RUN apt-get update \
&& apt-get install -y --no-install-recommends \
binutils=2.42-4ubuntu2.10 \
cmake=3.28.3-1build7 \
fontconfig=2.15.0-1.1ubuntu2 \
fonts-dejavu-core=2.37-8 \
python3=3.12.3-0ubuntu2.1 \
&& rm -rf /var/lib/apt/lists/*

WORKDIR /workspace
48 changes: 48 additions & 0 deletions packaging/WebScene.NativeEngine.Runtime/Dockerfile.linux-glibc
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
FROM mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-net10.0-cross-amd64@sha256:2962cae8ca49b18fb533504513c89308927ed3721372a0cc58630c350a2936b8 AS x64-sysroot
FROM mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-net10.0-cross-arm64@sha256:619e1c013b88c504d34c8e064e0860313cebeb3ee1fc6e2e838406744c9857a8 AS arm64-sysroot
FROM mcr.microsoft.com/dotnet/sdk:10.0.302-noble-amd64@sha256:7a91ccecc26d71bf7688c627a6b5eae2e27bb2cd1e37e8abe738348904245692 AS dotnet-sdk
FROM x64-sysroot

ARG RUST_VERSION=1.90.0
ARG RUST_ARCHIVE_SHA256=bff8974f2d3ee6c0e6ac926b533f65bbdd3697d2c2b925bdae5f45b9eed10a67
ARG RUST_ARM64_STD_SHA256=4952abb7d9d3ed7cea4f7ea44dcb23dc67631fae4ac44a5f059b90a4b5e9223f
ARG DEPOT_TOOLS_COMMIT=ca054941f756b50e1a3d83727270d879bec1f331

ENV DEBIAN_FRONTEND=noninteractive \
DOTNET_ROOT=/usr/share/dotnet \
DOTNET_CLI_TELEMETRY_OPTOUT=1 \
DOTNET_NOLOGO=1 \
NUGET_XMLDOC_MODE=skip \
DEPOT_TOOLS_UPDATE=0 \
PATH=/opt/depot_tools:/opt/rust/bin:/usr/share/dotnet:${PATH}

COPY --from=arm64-sysroot /crossrootfs/arm64 /crossrootfs/arm64
COPY --from=dotnet-sdk /usr/share/dotnet /usr/share/dotnet

RUN tdnf install -y \
dejavu-sans-fonts-2.37-3.azl3 \
dejavu-sans-mono-fonts-2.37-3.azl3 \
dejavu-serif-fonts-2.37-3.azl3 \
fontconfig-2.14.2-2.azl3 \
&& tdnf clean all

RUN set -eux; \
curl -fsSLO "https://static.rust-lang.org/dist/rust-${RUST_VERSION}-x86_64-unknown-linux-gnu.tar.xz"; \
echo "${RUST_ARCHIVE_SHA256} rust-${RUST_VERSION}-x86_64-unknown-linux-gnu.tar.xz" | sha256sum -c -; \
tar -xf "rust-${RUST_VERSION}-x86_64-unknown-linux-gnu.tar.xz"; \
"rust-${RUST_VERSION}-x86_64-unknown-linux-gnu/install.sh" --prefix=/opt/rust --without=rust-docs; \
curl -fsSLO "https://static.rust-lang.org/dist/rust-std-${RUST_VERSION}-aarch64-unknown-linux-gnu.tar.xz"; \
echo "${RUST_ARM64_STD_SHA256} rust-std-${RUST_VERSION}-aarch64-unknown-linux-gnu.tar.xz" | sha256sum -c -; \
tar -xf "rust-std-${RUST_VERSION}-aarch64-unknown-linux-gnu.tar.xz"; \
"rust-std-${RUST_VERSION}-aarch64-unknown-linux-gnu/install.sh" --prefix=/opt/rust; \
rm -rf rust-*.tar.xz rust-*unknown-linux-gnu

RUN git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git /opt/depot_tools \
&& git -C /opt/depot_tools checkout --detach "$DEPOT_TOOLS_COMMIT" \
&& test "$(git -C /opt/depot_tools rev-parse HEAD)" = "$DEPOT_TOOLS_COMMIT" \
&& /opt/depot_tools/ensure_bootstrap \
&& git config --system --add safe.directory /opt/depot_tools \
&& git config --system --add safe.directory /opt/depot_tools/.git

COPY linux-build-lock.json /opt/webscene/linux-build-lock.json
WORKDIR /workspace
Loading
Loading