Hi, I ran into a permission problem when using proot(1). The ${PORTSDIR}/bulk directory cannot be created when you decide to place the other directories outside the ports tree.
Here's my configuration: $ cat proot.cfg chroot=/prootports2 PORT_USER=denis extra=/etc/doas.conf /etc/installurl WRKOBJDIR=/bportbuild/pobj PLIST_REPOSITORY=/bportbuild/plist DISTDIR=/bportbuild/distfiles PACKAGE_REPOSITORY=/bportbuild/packages LOGDIR=/bportbuild/logs actions=unpopulate_light copy_ports mkconf_tail=proot_mkadd.cfg $ cat proot_mkadd.cfg PARALLEL_MAKE_JOBS=yes MAKE_JOBS=10 #BULK=No If the BULK line is commented out as here, "BULK=Auto" is used and the permission problem is encountered: $ doas /usr/ports/infrastructure/bin/proot -c proot.cfg $ doas chroot -u denis /prootports2 $ cd /usr/port/sysutils/flashrom $ make fake [...] ===> Building package for dwz-0.15 Create /bportbuild/packages/amd64/all/dwz-0.15.tgz Creating package dwz-0.15 Creating package debug-dwz-0.15 Link to /bportbuild/packages/amd64/ftp/dwz-0.15.tgz Link to /bportbuild/packages/amd64/ftp/debug-dwz-0.15.tgz mkdir: /usr/ports/bulk: Permission denied Of course, with "BULK=No", everything works straight away. I've modified proot(1) to include BULK_COOKIES_DIR in the configuration file in the same way as DISTDIR, WRKOBJDIR, PLIST_REPOSITORY, and so on. A patch for proot(1) is attached here. Not sure this is the right approach. -- Denis
Index: infrastructure/bin/proot =================================================================== RCS file: /cvs/ports/infrastructure/bin/proot,v diff -u -p -u -r1.74 proot --- infrastructure/bin/proot 6 May 2023 05:21:15 -0000 1.74 +++ infrastructure/bin/proot 3 Aug 2024 09:05:53 -0000 @@ -151,12 +151,16 @@ sub do_parm($state, $k, $v) $state->{PACKAGE_REPOSITORY} = File::Spec->canonpath($v); }, PLIST_REPOSITORY => sub() { $state->{PLIST_REPOSITORY} = File::Spec->canonpath($v); + }, BULK_COOKIES_DIR => sub() { + $state->{BULK_COOKIES_DIR} = File::Spec->canonpath($v); }, NFSDIR => sub() { $state->{DISTDIR} = File::Spec->canonpath("$v/distfiles"); $state->{PACKAGE_REPOSITORY} = File::Spec->canonpath("$v/packages"); $state->{PLIST_REPOSITORY} = File::Spec->canonpath("$v/plist"); + $state->{BULK_COOKIES_DIR} = + File::Spec->canonpath("$v/bulk"); }, LOCALDIR => sub() { $state->{WRKOBJDIR} = File::Spec->canonpath("$v/pobj"); $state->{LOCKDIR} = File::Spec->canonpath("$v/locks"); @@ -325,7 +329,7 @@ sub handle_options($state) if ($< != 0) { $state->fatal("Must be root"); } - for my $i (qw(PORTSDIR DISTDIR WRKOBJDIR PACKAGE_REPOSITORY PLIST_REPOSITORY LOCKDIR LOGDIR FETCH_USER BUILD_USER)) { + for my $i (qw(PORTSDIR DISTDIR WRKOBJDIR PACKAGE_REPOSITORY PLIST_REPOSITORY BULK_COOKIES_DIR LOCKDIR LOGDIR FETCH_USER BUILD_USER)) { if (defined $state->{$i}) { $state->{write}{$i} = 1; } @@ -340,8 +344,9 @@ sub handle_options($state) $state->{loguser} //= $state->{builduser}; $state->{PACKAGE_REPOSITORY} //= join('/', $state->{PORTSDIR}, 'packages'); $state->{PLIST_REPOSITORY} //= join('/', $state->{PORTSDIR}, 'plist'); + $state->{BULK_COOKIES_DIR} //= join('/', $state->{PORTSDIR}, 'bulk'); $state->{sysdir} //= '/usr/src/sys'; - for my $dir (qw(DISTDIR WRKOBJDIR LOGDIR PACKAGE_REPOSITORY PLIST_REPOSITORY LOCKDIR)) { + for my $dir (qw(DISTDIR WRKOBJDIR LOGDIR PACKAGE_REPOSITORY PLIST_REPOSITORY BULK_COOKIES_DIR LOCKDIR)) { $state->{$dir} = $state->canonical_dir($state->{$dir}); $state->add_preserved($state->{$dir}); } @@ -357,7 +362,7 @@ sub handle_options($state) } for my $i (qw(chroot srcroot PORTSDIR DISTDIR WRKOBJDIR LOCKDIR LOGDIR - PACKAGE_REPOSITORY PLIST_REPOSITORY)) { + PACKAGE_REPOSITORY PLIST_REPOSITORY BULK_COOKIES_DIR)) { if (defined $state->{$i}) { $state->say("#1=#2", $i, $state->{$i}); } @@ -689,6 +694,9 @@ sub best_user($state, $path) if (m/^\Q$state->{PLIST_REPOSITORY}\E/) { return $state->{builduser}; } + if (m/^\Q$state->{BULK_COOKIES_DIR}\E/) { + return $state->{builduser}; + } if (m/^\Q$state->{PACKAGE_REPOSITORY}\E/) { return $state->{builduser}; } @@ -1062,6 +1070,7 @@ sub make_ports_subdirs($state) $state->build_dir(WHINE|MKPATH , "builduser", "WRKOBJDIR"); $state->build_dir(0, "builduser", "PACKAGE_REPOSITORY"); $state->build_dir(0, "builduser", "PLIST_REPOSITORY"); + $state->build_dir(0, "builduser", "BULK_COOKIES_DIR"); $state->build_dir(WHINE, "builduser", "LOCKDIR"); }); }