Soren Stoutner
2025-01-16 20:10:01 UTC
Reply
PermalinkBackground:
Systemd parses files in /etc/environment.d/
Sysvinit parses the single file /etc/environment
Finit parses file in /etc/finit.d/
Why canât we all just get along?
It is easy for a package to add or remove files from /etc/environment.d/. It
is more tricky to edit /etc/environment. And having to do it in (potentially)
three locations seems inefficient.
1. Is there some other way for a package to set a global environment
variable?
2. If not, would it be advisable or possible to patch Sysvinit and Finit to
parse /etc/environment.d so this could all be handled from one place?
Specific problem prompting the question (you can skip this part unless you like
the gory details):
Qt WebEngine is an HTML rendering engine based on the Chromium source code
shipped as part of Qt (and KDE) that renders things like HTML documentation,
HTML emails, and is also used by various web browsers. Chromium uses a spell
checking system based on Hunspell, but in their âwisdomâ they decided to
customize it by creating a binary dictionary format instead of using the plain
text Hunspell format. Qt WebEngine inherits this design. Chromium ships a
tool that converts the standard Hunspell files into the binary .bdic format.
Trixie will release with most Hunspell packages shipping these files in /usr/
share/hunspell-bdic/.
Qt WebEngine contains a section of code that looks for these dictionaries in a
number of locations, including individual user profiles. One of the locations
it checks is the directory defined by the QTWEBENGINE_DICTIONARIES_PATH
variable. The revelant code is at:
https://sources.debian.org/src/qt6-webengine/6.7.2%2Bdfsg2-1/src/core/
web_engine_library_info.cpp/#L243
The initial discussion about how to ship .bdic binary dictionary files in
Debian was at:
https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1020387
The result of this was the following policy:
The Qt packages will install the following system-wide environment variable in
/etc/environment.d/ so that programs that use Qt WebEngine will be able to find
the .bdic dictionaries:
QTWEBENGINE_DICTIONARIES_PATH=/usr/share/hunspell-bdic/
https://salsa.debian.org/debian/dictionaries-common/-/blob/master/policy/dsdt-policy.xml.in?ref_type=heads#L1437
At the time we assumed that would be sufficient for any Debian system, but we
later learned that init systems besides Systemd donât parse /etc/
environment.d/.
There are several ways we could proceed with this particular problem.
1. Patch Qt WebEngine on Debian to always look in /usr/share/hunspell-bdic/.
2. Add the environment variable to /etc/environment.d/ and document in
README.Debian that users need to handle their own environment variable with
other init systems.
3. Add the environment variable to all known init environment variable
locations.
4. Add the environment variable somewhere else, like /etc/X11/Xsession.d/.
It would be possible to do 1, but it isnât my first choice because it would
modify upstream Qt WebEngine behavior in a way that some user might expect not
to be modified. Also, this would only solve the problem for this package. I
assume that at some point some other Debian package will have a need to set a
system-wide environment variable.
I have already implemented 2 for Privacy Browser, one of the packages I
maintain. But it seems suboptimal to require users to set this environment
variable themselves, even for uncommon init systems.
https://salsa.debian.org/soren/privacybrowser/-/blob/master/debian/
README.Debian?ref_type=heads
Option 3 gets a bit complex, because there are two current packages providing
Qt WebEngine that could be concurrently installed (Qt 5 WebEngine and Qt 6
WebEngine), both of them need to set this variable. There isnât a problem
with it being set twice by two separate files in /etc/environment.d/, but using
sed or some other tool to edit /etc/environment could get a little dicey as
one or both of the packages are installed and uninstalled.
https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1092726
Option 4 is fine with me in this case if it works (does Wayland parse
environment variables from /etc/X11/Xsession.d?), but it is only a solution
for graphical programs. And again, I would imagine that at some point there
will be a Debian package that needs a way to set an environment variable
system-wide, even when no graphical environment is running.
--
Soren Stoutner
***@debian.org
Soren Stoutner
***@debian.org