Gentoo Forums
Gentoo Forums
Gentoo Forums
Quick Search: in
Understanding package.env, env, package.bashrc, bashrc
View unanswered posts
View posts from last 24 hours

 
Reply to topic    Gentoo Forums Forum Index Portage & Programming
View previous topic :: View next topic  
Author Message
Massimo B.
Veteran
Veteran


Joined: 09 Feb 2005
Posts: 1810
Location: PB, Germany

PostPosted: Thu Sep 05, 2024 8:04 am    Post subject: Understanding package.env, env, package.bashrc, bashrc Reply with quote

Discussion about https://wiki.gentoo.org/wiki//etc/portage/package.env and the discussion https://wiki.gentoo.org/wiki/Talk:/etc/portage/package.env#.2Fetc.2Fportage.2Fenv

Quote from https://wiki.gentoo.org/index.php?title=Talk:/etc/portage/package.env&oldid=1310546#.2Fetc.2Fportage.2Fenv:
Quote:
/etc/portage/env
Currently there is no wiki for this location. Eventhough the man-page says in section "package.env" "Beginners should be careful to recognize the difference between these two types", it's not clearly described in the later section "/etc/portage/env/". The Wiki does not make it clearer. From my understanding, in /etc/portage/env there can be 2 type of files. One is placed in the parent dir and must be referenced by /etc/portage/package.env entries, the other is placed like /etc/portage/env/${CATEGORY}/${PN}. The difference is the time of sourcing.

Then there is package.bashrc with referenced files located in bashrc/ but in section "bashrc" of the man-page I read "Additional package-specific bashrc files can be created in /etc/portage/env.".

I'm confused. Is there somewhere the complete call-stack of all env and bashrc files?


Like for the example in https://wiki.gentoo.org/wiki//etc/portage/package.env#Use_different_MAKEOPTS_for_a_specific_package :
What is the difference between
/etc/portage/env/makeopts-jobs-28.conf:
MAKEOPTS="${MAKEOPTS} --jobs=28"
/etc/portage/package.env:
dev-qt/qtwebengine makeopts-jobs-28.conf
and
/etc/portage/env/dev-qt/qtwebengine:
MAKEOPTS="${MAKEOPTS} --jobs=28"
?

If there is
/etc/portage/env/${CATEGORY}/${PN} in parallel to /etc/portage/env/myconf AND /etc/portage/package.env/ reference, is there also
/etc/portage/bashrc/${CATEGORY}/${PN} in parallel to /etc/portage/bashrc/myconf AND /etc/portage/package.bashrc/ reference
?
_________________
HP ZBook Power 15.6" G8 i7-11800H|HP EliteDesk 800G1 i7-4790|HP Compaq Pro 6300 i7-3770
Back to top
View user's profile Send private message
Genone
Retired Dev
Retired Dev


Joined: 14 Mar 2003
Posts: 9607
Location: beyond the rim

PostPosted: Thu Sep 05, 2024 9:07 am    Post subject: Re: Understanding package.env, env, package.bashrc, bashrc Reply with quote

Massimo B. wrote:
If there is
/etc/portage/env/${CATEGORY}/${PN} in parallel to /etc/portage/env/myconf AND /etc/portage/package.env/ reference, is there also
/etc/portage/bashrc/${CATEGORY}/${PN} in parallel to /etc/portage/bashrc/myconf AND /etc/portage/package.bashrc/ reference
?


There is no /etc/portage/package.bashrc, that is only available for profiles (for whatever reason), not users. There is /etc/portage/bashrc (a file, not directory) which is sourced globally before package-specific bashrc files.

Quote:
What is the difference between
/etc/portage/env/makeopts-jobs-28.conf:
MAKEOPTS="${MAKEOPTS} --jobs=28"
/etc/portage/package.env:
dev-qt/qtwebengine makeopts-jobs-28.conf
and
/etc/portage/env/dev-qt/qtwebengine:
MAKEOPTS="${MAKEOPTS} --jobs=28"
?


In that example there is effectively no difference. That comes up when you want to do more fancy stuff:

