1
0
mirror of https://github.com/mirror/make.git synced 2025-04-11 20:10:49 +08:00

Support the MAKE_TMPDIR environment variable

Allow build systems to choose an alternative location for make to
store its temporary files.

* NEWS: Announce the new environment variable.
* doc/make.texi (Temporary Files): Provide documentation.
* src/misc.c (get_tmpdir): Split into a new function.  Compute the
temporary directory and store it in a static location.
* tests/scripts/features/jobserver: Add a test of MAKE_TMPDIR.
This commit is contained in:
Paul Smith 2022-09-11 10:56:08 -04:00
parent 02b3a6ad46
commit 86fc644dcc
4 changed files with 75 additions and 15 deletions
NEWS
doc
src
tests/scripts/features

8
NEWS
View File

@ -88,6 +88,14 @@ https://sv.gnu.org/bugs/index.php?group=make&report_id=111&fix_release_id=109&se
top-level invocation of GNU make, or via MAKEFLAGS or GNUMAKEFLAGS.
To detect this change search for 'jobserver-fifo' in the .FEATURES variable.
* New feature: The MAKE_TMPDIR environment variable
If you prefer that GNU make place temporary files in a different directory
than the standard TMPDIR (or TMP or TEMP on Windows), set the MAKE_TMPDIR
environment variable before starting make (this value CANNOT be set inside
the makefile, since make needs to find its temporary directory before the
makefiles are parsed). This is useful for build systems which reset TMPDIR
and clean it out during the build process.
* Some POSIX systems (*BSD) do not allow locks to be taken on pipes, which
caused the output sync feature to not work properly there. Also multiple
invocations of make redirecting to the same output file (e.g., /dev/null)

View File

@ -309,6 +309,7 @@ How to Run @code{make}
an alternate compiler and other things.
* Testing:: How to proceed past some errors, to
test compilation.
* Temporary Files:: Where @code{make} keeps its temporary files.
* Options Summary:: Summary of Options
Using Implicit Rules
@ -8773,6 +8774,7 @@ determines that some target is not already up to date.
an alternate compiler and other things.
* Testing:: How to proceed past some errors, to
test compilation.
* Temporary Files:: Where @code{make} keeps its temporary files.
* Options Summary:: Summary of Options
@end menu
@ -9164,7 +9166,7 @@ overridden. This is to use the @code{override} directive, which is a line
that looks like this: @samp{override @var{variable} = @var{value}}
(@pxref{Override Directive, ,The @code{override} Directive}).
@node Testing, Options Summary, Overriding, Running
@node Testing, Temporary Files, Overriding, Running
@section Testing the Compilation of a Program
@cindex testing compilation
@cindex compilation, testing
@ -9202,7 +9204,35 @@ program, perhaps to find several independent problems so that you can
correct them all before the next attempt to compile. This is why Emacs'
@kbd{M-x compile} command passes the @samp{-k} flag by default.
@node Options Summary, , Testing, Running
@node Temporary Files, Options Summary, Testing, Running
@section Temporary Files
@cindex temporary files
In some situations, @code{make} will need to create its own temporary files.
These files must not be disturbed while @code{make} is running, including all
recursively-invoked instances of @code{make}.
@cindex @code{MAKE_TMPDIR}
If the environment variable @code{MAKE_TMPDIR} is set then all temporary files
created by @code{make} will be placed there.
@cindex @code{TMPDIR}
@cindex @code{TMP}
@cindex @code{TEMP}
If @code{MAKE_TMPDIR} is not set, then the standard location for temporary
files for the current operating system will be used. For POSIX systems this
will be the location set in the @code{TMPDIR} environment variable, or else
the system's default location (e.g., @file{/tmp}) is used. On Windows,
first @code{TMP} then @code{TEMP} will be checked, then @code{TMPDIR}, and
finally the system default temporary file location will be used.
Note that this directory must already exist or @code{make} will fail:
@code{make} will not attempt to create it.
These variables @emph{cannot} be set from within a makefile: GNU @code{make}
must have access to this location before it begins reading the makefiles.
@node Options Summary, , Temporary Files, Running
@section Summary of Options
@cindex options
@cindex flags

View File

@ -506,15 +506,9 @@ umask (mode_t mask)
}
#endif
static char *
get_tmptemplate ()
{
const char *tmpdir;
char *template;
size_t len;
#define MAKE_TMPDIR "MAKE_TMPDIR"
#ifdef VMS
# define DEFAULT_TMPFILE "sys$scratch:gnv$make_cmdXXXXXX.com"
# define DEFAULT_TMPFILE "sys$scratch:gnv$make_cmdXXXXXX.com"
# define DEFAULT_TMPDIR "/sys$scratch/"
#else
# define DEFAULT_TMPFILE "GmXXXXXX"
@ -525,13 +519,31 @@ get_tmptemplate ()
# endif
#endif
if (
static const char *
get_tmpdir ()
{
static const char *tmpdir = NULL;
if (!tmpdir)
{
if (((tmpdir = getenv (MAKE_TMPDIR)) == NULL || *tmpdir == '\0')
#if defined (__MSDOS__) || defined (WINDOWS32) || defined (__EMX__)
((tmpdir = getenv ("TMP")) == NULL || *tmpdir == '\0') &&
((tmpdir = getenv ("TEMP")) == NULL || *tmpdir == '\0') &&
&& ((tmpdir = getenv ("TMP")) == NULL || *tmpdir == '\0')
&& ((tmpdir = getenv ("TEMP")) == NULL || *tmpdir == '\0')
#endif
((tmpdir = getenv ("TMPDIR")) == NULL || *tmpdir == '\0'))
tmpdir = DEFAULT_TMPDIR;
&& ((tmpdir = getenv ("TMPDIR")) == NULL || *tmpdir == '\0'))
tmpdir = DEFAULT_TMPDIR;
}
return tmpdir;
}
static char *
get_tmptemplate ()
{
const char *tmpdir = get_tmpdir ();
char *template;
size_t len;
len = strlen (tmpdir);
template = xmalloc (len + CSTRLEN (DEFAULT_TMPFILE) + 2);

View File

@ -145,6 +145,16 @@ if (exists $FEATURES{'jobserver-fifo'}) {
$ENV{TMPDIR} = "nosuchdir";
run_make_test(undef, '-j2', "/Nothing to be done/");
# Verify that MAKE_TMPDIR is preferred if provided
$ENV{MAKE_TMPDIR} = '.';
$ENV{TMPDIR} = 'nosuchdir';
run_make_test(q!
recurse: ; @$(MAKE) -f #MAKEFILE# all
all:;@echo "$$MAKEFLAGS"
!,
"-j2 --no-print-directory", "/--jobserver-auth=fifo:\\./");
}
1;