gecko-dev/build/win32/nsis-no-underscore.patch
Mike Hommey 4dbe34f810 Bug 1730825 - Build NSIS as a relocatable binary. r=firefox-build-system-reviewers,andi
The reason the error mentioned in build-mingw32-nsis.sh happens is that
the default mode NSIS builds in is a fully-installed mode, where it
hardcodes the locations of its data files. This is why nsis needs to
be used from the same place it's built for. But there's another mode,
enabled with NSIS_CONFIG_CONST_DATA_PATH=no, that makes it relocatable,
and makes it find its data files relatively to the nsis binary.

However, there's a bug in the nsis build scripts, which makes the nsis
binary installed in the destination directory instead of a bin/
subdirectory, while the source code itself looks for data files relative
to the parent directory of the directory that contains the executable.
So we need to set PREFIX_BIN to force the executable to be installed in
a bin/ subdirectory.

There is also an issue in nsis itself when it's executed by anything
other than a shell, which we patch out.

Differential Revision: https://phabricator.services.mozilla.com/D125638
2021-09-15 08:33:06 +00:00

35 lines
1.4 KiB
Diff

The `_` environment variable is a variable that is set by bash and some other
shells to point to the executable they use when executing a command. That is,
when executing `foo` from the command line, the shell sets `_` to
`/usr/bin/foo` (assuming that's where foo is).
However, nothing else does the same, so when e.g. a python program uses
`subprocess.Popen` to run another program, it doesn't set `_`. Worse, if that
python program itself was invoked from a shell, `_` would be set to e.g.
`/usr/bin/python3`.
So when nsis is invoked from a program that is not a shell, but the process
ancestry has a process that was a shell, `_` may be set to the first
intermediary program rather than nsis, which defeats nsis's assumption that `_`
would contain the nsis path. Ironically, nsis also has more reliable fallbacks
(using e.g. /proc/self/exe), but somehow prefers `_`.
We remove the reliance of `_` entirely, for simplicity's sake.
diff -ruN nsis-3.07-src.orig/Source/util.cpp nsis-3.07-src/Source/util.cpp
--- nsis-3.07-src.orig/Source/util.cpp 2021-09-02 09:25:48.489016918 +0900
+++ nsis-3.07-src/Source/util.cpp 2021-09-02 09:26:21.158814484 +0900
@@ -810,10 +810,7 @@
assert(rc == 0);
return tstring(CtoTString(temp_buf));
#else /* Linux/BSD/POSIX/etc */
- const TCHAR *envpath = _tgetenv(_T("_"));
- if (envpath)
- return get_full_path(envpath);
- else {
+ {
char *path = NULL, *pathtmp;
size_t len = 100;
int nchars;