The first is processed by portage when setting up the initial environment. As stated in the manpage, these files are processed like make.conf, so they can't contain arbitrary bash code and should only be used for setting up environment variables. On the upside you can modify certain variables here that are locked or ineffective when actual bashrc files are processed.
The second is actually sourced by bash when the actual ebuild phase is executed, so it is much more flexible in what it can do syntax-wise. However it will only affect the code executed in ebuild phases, not the base environment used by portage itself.

Quote:
I'm confused. Is there somewhere the complete call-stack of all env and bashrc files?


Unlikely as it isn't a single call-stack and the complete thing is rather messy. Reason is history: Originally none of these files existed, they were added gradually over time for different incompatible (edge-case) purposes and therefore had to be implemented in different parts of portage.

TL;DR: Just stick to the manpage recommendation: If you want to adjust the ebuild environment (variables), use package.env, that has the best chance to actually do what you expect. If you want to actually execute code, use bashrc files.
Back to top
View user's profile Send private message
Massimo B.
Veteran
Veteran


Joined: 09 Feb 2005
Posts: 1810
Location: PB, Germany

PostPosted: Thu Sep 05, 2024 9:26 am    Post subject: Reply with quote

Again, if for the second approach /etc/portage/env/dev-qt/qtwebengine is a sourced bashrc, then it should be better placed at /etc/portage/bashrc/dev-qt/qtwebengine, because it is unusual that some /etc/portage/env tree may contain completely different file types inside.

And what is then the difference to some
/etc/portage/package.bashrc/myqtwebenginebashrc:
dev-qt/qtwebengine myqtwebenginebashrc
/etc/portage/bashrc/myqtwebenginebashrc:
MAKEOPTS="${MAKEOPTS} --jobs=28"

_________________
HP ZBook Power 15.6" G8 i7-11800H|HP EliteDesk 800G1 i7-4790|HP Compaq Pro 6300 i7-3770
Back to top
View user's profile Send private message
Hu
Administrator
Administrator


Joined: 06 Mar 2007
Posts: 22612

PostPosted: Thu Sep 05, 2024 12:43 pm    Post subject: Reply with quote

You can disagree with what paths were chosen, but they are now locked by history, and convincing anyone to change them is probably difficult. The current values may not be optimal or make the most sense, but they are supported now and people are using them.
Back to top
View user's profile Send private message
Massimo B.
Veteran
Veteran


Joined: 09 Feb 2005
Posts: 1810
Location: PB, Germany

PostPosted: Thu Sep 05, 2024 12:47 pm    Post subject: Reply with quote

Sure, I agree. I just try to understand the differences between the currently implemented approaches.
_________________
HP ZBook Power 15.6" G8 i7-11800H|HP EliteDesk 800G1 i7-4790|HP Compaq Pro 6300 i7-3770
Back to top
View user's profile Send private message
Genone
Retired Dev
Retired Dev


Joined: 14 Mar 2003
Posts: 9607
Location: beyond the rim

PostPosted: Thu Sep 05, 2024 1:06 pm    Post subject: Reply with quote

Massimo B. wrote:
Again, if for the second approach /etc/portage/env/dev-qt/qtwebengine is a sourced bashrc, then it should be better placed at /etc/portage/bashrc/dev-qt/qtwebengine, because it is unusual that some /etc/portage/env tree may contain completely different file types inside.


Agreed, but that has historic reasons as well: /etc/portage/env was first used by a custom bashrc loader (long before package.env was even thought of). When that logic was integrated into portage itself the location was kept to avoid breaking user setups. That package.env later reused that location was probably an unfortunate decision in review, can't recall when that happened and if I had any input on that or was already gone.


Quote:
And what is then the difference to some
/etc/portage/package.bashrc/myqtwebenginebashrc:
dev-qt/qtwebengine myqtwebenginebashrc
/etc/portage/bashrc/myqtwebenginebashrc:
MAKEOPTS="${MAKEOPTS} --jobs=28"

As mentioned in the last post: There is no /etc/portage/package.bashrc, and /etc/portage/bashrc being a directory will likely trigger bash errors. See previous post.
Back to top
View user's profile Send private message
Massimo B.
Veteran
Veteran


