Misc #19146
closedFailed to activate YJIT for 3.2.0-dev on macOS Ventura (M1: Apple Silicon)
Description
(hsbt kindly suggested to open the issue here. Thank you!)
I found that I'm unable to activate YJIT for the latest 3.2.0-dev in rbenv with ruby_build.
Then I tried the build from the freshest 3.2.0-dev source, but the symptom remains.
I checked the setup with https://github.com/ruby/ruby/blob/master/doc/contributing/building_ruby.md
- M1 Macbook Pro 2021
- macOS Ventura 13.0.1
- rbenv 1.2.0-16-gc4395e5
- CommandLine Tools: 14.1.0.0.1.1666437224
- rustc 1.62.1 (e092d0b6b 2022-07-16)
- Ruby: 3.1.2p20 (2022-04-12 revision 4491bb740a) [arm64-darwin21]
- Homebrew: 3.6.12
- openssl@3: stable 3.0.7 (bottled) [keg-only]
- readline: stable 8.2.1 (bottled) [keg-only]
- libyaml: stable 0.2.5 (bottled)
- bison: stable 3.8.2 (bottled) [keg-only]
- gperf: stable 3.1 (bottled)
- zlib: stable 1.2.13 (bottled), HEAD [keg-only]
- libffi: stable 3.4.4 (bottled), HEAD [keg-only]
- source: 3.2.0-dev(master, 66e5200)
As far as I tried, if and only if specifying --disable-yjit
, the build is successful:
# success with --disable-yjit
$ ./autogen.sh;mkdir build && cd build;mkdir ~/.rubies;../configure --prefix="${HOME}/.rubies/ruby-master" --disable-yjit --with-opt-dir="$(brew --prefix openssl)" --disable-install-doc --disable-install-rdoc;make install
(Note that addding (or not adding) --disable-shared
or --enable-shared
to ../configure
does not affect the success)
# success with --disable-yjit
Configuration summary for ruby version 3.2.0
* Installation prefix: /Users/hachi8833/.rubies/ruby-master
* exec prefix: ${prefix}
* arch: arm64-darwin22
* site arch: ${arch}
* RUBY_BASE_NAME: ruby
* ruby lib prefix: ${libdir}/${RUBY_BASE_NAME}
* site libraries path: ${rubylibprefix}/${sitearch}
* vendor path: ${rubylibprefix}/vendor_ruby
* target OS: darwin22
* compiler: clang
* with thread: pthread
* with coroutine: arm64
* enable shared libs: no
* dynamic library ext: bundle
* CFLAGS: -fdeclspec ${optflags} ${debugflags} ${warnflags}
* LDFLAGS: -L. -L/opt/homebrew/opt/openssl@3/lib \
-fstack-protector-strong \
-L/opt/homebrew/opt/openssl@3/lib
* DLDFLAGS: -L/opt/homebrew/opt/openssl@3/lib \
-L/opt/homebrew/opt/openssl@3/lib \
-Wl,-multiply_defined,suppress
* optflags: -O3 -fno-fast-math
* debugflags: -ggdb3
* warnflags: -Wall -Wextra -Wextra-tokens \
-Wdeprecated-declarations -Wdivision-by-zero \
-Wdiv-by-zero -Wimplicit-function-declaration \
-Wimplicit-int -Wmisleading-indentation \
-Wpointer-arith -Wshorten-64-to-32 \
-Wwrite-strings -Wold-style-definition \
-Wmissing-noreturn -Wno-cast-function-type \
-Wno-constant-logical-operand -Wno-long-long \
-Wno-missing-field-initializers \
-Wno-overlength-strings -Wno-parentheses-equality \
-Wno-self-assign -Wno-tautological-compare \
-Wno-unused-parameter -Wno-unused-value \
-Wunused-variable -Wundef
* strip command: strip -A -n
* install doc: no
* MJIT support: yes
* YJIT support: no
* man page type: doc
* BASERUBY -v: ruby 3.1.2p20 (2022-04-12 revision 4491bb740a) \
[arm64-darwin21]
But without specifying --disable-yjit
, the build fails regardless any other options such as --disable-shared
or --enable-shared
:
# fails if --disable-yjit is missing:
$ ./autogen.sh;mkdir build && cd build;mkdir ~/.rubies;../configure --prefix="${HOME}/.rubies/ruby-master" --with-opt-dir="$(brew --prefix openssl)" --disable-install-doc --disable-install-rdoc;make install
# fails if --disable-yjit is missing:
Configuration summary for ruby version 3.2.0
* Installation prefix: /Users/hachi8833/.rubies/ruby-master
* exec prefix: ${prefix}
* arch: arm64-darwin22
* site arch: ${arch}
* RUBY_BASE_NAME: ruby
* ruby lib prefix: ${libdir}/${RUBY_BASE_NAME}
* site libraries path: ${rubylibprefix}/${sitearch}
* vendor path: ${rubylibprefix}/vendor_ruby
* target OS: darwin22
* compiler: clang
* with thread: pthread
* with coroutine: arm64
* enable shared libs: no
* dynamic library ext: bundle
* CFLAGS: -fdeclspec ${optflags} ${debugflags} ${warnflags}
* LDFLAGS: -L. -L/opt/homebrew/opt/openssl@3/lib \
-fstack-protector-strong \
-L/opt/homebrew/opt/openssl@3/lib
* DLDFLAGS: -L/opt/homebrew/opt/openssl@3/lib \
-L/opt/homebrew/opt/openssl@3/lib \
-Wl,-multiply_defined,suppress
* optflags: -O3 -fno-fast-math
* debugflags: -ggdb3
* warnflags: -Wall -Wextra -Wextra-tokens \
-Wdeprecated-declarations -Wdivision-by-zero \
-Wdiv-by-zero -Wimplicit-function-declaration \
-Wimplicit-int -Wmisleading-indentation \
-Wpointer-arith -Wshorten-64-to-32 \
-Wwrite-strings -Wold-style-definition \
-Wmissing-noreturn -Wno-cast-function-type \
-Wno-constant-logical-operand -Wno-long-long \
-Wno-missing-field-initializers \
-Wno-overlength-strings -Wno-parentheses-equality \
-Wno-self-assign -Wno-tautological-compare \
-Wno-unused-parameter -Wno-unused-value \
-Wunused-variable -Wundef
* strip command: strip -A -n
* install doc: no
* MJIT support: yes
* YJIT support: yes
* man page type: doc
* BASERUBY -v: ruby 3.1.2p20 (2022-04-12 revision 4491bb740a) \
[arm64-darwin21]
# fails if --disable-yjit is missing:
(...)
building Rust YJIT (release mode)
touch yjit/target/release/libyjit.a
linking miniruby
ld: warning: ignoring file yjit/target/release/libyjit.a, building for macOS-arm64 but attempting to link with file built for macOS-x86_64
Undefined symbols for architecture arm64:
"_rb_yjit_before_ractor_spawn", referenced from:
_ractor_create in ractor.o
"_rb_yjit_bop_redefined", referenced from:
_rb_vm_check_redefinition_opt_method in vm.o
"_rb_yjit_call_threshold", referenced from:
_rb_vm_exec in vm.o
_vm_sendish in vm.o
"_rb_yjit_cme_invalidate", referenced from:
_clear_method_cache_by_id_in_class in vm.o
"_rb_yjit_code_gc", referenced from:
_mjit_compile_invokebuiltin_for_rb_yjit_code_gc in yjit.o
_Init_builtin_yjit.yjit_table in yjit.o
"_rb_yjit_constant_ic_update", referenced from:
_vm_exec_core in vm.o
"_rb_yjit_constant_state_changed", referenced from:
_rb_clear_constant_cache_for_id in vm.o
"_rb_yjit_disasm_iseq", referenced from:
_mjit_compile_invokebuiltin_for_rb_yjit_disasm_iseq in yjit.o
_Init_builtin_yjit.yjit_table in yjit.o
"_rb_yjit_enabled_p", referenced from:
_rb_jit_cont_finish in cont.o
_rb_jit_cont_init in cont.o
_fiber_initialize in cont.o
_rb_threadptr_root_fiber_setup in cont.o
_cont_free in cont.o
_cont_capture in cont.o
_clear_method_cache_by_id_in_class in vm.o
...
"_rb_yjit_get_exit_locations", referenced from:
_mjit_compile_invokebuiltin_for_rb_yjit_get_exit_locations in yjit.o
_Init_builtin_yjit.yjit_table in yjit.o
"_rb_yjit_get_stats", referenced from:
_mjit_compile_invokebuiltin_for_rb_yjit_get_stats in yjit.o
_Init_builtin_yjit.yjit_table in yjit.o
"_rb_yjit_init_rust", referenced from:
_rb_yjit_init in yjit.o
"_rb_yjit_insns_compiled", referenced from:
_mjit_compile_invokebuiltin_for_rb_yjit_insns_compiled in yjit.o
_Init_builtin_yjit.yjit_table in yjit.o
"_rb_yjit_iseq_free", referenced from:
_rb_iseq_free in iseq.o
"_rb_yjit_iseq_gen_entry_point", referenced from:
_rb_yjit_compile_iseq in yjit.o
"_rb_yjit_iseq_mark", referenced from:
_rb_iseq_mark in iseq.o
"_rb_yjit_iseq_update_references", referenced from:
_rb_iseq_update_references in iseq.o
"_rb_yjit_parse_option", referenced from:
_proc_options in ruby.o
"_rb_yjit_reset_stats_bang", referenced from:
_mjit_compile_invokebuiltin_for_rb_yjit_reset_stats_bang in yjit.o
_Init_builtin_yjit.yjit_table in yjit.o
"_rb_yjit_root_mark", referenced from:
_yjit_root_type in yjit.o
"_rb_yjit_simulate_oom_bang", referenced from:
_mjit_compile_invokebuiltin_for_rb_yjit_simulate_oom_bang in yjit.o
_Init_builtin_yjit.yjit_table in yjit.o
"_rb_yjit_stats_enabled_p", referenced from:
_mjit_compile_invokebuiltin_for_rb_yjit_stats_enabled_p in yjit.o
_Init_builtin_yjit.yjit_table in yjit.o
"_rb_yjit_trace_exit_locations_enabled_p", referenced from:
_mjit_compile_invokebuiltin_for_rb_yjit_trace_exit_locations_enabled_p in yjit.o
_Init_builtin_yjit.yjit_table in yjit.o
"_rb_yjit_tracing_invalidate_all", referenced from:
_tracepoint_enable_m in vm_trace.o
_update_global_event_hook in vm_trace.o
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [miniruby] Error 1
In short, I cannot build 3.2.0-dev unless specifying --disable-yjit
. Could you please look into it?