mirror of
https://github.com/mirror/make.git
synced 2025-02-05 09:10:12 +08:00
Numerous updates and bug fixes.
A number of W32 cleanups from J.Grant. A number of OS/2 cleanups from Andreas Buening. Various random bug fixes.
This commit is contained in:
parent
f305a52c02
commit
e334942e57
51
ChangeLog
51
ChangeLog
@ -1,3 +1,54 @@
|
|||||||
|
2004-03-20 Paul D. Smith <psmith@gnu.org>
|
||||||
|
|
||||||
|
* variable.c (do_variable_definition): Don't append from the
|
||||||
|
global set if a previous non-appending target-specific variable
|
||||||
|
definition exists. Reported by Oliver Schmidt <oschmidt@gmx.net>
|
||||||
|
(with fix).
|
||||||
|
|
||||||
|
* expand.c (reference_variable): Don't give up on variables with
|
||||||
|
no value that have the target-specific append flag set: they might
|
||||||
|
have a value after all. Reported by Oliver Schmidt
|
||||||
|
<oschmidt@gmx.net> (with fix) and also by Maksim A. Nikulin
|
||||||
|
<nikulin@dx1cmd.inp.nsk.su>.
|
||||||
|
|
||||||
|
* rule.c (count_implicit_rule_limits): Don't delete patterns which
|
||||||
|
refer to absolute pathnames in directories that don't exist: some
|
||||||
|
portion of the makefile could create those directories before we
|
||||||
|
match the pattern. Fixes bugs #775 and #108.
|
||||||
|
|
||||||
|
Fixes from Jonathan R. Grant <jg-make@jguk.org>:
|
||||||
|
|
||||||
|
* main.c (main): Free makefile_mtimes if we have any.
|
||||||
|
* README.W32.template: Update documentation for the current status
|
||||||
|
of the MS-Windows port.
|
||||||
|
* NMakefile.template (MAKE): Add "MAKE = nmake". A conflicting
|
||||||
|
environment variable is sometimes already defined which causes the
|
||||||
|
build to fail.
|
||||||
|
* main.c (debug_signal_handler): Only define this function if
|
||||||
|
SIGUSR1 is available.
|
||||||
|
|
||||||
|
Fixes for OS/2 from Andreas Beuning <andreas.buening@nexgo.de>:
|
||||||
|
|
||||||
|
* configure.in [OS/2]: Relocate setting of HAVE_SA_RESTART for OS/2.
|
||||||
|
* README.OS2.template: Documentation updates.
|
||||||
|
* build.template: Add LIBINTL into LOADLIBES. Add $CFLAGS to the
|
||||||
|
link line for safety.
|
||||||
|
* maintMakefile (build.sh.in): Remove an extraneous ")".
|
||||||
|
* job.c (child_execute_job): Close saved FDs.
|
||||||
|
* job.c (exec_command) [OS/2]: exec_command(): If the command
|
||||||
|
can't be exec'ed and if the shell is not Unix-sh, then try again
|
||||||
|
with argv = { "cmd", "/c", ... }. Normally, this code is never
|
||||||
|
reached for the cmd shell unless the command really doesn't exist.
|
||||||
|
(construct_command_argv_internal) [OS/2]: The code for cmd
|
||||||
|
handling now uses new_argv = { "cmd", "/c", "original line", NULL}.
|
||||||
|
The CMD builtin commands are case insensitive so use strcasecmp().
|
||||||
|
|
||||||
|
2004-03-19 Paul D. Smith <psmith@gnu.org>
|
||||||
|
|
||||||
|
* read.c (do_define): Re-order line counter increment so the count
|
||||||
|
is accurate (we were losing one line per define). Reported by
|
||||||
|
Dave Yost <Dave@Yost.com>.
|
||||||
|
|
||||||
2004-03-06 Paul D. Smith <psmith@gnu.org>
|
2004-03-06 Paul D. Smith <psmith@gnu.org>
|
||||||
|
|
||||||
* configure.in (HAVE_ANSI_COMPILER): Define if we have an ANSI/ISO
|
* configure.in (HAVE_ANSI_COMPILER): Define if we have an ANSI/ISO
|
||||||
|
@ -25,6 +25,7 @@
|
|||||||
|
|
||||||
LINK = link
|
LINK = link
|
||||||
CC = cl
|
CC = cl
|
||||||
|
MAKE = nmake
|
||||||
|
|
||||||
OUTDIR=.
|
OUTDIR=.
|
||||||
MAKEFILE=NMakefile
|
MAKEFILE=NMakefile
|
||||||
|
@ -46,7 +46,7 @@ II. ***** REQUIREMENTS FOR THE COMPILATION *****
|
|||||||
A standard Unix like build environment:
|
A standard Unix like build environment:
|
||||||
|
|
||||||
- sh compatible shell (ksh, bash, ash, but tested only with pdksh 5.2.14
|
- sh compatible shell (ksh, bash, ash, but tested only with pdksh 5.2.14
|
||||||
(release 2)
|
release 2)
|
||||||
If you use pdksh it is recommended to update to 5.2.14 release 2. Older
|
If you use pdksh it is recommended to update to 5.2.14 release 2. Older
|
||||||
versions may not work! You can get this version at
|
versions may not work! You can get this version at
|
||||||
http://www.math.ohio-state.edu/~ilya/software/os2/pdksh-5.2.14-bin-2.zip
|
http://www.math.ohio-state.edu/~ilya/software/os2/pdksh-5.2.14-bin-2.zip
|
||||||
@ -59,12 +59,12 @@ A standard Unix like build environment:
|
|||||||
- gawk
|
- gawk
|
||||||
- grep
|
- grep
|
||||||
- sed
|
- sed
|
||||||
- GNU make 3.79.1 (special OS/2 patched version)
|
- GNU make 3.79.1 (special OS/2 patched version) or higher
|
||||||
- perl 5.005 or higher
|
- perl 5.005 or higher
|
||||||
- GNU texinfo (you can use 3.1 (gnuinfo.zip), but I recommend 4.0)
|
- GNU texinfo (you can use 3.1 (gnuinfo.zip), but I recommend 4.0)
|
||||||
|
|
||||||
If you want to recreate the configuration files (developers only!)
|
If you want to recreate the configuration files (developers only!)
|
||||||
you need also: GNU m4 1.4, autoconf 2.57, automake 1.7.2 (or compatible)
|
you need also: GNU m4 1.4, autoconf 2.59, automake 1.8.2 (or compatible)
|
||||||
|
|
||||||
|
|
||||||
III. ***** COMPILATION AND INSTALLATION *****
|
III. ***** COMPILATION AND INSTALLATION *****
|
||||||
@ -147,12 +147,12 @@ none.
|
|||||||
To run the testsuite do the following:
|
To run the testsuite do the following:
|
||||||
|
|
||||||
export CPPFLAGS="-D__ST_MT_ERRNO__ -DNO_CMD_DEFAULT -DNO_CHDIR2"
|
export CPPFLAGS="-D__ST_MT_ERRNO__ -DNO_CMD_DEFAULT -DNO_CHDIR2"
|
||||||
export CFLAGS="-Zomf -O2 -s -Zmt"
|
export CFLAGS="-Zomf -O2 -Zmt"
|
||||||
export LDFLAGS="-Zcrtdll -Zmt -s -Zlinker /exepack:2 -Zlinker /pm:vio -Zstack 0x8000"
|
export LDFLAGS="-Zcrtdll -s -Zlinker /exepack:2 -Zlinker /pm:vio -Zstack 0x8000"
|
||||||
export RANLIB="echo"
|
export RANLIB="echo"
|
||||||
./configure --prefix=x:/usr --disable-nls
|
./configure --prefix=x:/usr --disable-nls
|
||||||
make AR=emxomfar
|
make AR=emxomfar
|
||||||
make checks
|
make check
|
||||||
|
|
||||||
All tests should work fine with the exception of "default_names" which
|
All tests should work fine with the exception of "default_names" which
|
||||||
is because OS/2 file systems are not case sensitive ("makefile" and
|
is because OS/2 file systems are not case sensitive ("makefile" and
|
||||||
|
@ -5,7 +5,7 @@ Should also build fine with MSVC 5.x and 6.x (though not confirmed).
|
|||||||
This Windows 32-bit port of GNU make is maintained primarily by Rob
|
This Windows 32-bit port of GNU make is maintained primarily by Rob
|
||||||
Tulloh, who is also the author of this README.
|
Tulloh, who is also the author of this README.
|
||||||
|
|
||||||
To build with nmake on Windows NT, Windows 95, or Windows 98:
|
To build with nmake on MS-Windows:
|
||||||
|
|
||||||
1. Make sure cl.exe is in your %Path%. Example:
|
1. Make sure cl.exe is in your %Path%. Example:
|
||||||
|
|
||||||
@ -63,10 +63,10 @@ GNU make and sh.exe:
|
|||||||
|
|
||||||
There are very few true ports of Bourne shell for NT right now.
|
There are very few true ports of Bourne shell for NT right now.
|
||||||
There is a version of GNU bash available from Cygnus "Cygwin"
|
There is a version of GNU bash available from Cygnus "Cygwin"
|
||||||
porting effort (http://sourceware.cygnus.com/cygwin).
|
porting effort (http://www.cygwin.com/).
|
||||||
Other possibilities are the MKS version of sh.exe, or building
|
Other possibilities are the MKS version of sh.exe, or building
|
||||||
your own with a package like NutCracker (DataFocus) or Portage
|
your own with a package like NutCracker (DataFocus) or Portage
|
||||||
(Consensys).
|
(Consensys). Also MinGW includes sh (http://mingw.org/).
|
||||||
|
|
||||||
GNU make and brain-dead shells (BATCH_MODE_ONLY_SHELL):
|
GNU make and brain-dead shells (BATCH_MODE_ONLY_SHELL):
|
||||||
|
|
||||||
@ -131,7 +131,8 @@ GNU make handling of drive letters in pathnames (PATH, vpath, VPATH):
|
|||||||
Please note that you are free to mix colon and semi-colon in the
|
Please note that you are free to mix colon and semi-colon in the
|
||||||
specification of paths. Make is able to figure out the intended
|
specification of paths. Make is able to figure out the intended
|
||||||
result and convert the paths internally to the format needed
|
result and convert the paths internally to the format needed
|
||||||
when interacting with the operating system.
|
when interacting with the operating system, providing the path
|
||||||
|
is not within quotes, e.g. "x:/test/test.c".
|
||||||
|
|
||||||
You are encouraged to use colon as the separator character.
|
You are encouraged to use colon as the separator character.
|
||||||
This should ease the pain of deciding how to handle various path
|
This should ease the pain of deciding how to handle various path
|
||||||
@ -167,15 +168,17 @@ Building GNU make on Windows NT and Windows 95/98 with Microsoft Visual C:
|
|||||||
Pathnames and white space:
|
Pathnames and white space:
|
||||||
|
|
||||||
Unlike Unix, Windows 95/NT systems encourage pathnames which
|
Unlike Unix, Windows 95/NT systems encourage pathnames which
|
||||||
contain white space (e.g. C:\Program Files\). These sorts of pathnames
|
contain white space (e.g. C:\Program Files\). These sorts of
|
||||||
are legal under Unix too, but are never encouraged. There is
|
pathnames are legal under Unix too, but are never encouraged.
|
||||||
at least one place in make (VPATH/vpath handling) where paths
|
There is at least one place in make (VPATH/vpath handling) where
|
||||||
containing white space will simply not work. There may be others
|
paths containing white space will simply not work. There may be
|
||||||
too. I chose to not try and port make in such a way so that
|
others too. I chose to not try and port make in such a way so
|
||||||
these sorts of paths could be handled. I offer these suggestions
|
that these sorts of paths could be handled. I offer these
|
||||||
as workarounds:
|
suggestions as workarounds:
|
||||||
|
|
||||||
1. Use 8.3 notation
|
1. Use 8.3 notation. i.e. "x:/long~1/", which is actually
|
||||||
|
"x:\longpathtest". Type "dir /x" to view these filenames
|
||||||
|
within the cmd.exe shell.
|
||||||
2. Rename the directory so it does not contain white space.
|
2. Rename the directory so it does not contain white space.
|
||||||
|
|
||||||
If you are unhappy with this choice, this is free software
|
If you are unhappy with this choice, this is free software
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
# Shell script to build GNU Make in the absence of any `make' program.
|
# Shell script to build GNU Make in the absence of any `make' program.
|
||||||
# @configure_input@
|
# @configure_input@
|
||||||
|
|
||||||
# Copyright (C) 1993, 1994, 1997, 2003 Free Software Foundation, Inc.
|
# Copyright (C) 1993, 1994, 1997, 2003, 2004 Free Software Foundation, Inc.
|
||||||
# This file is part of GNU Make.
|
# This file is part of GNU Make.
|
||||||
#
|
#
|
||||||
# GNU Make is free software; you can redistribute it and/or modify
|
# GNU Make is free software; you can redistribute it and/or modify
|
||||||
@ -28,7 +28,7 @@ CFLAGS='@CFLAGS@'
|
|||||||
CPPFLAGS='@CPPFLAGS@'
|
CPPFLAGS='@CPPFLAGS@'
|
||||||
LDFLAGS='@LDFLAGS@'
|
LDFLAGS='@LDFLAGS@'
|
||||||
ALLOCA='@ALLOCA@'
|
ALLOCA='@ALLOCA@'
|
||||||
LOADLIBES='@LIBS@'
|
LOADLIBES='@LIBS@ @LIBINTL@'
|
||||||
eval extras=\'@LIBOBJS@\'
|
eval extras=\'@LIBOBJS@\'
|
||||||
REMOTE='@REMOTE@'
|
REMOTE='@REMOTE@'
|
||||||
GLOBLIB='@GLOBLIB@'
|
GLOBLIB='@GLOBLIB@'
|
||||||
@ -78,6 +78,6 @@ done
|
|||||||
|
|
||||||
# Link all the objects together.
|
# Link all the objects together.
|
||||||
echo linking make...
|
echo linking make...
|
||||||
$CC $LDFLAGS $objs $LOADLIBES -o makenew${EXEEXT}
|
$CC $CFLAGS $LDFLAGS $objs $LOADLIBES -o makenew${EXEEXT}
|
||||||
echo done
|
echo done
|
||||||
mv -f makenew${EXEEXT} make${EXEEXT}
|
mv -f makenew${EXEEXT} make${EXEEXT}
|
||||||
|
10
configure.in
10
configure.in
@ -254,16 +254,16 @@ AC_CACHE_CHECK(for SA_RESTART, make_cv_sa_restart, [
|
|||||||
[make_cv_sa_restart=yes],
|
[make_cv_sa_restart=yes],
|
||||||
[make_cv_sa_restart=no])])
|
[make_cv_sa_restart=no])])
|
||||||
|
|
||||||
# enable make_cv_sa_restart for OS/2
|
|
||||||
case "$host_os" in
|
|
||||||
os2*) make_cv_sa_restart=yes ;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
if test "$make_cv_sa_restart" != no; then
|
if test "$make_cv_sa_restart" != no; then
|
||||||
AC_DEFINE(HAVE_SA_RESTART, 1,
|
AC_DEFINE(HAVE_SA_RESTART, 1,
|
||||||
[Define if <signal.h> defines the SA_RESTART constant.])
|
[Define if <signal.h> defines the SA_RESTART constant.])
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# enable make_cv_sa_restart for OS/2
|
||||||
|
case "$host_os" in
|
||||||
|
os2*) make_cv_sa_restart=yes ;;
|
||||||
|
esac
|
||||||
|
|
||||||
case "$ac_cv_func_pipe/$ac_cv_func_sigaction/$make_cv_sa_restart/$has_wait_nohang/$make_cv_job_server" in
|
case "$ac_cv_func_pipe/$ac_cv_func_sigaction/$make_cv_sa_restart/$has_wait_nohang/$make_cv_job_server" in
|
||||||
yes/yes/yes/yes/yes)
|
yes/yes/yes/yes/yes)
|
||||||
AC_DEFINE(MAKE_JOBSERVER, 1,
|
AC_DEFINE(MAKE_JOBSERVER, 1,
|
||||||
|
3
expand.c
3
expand.c
@ -153,7 +153,8 @@ reference_variable (char *o, char *name, unsigned int length)
|
|||||||
if (v == 0)
|
if (v == 0)
|
||||||
warn_undefined (name, length);
|
warn_undefined (name, length);
|
||||||
|
|
||||||
if (v == 0 || *v->value == '\0')
|
/* If there's no variable by that name or it has no value, stop now. */
|
||||||
|
if (v == 0 || (*v->value == '\0' && !v->append))
|
||||||
return o;
|
return o;
|
||||||
|
|
||||||
value = (v->recursive ? recursively_expand (v) : v->value);
|
value = (v->recursive ? recursively_expand (v) : v->value);
|
||||||
|
231
job.c
231
job.c
@ -469,7 +469,7 @@ reap_children (int block, int err)
|
|||||||
&& (block || REAP_MORE))
|
&& (block || REAP_MORE))
|
||||||
{
|
{
|
||||||
int remote = 0;
|
int remote = 0;
|
||||||
register int pid;
|
pid_t pid;
|
||||||
int exit_code, exit_sig, coredump;
|
int exit_code, exit_sig, coredump;
|
||||||
register struct child *lastc, *c;
|
register struct child *lastc, *c;
|
||||||
int child_failed;
|
int child_failed;
|
||||||
@ -611,29 +611,34 @@ reap_children (int block, int err)
|
|||||||
{
|
{
|
||||||
HANDLE hPID;
|
HANDLE hPID;
|
||||||
int err;
|
int err;
|
||||||
|
exit_code = 0;
|
||||||
|
exit_sig = 0;
|
||||||
|
coredump = 0;
|
||||||
|
|
||||||
/* wait for anything to finish */
|
/* wait for anything to finish */
|
||||||
if (hPID = process_wait_for_any()) {
|
hPID = process_wait_for_any();
|
||||||
|
if (hPID)
|
||||||
|
{
|
||||||
|
|
||||||
/* was an error found on this process? */
|
/* was an error found on this process? */
|
||||||
err = process_last_err(hPID);
|
err = process_last_err(hPID);
|
||||||
|
|
||||||
/* get exit data */
|
/* get exit data */
|
||||||
exit_code = process_exit_code(hPID);
|
exit_code = process_exit_code(hPID);
|
||||||
|
|
||||||
if (err)
|
if (err)
|
||||||
fprintf(stderr, "make (e=%d): %s",
|
fprintf(stderr, "make (e=%d): %s",
|
||||||
exit_code, map_windows32_error_to_string(exit_code));
|
exit_code, map_windows32_error_to_string(exit_code));
|
||||||
|
|
||||||
/* signal */
|
/* signal */
|
||||||
exit_sig = process_signal(hPID);
|
exit_sig = process_signal(hPID);
|
||||||
|
|
||||||
/* cleanup process */
|
/* cleanup process */
|
||||||
process_cleanup(hPID);
|
process_cleanup(hPID);
|
||||||
|
|
||||||
coredump = 0;
|
coredump = 0;
|
||||||
}
|
}
|
||||||
pid = (int) hPID;
|
pid = (pid_t) hPID;
|
||||||
}
|
}
|
||||||
#endif /* WINDOWS32 */
|
#endif /* WINDOWS32 */
|
||||||
}
|
}
|
||||||
@ -2400,11 +2405,22 @@ child_execute_job (int stdin_fd, int stdout_fd, char **argv, char **envp)
|
|||||||
/* Run the command. */
|
/* Run the command. */
|
||||||
pid = exec_command (argv, envp);
|
pid = exec_command (argv, envp);
|
||||||
|
|
||||||
/* Restore stdout/stdin of the parent process. */
|
/* Restore stdout/stdin of the parent and close temporary FDs. */
|
||||||
if (stdin_fd != 0 && dup2 (save_stdin, 0) != 0)
|
if (stdin_fd != 0)
|
||||||
fatal (NILF, _("restoring of stdin failed\n"));
|
{
|
||||||
if (stdout_fd != 1 && dup2 (save_stdout, 1) != 1)
|
if (dup2 (save_stdin, 0) != 0)
|
||||||
fatal (NILF, _("restoring of stdout failed\n"));
|
fatal (NILF, _("Could not restore stdin\n"));
|
||||||
|
else
|
||||||
|
close (save_stdin);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (stdout_fd != 1)
|
||||||
|
{
|
||||||
|
if (dup2 (save_stdout, 1) != 1)
|
||||||
|
fatal (NILF, _("Could not restore stdout\n"));
|
||||||
|
else
|
||||||
|
close (save_stdout);
|
||||||
|
}
|
||||||
|
|
||||||
return pid;
|
return pid;
|
||||||
}
|
}
|
||||||
@ -2482,7 +2498,8 @@ exec_command (char **argv, char **envp)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* wait and reap last child */
|
/* wait and reap last child */
|
||||||
while (hWaitPID = process_wait_for_any())
|
hWaitPID = process_wait_for_any();
|
||||||
|
while (hWaitPID)
|
||||||
{
|
{
|
||||||
/* was an error found on this process? */
|
/* was an error found on this process? */
|
||||||
err = process_last_err(hWaitPID);
|
err = process_last_err(hWaitPID);
|
||||||
@ -2550,6 +2567,7 @@ exec_command (char **argv, char **envp)
|
|||||||
char *shell;
|
char *shell;
|
||||||
char **new_argv;
|
char **new_argv;
|
||||||
int argc;
|
int argc;
|
||||||
|
int i=1;
|
||||||
|
|
||||||
# ifdef __EMX__
|
# ifdef __EMX__
|
||||||
/* Do not use $SHELL from the environment */
|
/* Do not use $SHELL from the environment */
|
||||||
@ -2568,12 +2586,27 @@ exec_command (char **argv, char **envp)
|
|||||||
while (argv[argc] != 0)
|
while (argv[argc] != 0)
|
||||||
++argc;
|
++argc;
|
||||||
|
|
||||||
|
# ifdef __EMX__
|
||||||
|
if (!unixy_shell)
|
||||||
|
++argc;
|
||||||
|
# endif
|
||||||
|
|
||||||
new_argv = (char **) alloca ((1 + argc + 1) * sizeof (char *));
|
new_argv = (char **) alloca ((1 + argc + 1) * sizeof (char *));
|
||||||
new_argv[0] = shell;
|
new_argv[0] = shell;
|
||||||
new_argv[1] = argv[0];
|
|
||||||
|
# ifdef __EMX__
|
||||||
|
if (!unixy_shell)
|
||||||
|
{
|
||||||
|
new_argv[1] = "/c";
|
||||||
|
++i;
|
||||||
|
--argc;
|
||||||
|
}
|
||||||
|
# endif
|
||||||
|
|
||||||
|
new_argv[i] = argv[0];
|
||||||
while (argc > 0)
|
while (argc > 0)
|
||||||
{
|
{
|
||||||
new_argv[1 + argc] = argv[argc];
|
new_argv[i + argc] = argv[argc];
|
||||||
--argc;
|
--argc;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3010,8 +3043,16 @@ construct_command_argv_internal (char *line, char **restp, char *shell,
|
|||||||
{
|
{
|
||||||
register int j;
|
register int j;
|
||||||
for (j = 0; sh_cmds[j] != 0; ++j)
|
for (j = 0; sh_cmds[j] != 0; ++j)
|
||||||
if (streq (sh_cmds[j], new_argv[0]))
|
{
|
||||||
goto slow;
|
if (streq (sh_cmds[j], new_argv[0]))
|
||||||
|
goto slow;
|
||||||
|
# ifdef __EMX__
|
||||||
|
/* Non-Unix shells are case insensitive. */
|
||||||
|
if (!unixy_shell
|
||||||
|
&& strcasecmp (sh_cmds[j], new_argv[0]) == 0)
|
||||||
|
goto slow;
|
||||||
|
# endif
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Ignore multiple whitespace chars. */
|
/* Ignore multiple whitespace chars. */
|
||||||
@ -3247,103 +3288,59 @@ construct_command_argv_internal (char *line, char **restp, char *shell,
|
|||||||
new_argv = construct_command_argv_internal (new_line, (char **) NULL,
|
new_argv = construct_command_argv_internal (new_line, (char **) NULL,
|
||||||
(char *) 0, (char *) 0,
|
(char *) 0, (char *) 0,
|
||||||
(char **) 0);
|
(char **) 0);
|
||||||
# ifdef __EMX__
|
#ifdef __EMX__
|
||||||
else if (!unixy_shell)
|
else if (!unixy_shell)
|
||||||
{
|
{
|
||||||
/* new_line is local, must not be freed therefore */
|
/* new_line is local, must not be freed therefore
|
||||||
char *p, *q;
|
We use line here instead of new_line because we run the shell
|
||||||
int quote;
|
manually. */
|
||||||
size_t index;
|
size_t line_len = strlen (line);
|
||||||
size_t len;
|
memcpy (new_line, line, line_len + 1);
|
||||||
|
|
||||||
/* handle quotes
|
# ifndef NO_CMD_DEFAULT
|
||||||
We have to remove all double quotes and to split the line
|
if (strnicmp (new_line, "echo", 4) == 0
|
||||||
into distinct arguments because of the strange handling
|
&& (new_line[4] == ' ' || new_line[4] == '\t'))
|
||||||
of builtin commands by cmd: 'echo "bla"' prints "bla"
|
{
|
||||||
(with quotes) while 'c:\bin\echo.exe "bla"' prints bla
|
/* the builtin echo command: handle it separately */
|
||||||
(without quotes). Some programs like autoconf rely
|
size_t echo_len = line_len - 5;
|
||||||
on the second behaviour. */
|
char *echo_line = new_line + 5;
|
||||||
|
|
||||||
len = strlen (new_line) + 1;
|
/* special case: echo 'x="y"'
|
||||||
|
cmd works this way: a string is printed as is, i.e., no quotes
|
||||||
|
are removed. But autoconf uses a command like echo 'x="y"' to
|
||||||
|
determine whether make works. autoconf expects the output x="y"
|
||||||
|
so we will do exactly that.
|
||||||
|
Note: if we do not allow cmd to be the default shell
|
||||||
|
we do not need this kind of voodoo */
|
||||||
|
if (echo_line[0] == '\''
|
||||||
|
&& echo_line[echo_len - 1] == '\''
|
||||||
|
&& strncmp (echo_line + 1, "ac_maketemp=",
|
||||||
|
strlen ("ac_maketemp=")) == 0)
|
||||||
|
{
|
||||||
|
/* remove the enclosing quotes */
|
||||||
|
memmove (echo_line, echo_line + 1, echo_len - 2);
|
||||||
|
echo_line[echo_len - 2] = '\0';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
# endif
|
||||||
|
|
||||||
/* More than 1 arg per character is impossible. */
|
{
|
||||||
new_argv = (char **) xmalloc (len * sizeof (char *));
|
/* Let the shell decide what to do. Put the command line into the
|
||||||
|
2nd command line argument and hope for the best ;-) */
|
||||||
|
size_t sh_len = strlen (shell);
|
||||||
|
|
||||||
/* All the args can fit in a buffer as big as new_line is. */
|
/* exactly 3 arguments + NULL */
|
||||||
new_argv[0] = (char *) xmalloc (len);
|
new_argv = (char **) xmalloc (4 * sizeof (char *));
|
||||||
|
/* Exactly strlen(shell) + strlen("/c") + strlen(line) + 3 times
|
||||||
index = 0;
|
the trailing '\0' */
|
||||||
quote = 0;
|
new_argv[0] = (char *) malloc (sh_len + line_len + 5);
|
||||||
q = new_line;
|
memcpy (new_argv[0], shell, sh_len + 1);
|
||||||
p = new_argv[index];
|
new_argv[1] = new_argv[0] + sh_len + 1;
|
||||||
while(*q != '\0')
|
memcpy (new_argv[1], "/c", 3);
|
||||||
{
|
new_argv[2] = new_argv[1] + 3;
|
||||||
/* searching for closing quote */
|
memcpy (new_argv[2], new_line, line_len);
|
||||||
if (quote)
|
new_argv[3] = NULL;
|
||||||
{
|
}
|
||||||
if (*q == quote)
|
|
||||||
{
|
|
||||||
/* remove the quote */
|
|
||||||
q++;
|
|
||||||
quote = 0;
|
|
||||||
}
|
|
||||||
else /* normal character: copy it */
|
|
||||||
*p++ = *q++;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* searching for opening quote */
|
|
||||||
else if (*q == '\"'
|
|
||||||
# ifndef NO_CMD_DEFAULT
|
|
||||||
|| *q == '\''
|
|
||||||
# endif
|
|
||||||
)
|
|
||||||
{
|
|
||||||
/* remove opening quote */
|
|
||||||
quote = *q;
|
|
||||||
q++;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* spaces outside of a quoted string: remove them
|
|
||||||
and start a new argument */
|
|
||||||
else if (*q == ' ' || *q == '\t')
|
|
||||||
{
|
|
||||||
*p++ = '\0'; /* trailing '\0' for last argument */
|
|
||||||
|
|
||||||
/* remove all successive spaces */
|
|
||||||
do
|
|
||||||
{
|
|
||||||
q++;
|
|
||||||
}
|
|
||||||
while(*q == ' ' || *q == '\t');
|
|
||||||
|
|
||||||
/* start new argument */
|
|
||||||
index++;
|
|
||||||
new_argv[index] = p;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* normal character (no space) outside a quoted string*/
|
|
||||||
else
|
|
||||||
*p++ = *q++;
|
|
||||||
} /* end while() */
|
|
||||||
|
|
||||||
*p = '\0'; /* trailing '\0' for the last argument */
|
|
||||||
new_argv[index + 1] = NULL;
|
|
||||||
|
|
||||||
# ifndef NO_CMD_DEFAULT
|
|
||||||
/* special case: echo x="y"
|
|
||||||
(e.g. autoconf uses this to determine whether make works)
|
|
||||||
this is pure idioty but cmd works this way:
|
|
||||||
if 'echo' and 'x="y"' are two different arguments cmd
|
|
||||||
will print '"x="y""' but if they are only one argument
|
|
||||||
cmd will print 'bla="blurb"' as it should be
|
|
||||||
note: if we do not allow cmd to be the default shell
|
|
||||||
we do not need this kind of voodoo */
|
|
||||||
if (index == 3 && strcasecmp(new_argv[2], "echo") == 0)
|
|
||||||
{
|
|
||||||
new_argv[2][4] = ' ';
|
|
||||||
new_argv[3] = NULL;
|
|
||||||
}
|
|
||||||
# endif
|
|
||||||
}
|
}
|
||||||
#elif defined(__MSDOS__)
|
#elif defined(__MSDOS__)
|
||||||
else
|
else
|
||||||
|
15
main.c
15
main.c
@ -35,6 +35,7 @@ MA 02111-1307, USA. */
|
|||||||
#endif
|
#endif
|
||||||
#ifdef WINDOWS32
|
#ifdef WINDOWS32
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
#include <io.h>
|
||||||
#include "pathstuff.h"
|
#include "pathstuff.h"
|
||||||
#endif
|
#endif
|
||||||
#ifdef __EMX__
|
#ifdef __EMX__
|
||||||
@ -544,11 +545,13 @@ enter_command_line_file (char *name)
|
|||||||
|
|
||||||
/* Toggle -d on receipt of SIGUSR1. */
|
/* Toggle -d on receipt of SIGUSR1. */
|
||||||
|
|
||||||
|
#ifdef SIGUSR1
|
||||||
static RETSIGTYPE
|
static RETSIGTYPE
|
||||||
debug_signal_handler (int sig UNUSED)
|
debug_signal_handler (int sig UNUSED)
|
||||||
{
|
{
|
||||||
db_level = db_level ? DB_NONE : DB_BASIC;
|
db_level = db_level ? DB_NONE : DB_BASIC;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static void
|
static void
|
||||||
decode_debug_flags (void)
|
decode_debug_flags (void)
|
||||||
@ -1917,14 +1920,14 @@ main (int argc, char **argv, char **envp)
|
|||||||
termination. */
|
termination. */
|
||||||
int pid;
|
int pid;
|
||||||
int status;
|
int status;
|
||||||
pid = child_execute_job(0, 1, nargv, environ);
|
pid = child_execute_job (0, 1, nargv, environ);
|
||||||
|
|
||||||
/* is this loop really necessary? */
|
/* is this loop really necessary? */
|
||||||
do {
|
do {
|
||||||
pid = wait(&status);
|
pid = wait (&status);
|
||||||
} while(pid <= 0);
|
} while (pid <= 0);
|
||||||
/* use the exit code of the child process */
|
/* use the exit code of the child process */
|
||||||
exit(WIFEXITED(status) ? WEXITSTATUS(status) : EXIT_FAILURE);
|
exit (WIFEXITED(status) ? WEXITSTATUS(status) : EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
exec_command (nargv, environ);
|
exec_command (nargv, environ);
|
||||||
@ -1938,6 +1941,10 @@ main (int argc, char **argv, char **envp)
|
|||||||
}
|
}
|
||||||
|
|
||||||
db_level = orig_db_level;
|
db_level = orig_db_level;
|
||||||
|
|
||||||
|
/* Free the makefile mtimes (if we allocated any). */
|
||||||
|
if (makefile_mtimes)
|
||||||
|
free ((char *) makefile_mtimes);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set up `MAKEFLAGS' again for the normal targets. */
|
/* Set up `MAKEFLAGS' again for the normal targets. */
|
||||||
|
@ -56,7 +56,7 @@ NMakefile: NMakefile.template .dep_segment Makefile
|
|||||||
build.sh.in: build.template Makefile
|
build.sh.in: build.template Makefile
|
||||||
rm -f $@
|
rm -f $@
|
||||||
sed -e 's@%objs%@$(patsubst %.o,%.$${OBJEXT},$(filter-out remote-%,$(make_OBJECTS)))@g' \
|
sed -e 's@%objs%@$(patsubst %.o,%.$${OBJEXT},$(filter-out remote-%,$(make_OBJECTS)))@g' \
|
||||||
-e 's@%globobjs%@$(patsubst %.c,%.$${OBJEXT},$(globsrc)))@g' \
|
-e 's@%globobjs%@$(patsubst %.c,%.$${OBJEXT},$(globsrc))@g' \
|
||||||
$< > $@
|
$< > $@
|
||||||
chmod a-w+x $@
|
chmod a-w+x $@
|
||||||
|
|
||||||
@ -246,8 +246,10 @@ po-check:
|
|||||||
## ------------------------- ##
|
## ------------------------- ##
|
||||||
|
|
||||||
# This target creates the upload artifacts.
|
# This target creates the upload artifacts.
|
||||||
|
# Sign it with my key.
|
||||||
|
|
||||||
GPG = gpg
|
GPG = gpg
|
||||||
|
GPGFLAGS = -u 6338B6D4
|
||||||
|
|
||||||
DIST_ARCHIVES_SIG = $(addsuffix .sig,$(DIST_ARCHIVES))
|
DIST_ARCHIVES_SIG = $(addsuffix .sig,$(DIST_ARCHIVES))
|
||||||
DIST_ARCHIVES_DIRECTIVE = $(addsuffix .directive.asc,$(DIST_ARCHIVES))
|
DIST_ARCHIVES_DIRECTIVE = $(addsuffix .directive.asc,$(DIST_ARCHIVES))
|
||||||
@ -260,12 +262,12 @@ $(DIST_ARCHIVES_DIRECTIVE): .directive.asc
|
|||||||
|
|
||||||
%.sig : %
|
%.sig : %
|
||||||
@echo "Signing file '$<':"
|
@echo "Signing file '$<':"
|
||||||
$(GPG) -o $@ -b $<
|
$(GPG) $(GPGFLAGS) -o $@ -b $<
|
||||||
|
|
||||||
.directive.asc:
|
.directive.asc:
|
||||||
@echo "Creating directive file '$@':"
|
@echo "Creating directive file '$@':"
|
||||||
@echo 'directory: make' > .directive
|
@echo 'directory: make' > .directive
|
||||||
$(GPG) -o $@ --clearsign .directive
|
$(GPG) $(GPGFLAGS) -o $@ --clearsign .directive
|
||||||
@rm -f .directive
|
@rm -f .directive
|
||||||
|
|
||||||
# Upload the artifacts
|
# Upload the artifacts
|
||||||
|
2
read.c
2
read.c
@ -1277,8 +1277,8 @@ do_define (char *name, unsigned int namelen,
|
|||||||
unsigned int len;
|
unsigned int len;
|
||||||
char *line;
|
char *line;
|
||||||
|
|
||||||
ebuf->floc.lineno += nlines;
|
|
||||||
nlines = readline (ebuf);
|
nlines = readline (ebuf);
|
||||||
|
ebuf->floc.lineno += nlines;
|
||||||
|
|
||||||
/* If there is nothing left to eval, we're done. */
|
/* If there is nothing left to eval, we're done. */
|
||||||
if (nlines < 0)
|
if (nlines < 0)
|
||||||
|
15
rule.c
15
rule.c
@ -135,20 +135,6 @@ count_implicit_rule_limits (void)
|
|||||||
nonexistent subdirectory. */
|
nonexistent subdirectory. */
|
||||||
|
|
||||||
dep->changed = !dir_file_exists_p (name, "");
|
dep->changed = !dir_file_exists_p (name, "");
|
||||||
#ifdef VMS
|
|
||||||
if (dep->changed && strchr (name, ':') != 0)
|
|
||||||
#else
|
|
||||||
if (dep->changed && *name == '/')
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
/* The name is absolute and the directory does not exist.
|
|
||||||
This rule can never possibly match, since this dependency
|
|
||||||
can never possibly exist. So just remove the rule from
|
|
||||||
the list. */
|
|
||||||
freerule (rule, lastrule);
|
|
||||||
--num_pattern_rules;
|
|
||||||
goto end_main_loop;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
/* This dependency does not reside in a subdirectory. */
|
/* This dependency does not reside in a subdirectory. */
|
||||||
@ -159,7 +145,6 @@ count_implicit_rule_limits (void)
|
|||||||
max_pattern_deps = ndeps;
|
max_pattern_deps = ndeps;
|
||||||
|
|
||||||
lastrule = rule;
|
lastrule = rule;
|
||||||
end_main_loop:
|
|
||||||
rule = next;
|
rule = next;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,3 +1,9 @@
|
|||||||
|
2004-03-22 Paul D. Smith <psmith@gnu.org>
|
||||||
|
|
||||||
|
* test_driver.pl (run_each_test, toplevel, compare_output): Change
|
||||||
|
to track both the testing categories _AND_ the number of
|
||||||
|
individual tests, and report both sets of numbers.
|
||||||
|
|
||||||
2004-02-21 Paul D. Smith <psmith@gnu.org>
|
2004-02-21 Paul D. Smith <psmith@gnu.org>
|
||||||
|
|
||||||
* scripts/functions/origin: Set our own environment variable
|
* scripts/functions/origin: Set our own environment variable
|
||||||
|
@ -71,7 +71,7 @@ $answer = "later foo bar\n";
|
|||||||
# -------
|
# -------
|
||||||
|
|
||||||
&run_make_with_options($makefile, "BOGUS=true", &get_logfile, 512);
|
&run_make_with_options($makefile, "BOGUS=true", &get_logfile, 512);
|
||||||
$answer = "$makefile:23: *** empty variable name. Stop.\n";
|
$answer = "$makefile:24: *** empty variable name. Stop.\n";
|
||||||
&compare_output($answer, &get_logfile(1));
|
&compare_output($answer, &get_logfile(1));
|
||||||
|
|
||||||
# TEST #4
|
# TEST #4
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
#!/usr/local/bin/perl
|
#!/usr/bin/perl
|
||||||
# -*-perl-*-
|
# -*-perl-*-
|
||||||
|
|
||||||
# Modification history:
|
# Modification history:
|
||||||
@ -12,6 +12,22 @@
|
|||||||
# this routine controls the whole mess; each test suite sets up a few
|
# this routine controls the whole mess; each test suite sets up a few
|
||||||
# variables and then calls &toplevel, which does all the real work.
|
# variables and then calls &toplevel, which does all the real work.
|
||||||
|
|
||||||
|
# $Id$
|
||||||
|
|
||||||
|
|
||||||
|
# The number of test categories we've run
|
||||||
|
$categories_run = 0;
|
||||||
|
# The number of test categroies that have passed
|
||||||
|
$categories_passed = 0;
|
||||||
|
# The total number of individual tests that have been run
|
||||||
|
$total_tests_run = 0;
|
||||||
|
# The total number of individual tests that have passed
|
||||||
|
$total_tests_passed = 0;
|
||||||
|
# The number of tests in this category that have been run
|
||||||
|
$tests_run = 0;
|
||||||
|
# The number of tests in this category that have passed
|
||||||
|
$tests_passed = 0;
|
||||||
|
|
||||||
sub toplevel
|
sub toplevel
|
||||||
{
|
{
|
||||||
# Get a clean environment
|
# Get a clean environment
|
||||||
@ -150,17 +166,24 @@ sub toplevel
|
|||||||
|
|
||||||
$| = 1;
|
$| = 1;
|
||||||
|
|
||||||
if ($num_failed)
|
$categories_failed = $categories_run - $categories_passed;
|
||||||
|
$total_tests_failed = $total_tests_run - $total_tests_passed;
|
||||||
|
|
||||||
|
if ($total_tests_failed)
|
||||||
{
|
{
|
||||||
print "\n$num_failed Test";
|
print "\n$total_tests_failed Test";
|
||||||
print "s" unless $num_failed == 1;
|
print "s" unless $total_tests_failed == 1;
|
||||||
|
print " in $categories_failed Categor";
|
||||||
|
print ($categories_failed == 1 ? "y" : "ies");
|
||||||
print " Failed (See .$diffext files in $workdir dir for details) :-(\n\n";
|
print " Failed (See .$diffext files in $workdir dir for details) :-(\n\n";
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
print "\n$counter Test";
|
print "\n$total_tests_passed Test";
|
||||||
print "s" unless $counter == 1;
|
print "s" unless $total_tests_passed == 1;
|
||||||
|
print " in $categories_passed Categor";
|
||||||
|
print ($categories_passed == 1 ? "y" : "ies");
|
||||||
print " Complete ... No Failures :-)\n\n";
|
print " Complete ... No Failures :-)\n\n";
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -348,12 +371,12 @@ sub print_banner
|
|||||||
|
|
||||||
sub run_each_test
|
sub run_each_test
|
||||||
{
|
{
|
||||||
$counter = 0;
|
$categories_run = 0;
|
||||||
|
|
||||||
foreach $testname (sort @TESTS)
|
foreach $testname (sort @TESTS)
|
||||||
{
|
{
|
||||||
$counter++;
|
++$categories_run;
|
||||||
$test_passed = 1; # reset by test on failure
|
$passed = 1; # reset by test on failure
|
||||||
$num_of_logfiles = 0;
|
$num_of_logfiles = 0;
|
||||||
$num_of_tmpfiles = 0;
|
$num_of_tmpfiles = 0;
|
||||||
$description = "";
|
$description = "";
|
||||||
@ -390,11 +413,17 @@ sub run_each_test
|
|||||||
print $output;
|
print $output;
|
||||||
|
|
||||||
# Run the actual test!
|
# Run the actual test!
|
||||||
#
|
$tests_run = 0;
|
||||||
|
$tests_passed = 0;
|
||||||
$code = do $perl_testname;
|
$code = do $perl_testname;
|
||||||
|
|
||||||
|
$total_tests_run += $tests_run;
|
||||||
|
$total_tests_passed += $tests_passed;
|
||||||
|
|
||||||
|
# How did it go?
|
||||||
if (!defined($code))
|
if (!defined($code))
|
||||||
{
|
{
|
||||||
$test_passed = 0;
|
$passed = 0;
|
||||||
if (length ($@))
|
if (length ($@))
|
||||||
{
|
{
|
||||||
warn "\n*** Test died ($testname): $@\n";
|
warn "\n*** Test died ($testname): $@\n";
|
||||||
@ -405,15 +434,16 @@ sub run_each_test
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
elsif ($code == -1) {
|
elsif ($code == -1) {
|
||||||
$test_passed = 0;
|
$passed = 0;
|
||||||
}
|
}
|
||||||
elsif ($code != 1 && $code != -1) {
|
elsif ($code != 1 && $code != -1) {
|
||||||
$test_passed = 0;
|
$passed = 0;
|
||||||
warn "\n*** Test returned $code\n";
|
warn "\n*** Test returned $code\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($test_passed) {
|
if ($passed) {
|
||||||
$status = "ok";
|
++$categories_passed;
|
||||||
|
$status = "ok ($tests_passed passed)";
|
||||||
for ($i = $num_of_tmpfiles; $i; $i--)
|
for ($i = $num_of_tmpfiles; $i; $i--)
|
||||||
{
|
{
|
||||||
&delete ($tmp_filename . &num_suffix ($i) );
|
&delete ($tmp_filename . &num_suffix ($i) );
|
||||||
@ -426,12 +456,11 @@ sub run_each_test
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
elsif ($code > 0) {
|
elsif ($code > 0) {
|
||||||
$status = "FAILED";
|
$status = "FAILED ($tests_passed/$tests_run passed)";
|
||||||
$num_failed++;
|
|
||||||
}
|
}
|
||||||
elsif ($code < 0) {
|
elsif ($code < 0) {
|
||||||
$status = "N/A";
|
$status = "N/A";
|
||||||
--$counter;
|
--$categories_run;
|
||||||
}
|
}
|
||||||
|
|
||||||
# If the verbose option has been specified, then a short description
|
# If the verbose option has been specified, then a short description
|
||||||
@ -591,12 +620,15 @@ sub compare_output
|
|||||||
$slurp =~ s/^.*modification time .*in the future.*\n//gm;
|
$slurp =~ s/^.*modification time .*in the future.*\n//gm;
|
||||||
$slurp =~ s/^.*Clock skew detected.*\n//gm;
|
$slurp =~ s/^.*Clock skew detected.*\n//gm;
|
||||||
|
|
||||||
|
++$tests_run;
|
||||||
|
|
||||||
if ($slurp eq $answer)
|
if ($slurp eq $answer)
|
||||||
{
|
{
|
||||||
if ($debug)
|
if ($debug)
|
||||||
{
|
{
|
||||||
print "ok\n";
|
print "ok\n";
|
||||||
}
|
}
|
||||||
|
++$tests_passed;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -605,7 +637,7 @@ sub compare_output
|
|||||||
{
|
{
|
||||||
print "DIFFERENT OUTPUT\n";
|
print "DIFFERENT OUTPUT\n";
|
||||||
}
|
}
|
||||||
$test_passed = 0;
|
$passed = 0;
|
||||||
&create_file (&get_basefile, $answer);
|
&create_file (&get_basefile, $answer);
|
||||||
|
|
||||||
if ($debug)
|
if ($debug)
|
||||||
|
@ -957,6 +957,11 @@ do_variable_definition (const struct floc *flocp, const char *varname,
|
|||||||
append = 1;
|
append = 1;
|
||||||
v = lookup_variable_in_set (varname, strlen (varname),
|
v = lookup_variable_in_set (varname, strlen (varname),
|
||||||
current_variable_set_list->set);
|
current_variable_set_list->set);
|
||||||
|
|
||||||
|
/* Don't append from the global set if a previous non-appending
|
||||||
|
target-specific variable definition exists. */
|
||||||
|
if (v && !v->append)
|
||||||
|
append = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
v = lookup_variable (varname, strlen (varname));
|
v = lookup_variable (varname, strlen (varname));
|
||||||
|
Loading…
Reference in New Issue
Block a user