Joined: 09 Feb 2005
Posts: 1810
Location: PB, Germany

PostPosted: Fri Sep 06, 2024 8:15 am    Post subject: Reply with quote

Genone wrote:
As mentioned in the last post: There is no /etc/portage/package.bashrc, and /etc/portage/bashrc being a directory will likely trigger bash errors. See previous post.

Really? In man portage I find:
Quote:
package.bashrc
Per-package bashrc mechanism. Contains a list of bashrc files to be sourced before emerging a given atom. The bashrc files must be stored in bashrc/, in the profile directory.

I thought that means /etc/portage/package.bashrc and /etc/portage/bashrc. But it rather means "/bashrc in the profile directory" which is /etc/portage/profile/bashrc, right? What about package.bashrc, where can that be found?
_________________
HP ZBook Power 15.6" G8 i7-11800H|HP EliteDesk 800G1 i7-4790|HP Compaq Pro 6300 i7-3770
Back to top
View user's profile Send private message
logrusx
Advocate
Advocate


Joined: 22 Feb 2018
Posts: 2397

PostPosted: Fri Sep 06, 2024 8:59 am    Post subject: Reply with quote

Massimo B. wrote:
Genone wrote:
As mentioned in the last post: There is no /etc/portage/package.bashrc, and /etc/portage/bashrc being a directory will likely trigger bash errors. See previous post.

Really? In man portage I find:
Quote:
package.bashrc
Per-package bashrc mechanism. Contains a list of bashrc files to be sourced before emerging a given atom. The bashrc files must be stored in bashrc/, in the profile directory.

I thought that means /etc/portage/package.bashrc and /etc/portage/bashrc. But it rather means "/bashrc in the profile directory" which is /etc/portage/profile/bashrc, right? What about package.bashrc, where can that be found?



Code:
SPECIFIC FILE DESCRIPTIONS
       /etc/portage/make.profile/ or /etc/make.profile/
...
              package.bashrc
                     Per-package bashrc mechanism.  Contains a list of bashrc files to be sourced before emerging a given atom.  The bashrc files must be stored in bashrc/, in the profile directory.
...


Did you miss the above part?

Also for completeness:

Code:
SYNOPSIS
       /etc/portage/make.profile/ or /etc/make.profile/
              site-specific overrides go in /etc/portage/profile/
...
              package.bashrc
...


However I find it a bit confusing as package.accept_keywords is right above package.bashrc. Is there a separate package.accept_keywords under /etc/portage/make.profile/ or /etc/make.profile/ or /etc/portage/profile?

Best Regards,
Georgi
Back to top
View user's profile Send private message
Genone
Retired Dev
Retired Dev


Joined: 14 Mar 2003
Posts: 9607
Location: beyond the rim

PostPosted: Sat Sep 07, 2024 2:27 am    Post subject: Reply with quote

Massimo B. wrote:
Genone wrote:
As mentioned in the last post: There is no /etc/portage/package.bashrc, and /etc/portage/bashrc being a directory will likely trigger bash errors. See previous post.

Really? In man portage I find:
Quote:
package.bashrc
Per-package bashrc mechanism. Contains a list of bashrc files to be sourced before emerging a given atom. The bashrc files must be stored in bashrc/, in the profile directory.

Yes, but that is not in the section about /etc/portage. I agree that it is probably confusing that profile stuff is listed before user config files.
Quote:
What about package.bashrc, where can that be found?

As already said, that is only for profiles, not for users. And no idea why it even exists for profiles. Just forget about it.
Quote:
However I find it a bit confusing as package.accept_keywords is right above package.bashrc. Is there a separate package.accept_keywords under /etc/portage/make.profile/ or /etc/make.profile/ or /etc/portage/profile?

Yes. Not sure why profiles would need that AND package.keywords (which is different from the old package.keywords user config file), but it is available.
Back to top
View user's profile Send private message
Massimo B.
Veteran
Veteran


Joined: 09 Feb 2005
Posts: 1810
Location: PB, Germany

PostPosted: Mon Oct 21, 2024 6:33 am    Post subject: Reply with quote

