diff --git a/configure.ac b/configure.ac index 90f52e23836bd4..b39f6ca136da1a 100644 --- a/configure.ac +++ b/configure.ac @@ -3555,7 +3555,7 @@ AS_CASE("$enable_shared", [yes], [ RUBY_APPEND_OPTIONS(LIBRUBY_DLDFLAGS, ['-Wl,-soname,$(LIBRUBY_SONAME)' "$LDFLAGS_OPTDIR"]) LIBRUBY_ALIASES='$(LIBRUBY_SONAME) lib$(RUBY_SO_NAME).$(SOEXT)' AS_IF([test "$load_relative" = yes], [ - libprefix="'\$\${ORIGIN}/../${libdir_basename}'" + libprefix="'\$\${ORIGIN}/../${multiarch+../../}${libdir_basename}'" LIBRUBY_RPATHFLAGS="-Wl,-rpath,${libprefix}" LIBRUBY_RELATIVE=yes ]) @@ -3567,7 +3567,7 @@ AS_CASE("$enable_shared", [yes], [ LIBRUBY_SO="$LIBRUBY_SO.\$(TEENY)" LIBRUBY_ALIASES='' ], [test "$load_relative" = yes], [ - libprefix="'\$\$ORIGIN/../${libdir_basename}'" + libprefix="'\$\$ORIGIN/../${multiarch+../../}${libdir_basename}'" LIBRUBY_RPATHFLAGS="-Wl,-rpath,${libprefix}" LIBRUBY_RELATIVE=yes ]) @@ -3591,7 +3591,7 @@ AS_CASE("$enable_shared", [yes], [ LIBRUBY_ALIASES='$(LIBRUBY_SONAME) lib$(RUBY_SO_NAME).$(SOEXT)' RUBY_APPEND_OPTIONS(LIBRUBY_DLDFLAGS, ["${linker_flag}-h${linker_flag:+,}"'$(@F)']) AS_IF([test "$load_relative" = yes], [ - libprefix="'\$\$ORIGIN/../${libdir_basename}'" + libprefix="'\$\$ORIGIN/../${multiarch+../../}${libdir_basename}'" LIBRUBY_RPATHFLAGS="-R${libprefix}" LIBRUBY_RELATIVE=yes ], [ @@ -3608,7 +3608,7 @@ AS_CASE("$enable_shared", [yes], [ LIBRUBY_SONAME='$(LIBRUBY_SO)' LIBRUBY_ALIASES='lib$(RUBY_INSTALL_NAME).$(SOEXT)' AS_IF([test "$load_relative" = yes], [ - libprefix="@executable_path/../${libdir_basename}" + libprefix="@executable_path/../${multiarch+../../}${libdir_basename}" LIBRUBY_RELATIVE=yes ]) LIBRUBY_DLDFLAGS="$LIBRUBY_DLDFLAGS -install_name ${libprefix}"'/$(LIBRUBY_SONAME)' diff --git a/tool/mkrunnable.rb b/tool/mkrunnable.rb index 07f638a9a56060..3a62fea80f4996 100755 --- a/tool/mkrunnable.rb +++ b/tool/mkrunnable.rb @@ -34,18 +34,22 @@ rubylibdir = config["rubylibdir"] rubyarchdir = config["rubyarchdir"] archdir = "#{extout}/#{arch}" -[bindir, libdir, archdir].uniq.each do |dir| +exedir = libdirname == "archlibdir" ? "#{config["libexecdir"]}/#{arch}/bin" : bindir +[exedir, libdir, archdir].uniq.each do |dir| File.directory?(dir) or mkdir_p(dir) end +unless exedir == bindir + ln_dir_relative(exedir, bindir) +end exeext = config["EXEEXT"] ruby_install_name = config["ruby_install_name"] rubyw_install_name = config["rubyw_install_name"] goruby_install_name = "go" + ruby_install_name -[ruby_install_name, rubyw_install_name, goruby_install_name].map do |ruby| +[ruby_install_name, rubyw_install_name, goruby_install_name].each do |ruby| if ruby and !ruby.empty? ruby += exeext - ln_relative(ruby, "#{bindir}/#{ruby}", true) + ln_relative(ruby, "#{exedir}/#{ruby}", true) end end so = config["LIBRUBY_SO"] diff --git a/tool/rbinstall.rb b/tool/rbinstall.rb index 56e88045b2c67b..80041156bebc3f 100755 --- a/tool/rbinstall.rb +++ b/tool/rbinstall.rb @@ -28,6 +28,7 @@ rescue LoadError $" << "zlib.rb" end +require_relative 'lib/path' INDENT = " "*36 STDOUT.sync = true @@ -360,6 +361,13 @@ def CONFIG.[](name, mandatory = false) goruby_install_name = "go" + ruby_install_name bindir = CONFIG["bindir", true] +if CONFIG["libdirname"] == "archlibdir" + libexecdir = MAKEFILE_CONFIG["archlibdir"].dup + unless libexecdir.sub!(/\$\(lib\K(?=dir\))/) {"exec"} + libexecdir = "$(libexecdir)/$(arch)" + end + archbindir = RbConfig.expand(libexecdir) + "/bin" +end libdir = CONFIG[CONFIG.fetch("libdirname", "libdir"), true] rubyhdrdir = CONFIG["rubyhdrdir", true] archhdrdir = CONFIG["rubyarchhdrdir"] || (rubyhdrdir + "/" + CONFIG['arch']) @@ -384,22 +392,34 @@ def CONFIG.[](name, mandatory = false) rdoc_noinst = %w[created.rid] install?(:local, :arch, :bin, :'bin-arch') do - prepare "binary commands", bindir + prepare "binary commands", (dest = archbindir || bindir) + + def (bins = []).add(name) + push(name) + name + end - install ruby_install_name+exeext, bindir, :mode => $prog_mode, :strip => $strip + install bins.add(ruby_install_name+exeext), dest, :mode => $prog_mode, :strip => $strip if rubyw_install_name and !rubyw_install_name.empty? - install rubyw_install_name+exeext, bindir, :mode => $prog_mode, :strip => $strip + install bins.add(rubyw_install_name+exeext), dest, :mode => $prog_mode, :strip => $strip end # emcc produces ruby and ruby.wasm, the first is a JavaScript file of runtime support # to load and execute the second .wasm file. Both are required to execute ruby if RUBY_PLATFORM =~ /emscripten/ and File.exist? ruby_install_name+".wasm" - install ruby_install_name+".wasm", bindir, :mode => $prog_mode, :strip => $strip + install bins.add(ruby_install_name+".wasm"), dest, :mode => $prog_mode, :strip => $strip end if File.exist? goruby_install_name+exeext - install goruby_install_name+exeext, bindir, :mode => $prog_mode, :strip => $strip + install bins.add(goruby_install_name+exeext), dest, :mode => $prog_mode, :strip => $strip end if enable_shared and dll != lib - install dll, bindir, :mode => $prog_mode, :strip => $strip + install bins.add(dll), dest, :mode => $prog_mode, :strip => $strip + end + if archbindir + prepare "binary command links", bindir + relpath = Path.relative(archbindir, bindir) + bins.each do |f| + ln_sf(File.join(relpath, f), File.join(bindir, f)) + end end end @@ -690,7 +710,7 @@ class << (w = []) install?(:dbg, :nodefault) do prepare "debugger commands", bindir prepare "debugger scripts", rubylibdir - conf = RbConfig::MAKEFILE_CONFIG.merge({"prefix"=>"${prefix#/}"}) + conf = MAKEFILE_CONFIG.merge({"prefix"=>"${prefix#/}"}) Dir.glob(File.join(srcdir, "template/ruby-*db.in")) do |src| cmd = $script_installer.transform(File.basename(src, ".in")) open_for_install(File.join(bindir, cmd), $script_mode) { @@ -707,9 +727,9 @@ class << (w = []) install File.join(srcdir, ".gdbinit"), File.join(rubylibdir, "gdbinit") if $debug_symbols { - ruby_install_name => bindir, - rubyw_install_name => bindir, - goruby_install_name => bindir, + ruby_install_name => archbindir || bindir, + rubyw_install_name => archbindir || bindir, + goruby_install_name => archbindir || bindir, dll => libdir, }.each do |src, dest| next if src.empty?