JS Temporal is not Built into v8_monolith for MacOS / Windows

262 views
Skip to first unread message

Sam Cao

unread,
Jun 22, 2025, 4:05:38 PMJun 22
to v8-users
Hi V8 Dev Team,

I tried to turn on v8_enable_temporal_support for my V8 embedder, but found the related JS temporal symbols are only built into libv8_monolith.a on Linux. On MacOS or Windows, I experienced js_temporal_* symbol not found errors.

Could you check it out? Thank you.

Best regards,
Sam

Manish Goregaokar

unread,
Jun 23, 2025, 12:02:12 PMJun 23
to v8-users
Hi!

I don't know how to replicate this problem, but have you tried adding `:v8_maybe_temporal` as a dependency to `v8_static_library("v8_monolith")` in `BUILD.gn`?

Let me know if that works and i can fix it upstream.

Sam Cao

unread,
Jun 23, 2025, 1:16:41 PMJun 23
to v8-u...@googlegroups.com
Hi Manish,

Thank you for the info. I'll try it later and let you know if it works.

Best regards,
Sam

--
--
v8-users mailing list
v8-u...@googlegroups.com
http://groups.google.com/group/v8-users
---
You received this message because you are subscribed to a topic in the Google Groups "v8-users" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/v8-users/nI21ZCjYJwo/unsubscribe.
To unsubscribe from this group and all its topics, send an email to v8-users+u...@googlegroups.com.
To view this discussion visit https://groups.google.com/d/msgid/v8-users/e3eee9bb-bf9b-42ef-b215-6b89d2768f28n%40googlegroups.com.


--
-- Sam
Message has been deleted

Sam Cao

unread,
Jun 24, 2025, 6:32:52 AMJun 24
to v8-users
Hi Manish,

I just tried the following flags (V8 v13.8.258.19) on Windows.
dcheck_always_on = false
is_component_build = false
is_debug = false
symbol_level = 0
target_cpu = "x64"
use_custom_libcxx = false
v8_enable_i18n_support = false
v8_enable_pointer_compression = false
v8_enable_sandbox = false
v8_enable_temporal_support = true
v8_monolithic = true
v8_monolithic_for_shared_library = true
v8_static_library = true
v8_target_cpu = "x64"
v8_use_external_startup_data = false


It still doesn't work. Here are the errors.
MSBuild version 17.13.19+0d9f5a35a for .NET Framework

  1>Checking Build System
  Building Custom Rule C:/****/CMakeLists.txt
lld-link : error : undefined symbol: temporal_rs_Instant_try_new [C:\****.vcxproj]
  >>> referenced by v8_monolith.lib(js-temporal-objects.obj):(class v8::internal::MaybeDirectHandle<class v8::internal::JSTemporalInstant> __cdecl v8::internal::temporal::CreateTemporalInstantWithValidityCheck(
  class v8::internal::Isolate *, class v8::internal::DirectHandle<class v8::internal::JSFunction>, class v8::internal::DirectHandle<class v8::internal::HeapObject>, class v8::internal::DirectHandle<class v8::in
  ternal::BigInt>))

lld-link : error : undefined symbol: temporal_rs_Instant_destroy [C:\****.vcxproj]
  >>> referenced by v8_monolith.lib(js-temporal-objects.obj):(class v8::internal::MaybeDirectHandle<class v8::internal::JSTemporalInstant> __cdecl v8::internal::temporal::CreateTemporalInstantWithValidityCheck(
  class v8::internal::Isolate *, class v8::internal::DirectHandle<class v8::internal::JSFunction>, class v8::internal::DirectHandle<class v8::internal::HeapObject>, class v8::internal::DirectHandle<class v8::in
  ternal::BigInt>))
  >>> referenced by v8_monolith.lib(js-temporal-objects.obj):(public: static class v8::internal::MaybeDirectHandle<class v8::internal::JSTemporalInstant> __cdecl v8::internal::JSTemporalInstant::Round(class v8:
  :internal::Isolate *, class v8::internal::DirectHandle<class v8::internal::JSTemporalInstant>, class v8::internal::DirectHandle<class v8::internal::Object>))
  >>> referenced by v8_monolith.lib(js-temporal-objects.obj):(private: virtual void __cdecl std::_Ref_count_resource<class temporal_rs::Instant *, struct std::default_delete<class temporal_rs::Instant>>::_Destr
  oy(void))

lld-link : error : undefined symbol: temporal_rs_Instant_round [C:\****.vcxproj]
  >>> referenced by v8_monolith.lib(js-temporal-objects.obj):(public: static class v8::internal::MaybeDirectHandle<class v8::internal::JSTemporalInstant> __cdecl v8::internal::JSTemporalInstant::Round(class v8:
  :internal::Isolate *, class v8::internal::DirectHandle<class v8::internal::JSTemporalInstant>, class v8::internal::DirectHandle<class v8::internal::Object>))

lld-link : error : undefined symbol: temporal_rs_Instant_epoch_milliseconds [C:\****.vcxproj]
  >>> referenced by v8_monolith.lib(js-temporal-objects.obj):(public: static class v8::internal::MaybeDirectHandle<class v8::internal::Union<class v8::internal::Smi, class v8::internal::HeapNumber>> __cdecl v8:
  :internal::JSTemporalInstant::EpochMilliseconds(class v8::internal::Isolate *, class v8::internal::DirectHandle<class v8::internal::JSTemporalInstant>))
  >>> referenced by v8_monolith.lib(js-temporal-objects.obj):(public: static class v8::internal::MaybeDirectHandle<class v8::internal::String> __cdecl v8::internal::JSTemporalInstant::ToString(class v8::interna
  l::Isolate *, class v8::internal::DirectHandle<class v8::internal::JSTemporalInstant>, class v8::internal::DirectHandle<class v8::internal::Object>))