In this context, a question about a usecase:
Currently I have:
/etc/portage/package.env/proxy :
*/* http_proxy
app-custom/mycustompackage no_proxy
/etc/portage/env/http_proxy:
http_proxy="http://wwwcache:8080"
https_proxy="http://wwwcache:8080"
/etc/portage/env/no_proxy :
http_proxy=""
https_proxy=""

Now I like to set a http proxy depending on the current network. Where can I add code to check the current network address? env/ does only contain environment variables?
It's not clear from the man-page:
Quote:
/etc/portage/env/
package-specific bashrc files
That would actually mean, it interprets bash code like any bashrc.

Would I need to add /etc/portage/bashrc/mycustompackagebashrc for every single package?
_________________
HP ZBook Power 15.6" G8 i7-11800H|HP EliteDesk 800G1 i7-4790|HP Compaq Pro 6300 i7-3770
Back to top
View user's profile Send private message
flexibeast
Guru
Guru


Joined: 04 Apr 2022
Posts: 433
Location: Naarm/Melbourne, Australia

PostPosted: Mon Oct 21, 2024 7:39 am    Post subject: Reply with quote

You're mixing up two different contexts:

* Configuring the environment of the Portage build process. This is where you would use /etc/portage/package.env and /etc/portage/env. You would only be using these paths if you wanted to change the environment of the build process every time the network changes (which i assume is not the case).

* Configuring your system's environment more generally. In that case, you can drop a shell script into /etc/env.d/ - note the lack of "portage" in that path. Alternatively, you can put something in your personal ~/.bash_login file (or equivalent, e.g. ~/.zlogin) to set up environment variables when you log in.

For example, if the network is known by the time you log in, you could put something in your ~/.bash_login to set the proxy based on the output of some command that determines what network you're connected to.
_________________
https://wiki.gentoo.org/wiki/User:Flexibeast
Back to top
View user's profile Send private message
logrusx
Advocate
Advocate


Joined: 22 Feb 2018
Posts: 2397

PostPosted: Mon Oct 21, 2024 8:06 am    Post subject: Reply with quote

Massimo B. wrote:
In this context, a question about a usecase:
Currently I have:
/etc/portage/package.env/proxy :
*/* http_proxy
app-custom/mycustompackage no_proxy
/etc/portage/env/http_proxy:
http_proxy="http://wwwcache:8080"
https_proxy="http://wwwcache:8080"


I think this won't work. Both will match for mycustompackage and you'll have both proxy and no_proxy.

But also your concept it totally wrong. This configures the environment during the emerge process. See flexibeast's comment above.

Best Regards,
Georgi
Back to top
View user's profile Send private message
Massimo B.
Veteran
Veteran


Joined: 09 Feb 2005
Posts: 1810
Location: PB, Germany

PostPosted: Mon Oct 21, 2024 12:57 pm    Post subject: Reply with quote

flexibeast wrote:
You're mixing up two different contexts
What makes you think I would confuse /etc/portage/env with /etc/env.d ?
flexibeast wrote:
For example, if the network is known by the time you log in, you could put something in your ~/.bash_login to set the proxy based on the output of some command that determines what network you're connected to.
Actually yes. But I like to set different proxies per package and for Portage only, not globally. And if setting globally this would rather be a task for NetworkManager.
So currently I'm able to set specific proxies for specific packages, but I can't add code to make that depending on the current network.
_________________
HP ZBook Power 15.6" G8 i7-11800H|HP EliteDesk 800G1 i7-4790|HP Compaq Pro 6300 i7-3770
Back to top
View user's profile Send private message
logrusx
Advocate
Advocate


Joined: 22 Feb 2018
Posts: 2397

PostPosted: Mon Oct 21, 2024 1:21 pm    Post subject: Reply with quote

You didn't make that clear.

My first remark still applies.

Best Regards,
Georgi
Back to top
View user's profile Send private message
Massimo B.
Veteran
Veteran


Joined: 09 Feb 2005
Posts: 1810
Location: PB, Germany

PostPosted: Mon Oct 21, 2024 1:55 pm    Post subject: Reply with quote

