If one has moved /usr/local to a separate file system and symlink'ed it to it's original location (e.g.: /usr/ports - > /u1/usr-local ), then during install the commands: /bin/mkdir -p /usr/ports/devel/ruby-gems/work/stage/usr/local/lib/ruby/gems/2.6 cd /usr/ports/devel/ruby-gems/work/rubygems-3.0.6/ && /usr/bin/env DONT_USE_BUNDLER_FOR_GEMDEPS=true G EM_HOME=/usr/ports/devel/ruby-gems/work/stage/usr/local/lib/ruby/gems/2.6 /usr/local/bin/ruby26 setup. rb --destdir=/usr/ports/devel/ruby-gems/work/stage --no-regenerate-binstubs --no-ri --no-rdoc causes the creation of two trees in ./stage: ./stage/u1/usr-local/bin/gem26 ./stage/usr/local... [everything else] Only the script gem26 appears in the path ./u1/usr-local/.., but that's sufficient for the install to fail with: pkg-static: Unable to access file /usr/ports/devel/ruby-gems/work/stage/usr/local/bin/gem26:No such fi le or directory My work-around was to "make" "mv u1/usr-local/bin/gem26 usr/local/bin/" "make install" I believe this is a bug in the ruby script 'setup,' but I have never learned ruby.
This still happens with ruby 2.7 & ruby-gems 3.0.8.
(In reply to parv from comment #1) I should have added the output from the attempt ... RubyGems installed the following executables: /src-build/ports-build/src-build/ports/devel/ruby-gems/work/stage/root2/system-local/bin/gem27 Ruby Interactive (ri) documentation was installed. ri is kind of like man pages for Ruby libraries. You may access it like this: ri Classname ri Classname.class_method ri Classname#instance_method If you do not wish to install this documentation in the future, use the --no-document flag, or set it as the default in your ~/.gemrc file. See 'gem help env' for details. /bin/ln -sf gem27 /src-build/ports-build/src-build/ports/devel/ruby-gems/work/stage/usr/local/bin/gem cd /src-build/ports-build/src-build/ports/devel/ruby-gems/work/stage/usr/local/ && /usr/bin/find -ds lib/ruby/gems/2.7/doc/rubygems-3.0.8/ ! -type d >> /src-build/ports-build/src-build/ports/devel/ruby-gems/work/.PLIST.mktmp ====> Compressing man pages (compress-man) ===> Installing for ruby27-gems-3.0.8 ===> Checking if ruby27-gems is already installed ===> Registering installation for ruby27-gems-3.0.8 pkg-static: Unable to access file /src-build/ports-build/src-build/ports/devel/ruby-gems/work/stage/usr/local/bin/gem27:No such file or directory *** Error code 1 Stop. make: stopped in /src-build/ports/devel/ruby-gems
if setup.rb is run without --prefix then bindir is taken from ruby config and then it prepends the destdir problem is that bindir from config is canonic (with symlinks resolved) so you end up with a stage dir containing ..../usr/local/stuff and ..../usr/reallocal/stuff --- /tmp/Makefile 2022-12-09 12:01:45.050912000 +0200 +++ Makefile 2022-12-09 12:24:40.557735000 +0200 @@ -6,6 +6,8 @@ DISTNAME= rubygems-${PORTVERSION} DIST_SUBDIR= ruby + + MAINTAINER= ruby@FreeBSD.org COMMENT= Package management framework for the Ruby language WWW= https://rubygems.org/ @@ -72,3 +74,7 @@ cd ${STAGEDIR}${PREFIX}/ && ${FIND} -ds ${DOC_DIR}/ ! -type d >> ${TMPPLIST} .include <bsd.port.mk> +REAL_PREFIX!= realpath ${PREFIX} +.if ${REAL_PREFIX} != ${PREFIX} + GEMS_ENV+= GEM_XXX_BIN=${PREFIX}/bin +.endif ========================================================= and add this diff file in files/patch-fix-linked-local Code: --- lib/rubygems/commands/setup_command.rb.orig 2022-12-09 12:22:16.123948000 +0200 +++ lib/rubygems/commands/setup_command.rb 2022-12-09 12:22:34.331107000 +0200 @@ -448,10 +448,14 @@ def generate_default_dirs prefix = options[:prefix] site_or_vendor = options[:site_or_vendor] + xxx_bin = ENV["GEM_XXX_BIN"] if prefix.empty? lib_dir = RbConfig::CONFIG[site_or_vendor] bin_dir = RbConfig::CONFIG["bindir"] + if xxx_bin && !xxx_bin.empty? + bin_dir = xxx_bin + end else lib_dir = File.join prefix, "lib" bin_dir = File.join prefix, "bin"