lld-link : error : undefined symbol: temporal_rs_Instant_epoch_nanoseconds [C:\****.vcxproj]
  >>> referenced by v8_monolith.lib(js-temporal-objects.obj):(public: static class v8::internal::MaybeDirectHandle<class v8::internal::BigInt> __cdecl v8::internal::JSTemporalInstant::EpochNanoseconds(class v8:
  :internal::Isolate *, class v8::internal::DirectHandle<class v8::internal::JSTemporalInstant>))
Build Failed

I'm not sure what went wrong.

Best regards,
Sam

Manish Goregaokar

unread,
Jun 24, 2025, 10:55:48 AMJun 24
to v8-u...@googlegroups.com
Did you make the requested change to BUILD.gn, or just change args? Again, I'm recommending adding `:v8_maybe_temporal` to the dependencies section of the `v8_monolith` build rule.

When I get a chance I can try and replicate these flags locally.

Sam Cao

unread,
Jun 24, 2025, 2:11:35 PMJun 24
to v8-users
Hi Manish,

Yes, I made the change to BUILD.gn on Windows. I'll try on MacOS this weekend.

Best regards,
Sam

jmr

unread,
Jul 19, 2025, 7:51:15 PMJul 19
to v8-users
Hitting the same issue.

Adding:

  v8_static_library("v8_monolith") {
    deps = [
      ":v8",
      ":v8_libbase",
      ":v8_libplatform",
      ":v8_maybe_temporal",
      "//build/win:default_exe_manifest",
    ]

    configs = [ ":internal_config" ]
  }

Does not help.

jmr

unread,
Jul 19, 2025, 8:01:34 PMJul 19
to v8-users
This does not help either:

  v8_static_library("v8_monolith") {
    deps = [
      ":v8",
      ":v8_libbase",
      ":v8_libplatform",
      ":v8_maybe_temporal",
      "//third_party/rust/temporal_capi",
      "//build/win:default_exe_manifest",
    ]
    public_deps = [ "//third_party/rust/temporal_capi" ]
    ....

jmr

unread,
Jul 19, 2025, 8:28:44 PMJul 19
to v8-users
Disabling temporal support works as a workaround for now:

v8_enable_temporal_support = false

snek

unread,
Jul 28, 2025, 9:16:46 AMJul 28
to v8-users
I'm seeing the same linker issue while trying to enable temporal in rusty_v8: https://github.com/denoland/rusty_v8/pull/1825

I tried adding the `:v8_maybe_temporal` group as a dependency of the static lib target, but it didn't resolve the issue.

Alexandra Wheeler

unread,
Oct 30, 2025, 4:21:32 PMOct 30
to v8-users
Hi, was there ever a fix? I'm running into this problem now on macos.

Manish Goregaokar

unread,
Oct 30, 2025, 5:59:33 PMOct 30
to v8-u...@googlegroups.com
No, but you can track this issue at https://g-issues.chromium.org/issues/434763436.

I believe some work needs to be done on the Rust GN rules to fix this. That work is currently not being worked on (or planned).

Sam Cao

unread,
Dec 17, 2025, 8:11:39 AM (4 days ago) Dec 17
to v8-u...@googlegroups.com
Hi All,

I found a way to build Temporal for v8_monolith. Please follow the steps.
  1. Set 'v8_enable_temporal_support = true' in your gn file. Be careful that 'compiler_timing' must be turned off. That's 'compiler_timing = false'.
  2. Build v8_monolith as usual.
  3. Run 'git clone https://github.com/boa-dev/temporal.git' to clone Temporal to a local folder.
  4. Run 'cd temporal' and 'git checkout v0.1.2'.
  5. Update 'Cargo.toml' and 'temporal_capi/Cargo.toml' by adding the following section.
    [lib]
    crate-type = ["staticlib", "rlib"]
  6. Make sure you have a rust toolchain installed.
  7. Run 'cargo build --release --package temporal_capi --features compiled_data,zoneinfo64'.
  8. Copy 'target/release/libtemporal_capi.a' to 'out.gn/xxx/obj'.
  9. Set the preprocessor 'V8_TEMPORAL_SUPPORT' in your project.
  10. Link libtemporal_capi.a and libv8_monolith.a in your project.
  11. Done.
I've tested it on MacOS and the Temporal API works well.

Please let me know if you have any questions.

Cheers,
Sam




--
-- Sam

Sam Cao

unread,
Dec 19, 2025, 4:08:57 AM (3 days ago) Dec 19
to v8-users
Hi All,

I also confirmed on Windows x86_64 and Linux x86_64 the same steps work. It's quite challenging to do the same on Linux arm64. I'm still investigating. Please feel free to let me know if you have any questions.

Best regards,
Sam

snek

unread,
Dec 19, 2025, 4:42:25 AM (3 days ago) Dec 19
to v8-users
If the final artifact you're building happens to be rust you can also just add it as a cargo dependency: https://github.com/denoland/rusty_v8/blob/31e543f26bde595f80f4bb50c47a07ccac31c624/Cargo.toml#L110

Sam Cao

unread,
Dec 20, 2025, 9:43:17 AM (yesterday) Dec 20
to v8-users
Hi All,

Good news. This hack finally works on Linux arm64, but it is twice more complicated.

Best regards,
Sam

Reply all
Reply to author
Forward
0 new messages