It works like that, I tried. The later has precedence and overwrites the */* default.
_________________
HP ZBook Power 15.6" G8 i7-11800H|HP EliteDesk 800G1 i7-4790|HP Compaq Pro 6300 i7-3770
Back to top
View user's profile Send private message
Genone
Retired Dev
Retired Dev


Joined: 14 Mar 2003
Posts: 9607
Location: beyond the rim

PostPosted: Mon Oct 21, 2024 9:15 pm    Post subject: Reply with quote

Short version, you can't use package.env for that, at least not on its own.

What you can do is to write a custom script for downloading files that adjusts your proxy settings based on whatever condition you like, and then specify that as FETCHCOMMAND in make.conf instead of the default. Wouldn't be surprised if someone already did such a thing as well.
Would only affect regular distfiles downloading though, not any other network access that ebuilds or eclasses might do (e.g. using git).

Quote:
I think this won't work. Both will match for mycustompackage and you'll have both proxy and no_proxy.

While it does process both files, only the last assigment will hold. So effectively it does work as long as both files set the same variables and are processed in the correct order (not sure if that is properly specified or an implementation detail).

Massimo B. wrote:
But I like to set different proxies per package and for Portage only, not globally.

Just out of curiosity, why would you want to set proxy per package? Or do you actually want to set it per host?
Back to top
View user's profile Send private message
flexibeast
Guru
Guru


Joined: 04 Apr 2022
Posts: 433
Location: Naarm/Melbourne, Australia

PostPosted: Mon Oct 21, 2024 11:46 pm    Post subject: Reply with quote

Massimo B. wrote:
What makes you think I would confuse /etc/portage/env with /etc/env.d ?

Because i spend a lot of time writing documentation, helping users with their issues, and clarifying misunderstandings, sometimes involving experienced users. (An all-too-common example is people not making a distinction between the D-Bus system bus and a D-Bus session bus.) As a result, and in the absence of you being explicit about what you're trying to do - "I want to change the network proxy on a per-package basis when building packages" - i assumed that, as an experienced user, you'd provided all relevant information, and that your question wasn't just limited to the build process. And logrusx, who also spends a lot of time trying to help users, apparently interpreted your question the same way.
_________________
https://wiki.gentoo.org/wiki/User:Flexibeast
Back to top
View user's profile Send private message
logrusx
Advocate
Advocate


Joined: 22 Feb 2018
Posts: 2397

PostPosted: Tue Oct 22, 2024 4:45 am    Post subject: Reply with quote

flexibeast wrote:
i assumed that, as an experienced user, you'd provided all relevant information, and that your question wasn't just limited to the build process. And logrusx, who also spends a lot of time trying to help users, apparently interpreted your question the same way.


TBH I was surprised too from what looked like and experienced user wanted to do and now that you mention it, I'm even more surprised when I realize an experienced user didn't make their intentions clear.

Best Regards,
Georgi
Back to top
View user's profile Send private message
Massimo B.
Veteran
Veteran


Joined: 09 Feb 2005
Posts: 1810
Location: PB, Germany

PostPosted: Fri Oct 25, 2024 10:23 am    Post subject: Reply with quote

Massimo B. wrote:
Currently I have:
/etc/portage/package.env/proxy :
*/* http_proxy
app-custom/mycustompackage no_proxy
/etc/portage/env/http_proxy:
http_proxy="http://wwwcache:8080"
https_proxy="http://wwwcache:8080"
/etc/portage/env/no_proxy :
http_proxy=""
https_proxy=""

Now I like to set a http proxy depending on the current network.

Sorry for being unclear or confusing as an experienced user. I thought showing the configuration that is currently working, with the new requirement "depending on the current network" makes it clear enough:
I'm setting a http_proxy environment for the currently emerged package. It is already package specific, that works. But I can't add code somewhere to make that network related like this:
Being in network A, I need that proxy setup as above. Being in network B, I don't need any proxy at all.
_________________
HP ZBook Power 15.6" G8 i7-11800H|HP EliteDesk 800G1 i7-4790|HP Compaq Pro 6300 i7-3770
Back to top
View user's profile Send private message
Display posts from previous:   
Reply to topic    Gentoo Forums Forum Index Portage & Programming All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum