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)
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
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
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
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
}
#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"
# 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);