mirror of
https://github.com/mirror/make.git
synced 2025-03-27 20:40:35 +08:00
- Modify access of config and gnulib Savannah modules to use GIT
- Fix Savannah bug #24655. - Fix Savannah bug #24588. - Fix Savannah bug #24277. - Fix Savannah bug #25697. - Fix Savannah bug #25694. - Fix Savannah bug #25460. - Fix Savannah bug #26207. - Fix Savannah bug #25712. - Fix Savannah bug #26593. - Fix various doc issues.
This commit is contained in:
parent
5b4d419476
commit
81f3e4babd
64
ChangeLog
64
ChangeLog
@ -1,3 +1,67 @@
|
|||||||
|
2009-06-04 Paul Smith <psmith@gnu.org>
|
||||||
|
|
||||||
|
* maintMakefile: Modify access of config and gnulib Savannah
|
||||||
|
modules to use GIT instead of CVS.
|
||||||
|
|
||||||
|
* main.c (main): Initialize the LENGTH field in SHELL_VAR.
|
||||||
|
Fixes Savannah bug #24655.
|
||||||
|
|
||||||
|
* read.c (eval_buffer): Don't dereference reading_file if it's NULL;
|
||||||
|
this can happen during some invocations of $(eval ...) for example.
|
||||||
|
Fixes Savannah bug #24588. Patch by Lars Jessen <ljessen@ljessen.dk>
|
||||||
|
|
||||||
|
2009-06-02 Paul Smith <psmith@gnu.org>
|
||||||
|
|
||||||
|
* configure.in: Check for fileno()
|
||||||
|
* read.c (eval_makefile): If fileno() is available, set CLOSE_ON_EXEC
|
||||||
|
for the makefile file so invocations of $(shell ...) don't inherit it.
|
||||||
|
Fixes Savannah bug #24277.
|
||||||
|
|
||||||
|
2009-06-01 Paul Smith <psmith@gnu.org>
|
||||||
|
|
||||||
|
* main.c (main): The previous fix for .DEFAULT_GOAL had issues;
|
||||||
|
expansion was handled incorrectly. Rework the default goal
|
||||||
|
handling to save the variable only. Remove default_goal_file and
|
||||||
|
default_goal_name.
|
||||||
|
* read.c (eval): Check default_goal_var, not default_goal_name.
|
||||||
|
* read.c (record_target_var): Don't check default_goal_file here.
|
||||||
|
|
||||||
|
2009-05-31 Paul Smith <psmith@gnu.org>
|
||||||
|
|
||||||
|
* main.c (main): Expand the .DEFAULT_GOAL variable before using
|
||||||
|
it, and if the multi_glob() returns nothing (say it expanded to
|
||||||
|
nothing but spaces) then don't crash. Fixes Savannah bug #25697.
|
||||||
|
|
||||||
|
* doc/make.texi (Quick Reference): Add $(if ..), $(or ..), and
|
||||||
|
$(and ..) to the reference. Fixes Savannah bug #25694.
|
||||||
|
|
||||||
|
* make.1: Be clear that some recipes will be executed even with -n.
|
||||||
|
* doc/make.texi: Ditto. Fixes Savannah bug #25460.
|
||||||
|
|
||||||
|
* doc/make.texi (Override Directive): Make more clear how
|
||||||
|
overrides and appends interact.
|
||||||
|
Elucidates part of Savannah bug #26207.
|
||||||
|
|
||||||
|
* read.c (record_target_var): Don't reset the origin on
|
||||||
|
target-specific variables; try_variable_definition() will handle
|
||||||
|
this correctly. Fixes Savannah bug #26207.
|
||||||
|
|
||||||
|
* maintMakefile (do-po-update): Copy PO files into $(top_srcdir).
|
||||||
|
Fixes Savannah bug #25712.
|
||||||
|
|
||||||
|
* implicit.c (pattern_search): Keep a pointer to the beginning of
|
||||||
|
the filename and save that instead of the constructed pointer.
|
||||||
|
Fixes Savannah bug #26593.
|
||||||
|
Patch by Mark Seaborn <mrs@mythic-beasts.com>
|
||||||
|
|
||||||
|
2009-05-30 Paul Smith <psmith@gnu.org>
|
||||||
|
|
||||||
|
* doc/make.texi (Multi-Line): Add a description of the new abilities
|
||||||
|
of define/endef. Rename "Sequences" to "Multi-Line" and fix some
|
||||||
|
"command sequence" vs. "recipe" syntax.
|
||||||
|
* read.c (do_define): Modify to allow assignment tokens (=, :=, etc.)
|
||||||
|
after a define, to create variables with those flavors.
|
||||||
|
|
||||||
2009-05-25 Paul Smith <psmith@gnu.org>
|
2009-05-25 Paul Smith <psmith@gnu.org>
|
||||||
|
|
||||||
Reworked the parser for variable assignments to allow multiple
|
Reworked the parser for variable assignments to allow multiple
|
||||||
|
@ -147,7 +147,7 @@ if test "$ac_cv_func_gettimeofday" = yes; then
|
|||||||
[Define to 1 if you have a standard gettimeofday function])
|
[Define to 1 if you have a standard gettimeofday function])
|
||||||
fi
|
fi
|
||||||
|
|
||||||
AC_CHECK_FUNCS( strdup strndup mkstemp mktemp fdopen \
|
AC_CHECK_FUNCS( strdup strndup mkstemp mktemp fdopen fileno \
|
||||||
bsd_signal dup2 getcwd realpath sigsetmask sigaction \
|
bsd_signal dup2 getcwd realpath sigsetmask sigaction \
|
||||||
getgroups seteuid setegid setlinebuf setreuid setregid \
|
getgroups seteuid setegid setlinebuf setreuid setregid \
|
||||||
getrlimit setrlimit setvbuf pipe strerror strsignal \
|
getrlimit setrlimit setvbuf pipe strerror strsignal \
|
||||||
|
226
doc/make.texi
226
doc/make.texi
@ -25,8 +25,8 @@ and issues the commands to recompile them.
|
|||||||
This is Edition @value{EDITION}, last updated @value{UPDATED},
|
This is Edition @value{EDITION}, last updated @value{UPDATED},
|
||||||
of @cite{The GNU Make Manual}, for GNU @code{make} version @value{VERSION}.
|
of @cite{The GNU Make Manual}, for GNU @code{make} version @value{VERSION}.
|
||||||
|
|
||||||
Copyright @copyright{} 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995,
|
Copyright @copyright{} 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996,
|
||||||
1996, 1997, 1998, 1999, 2000, 2002, 2003, 2004, 2005, 2006, 2007
|
1997, 1998, 1999, 2000, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
|
||||||
Free Software Foundation, Inc.
|
Free Software Foundation, Inc.
|
||||||
|
|
||||||
@quotation
|
@quotation
|
||||||
@ -38,8 +38,8 @@ and with the Back-Cover Texts as in (a) below. A copy of the
|
|||||||
license is included in the section entitled ``GNU Free Documentation
|
license is included in the section entitled ``GNU Free Documentation
|
||||||
License.''
|
License.''
|
||||||
|
|
||||||
(a) The FSF's Back-Cover Text is: ``You are free to copy and modify
|
(a) The FSF's Back-Cover Text is: ``You have the freedom to copy and
|
||||||
this GNU Manual. Buying copies from GNU Press supports the FSF in
|
modify this GNU manual. Buying copies from the FSF supports it in
|
||||||
developing GNU and promoting software freedom.''
|
developing GNU and promoting software freedom.''
|
||||||
@end quotation
|
@end quotation
|
||||||
@end copying
|
@end copying
|
||||||
@ -201,7 +201,7 @@ Writing Recipes in Rules
|
|||||||
* Errors:: What happens after a recipe execution error.
|
* Errors:: What happens after a recipe execution error.
|
||||||
* Interrupts:: What happens when a recipe is interrupted.
|
* Interrupts:: What happens when a recipe is interrupted.
|
||||||
* Recursion:: Invoking @code{make} from makefiles.
|
* Recursion:: Invoking @code{make} from makefiles.
|
||||||
* Sequences:: Defining canned recipes.
|
* Canned Recipes:: Defining canned recipes.
|
||||||
* Empty Recipes:: Defining useful, do-nothing recipes.
|
* Empty Recipes:: Defining useful, do-nothing recipes.
|
||||||
|
|
||||||
Recipe Syntax
|
Recipe Syntax
|
||||||
@ -233,8 +233,8 @@ How to Use Variables
|
|||||||
of a variable.
|
of a variable.
|
||||||
* Override Directive:: How to set a variable in the makefile even if
|
* Override Directive:: How to set a variable in the makefile even if
|
||||||
the user has set it with a command argument.
|
the user has set it with a command argument.
|
||||||
* Defining:: An alternate way to set a variable
|
* Multi-Line:: An alternate way to set a variable
|
||||||
to a verbatim string.
|
to a multi-line string.
|
||||||
* Environment:: Variable values can come from the environment.
|
* Environment:: Variable values can come from the environment.
|
||||||
* Target-specific:: Variable values can be defined on a per-target
|
* Target-specific:: Variable values can be defined on a per-target
|
||||||
basis.
|
basis.
|
||||||
@ -996,7 +996,7 @@ ignore a part of the makefile (@pxref{Conditionals, ,Conditional Parts of Makefi
|
|||||||
|
|
||||||
@item
|
@item
|
||||||
Defining a variable from a verbatim string containing multiple lines
|
Defining a variable from a verbatim string containing multiple lines
|
||||||
(@pxref{Defining, ,Defining Variables Verbatim}).
|
(@pxref{Multi-Line, ,Defining Multi-Line Variables}).
|
||||||
@end itemize
|
@end itemize
|
||||||
|
|
||||||
@cindex comments, in makefile
|
@cindex comments, in makefile
|
||||||
@ -1269,7 +1269,7 @@ that it is not an error if @code{make} cannot find or make any makefile;
|
|||||||
a makefile is not always necessary.@refill
|
a makefile is not always necessary.@refill
|
||||||
|
|
||||||
When you use the @samp{-t} or @samp{--touch} option
|
When you use the @samp{-t} or @samp{--touch} option
|
||||||
(@pxref{Instead of Execution, ,Instead of Executing the Recipe}),
|
(@pxref{Instead of Execution, ,Instead of Executing Recipes}),
|
||||||
you would not want to use an out-of-date makefile to decide which
|
you would not want to use an out-of-date makefile to decide which
|
||||||
targets to touch. So the @samp{-t} option has no effect on updating
|
targets to touch. So the @samp{-t} option has no effect on updating
|
||||||
makefiles; they are really updated even if @samp{-t} is specified.
|
makefiles; they are really updated even if @samp{-t} is specified.
|
||||||
@ -1388,6 +1388,22 @@ Variable definitions are parsed as follows:
|
|||||||
define @var{immediate}
|
define @var{immediate}
|
||||||
@var{deferred}
|
@var{deferred}
|
||||||
endef
|
endef
|
||||||
|
|
||||||
|
define @var{immediate} =
|
||||||
|
@var{deferred}
|
||||||
|
endef
|
||||||
|
|
||||||
|
define @var{immediate} ?=
|
||||||
|
@var{deferred}
|
||||||
|
endef
|
||||||
|
|
||||||
|
define @var{immediate} :=
|
||||||
|
@var{immediate}
|
||||||
|
endef
|
||||||
|
|
||||||
|
define @var{immediate} +=
|
||||||
|
@var{deferred} or @var{immediate}
|
||||||
|
endef
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
For the append operator, @samp{+=}, the right-hand side is considered
|
For the append operator, @samp{+=}, the right-hand side is considered
|
||||||
@ -3361,7 +3377,7 @@ otherwise. @xref{Execution, ,Command Execution}.
|
|||||||
* Errors:: What happens after a recipe execution error.
|
* Errors:: What happens after a recipe execution error.
|
||||||
* Interrupts:: What happens when a recipe is interrupted.
|
* Interrupts:: What happens when a recipe is interrupted.
|
||||||
* Recursion:: Invoking @code{make} from makefiles.
|
* Recursion:: Invoking @code{make} from makefiles.
|
||||||
* Sequences:: Defining canned recipes.
|
* Canned Recipes:: Defining canned recipes.
|
||||||
* Empty Recipes:: Defining useful, do-nothing recipes.
|
* Empty Recipes:: Defining useful, do-nothing recipes.
|
||||||
@end menu
|
@end menu
|
||||||
|
|
||||||
@ -3629,12 +3645,12 @@ the makefile:
|
|||||||
@cindex @code{--just-print}
|
@cindex @code{--just-print}
|
||||||
@cindex @code{--dry-run}
|
@cindex @code{--dry-run}
|
||||||
@cindex @code{--recon}
|
@cindex @code{--recon}
|
||||||
When @code{make} is given the flag @samp{-n} or @samp{--just-print}
|
When @code{make} is given the flag @samp{-n} or @samp{--just-print} it
|
||||||
it only echoes recipes, it won't execute them. @xref{Options Summary,
|
only echoes most recipes, without executing them. @xref{Options
|
||||||
,Summary of Options}. In this case and only this case, even the
|
Summary, ,Summary of Options}. In this case even the recipe lines
|
||||||
recipe lines starting with @samp{@@} are printed. This flag is useful for
|
starting with @samp{@@} are printed. This flag is useful for finding
|
||||||
finding out which recipes @code{make} thinks are necessary without
|
out which recipes @code{make} thinks are necessary without actually
|
||||||
actually doing them.
|
doing them.
|
||||||
|
|
||||||
@cindex @code{-s}
|
@cindex @code{-s}
|
||||||
@cindex @code{--silent}
|
@cindex @code{--silent}
|
||||||
@ -4014,7 +4030,7 @@ target is updated in some atomic fashion, or exists only to record a
|
|||||||
modification-time (its contents do not matter), or must exist at all
|
modification-time (its contents do not matter), or must exist at all
|
||||||
times to prevent other sorts of trouble.
|
times to prevent other sorts of trouble.
|
||||||
|
|
||||||
@node Recursion, Sequences, Interrupts, Recipes
|
@node Recursion, Canned Recipes, Interrupts, Recipes
|
||||||
@section Recursive Use of @code{make}
|
@section Recursive Use of @code{make}
|
||||||
@cindex recursion
|
@cindex recursion
|
||||||
@cindex subdirectories, recursion for
|
@cindex subdirectories, recursion for
|
||||||
@ -4360,7 +4376,7 @@ supports it (most any UNIX system will; others typically won't), the
|
|||||||
parent @code{make} and all the sub-@code{make}s will communicate to
|
parent @code{make} and all the sub-@code{make}s will communicate to
|
||||||
ensure that there are only @samp{N} jobs running at the same time
|
ensure that there are only @samp{N} jobs running at the same time
|
||||||
between them all. Note that any job that is marked recursive
|
between them all. Note that any job that is marked recursive
|
||||||
(@pxref{Instead of Execution, ,Instead of Executing the Recipes})
|
(@pxref{Instead of Execution, ,Instead of Executing Recipes})
|
||||||
doesn't count against the total jobs (otherwise we could get @samp{N}
|
doesn't count against the total jobs (otherwise we could get @samp{N}
|
||||||
sub-@code{make}s running and have no slots left over for any real work!)
|
sub-@code{make}s running and have no slots left over for any real work!)
|
||||||
|
|
||||||
@ -4496,7 +4512,7 @@ automatically turn on @samp{-w} if you also use @samp{-s}, which says to
|
|||||||
be silent, or if you use @samp{--no-print-directory} to explicitly
|
be silent, or if you use @samp{--no-print-directory} to explicitly
|
||||||
disable it.
|
disable it.
|
||||||
|
|
||||||
@node Sequences, Empty Recipes, Recursion, Recipes
|
@node Canned Recipes, Empty Recipes, Recursion, Recipes
|
||||||
@section Defining Canned Recipes
|
@section Defining Canned Recipes
|
||||||
@cindex canned recipes
|
@cindex canned recipes
|
||||||
@cindex recipes, canned
|
@cindex recipes, canned
|
||||||
@ -4509,10 +4525,10 @@ directive, and refer to the canned sequence from the recipes for those
|
|||||||
targets. The canned sequence is actually a variable, so the name must
|
targets. The canned sequence is actually a variable, so the name must
|
||||||
not conflict with other variable names.
|
not conflict with other variable names.
|
||||||
|
|
||||||
Here is an example of defining a canned recipes:
|
Here is an example of defining a canned recipe:
|
||||||
|
|
||||||
@example
|
@example
|
||||||
define run-yacc
|
define run-yacc =
|
||||||
yacc $(firstword $^)
|
yacc $(firstword $^)
|
||||||
mv y.tab.c $@@
|
mv y.tab.c $@@
|
||||||
endef
|
endef
|
||||||
@ -4526,7 +4542,7 @@ commands. The @code{define} directive does not expand variable references
|
|||||||
and function calls in the canned sequence; the @samp{$} characters,
|
and function calls in the canned sequence; the @samp{$} characters,
|
||||||
parentheses, variable names, and so on, all become part of the value of the
|
parentheses, variable names, and so on, all become part of the value of the
|
||||||
variable you are defining.
|
variable you are defining.
|
||||||
@xref{Defining, ,Defining Variables Verbatim},
|
@xref{Multi-Line, ,Defining Multi-Line Variables},
|
||||||
for a complete explanation of @code{define}.
|
for a complete explanation of @code{define}.
|
||||||
|
|
||||||
The first command in this example runs Yacc on the first prerequisite of
|
The first command in this example runs Yacc on the first prerequisite of
|
||||||
@ -4567,7 +4583,7 @@ can use the special prefix characters that affect command lines
|
|||||||
For example, using this canned sequence:
|
For example, using this canned sequence:
|
||||||
|
|
||||||
@example
|
@example
|
||||||
define frobnicate
|
define frobnicate =
|
||||||
@@echo "frobnicating target $@@"
|
@@echo "frobnicating target $@@"
|
||||||
frob-step-1 $< -o $@@-step-1
|
frob-step-1 $< -o $@@-step-1
|
||||||
frob-step-2 $@@-step-1 -o $@@
|
frob-step-2 $@@-step-1 -o $@@
|
||||||
@ -4590,7 +4606,7 @@ frob.out: frob.in
|
|||||||
does not echo @emph{any} recipe lines.
|
does not echo @emph{any} recipe lines.
|
||||||
(@xref{Echoing, ,Recipe Echoing}, for a full explanation of @samp{@@}.)
|
(@xref{Echoing, ,Recipe Echoing}, for a full explanation of @samp{@@}.)
|
||||||
|
|
||||||
@node Empty Recipes, , Sequences, Recipes
|
@node Empty Recipes, , Canned Recipes, Recipes
|
||||||
@section Using Empty Recipes
|
@section Using Empty Recipes
|
||||||
@cindex empty recipes
|
@cindex empty recipes
|
||||||
@cindex recipes, empty
|
@cindex recipes, empty
|
||||||
@ -4685,8 +4701,8 @@ they have particular specialized uses. @xref{Automatic Variables}.
|
|||||||
of a variable.
|
of a variable.
|
||||||
* Override Directive:: How to set a variable in the makefile even if
|
* Override Directive:: How to set a variable in the makefile even if
|
||||||
the user has set it with a command argument.
|
the user has set it with a command argument.
|
||||||
* Defining:: An alternate way to set a variable
|
* Multi-Line:: An alternate way to set a variable
|
||||||
to a verbatim string.
|
to a multi-line string.
|
||||||
* Environment:: Variable values can come from the environment.
|
* Environment:: Variable values can come from the environment.
|
||||||
* Target-specific:: Variable values can be defined on a per-target
|
* Target-specific:: Variable values can be defined on a per-target
|
||||||
basis.
|
basis.
|
||||||
@ -4762,7 +4778,7 @@ distinguished in how they are defined and in what they do when expanded.
|
|||||||
The first flavor of variable is a @dfn{recursively expanded} variable.
|
The first flavor of variable is a @dfn{recursively expanded} variable.
|
||||||
Variables of this sort are defined by lines using @samp{=}
|
Variables of this sort are defined by lines using @samp{=}
|
||||||
(@pxref{Setting, ,Setting Variables}) or by the @code{define} directive
|
(@pxref{Setting, ,Setting Variables}) or by the @code{define} directive
|
||||||
(@pxref{Defining, ,Defining Variables Verbatim}). The value you specify
|
(@pxref{Multi-Line, ,Defining Multi-Line Variables}). The value you specify
|
||||||
is installed verbatim; if it contains references to other variables,
|
is installed verbatim; if it contains references to other variables,
|
||||||
these references are expanded whenever this variable is substituted (in
|
these references are expanded whenever this variable is substituted (in
|
||||||
the course of expanding some other string). When this happens, it is
|
the course of expanding some other string). When this happens, it is
|
||||||
@ -5189,7 +5205,7 @@ variable assignment, or in a @code{define} directive, as in:
|
|||||||
@example
|
@example
|
||||||
dir = foo
|
dir = foo
|
||||||
$(dir)_sources := $(wildcard $(dir)/*.c)
|
$(dir)_sources := $(wildcard $(dir)/*.c)
|
||||||
define $(dir)_print
|
define $(dir)_print =
|
||||||
lpr $($(dir)_sources)
|
lpr $($(dir)_sources)
|
||||||
endef
|
endef
|
||||||
@end example
|
@end example
|
||||||
@ -5218,7 +5234,7 @@ You can specify an overriding value when you run @code{make}.
|
|||||||
@item
|
@item
|
||||||
You can specify a value in the makefile, either
|
You can specify a value in the makefile, either
|
||||||
with an assignment (@pxref{Setting, ,Setting Variables}) or with a
|
with an assignment (@pxref{Setting, ,Setting Variables}) or with a
|
||||||
verbatim definition (@pxref{Defining, ,Defining Variables Verbatim}).@refill
|
verbatim definition (@pxref{Multi-Line, ,Defining Multi-Line Variables}).@refill
|
||||||
|
|
||||||
@item
|
@item
|
||||||
Variables in the environment become @code{make} variables.
|
Variables in the environment become @code{make} variables.
|
||||||
@ -5426,7 +5442,7 @@ the reference to @code{includes}, so if that variable gets defined at
|
|||||||
any later point, a reference like @samp{$(CFLAGS)} still uses its
|
any later point, a reference like @samp{$(CFLAGS)} still uses its
|
||||||
value.
|
value.
|
||||||
|
|
||||||
@node Override Directive, Defining, Appending, Using Variables
|
@node Override Directive, Multi-Line, Appending, Using Variables
|
||||||
@section The @code{override} Directive
|
@section The @code{override} Directive
|
||||||
@findex override
|
@findex override
|
||||||
@cindex overriding with @code{override}
|
@cindex overriding with @code{override}
|
||||||
@ -5459,6 +5475,11 @@ override @var{variable} += @var{more text}
|
|||||||
@noindent
|
@noindent
|
||||||
@xref{Appending, ,Appending More Text to Variables}.
|
@xref{Appending, ,Appending More Text to Variables}.
|
||||||
|
|
||||||
|
Variable assignments marked with the @code{override} flag have a
|
||||||
|
higher priority than all other assignments, except another
|
||||||
|
@code{override}. Subsequent assignments or appends to this variable
|
||||||
|
which are not marked @code{override} will be ignored.
|
||||||
|
|
||||||
The @code{override} directive was not invented for escalation in the war
|
The @code{override} directive was not invented for escalation in the war
|
||||||
between makefiles and command arguments. It was invented so you can alter
|
between makefiles and command arguments. It was invented so you can alter
|
||||||
and add to values that the user specifies with command arguments.
|
and add to values that the user specifies with command arguments.
|
||||||
@ -5476,7 +5497,7 @@ You can also use @code{override} directives with @code{define} directives.
|
|||||||
This is done as you might expect:
|
This is done as you might expect:
|
||||||
|
|
||||||
@example
|
@example
|
||||||
override define foo
|
override define foo =
|
||||||
bar
|
bar
|
||||||
endef
|
endef
|
||||||
@end example
|
@end example
|
||||||
@ -5486,43 +5507,52 @@ endef
|
|||||||
See the next section for information about @code{define}.
|
See the next section for information about @code{define}.
|
||||||
@end iftex
|
@end iftex
|
||||||
@ifnottex
|
@ifnottex
|
||||||
@xref{Defining, ,Defining Variables Verbatim}.
|
@xref{Multi-Line, ,Defining Multi-Line Variables}.
|
||||||
@end ifnottex
|
@end ifnottex
|
||||||
|
|
||||||
@node Defining, Environment, Override Directive, Using Variables
|
@node Multi-Line, Environment, Override Directive, Using Variables
|
||||||
@section Defining Variables Verbatim
|
@section Defining Multi-Line Variables
|
||||||
@findex define
|
@findex define
|
||||||
@findex endef
|
@findex endef
|
||||||
|
@cindex multi-line variable definition
|
||||||
|
@cindex variables, multi-line
|
||||||
@cindex verbatim variable definition
|
@cindex verbatim variable definition
|
||||||
@cindex defining variables verbatim
|
@cindex defining variables verbatim
|
||||||
@cindex variables, defining verbatim
|
@cindex variables, defining verbatim
|
||||||
|
|
||||||
Another way to set the value of a variable is to use the @code{define}
|
Another way to set the value of a variable is to use the @code{define}
|
||||||
directive. This directive has an unusual syntax which allows newline
|
directive. This directive has an unusual syntax which allows newline
|
||||||
characters to be included in the value, which is convenient for defining
|
characters to be included in the value, which is convenient for
|
||||||
both canned sequences of commands
|
defining both canned sequences of commands (@pxref{Canned Recipes,
|
||||||
(@pxref{Sequences, ,Defining Canned Command Sequences}), and also
|
,Defining Canned Recipes}), and also sections of makefile syntax to
|
||||||
sections of makefile syntax to use with @code{eval} (@pxref{Eval Function}).
|
use with @code{eval} (@pxref{Eval Function}).@refill
|
||||||
|
|
||||||
The @code{define} directive is followed on the same line by the name of the
|
The @code{define} directive is followed on the same line by the name
|
||||||
variable and nothing more. The value to give the variable appears on the
|
of the variable being defined and an (optional) assignment operator,
|
||||||
following lines. The end of the value is marked by a line containing just
|
and nothing more. The value to give the variable appears on the
|
||||||
the word @code{endef}. Aside from this difference in syntax, @code{define}
|
following lines. The end of the value is marked by a line containing
|
||||||
works just like @samp{=}: it creates a recursively-expanded variable
|
just the word @code{endef}. Aside from this difference in syntax,
|
||||||
(@pxref{Flavors, ,The Two Flavors of Variables}).
|
@code{define} works just like any other variable definition. The
|
||||||
The variable name may contain function and variable references, which
|
variable name may contain function and variable references, which are
|
||||||
are expanded when the directive is read to find the actual variable name
|
expanded when the directive is read to find the actual variable name
|
||||||
to use.
|
to use.
|
||||||
|
|
||||||
|
You may omit the variable assignment operator if you prefer. If
|
||||||
|
omitted, @code{make} assumes it to be @samp{=} and creates a
|
||||||
|
recursively-expanded variable (@pxref{Flavors, ,The Two Flavors of Variables}).
|
||||||
|
When using a @samp{+=} operator, the value is appended to the previous
|
||||||
|
value as with any other append operation: with a single space
|
||||||
|
separating the old and new values.
|
||||||
|
|
||||||
You may nest @code{define} directives: @code{make} will keep track of
|
You may nest @code{define} directives: @code{make} will keep track of
|
||||||
nested directives and report an error if they are not all properly
|
nested directives and report an error if they are not all properly
|
||||||
closed with @code{endef}. Note that lines beginning with the recipe
|
closed with @code{endef}. Note that lines beginning with the recipe
|
||||||
prefix character are considered part of a recipe, so any @code{define}
|
prefix character are considered part of a recipe, so any @code{define}
|
||||||
or @code{endef} strings appearing on such a line will not be
|
or @code{endef} strings appearing on such a line will not be
|
||||||
considered @code{make} operators.
|
considered @code{make} directives.
|
||||||
|
|
||||||
@example
|
@example
|
||||||
define two-lines
|
define two-lines =
|
||||||
echo foo
|
echo foo
|
||||||
echo $(bar)
|
echo $(bar)
|
||||||
endef
|
endef
|
||||||
@ -5552,7 +5582,7 @@ precedence over command-line variable definitions, you can use the
|
|||||||
@code{override} directive together with @code{define}:
|
@code{override} directive together with @code{define}:
|
||||||
|
|
||||||
@example
|
@example
|
||||||
override define two-lines
|
override define two-lines =
|
||||||
foo
|
foo
|
||||||
$(bar)
|
$(bar)
|
||||||
endef
|
endef
|
||||||
@ -5561,7 +5591,7 @@ endef
|
|||||||
@noindent
|
@noindent
|
||||||
@xref{Override Directive, ,The @code{override} Directive}.
|
@xref{Override Directive, ,The @code{override} Directive}.
|
||||||
|
|
||||||
@node Environment, Target-specific, Defining, Using Variables
|
@node Environment, Target-specific, Multi-Line, Using Variables
|
||||||
@section Variables from the Environment
|
@section Variables from the Environment
|
||||||
|
|
||||||
@cindex variables, environment
|
@cindex variables, environment
|
||||||
@ -7193,7 +7223,7 @@ client_LIBS = protocol
|
|||||||
.PHONY: all
|
.PHONY: all
|
||||||
all: $(PROGRAMS)
|
all: $(PROGRAMS)
|
||||||
|
|
||||||
define PROGRAM_template
|
define PROGRAM_template =
|
||||||
$(1): $$($(1)_OBJS) $$($(1)_LIBS:%=-l%)
|
$(1): $$($(1)_OBJS) $$($(1)_LIBS:%=-l%)
|
||||||
ALL_OBJS += $$($(1)_OBJS)
|
ALL_OBJS += $$($(1)_OBJS)
|
||||||
endef
|
endef
|
||||||
@ -7246,14 +7276,15 @@ function will return the origin of the later definition.
|
|||||||
|
|
||||||
@item environment
|
@item environment
|
||||||
|
|
||||||
if @var{variable} was defined as an environment variable and the
|
if @var{variable} was inherited from the environment provided to
|
||||||
@samp{-e} option is @emph{not} turned on (@pxref{Options Summary, ,Summary of Options}).
|
@code{make}.
|
||||||
|
|
||||||
@item environment override
|
@item environment override
|
||||||
|
|
||||||
if @var{variable} was defined as an environment variable and the
|
if @var{variable} was inherited from the environment provided to
|
||||||
@w{@samp{-e}} option @emph{is} turned on (@pxref{Options Summary,
|
@code{make}, and is overriding a setting for @var{variable} in the
|
||||||
,Summary of Options}).@refill
|
makefile as a result of the @w{@samp{-e}} option (@pxref{Options
|
||||||
|
Summary, ,Summary of Options}).@refill
|
||||||
|
|
||||||
@item file
|
@item file
|
||||||
|
|
||||||
@ -7494,7 +7525,7 @@ It will print messages describing the particular errors.
|
|||||||
@item 1
|
@item 1
|
||||||
The exit status is one if you use the @samp{-q} flag and @code{make}
|
The exit status is one if you use the @samp{-q} flag and @code{make}
|
||||||
determines that some target is not already up to date.
|
determines that some target is not already up to date.
|
||||||
@xref{Instead of Execution, ,Instead of Executing the Recipes}.
|
@xref{Instead of Execution, ,Instead of Executing Recipes}.
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
@menu
|
@menu
|
||||||
@ -7671,7 +7702,7 @@ Perform self tests on the program this makefile builds.
|
|||||||
@end table
|
@end table
|
||||||
|
|
||||||
@node Instead of Execution, Avoiding Compilation, Goals, Running
|
@node Instead of Execution, Avoiding Compilation, Goals, Running
|
||||||
@section Instead of Executing the Recipes
|
@section Instead of Executing Recipes
|
||||||
@cindex execution, instead of
|
@cindex execution, instead of
|
||||||
@cindex recipes, instead of executing
|
@cindex recipes, instead of executing
|
||||||
|
|
||||||
@ -7691,7 +7722,8 @@ what you want. Certain options specify other activities for @code{make}.
|
|||||||
@cindex @code{-n}
|
@cindex @code{-n}
|
||||||
|
|
||||||
``No-op''. The activity is to print what recipe would be used to make
|
``No-op''. The activity is to print what recipe would be used to make
|
||||||
the targets up to date, but not actually execute it.
|
the targets up to date, but not actually execute it. Some recipes are
|
||||||
|
still executed, even with this flag (@pxref{MAKE Variable, ,How the @code{MAKE} Variable Works}).
|
||||||
|
|
||||||
@item -t
|
@item -t
|
||||||
@itemx --touch
|
@itemx --touch
|
||||||
@ -7733,7 +7765,7 @@ to see what would happen if you were to modify specific files.@refill
|
|||||||
@end table
|
@end table
|
||||||
|
|
||||||
With the @samp{-n} flag, @code{make} prints the recipe that it would
|
With the @samp{-n} flag, @code{make} prints the recipe that it would
|
||||||
normally execute but does not execute it.
|
normally execute but usually does not execute it.
|
||||||
|
|
||||||
With the @samp{-t} flag, @code{make} ignores the recipes in the rules
|
With the @samp{-t} flag, @code{make} ignores the recipes in the rules
|
||||||
and uses (in effect) the command @code{touch} for each target that needs to
|
and uses (in effect) the command @code{touch} for each target that needs to
|
||||||
@ -8108,8 +8140,9 @@ links is taken as the modification time for this target file.
|
|||||||
@cindex @code{--recon}
|
@cindex @code{--recon}
|
||||||
@c Extra blank line here makes the table look better.
|
@c Extra blank line here makes the table look better.
|
||||||
|
|
||||||
Print the recipe that would be executed, but do not execute it.
|
Print the recipe that would be executed, but do not execute it (except
|
||||||
@xref{Instead of Execution, ,Instead of Executing the Recipes}.
|
in certain circumstances).
|
||||||
|
@xref{Instead of Execution, ,Instead of Executing Recipes}.
|
||||||
|
|
||||||
@item -o @var{file}
|
@item -o @var{file}
|
||||||
@cindex @code{-o}
|
@cindex @code{-o}
|
||||||
@ -8146,7 +8179,7 @@ in complex environments.
|
|||||||
``Question mode''. Do not run any recipes, or print anything; just
|
``Question mode''. Do not run any recipes, or print anything; just
|
||||||
return an exit status that is zero if the specified targets are already
|
return an exit status that is zero if the specified targets are already
|
||||||
up to date, one if any remaking is required, or two if an error is
|
up to date, one if any remaking is required, or two if an error is
|
||||||
encountered. @xref{Instead of Execution, ,Instead of Executing the
|
encountered. @xref{Instead of Execution, ,Instead of Executing
|
||||||
Recipes}.@refill
|
Recipes}.@refill
|
||||||
|
|
||||||
@item -r
|
@item -r
|
||||||
@ -8208,7 +8241,7 @@ or if you set @samp{-k} in @code{MAKEFLAGS} in your environment.@refill
|
|||||||
Touch files (mark them up to date without really changing them)
|
Touch files (mark them up to date without really changing them)
|
||||||
instead of running their recipes. This is used to pretend that the
|
instead of running their recipes. This is used to pretend that the
|
||||||
recipes were done, in order to fool future invocations of
|
recipes were done, in order to fool future invocations of
|
||||||
@code{make}. @xref{Instead of Execution, ,Instead of Executing the Recipes}.
|
@code{make}. @xref{Instead of Execution, ,Instead of Executing Recipes}.
|
||||||
|
|
||||||
@item -v
|
@item -v
|
||||||
@cindex @code{-v}
|
@cindex @code{-v}
|
||||||
@ -8249,7 +8282,7 @@ to modify that file. Without @samp{-n}, it is almost the same as
|
|||||||
running a @code{touch} command on the given file before running
|
running a @code{touch} command on the given file before running
|
||||||
@code{make}, except that the modification time is changed only in the
|
@code{make}, except that the modification time is changed only in the
|
||||||
imagination of @code{make}.
|
imagination of @code{make}.
|
||||||
@xref{Instead of Execution, ,Instead of Executing the Recipes}.
|
@xref{Instead of Execution, ,Instead of Executing Recipes}.
|
||||||
|
|
||||||
@item --warn-undefined-variables
|
@item --warn-undefined-variables
|
||||||
@cindex @code{--warn-undefined-variables}
|
@cindex @code{--warn-undefined-variables}
|
||||||
@ -10102,7 +10135,7 @@ did. @xref{Automatic Variables}. The automatic variable
|
|||||||
@item
|
@item
|
||||||
The ``what if'' flag (@samp{-W} in GNU @code{make}) was (as far as we know)
|
The ``what if'' flag (@samp{-W} in GNU @code{make}) was (as far as we know)
|
||||||
invented by Andrew Hume in @code{mk}.
|
invented by Andrew Hume in @code{mk}.
|
||||||
@xref{Instead of Execution, ,Instead of Executing the Recipes}.
|
@xref{Instead of Execution, ,Instead of Executing Recipes}.
|
||||||
|
|
||||||
@item
|
@item
|
||||||
The concept of doing several things at once (parallelism) exists in
|
The concept of doing several things at once (parallelism) exists in
|
||||||
@ -10120,7 +10153,7 @@ inspired whom, since GNU @code{make} had @code{patsubst} before SunOS
|
|||||||
|
|
||||||
@item
|
@item
|
||||||
The special significance of @samp{+} characters preceding recipe lines
|
The special significance of @samp{+} characters preceding recipe lines
|
||||||
(@pxref{Instead of Execution, ,Instead of Executing the Recipes}) is
|
(@pxref{Instead of Execution, ,Instead of Executing Recipes}) is
|
||||||
mandated by @cite{IEEE Standard 1003.2-1992} (POSIX.2).
|
mandated by @cite{IEEE Standard 1003.2-1992} (POSIX.2).
|
||||||
|
|
||||||
@item
|
@item
|
||||||
@ -10165,7 +10198,7 @@ directory. @xref{Options Summary, ,Summary of Options}.
|
|||||||
|
|
||||||
@item
|
@item
|
||||||
Make verbatim variable definitions with @code{define}.
|
Make verbatim variable definitions with @code{define}.
|
||||||
@xref{Defining, ,Defining Variables Verbatim}.
|
@xref{Multi-Line, ,Defining Multi-Line Variables}.
|
||||||
|
|
||||||
@item
|
@item
|
||||||
Declare phony targets with the special target @code{.PHONY}.
|
Declare phony targets with the special target @code{.PHONY}.
|
||||||
@ -10373,10 +10406,13 @@ Here is a summary of the directives GNU @code{make} recognizes:
|
|||||||
|
|
||||||
@table @code
|
@table @code
|
||||||
@item define @var{variable}
|
@item define @var{variable}
|
||||||
|
@itemx define @var{variable} =
|
||||||
|
@itemx define @var{variable} :=
|
||||||
|
@itemx define @var{variable} +=
|
||||||
|
@itemx define @var{variable} ?=
|
||||||
@itemx endef
|
@itemx endef
|
||||||
|
Define multi-line variables.@*
|
||||||
Define a multi-line, recursively-expanded variable.@*
|
@xref{Multi-Line}.
|
||||||
@xref{Sequences}.
|
|
||||||
|
|
||||||
@item ifdef @var{variable}
|
@item ifdef @var{variable}
|
||||||
@itemx ifndef @var{variable}
|
@itemx ifndef @var{variable}
|
||||||
@ -10388,43 +10424,35 @@ Define a multi-line, recursively-expanded variable.@*
|
|||||||
@itemx ifneq '@var{a}' '@var{b}'
|
@itemx ifneq '@var{a}' '@var{b}'
|
||||||
@itemx else
|
@itemx else
|
||||||
@itemx endif
|
@itemx endif
|
||||||
|
|
||||||
Conditionally evaluate part of the makefile.@*
|
Conditionally evaluate part of the makefile.@*
|
||||||
@xref{Conditionals}.
|
@xref{Conditionals}.
|
||||||
|
|
||||||
@item include @var{file}
|
@item include @var{file}
|
||||||
@itemx -include @var{file}
|
@itemx -include @var{file}
|
||||||
@itemx sinclude @var{file}
|
@itemx sinclude @var{file}
|
||||||
|
|
||||||
Include another makefile.@*
|
Include another makefile.@*
|
||||||
@xref{Include, ,Including Other Makefiles}.
|
@xref{Include, ,Including Other Makefiles}.
|
||||||
|
|
||||||
@item override @var{variable} = @var{value}
|
@item override @var{variable-assignment}
|
||||||
@itemx override @var{variable} := @var{value}
|
|
||||||
@itemx override @var{variable} += @var{value}
|
|
||||||
@itemx override @var{variable} ?= @var{value}
|
|
||||||
@itemx override define @var{variable}
|
|
||||||
@itemx endef
|
|
||||||
|
|
||||||
Define a variable, overriding any previous definition, even one from
|
Define a variable, overriding any previous definition, even one from
|
||||||
the command line.@*
|
the command line.@*
|
||||||
@xref{Override Directive, ,The @code{override} Directive}.
|
@xref{Override Directive, ,The @code{override} Directive}.
|
||||||
|
|
||||||
@item export
|
@item export
|
||||||
|
|
||||||
Tell @code{make} to export all variables to child processes by default.@*
|
Tell @code{make} to export all variables to child processes by default.@*
|
||||||
@xref{Variables/Recursion, , Communicating Variables to a Sub-@code{make}}.
|
@xref{Variables/Recursion, , Communicating Variables to a Sub-@code{make}}.
|
||||||
|
|
||||||
@item export @var{variable}
|
@item export @var{variable}
|
||||||
@itemx export @var{variable} = @var{value}
|
@itemx export @var{variable-assignment}
|
||||||
@itemx export @var{variable} := @var{value}
|
|
||||||
@itemx export @var{variable} += @var{value}
|
|
||||||
@itemx export @var{variable} ?= @var{value}
|
|
||||||
@itemx unexport @var{variable}
|
@itemx unexport @var{variable}
|
||||||
Tell @code{make} whether or not to export a particular variable to child
|
Tell @code{make} whether or not to export a particular variable to child
|
||||||
processes.@*
|
processes.@*
|
||||||
@xref{Variables/Recursion, , Communicating Variables to a Sub-@code{make}}.
|
@xref{Variables/Recursion, , Communicating Variables to a Sub-@code{make}}.
|
||||||
|
|
||||||
|
@item private @var{variable-assignment}
|
||||||
|
Do not allow this variable assignment to be inherited by prerequisites.@*
|
||||||
|
@xref{Suppressing Inheritance}.
|
||||||
|
|
||||||
@item vpath @var{pattern} @var{path}
|
@item vpath @var{pattern} @var{path}
|
||||||
Specify a search path for files matching a @samp{%} pattern.@*
|
Specify a search path for files matching a @samp{%} pattern.@*
|
||||||
@xref{Selective Search, , The @code{vpath} Directive}.
|
@xref{Selective Search, , The @code{vpath} Directive}.
|
||||||
@ -10533,54 +10561,64 @@ symlinks.@*
|
|||||||
@xref{File Name Functions, ,Functions for File Names}.
|
@xref{File Name Functions, ,Functions for File Names}.
|
||||||
|
|
||||||
@item $(error @var{text}@dots{})
|
@item $(error @var{text}@dots{})
|
||||||
|
|
||||||
When this function is evaluated, @code{make} generates a fatal error
|
When this function is evaluated, @code{make} generates a fatal error
|
||||||
with the message @var{text}.@*
|
with the message @var{text}.@*
|
||||||
@xref{Make Control Functions, ,Functions That Control Make}.
|
@xref{Make Control Functions, ,Functions That Control Make}.
|
||||||
|
|
||||||
@item $(warning @var{text}@dots{})
|
@item $(warning @var{text}@dots{})
|
||||||
|
|
||||||
When this function is evaluated, @code{make} generates a warning with
|
When this function is evaluated, @code{make} generates a warning with
|
||||||
the message @var{text}.@*
|
the message @var{text}.@*
|
||||||
@xref{Make Control Functions, ,Functions That Control Make}.
|
@xref{Make Control Functions, ,Functions That Control Make}.
|
||||||
|
|
||||||
@item $(shell @var{command})
|
@item $(shell @var{command})
|
||||||
|
|
||||||
Execute a shell command and return its output.@*
|
Execute a shell command and return its output.@*
|
||||||
@xref{Shell Function, , The @code{shell} Function}.
|
@xref{Shell Function, , The @code{shell} Function}.
|
||||||
|
|
||||||
@item $(origin @var{variable})
|
@item $(origin @var{variable})
|
||||||
|
|
||||||
Return a string describing how the @code{make} variable @var{variable} was
|
Return a string describing how the @code{make} variable @var{variable} was
|
||||||
defined.@*
|
defined.@*
|
||||||
@xref{Origin Function, , The @code{origin} Function}.
|
@xref{Origin Function, , The @code{origin} Function}.
|
||||||
|
|
||||||
@item $(flavor @var{variable})
|
@item $(flavor @var{variable})
|
||||||
|
|
||||||
Return a string describing the flavor of the @code{make} variable
|
Return a string describing the flavor of the @code{make} variable
|
||||||
@var{variable}.@*
|
@var{variable}.@*
|
||||||
@xref{Flavor Function, , The @code{flavor} Function}.
|
@xref{Flavor Function, , The @code{flavor} Function}.
|
||||||
|
|
||||||
@item $(foreach @var{var},@var{words},@var{text})
|
@item $(foreach @var{var},@var{words},@var{text})
|
||||||
|
|
||||||
Evaluate @var{text} with @var{var} bound to each word in @var{words},
|
Evaluate @var{text} with @var{var} bound to each word in @var{words},
|
||||||
and concatenate the results.@*
|
and concatenate the results.@*
|
||||||
@xref{Foreach Function, ,The @code{foreach} Function}.
|
@xref{Foreach Function, ,The @code{foreach} Function}.
|
||||||
|
|
||||||
@item $(call @var{var},@var{param},@dots{})
|
@item $(if @var{condition},@var{then-part}[,@var{else-part}])
|
||||||
|
Evaluate the condition @var{condition}; if it's non-empty substitute
|
||||||
|
the expansion of the @var{then-part} otherwise substitute the
|
||||||
|
expansion of the @var{else-part}.@*
|
||||||
|
@xref{Conditional Functions, ,Functions for Conditionals}.
|
||||||
|
|
||||||
|
@item $(or @var{condition1}[,@var{condition2}[,@var{condition3}@dots{}]])
|
||||||
|
Evaluate each condition @var{conditionN} one at a time; substitute the
|
||||||
|
first non-empty expansion. If all expansions are empty, substitute
|
||||||
|
the empty string.@*
|
||||||
|
@xref{Conditional Functions, ,Functions for Conditionals}.
|
||||||
|
|
||||||
|
@item $(and @var{condition1}[,@var{condition2}[,@var{condition3}@dots{}]])
|
||||||
|
Evaluate each condition @var{conditionN} one at a time; if any
|
||||||
|
expansion results in the empty string substitute the empty string. If
|
||||||
|
all expansions result in a non-empty string, substitute the expansion
|
||||||
|
of the last @var{condition}.@*
|
||||||
|
@xref{Conditional Functions, ,Functions for Conditionals}.
|
||||||
|
|
||||||
|
@item $(call @var{var},@var{param},@dots{})
|
||||||
Evaluate the variable @var{var} replacing any references to @code{$(1)},
|
Evaluate the variable @var{var} replacing any references to @code{$(1)},
|
||||||
@code{$(2)} with the first, second, etc.@: @var{param} values.@*
|
@code{$(2)} with the first, second, etc.@: @var{param} values.@*
|
||||||
@xref{Call Function, ,The @code{call} Function}.
|
@xref{Call Function, ,The @code{call} Function}.
|
||||||
|
|
||||||
@item $(eval @var{text})
|
@item $(eval @var{text})
|
||||||
|
|
||||||
Evaluate @var{text} then read the results as makefile commands.
|
Evaluate @var{text} then read the results as makefile commands.
|
||||||
Expands to the empty string.@*
|
Expands to the empty string.@*
|
||||||
@xref{Eval Function, ,The @code{eval} Function}.
|
@xref{Eval Function, ,The @code{eval} Function}.
|
||||||
|
|
||||||
@item $(value @var{var})
|
@item $(value @var{var})
|
||||||
|
|
||||||
Evaluates to the contents of the variable @var{var}, with no expansion
|
Evaluates to the contents of the variable @var{var}, with no expansion
|
||||||
performed on it.@*
|
performed on it.@*
|
||||||
@xref{Value Function, ,The @code{value} Function}.
|
@xref{Value Function, ,The @code{value} Function}.
|
||||||
|
3
file.c
3
file.c
@ -738,7 +738,8 @@ snap_deps (void)
|
|||||||
*/
|
*/
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Remember that we've done this. */
|
/* Remember that we've done this. Once done we can no longer define
|
||||||
|
new targets. */
|
||||||
snapped_deps = 1;
|
snapped_deps = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -97,8 +97,7 @@ struct file
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
extern struct file *default_goal_file, *suffix_file, *default_file;
|
extern struct file *suffix_file, *default_file;
|
||||||
extern char **default_goal_name;
|
|
||||||
|
|
||||||
|
|
||||||
struct file *lookup_file (const char *name);
|
struct file *lookup_file (const char *name);
|
||||||
|
@ -917,7 +917,8 @@ pattern_search (struct file *file, int archive,
|
|||||||
for (ri = 0; ri < rule->num; ++ri)
|
for (ri = 0; ri < rule->num; ++ri)
|
||||||
if (ri != matches[foundrule])
|
if (ri != matches[foundrule])
|
||||||
{
|
{
|
||||||
char *p = alloca (rule->lens[ri] + fullstemlen + 1);
|
char *nm = alloca (rule->lens[ri] + fullstemlen + 1);
|
||||||
|
char *p = nm;
|
||||||
struct file *f;
|
struct file *f;
|
||||||
struct dep *new = alloc_dep ();
|
struct dep *new = alloc_dep ();
|
||||||
|
|
||||||
@ -929,7 +930,7 @@ pattern_search (struct file *file, int archive,
|
|||||||
p += fullstemlen;
|
p += fullstemlen;
|
||||||
memcpy (p, rule->suffixes[ri],
|
memcpy (p, rule->suffixes[ri],
|
||||||
rule->lens[ri] - (rule->suffixes[ri] - rule->targets[ri])+1);
|
rule->lens[ri] - (rule->suffixes[ri] - rule->targets[ri])+1);
|
||||||
new->name = strcache_add (p);
|
new->name = strcache_add (nm);
|
||||||
new->file = enter_file (new->name);
|
new->file = enter_file (new->name);
|
||||||
new->next = file->also_make;
|
new->next = file->also_make;
|
||||||
|
|
||||||
|
137
main.c
137
main.c
@ -468,15 +468,13 @@ char *starting_directory;
|
|||||||
|
|
||||||
unsigned int makelevel;
|
unsigned int makelevel;
|
||||||
|
|
||||||
/* First file defined in the makefile whose name does not
|
/* Pointer to the value of the .DEFAULT_GOAL special variable.
|
||||||
start with `.'. This is the default to remake if the
|
The value will be the name of the goal to remake if the command line
|
||||||
command line does not specify. */
|
does not override it. It can be set by the makefile, or else it's
|
||||||
|
the first target defined in the makefile whose name does not start
|
||||||
|
with '.'. */
|
||||||
|
|
||||||
struct file *default_goal_file;
|
struct variable * default_goal_var;
|
||||||
|
|
||||||
/* Pointer to the value of the .DEFAULT_GOAL special
|
|
||||||
variable. */
|
|
||||||
char ** default_goal_name;
|
|
||||||
|
|
||||||
/* Pointer to structure for the file .DEFAULT
|
/* Pointer to structure for the file .DEFAULT
|
||||||
whose commands are used for any file that has none of its own.
|
whose commands are used for any file that has none of its own.
|
||||||
@ -945,7 +943,6 @@ main (int argc, char **argv, char **envp)
|
|||||||
/* Needed for OS/2 */
|
/* Needed for OS/2 */
|
||||||
initialize_main(&argc, &argv);
|
initialize_main(&argc, &argv);
|
||||||
|
|
||||||
default_goal_file = 0;
|
|
||||||
reading_file = 0;
|
reading_file = 0;
|
||||||
|
|
||||||
#if defined (__MSDOS__) && !defined (_POSIX_SOURCE)
|
#if defined (__MSDOS__) && !defined (_POSIX_SOURCE)
|
||||||
@ -1186,6 +1183,7 @@ main (int argc, char **argv, char **envp)
|
|||||||
v->export = v_noexport;
|
v->export = v_noexport;
|
||||||
#endif
|
#endif
|
||||||
shell_var.name = "SHELL";
|
shell_var.name = "SHELL";
|
||||||
|
shell_var.length = 5;
|
||||||
shell_var.value = xstrdup (ep + 1);
|
shell_var.value = xstrdup (ep + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1603,10 +1601,7 @@ main (int argc, char **argv, char **envp)
|
|||||||
|
|
||||||
default_file = enter_file (strcache_add (".DEFAULT"));
|
default_file = enter_file (strcache_add (".DEFAULT"));
|
||||||
|
|
||||||
{
|
default_goal_var = define_variable (".DEFAULT_GOAL", 13, "", o_file, 0);
|
||||||
struct variable *v = define_variable (".DEFAULT_GOAL", 13, "", o_file, 0);
|
|
||||||
default_goal_name = &v->value;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Read all the makefiles. */
|
/* Read all the makefiles. */
|
||||||
|
|
||||||
@ -2159,62 +2154,72 @@ main (int argc, char **argv, char **envp)
|
|||||||
if (stdin_nm && unlink (stdin_nm) < 0 && errno != ENOENT)
|
if (stdin_nm && unlink (stdin_nm) < 0 && errno != ENOENT)
|
||||||
perror_with_name (_("unlink (temporary file): "), stdin_nm);
|
perror_with_name (_("unlink (temporary file): "), stdin_nm);
|
||||||
|
|
||||||
|
/* If there were no command-line goals, use the default. */
|
||||||
|
if (goals == 0)
|
||||||
|
{
|
||||||
|
char *p;
|
||||||
|
|
||||||
|
if (default_goal_var->recursive)
|
||||||
|
p = variable_expand (default_goal_var->value);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
p = variable_buffer_output (variable_buffer, default_goal_var->value,
|
||||||
|
strlen (default_goal_var->value));
|
||||||
|
*p = '\0';
|
||||||
|
p = variable_buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (*p != '\0')
|
||||||
|
{
|
||||||
|
struct file *f = lookup_file (p);
|
||||||
|
|
||||||
|
/* If .DEFAULT_GOAL is a non-existent target, enter it into the
|
||||||
|
table and let the standard logic sort it out. */
|
||||||
|
if (f == 0)
|
||||||
|
{
|
||||||
|
struct nameseq *ns;
|
||||||
|
|
||||||
|
ns = multi_glob (parse_file_seq (&p, '\0', sizeof (struct nameseq), 1),
|
||||||
|
sizeof (struct nameseq));
|
||||||
|
if (ns)
|
||||||
|
{
|
||||||
|
/* .DEFAULT_GOAL should contain one target. */
|
||||||
|
if (ns->next != 0)
|
||||||
|
fatal (NILF, _(".DEFAULT_GOAL contains more than one target"));
|
||||||
|
|
||||||
|
f = enter_file (strcache_add (ns->name));
|
||||||
|
|
||||||
|
ns->name = 0; /* It was reused by enter_file(). */
|
||||||
|
free_ns_chain (ns);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (f)
|
||||||
|
{
|
||||||
|
goals = alloc_dep ();
|
||||||
|
goals->file = f;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
lastgoal->next = 0;
|
||||||
|
|
||||||
|
|
||||||
|
if (!goals)
|
||||||
|
{
|
||||||
|
if (read_makefiles == 0)
|
||||||
|
fatal (NILF, _("No targets specified and no makefile found"));
|
||||||
|
|
||||||
|
fatal (NILF, _("No targets"));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Update the goals. */
|
||||||
|
|
||||||
|
DB (DB_BASIC, (_("Updating goal targets....\n")));
|
||||||
|
|
||||||
{
|
{
|
||||||
int status;
|
int status;
|
||||||
|
|
||||||
/* If there were no command-line goals, use the default. */
|
|
||||||
if (goals == 0)
|
|
||||||
{
|
|
||||||
if (**default_goal_name != '\0')
|
|
||||||
{
|
|
||||||
if (default_goal_file == 0 ||
|
|
||||||
strcmp (*default_goal_name, default_goal_file->name) != 0)
|
|
||||||
{
|
|
||||||
default_goal_file = lookup_file (*default_goal_name);
|
|
||||||
|
|
||||||
/* In case user set .DEFAULT_GOAL to a non-existent target
|
|
||||||
name let's just enter this name into the table and let
|
|
||||||
the standard logic sort it out. */
|
|
||||||
if (default_goal_file == 0)
|
|
||||||
{
|
|
||||||
struct nameseq *ns;
|
|
||||||
char *p = *default_goal_name;
|
|
||||||
|
|
||||||
ns = multi_glob (
|
|
||||||
parse_file_seq (&p, '\0', sizeof (struct nameseq), 1),
|
|
||||||
sizeof (struct nameseq));
|
|
||||||
|
|
||||||
/* .DEFAULT_GOAL should contain one target. */
|
|
||||||
if (ns->next != 0)
|
|
||||||
fatal (NILF, _(".DEFAULT_GOAL contains more than one target"));
|
|
||||||
|
|
||||||
default_goal_file = enter_file (strcache_add (ns->name));
|
|
||||||
|
|
||||||
ns->name = 0; /* It was reused by enter_file(). */
|
|
||||||
free_ns_chain (ns);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
goals = alloc_dep ();
|
|
||||||
goals->file = default_goal_file;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
lastgoal->next = 0;
|
|
||||||
|
|
||||||
|
|
||||||
if (!goals)
|
|
||||||
{
|
|
||||||
if (read_makefiles == 0)
|
|
||||||
fatal (NILF, _("No targets specified and no makefile found"));
|
|
||||||
|
|
||||||
fatal (NILF, _("No targets"));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Update the goals. */
|
|
||||||
|
|
||||||
DB (DB_BASIC, (_("Updating goal targets....\n")));
|
|
||||||
|
|
||||||
switch (update_goal_chain (goals))
|
switch (update_goal_chain (goals))
|
||||||
{
|
{
|
||||||
case -1:
|
case -1:
|
||||||
|
@ -143,14 +143,12 @@ do-po-update:
|
|||||||
&& mkdir "$$tmppo" \
|
&& mkdir "$$tmppo" \
|
||||||
&& (cd "$$tmppo" \
|
&& (cd "$$tmppo" \
|
||||||
&& $(WGET) -r -l1 -nd --no-parent -A '*.po' $(po_repo)) \
|
&& $(WGET) -r -l1 -nd --no-parent -A '*.po' $(po_repo)) \
|
||||||
&& cp "$$tmppo"/*.po po && rm -rf "$$tmppo"
|
&& cp "$$tmppo"/*.po $(top_srcdir)/po && rm -rf "$$tmppo"
|
||||||
cd po && $(MAKE) update-po
|
cd po && $(MAKE) update-po
|
||||||
$(MAKE) po-check
|
$(MAKE) po-check
|
||||||
|
|
||||||
po-update:
|
po-update:
|
||||||
if test -d "po"; then \
|
[ -d "po" ] && $(MAKE) do-po-update
|
||||||
$(MAKE) do-po-update; \
|
|
||||||
fi
|
|
||||||
|
|
||||||
# -------------------------- #
|
# -------------------------- #
|
||||||
# Updating GNU build files. #
|
# Updating GNU build files. #
|
||||||
@ -160,29 +158,30 @@ po-update:
|
|||||||
# with each of the files that belongs to some other package and is
|
# with each of the files that belongs to some other package and is
|
||||||
# regularly updated from the specified URL.
|
# regularly updated from the specified URL.
|
||||||
|
|
||||||
savannah-url = http://savannah.gnu.org/cgi-bin/viewcvs/~checkout~
|
cvs-url = http://savannah.gnu.org/cgi-bin/viewcvs/~checkout~
|
||||||
|
git-url = http://git.savannah.gnu.org/cgit
|
||||||
target = $(patsubst get-%,%,$@)
|
target = $(patsubst get-%,%,$@)
|
||||||
|
|
||||||
config-url = $(savannah-url)/config/config/$(patsubst get-config/%,%,$@)
|
config-url = $(git-url)/config.git/plain/$(patsubst get-config/%,%,$@)
|
||||||
get-config/config.guess get-config/config.sub:
|
get-config/config.guess get-config/config.sub:
|
||||||
@echo $(WGET) $(config-url) -O $(target) \
|
@echo $(WGET) $(config-url) -O $(target) \
|
||||||
&& $(WGET) $(config-url) -O $(target).t \
|
&& $(WGET) $(config-url) -O $(target).t \
|
||||||
&& $(move_if_change)
|
&& $(move_if_change)
|
||||||
|
|
||||||
gnulib-url = $(savannah-url)/gnulib/gnulib/build-aux/$(patsubst get-config/%,%,$@)
|
gnulib-url = $(git-url)/gnulib.git/plain/build-aux/$(patsubst get-config/%,%,$@)
|
||||||
get-config/texinfo.tex:
|
get-config/texinfo.tex:
|
||||||
@echo $(WGET) $(gnulib-url) -O $(target) \
|
@echo $(WGET) $(gnulib-url) -O $(target) \
|
||||||
&& $(WGET) $(gnulib-url) -O $(target).t \
|
&& $(WGET) $(gnulib-url) -O $(target).t \
|
||||||
&& $(move_if_change)
|
&& $(move_if_change)
|
||||||
|
|
||||||
gnustandards-url = $(savannah-url)/gnustandards/gnustandards/$(patsubst get-doc/%,%,$@)
|
gnustandards-url = $(cvs-url)/gnustandards/gnustandards/$(patsubst get-doc/%,%,$@)
|
||||||
get-doc/make-stds.texi get-doc/fdl.texi:
|
get-doc/make-stds.texi get-doc/fdl.texi:
|
||||||
@echo $(WGET) $(gnustandards-url) -O $(target) \
|
@echo $(WGET) $(gnustandards-url) -O $(target) \
|
||||||
&& $(WGET) $(gnustandards-url) -O $(target).t \
|
&& $(WGET) $(gnustandards-url) -O $(target).t \
|
||||||
&& $(move_if_change)
|
&& $(move_if_change)
|
||||||
|
|
||||||
.PHONY: cvs-update
|
.PHONY: scm-update
|
||||||
cvs-update: get-config/texinfo.tex get-config/config.guess get-config/config.sub get-doc/make-stds.texi get-doc/fdl.texi
|
scm-update: get-config/texinfo.tex get-config/config.guess get-config/config.sub get-doc/make-stds.texi get-doc/fdl.texi
|
||||||
|
|
||||||
|
|
||||||
# --------------------- #
|
# --------------------- #
|
||||||
@ -190,7 +189,7 @@ cvs-update: get-config/texinfo.tex get-config/config.guess get-config/config.sub
|
|||||||
# --------------------- #
|
# --------------------- #
|
||||||
|
|
||||||
.PHONY: update
|
.PHONY: update
|
||||||
update: po-update cvs-update
|
update: po-update scm-update
|
||||||
|
|
||||||
|
|
||||||
## --------------- ##
|
## --------------- ##
|
||||||
@ -204,7 +203,7 @@ local-check: po-check changelog-check
|
|||||||
# copyright-check writable-files
|
# copyright-check writable-files
|
||||||
|
|
||||||
changelog-check:
|
changelog-check:
|
||||||
if head ChangeLog | grep 'Version $(VERSION)' >/dev/null; then \
|
if head $(top_srcdir)/ChangeLog | grep 'Version $(VERSION)' >/dev/null; then \
|
||||||
:; \
|
:; \
|
||||||
else \
|
else \
|
||||||
echo "$(VERSION) not in ChangeLog" 1>&2; \
|
echo "$(VERSION) not in ChangeLog" 1>&2; \
|
||||||
|
3
make.1
3
make.1
@ -223,7 +223,8 @@ With no argument, removes a previous load limit.
|
|||||||
Use the latest mtime between symlinks and target.
|
Use the latest mtime between symlinks and target.
|
||||||
.TP 0.5i
|
.TP 0.5i
|
||||||
.BR \-n , " \-\-just\-print" , " \-\-dry\-run" , " \-\-recon"
|
.BR \-n , " \-\-just\-print" , " \-\-dry\-run" , " \-\-recon"
|
||||||
Print the commands that would be executed, but do not execute them.
|
Print the commands that would be executed, but do not execute them (except in
|
||||||
|
certain circumstances).
|
||||||
.TP 0.5i
|
.TP 0.5i
|
||||||
\fB\-o\fR \fIfile\fR, \fB\-\-old\-file\fR=\fIfile\fR, \fB\-\-assume\-old\fR=\fIfile\fR
|
\fB\-o\fR \fIfile\fR, \fB\-\-old\-file\fR=\fIfile\fR, \fB\-\-assume\-old\fR=\fIfile\fR
|
||||||
Do not remake the file
|
Do not remake the file
|
||||||
|
6
misc.c
6
misc.c
@ -112,11 +112,13 @@ collapse_continuations (char *line)
|
|||||||
/* Skip the newline. */
|
/* Skip the newline. */
|
||||||
++in;
|
++in;
|
||||||
|
|
||||||
/* If the newline is quoted, discard following whitespace
|
/* If the newline is escaped, discard following whitespace leaving just
|
||||||
and any preceding whitespace; leave just one space. */
|
one space. POSIX requires that each backslash/newline/following
|
||||||
|
whitespace sequence be reduced to a single space. */
|
||||||
if (backslash)
|
if (backslash)
|
||||||
{
|
{
|
||||||
in = next_token (in);
|
in = next_token (in);
|
||||||
|
/* Removing this loop will fix Savannah bug #16670: do we want to? */
|
||||||
while (out > line && isblank ((unsigned char)out[-1]))
|
while (out > line && isblank ((unsigned char)out[-1]))
|
||||||
--out;
|
--out;
|
||||||
*out++ = ' ';
|
*out++ = ' ';
|
||||||
|
136
read.c
136
read.c
@ -136,8 +136,7 @@ static int eval_makefile (const char *filename, int flags);
|
|||||||
static int eval (struct ebuffer *buffer, int flags);
|
static int eval (struct ebuffer *buffer, int flags);
|
||||||
|
|
||||||
static long readline (struct ebuffer *ebuf);
|
static long readline (struct ebuffer *ebuf);
|
||||||
static struct variable *do_define (char *name, unsigned int namelen,
|
static struct variable *do_define (char *name, enum variable_origin origin,
|
||||||
enum variable_origin origin,
|
|
||||||
struct ebuffer *ebuf);
|
struct ebuffer *ebuf);
|
||||||
static int conditional_line (char *line, int len, const struct floc *flocp);
|
static int conditional_line (char *line, int len, const struct floc *flocp);
|
||||||
static void record_files (struct nameseq *filenames, const char *pattern,
|
static void record_files (struct nameseq *filenames, const char *pattern,
|
||||||
@ -400,6 +399,12 @@ eval_makefile (const char *filename, int flags)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Set close-on-exec to avoid leaking the makefile to children, such as
|
||||||
|
$(shell ...). */
|
||||||
|
#ifdef HAVE_FILENO
|
||||||
|
CLOSE_ON_EXEC (fileno (ebuf.fp));
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Add this makefile to the list. */
|
/* Add this makefile to the list. */
|
||||||
do_variable_definition (&ebuf.floc, "MAKEFILE_LIST", filename, o_file,
|
do_variable_definition (&ebuf.floc, "MAKEFILE_LIST", filename, o_file,
|
||||||
f_append, 0);
|
f_append, 0);
|
||||||
@ -438,7 +443,10 @@ eval_buffer (char *buffer)
|
|||||||
ebuf.buffer = ebuf.bufnext = ebuf.bufstart = buffer;
|
ebuf.buffer = ebuf.bufnext = ebuf.bufstart = buffer;
|
||||||
ebuf.fp = NULL;
|
ebuf.fp = NULL;
|
||||||
|
|
||||||
ebuf.floc = *reading_file;
|
if (reading_file)
|
||||||
|
ebuf.floc = *reading_file;
|
||||||
|
else
|
||||||
|
ebuf.floc.filenm = NULL;
|
||||||
|
|
||||||
curfile = reading_file;
|
curfile = reading_file;
|
||||||
reading_file = &ebuf.floc;
|
reading_file = &ebuf.floc;
|
||||||
@ -688,26 +696,12 @@ eval (struct ebuffer *ebuf, int set_default)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If it's a multi-line define / endef, manage that. */
|
|
||||||
if (vmod.define_v)
|
if (vmod.define_v)
|
||||||
{
|
v = do_define (p, origin, ebuf);
|
||||||
if (*p == '\0')
|
|
||||||
fatal (fstart, _("empty variable name"));
|
|
||||||
|
|
||||||
/* Let the variable name be the whole rest of the line,
|
|
||||||
with trailing blanks stripped (comments have already been
|
|
||||||
removed), so it could be a complex variable/function
|
|
||||||
reference that might contain blanks. */
|
|
||||||
p2 = p + strlen (p);
|
|
||||||
while (isblank ((unsigned char)p2[-1]))
|
|
||||||
--p2;
|
|
||||||
v = do_define (p, p2 - p, origin, ebuf);
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
v = try_variable_definition (fstart, p, origin, 0);
|
||||||
v = try_variable_definition (fstart, p, origin, 0);
|
|
||||||
assert (v != NULL);
|
assert (v != NULL);
|
||||||
}
|
|
||||||
|
|
||||||
if (vmod.export_v)
|
if (vmod.export_v)
|
||||||
v->export = v_export;
|
v->export = v_export;
|
||||||
@ -1205,10 +1199,9 @@ eval (struct ebuffer *ebuf, int set_default)
|
|||||||
|
|
||||||
Because the target is not recorded until after ifeq directive is
|
Because the target is not recorded until after ifeq directive is
|
||||||
evaluated the .DEFAULT_GOAL does not contain foo yet as one
|
evaluated the .DEFAULT_GOAL does not contain foo yet as one
|
||||||
would expect. Because of this we have to move some of the logic
|
would expect. Because of this we have to move the logic here. */
|
||||||
here. */
|
|
||||||
|
|
||||||
if (**default_goal_name == '\0' && set_default)
|
if (set_default && default_goal_var->value[0] == '\0')
|
||||||
{
|
{
|
||||||
const char *name;
|
const char *name;
|
||||||
struct dep *d;
|
struct dep *d;
|
||||||
@ -1314,45 +1307,60 @@ remove_comments (char *line)
|
|||||||
the variable to be defined. The following lines remain to be read. */
|
the variable to be defined. The following lines remain to be read. */
|
||||||
|
|
||||||
static struct variable *
|
static struct variable *
|
||||||
do_define (char *name, unsigned int namelen,
|
do_define (char *name, enum variable_origin origin, struct ebuffer *ebuf)
|
||||||
enum variable_origin origin, struct ebuffer *ebuf)
|
|
||||||
{
|
{
|
||||||
|
struct variable *v;
|
||||||
|
enum variable_flavor flavor;
|
||||||
struct floc defstart;
|
struct floc defstart;
|
||||||
long nlines = 0;
|
|
||||||
int nlevels = 1;
|
int nlevels = 1;
|
||||||
unsigned int length = 100;
|
unsigned int length = 100;
|
||||||
char *definition = xmalloc (length);
|
char *definition = xmalloc (length);
|
||||||
unsigned int idx = 0;
|
unsigned int idx = 0;
|
||||||
char *p;
|
char *p, *var;
|
||||||
|
|
||||||
/* Expand the variable name. */
|
|
||||||
char *var = alloca (namelen + 1);
|
|
||||||
memcpy (var, name, namelen);
|
|
||||||
var[namelen] = '\0';
|
|
||||||
var = variable_expand (var);
|
|
||||||
|
|
||||||
defstart = ebuf->floc;
|
defstart = ebuf->floc;
|
||||||
|
|
||||||
|
p = parse_variable_definition (name, &flavor);
|
||||||
|
if (p == NULL)
|
||||||
|
/* No assignment token, so assume recursive. */
|
||||||
|
flavor = f_recursive;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (*(next_token (p)) != '\0')
|
||||||
|
error (&defstart, _("extraneous text after `define' directive"));
|
||||||
|
|
||||||
|
/* Chop the string before the assignment token to get the name. */
|
||||||
|
p[flavor == f_recursive ? -1 : -2] = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Expand the variable name and find the beginning (NAME) and end. */
|
||||||
|
var = allocated_variable_expand (name);
|
||||||
|
name = next_token (var);
|
||||||
|
if (*name == '\0')
|
||||||
|
fatal (&defstart, _("empty variable name"));
|
||||||
|
p = name + strlen (name) - 1;
|
||||||
|
while (p > name && isblank ((unsigned char)*p))
|
||||||
|
--p;
|
||||||
|
p[1] = '\0';
|
||||||
|
|
||||||
|
/* Now read the value of the variable. */
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
unsigned int len;
|
unsigned int len;
|
||||||
char *line;
|
char *line;
|
||||||
|
long nlines = readline (ebuf);
|
||||||
|
|
||||||
nlines = readline (ebuf);
|
/* If there is nothing left to be eval'd, there's no 'endef'!! */
|
||||||
ebuf->floc.lineno += nlines;
|
|
||||||
|
|
||||||
/* If there is nothing left to eval, we're done. */
|
|
||||||
if (nlines < 0)
|
if (nlines < 0)
|
||||||
break;
|
fatal (&defstart, _("missing `endef', unterminated `define'"));
|
||||||
|
|
||||||
|
ebuf->floc.lineno += nlines;
|
||||||
line = ebuf->buffer;
|
line = ebuf->buffer;
|
||||||
|
|
||||||
collapse_continuations (line);
|
collapse_continuations (line);
|
||||||
|
|
||||||
/* If the line doesn't begin with a tab, test to see if it introduces
|
/* If the line doesn't begin with a tab, test to see if it introduces
|
||||||
another define, or ends one. */
|
another define, or ends one. Stop if we find an 'endef' */
|
||||||
|
|
||||||
/* Stop if we find an 'endef' */
|
|
||||||
if (line[0] != cmd_prefix)
|
if (line[0] != cmd_prefix)
|
||||||
{
|
{
|
||||||
p = next_token (line);
|
p = next_token (line);
|
||||||
@ -1370,30 +1378,16 @@ do_define (char *name, unsigned int namelen,
|
|||||||
{
|
{
|
||||||
p += 5;
|
p += 5;
|
||||||
remove_comments (p);
|
remove_comments (p);
|
||||||
if (*next_token (p) != '\0')
|
if (*(next_token (p)) != '\0')
|
||||||
error (&ebuf->floc,
|
error (&ebuf->floc,
|
||||||
_("Extraneous text after `endef' directive"));
|
_("extraneous text after `endef' directive"));
|
||||||
|
|
||||||
if (--nlevels == 0)
|
if (--nlevels == 0)
|
||||||
{
|
break;
|
||||||
struct variable *v;
|
|
||||||
|
|
||||||
/* Define the variable. */
|
|
||||||
if (idx == 0)
|
|
||||||
definition[0] = '\0';
|
|
||||||
else
|
|
||||||
definition[idx - 1] = '\0';
|
|
||||||
|
|
||||||
/* Always define these variables in the global set. */
|
|
||||||
v = define_variable_global (var, strlen (var), definition,
|
|
||||||
origin, 1, &defstart);
|
|
||||||
free (definition);
|
|
||||||
return (v);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Otherwise add this line to the variable definition. */
|
/* Add this line to the variable definition. */
|
||||||
len = strlen (line);
|
len = strlen (line);
|
||||||
if (idx + len + 1 > length)
|
if (idx + len + 1 > length)
|
||||||
{
|
{
|
||||||
@ -1407,8 +1401,16 @@ do_define (char *name, unsigned int namelen,
|
|||||||
definition[idx++] = '\n';
|
definition[idx++] = '\n';
|
||||||
}
|
}
|
||||||
|
|
||||||
/* No `endef'!! */
|
/* We've got what we need; define the variable. */
|
||||||
fatal (&defstart, _("missing `endef', unterminated `define'"));
|
if (idx == 0)
|
||||||
|
definition[0] = '\0';
|
||||||
|
else
|
||||||
|
definition[idx - 1] = '\0';
|
||||||
|
|
||||||
|
v = do_variable_definition (&defstart, name, definition, origin, flavor, 0);
|
||||||
|
free (definition);
|
||||||
|
free (var);
|
||||||
|
return (v);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Interpret conditional commands "ifdef", "ifndef", "ifeq",
|
/* Interpret conditional commands "ifdef", "ifndef", "ifeq",
|
||||||
@ -1791,6 +1793,7 @@ record_target_var (struct nameseq *filenames, char *defn,
|
|||||||
v = assign_variable_definition (&p->variable, defn);
|
v = assign_variable_definition (&p->variable, defn);
|
||||||
assert (v != 0);
|
assert (v != 0);
|
||||||
|
|
||||||
|
v->origin = origin;
|
||||||
if (v->flavor == f_simple)
|
if (v->flavor == f_simple)
|
||||||
v->value = allocated_variable_expand (v->value);
|
v->value = allocated_variable_expand (v->value);
|
||||||
else
|
else
|
||||||
@ -1823,14 +1826,13 @@ record_target_var (struct nameseq *filenames, char *defn,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Set up the variable to be *-specific. */
|
/* Set up the variable to be *-specific. */
|
||||||
v->origin = origin;
|
|
||||||
v->per_target = 1;
|
v->per_target = 1;
|
||||||
v->private_var = vmod->private_v;
|
v->private_var = vmod->private_v;
|
||||||
v->export = vmod->export_v ? v_export : v_default;
|
v->export = vmod->export_v ? v_export : v_default;
|
||||||
|
|
||||||
/* If it's not an override, check to see if there was a command-line
|
/* If it's not an override, check to see if there was a command-line
|
||||||
setting. If so, reset the value. */
|
setting. If so, reset the value. */
|
||||||
if (origin != o_override)
|
if (v->origin != o_override)
|
||||||
{
|
{
|
||||||
struct variable *gv;
|
struct variable *gv;
|
||||||
int len = strlen(v->name);
|
int len = strlen(v->name);
|
||||||
@ -2097,12 +2099,6 @@ record_files (struct nameseq *filenames, const char *pattern,
|
|||||||
}
|
}
|
||||||
|
|
||||||
name = f->name;
|
name = f->name;
|
||||||
|
|
||||||
/* If this target is a default target, update DEFAULT_GOAL_FILE. */
|
|
||||||
if (streq (*default_goal_name, name)
|
|
||||||
&& (default_goal_file == 0
|
|
||||||
|| ! streq (default_goal_file->name, name)))
|
|
||||||
default_goal_file = f;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (implicit)
|
if (implicit)
|
||||||
|
@ -1,5 +1,27 @@
|
|||||||
|
2009-06-04 Paul Smith <psmith@gnu.org>
|
||||||
|
|
||||||
|
* scripts/features/se_explicit: Add tests for Savannah bug #24588.
|
||||||
|
|
||||||
|
2009-05-31 Paul Smith <psmith@gnu.org>
|
||||||
|
|
||||||
|
* scripts/variables/DEFAULT_GOAL: Add tests for Savannah bug #25697.
|
||||||
|
|
||||||
|
* scripts/features/targetvars: Add tests of overrides for Savannah
|
||||||
|
bug #26207.
|
||||||
|
* scripts/features/patspecific_vars: Ditto.
|
||||||
|
|
||||||
|
* scripts/features/patternrules: Add a test for Savannah bug #26593.
|
||||||
|
|
||||||
|
2009-05-30 Paul Smith <psmith@gnu.org>
|
||||||
|
|
||||||
|
* scripts/variables/flavors: Update with new variable flavor tests.
|
||||||
|
* scripts/variables/define: Create a new set of tests for
|
||||||
|
define/endef and move those aspects of the flavors suite here.
|
||||||
|
|
||||||
2009-05-25 Paul Smith <psmith@gnu.org>
|
2009-05-25 Paul Smith <psmith@gnu.org>
|
||||||
|
|
||||||
|
* scripts/features/targetvars: Ditto.
|
||||||
|
|
||||||
* scripts/features/export: Test new variable parsing abilities.
|
* scripts/features/export: Test new variable parsing abilities.
|
||||||
|
|
||||||
2009-02-23 Ramon Garcia <ramon.garcia.f@gmail.com>
|
2009-02-23 Ramon Garcia <ramon.garcia.f@gmail.com>
|
||||||
|
@ -1,34 +1,45 @@
|
|||||||
$description = "The following test creates a makefile to ...";
|
# -*-perl-*-
|
||||||
|
|
||||||
|
$description = "Test the override directive on variable assignments.";
|
||||||
|
|
||||||
$details = "";
|
$details = "";
|
||||||
|
|
||||||
open(MAKEFILE,"> $makefile");
|
# TEST 0: Basic override
|
||||||
|
|
||||||
# The Contents of the MAKEFILE ...
|
run_make_test('
|
||||||
|
X = start
|
||||||
|
override recur = $(X)
|
||||||
|
override simple := $(X)
|
||||||
|
X = end
|
||||||
|
all: ; @echo "$(recur) $(simple)"
|
||||||
|
',
|
||||||
|
'recur=I simple=J', "end start\n");
|
||||||
|
|
||||||
print MAKEFILE "override define foo\n"
|
# TEST 1: Override with append
|
||||||
."\@echo First comes the definition.\n"
|
|
||||||
."\@echo Then comes the override.\n"
|
|
||||||
."endef\n"
|
|
||||||
."all: \n"
|
|
||||||
."\t\$(foo)\n";
|
|
||||||
|
|
||||||
# END of Contents of MAKEFILE
|
run_make_test('
|
||||||
|
X += X1
|
||||||
|
override X += X2
|
||||||
|
override Y += Y1
|
||||||
|
Y += Y2
|
||||||
|
all: ; @echo "$(X) $(Y)"
|
||||||
|
',
|
||||||
|
'', "X1 X2 Y1\n");
|
||||||
|
|
||||||
close(MAKEFILE);
|
# TEST 2: Override with append to the command line
|
||||||
|
|
||||||
&run_make_with_options($makefile,"foo=Hello",&get_logfile);
|
run_make_test(undef, 'X=C Y=C', "C X2 C Y1\n");
|
||||||
|
|
||||||
# Create the answer to what should be produced by this Makefile
|
# Test override of define/endef
|
||||||
$answer = "First comes the definition.\n"
|
|
||||||
."Then comes the override.\n";
|
run_make_test('
|
||||||
|
override define foo
|
||||||
|
@echo First comes the definition.
|
||||||
|
@echo Then comes the override.
|
||||||
|
endef
|
||||||
|
all: ; $(foo)
|
||||||
|
',
|
||||||
|
'foo=Hello', "First comes the definition.\nThen comes the override.\n");
|
||||||
|
|
||||||
&compare_output($answer,&get_logfile(1));
|
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -120,5 +120,15 @@ run_make_test(undef, # reuse previous makefile
|
|||||||
'normal: global: new $t pattern: good $t inherit: good $t;
|
'normal: global: new $t pattern: good $t inherit: good $t;
|
||||||
pattrn: global: new $t pattern: good $t inherit: good $t;');
|
pattrn: global: new $t pattern: good $t inherit: good $t;');
|
||||||
|
|
||||||
|
# TEST #8: override in pattern-specific variables
|
||||||
|
|
||||||
|
run_make_test('
|
||||||
|
a%: override FOO += f1
|
||||||
|
a%: FOO += f2
|
||||||
|
ab: ; @echo "$(FOO)"
|
||||||
|
',
|
||||||
|
'', "f1\n");
|
||||||
|
|
||||||
|
run_make_test(undef, 'FOO=C', "C f1\n");
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
@ -145,5 +145,20 @@ echo foo.c foo.h >foo.o');
|
|||||||
|
|
||||||
unlink('foo.in', 'foo.h', 'foo.c', 'foo.o');
|
unlink('foo.in', 'foo.h', 'foo.c', 'foo.o');
|
||||||
|
|
||||||
|
# TEST #5: make sure both prefix and suffix patterns work with multiple
|
||||||
|
# target patterns (Savannah bug #26593).
|
||||||
|
#
|
||||||
|
run_make_test('
|
||||||
|
all: foo.s1 foo.s2 p1.foo p2.foo
|
||||||
|
|
||||||
|
p1.% p2.%: %.orig
|
||||||
|
@echo $@
|
||||||
|
%.s1 %.s2: %.orig
|
||||||
|
@echo $@
|
||||||
|
|
||||||
|
.PHONY: foo.orig
|
||||||
|
',
|
||||||
|
'', "foo.s1\np1.foo\n");
|
||||||
|
|
||||||
# This tells the test driver that the perl test script executed properly.
|
# This tells the test driver that the perl test script executed properly.
|
||||||
1;
|
1;
|
||||||
|
@ -123,5 +123,12 @@ baz.1
|
|||||||
baz.2
|
baz.2
|
||||||
');
|
');
|
||||||
|
|
||||||
|
# TEST #4: eval in a context where there is no reading_file
|
||||||
|
run_make_test('
|
||||||
|
.SECONDEXPANSION:
|
||||||
|
all : $$(eval $$(info test))
|
||||||
|
', '', "test\n#MAKE#: Nothing to be done for `all'.\n");
|
||||||
|
|
||||||
|
|
||||||
# This tells the test driver that the perl test script executed properly.
|
# This tells the test driver that the perl test script executed properly.
|
||||||
1;
|
1;
|
||||||
|
@ -219,12 +219,24 @@ rmdir('t1');
|
|||||||
# Test appending to a simple variable containing a "$": avoid a
|
# Test appending to a simple variable containing a "$": avoid a
|
||||||
# double-expansion. See Savannah bug #15913.
|
# double-expansion. See Savannah bug #15913.
|
||||||
|
|
||||||
run_make_test("
|
run_make_test('
|
||||||
VAR := \$\$FOO
|
VAR := $$FOO
|
||||||
foo: VAR += BAR
|
foo: VAR += BAR
|
||||||
foo: ; \@echo '\$(VAR)'",
|
foo: ; @echo '."'".'$(VAR)'."'".'
|
||||||
|
',
|
||||||
'', '$FOO BAR');
|
'', '$FOO BAR');
|
||||||
|
|
||||||
|
# TEST #19: Override with append variables
|
||||||
|
|
||||||
|
run_make_test('
|
||||||
|
a: override FOO += f1
|
||||||
|
a: FOO += f2
|
||||||
|
a: ; @echo "$(FOO)"
|
||||||
|
',
|
||||||
|
'', "f1\n");
|
||||||
|
|
||||||
|
run_make_test(undef, 'FOO=C', "C f1\n");
|
||||||
|
|
||||||
# TEST #19: Test define/endef variables as target-specific vars
|
# TEST #19: Test define/endef variables as target-specific vars
|
||||||
|
|
||||||
# run_make_test('
|
# run_make_test('
|
||||||
|
@ -73,6 +73,15 @@ $(call make-rule)
|
|||||||
'',
|
'',
|
||||||
'foo');
|
'foo');
|
||||||
|
|
||||||
|
# TEST #5: .DEFAULT_GOAL containing just whitespace (Savannah bug #25697)
|
||||||
|
|
||||||
|
run_make_test('
|
||||||
|
N =
|
||||||
|
.DEFAULT_GOAL = $N $N # Just whitespace
|
||||||
|
|
||||||
|
foo: ; @echo "boo"
|
||||||
|
',
|
||||||
|
'', "#MAKE#: *** No targets. Stop.\n", 512);
|
||||||
|
|
||||||
# This tells the test driver that the perl test script executed properly.
|
# This tells the test driver that the perl test script executed properly.
|
||||||
1;
|
1;
|
||||||
|
@ -4,180 +4,73 @@ $description = "Test various flavors of make variable setting.";
|
|||||||
|
|
||||||
$details = "";
|
$details = "";
|
||||||
|
|
||||||
open(MAKEFILE, "> $makefile");
|
# TEST 0: Recursive
|
||||||
|
|
||||||
# The Contents of the MAKEFILE ...
|
run_make_test('
|
||||||
|
ugh = Goodbye
|
||||||
print MAKEFILE <<'EOF';
|
|
||||||
foo = $(bar)
|
foo = $(bar)
|
||||||
bar = ${ugh}
|
bar = ${ugh}
|
||||||
ugh = Hello
|
ugh = Hello
|
||||||
|
all: ; @echo $(foo)
|
||||||
|
',
|
||||||
|
'', "Hello\n");
|
||||||
|
|
||||||
all: multi ; @echo $(foo)
|
# TEST 1: Simple
|
||||||
|
|
||||||
multi: ; $(multi)
|
|
||||||
|
|
||||||
x := foo
|
|
||||||
y := $(x) bar
|
|
||||||
x := later
|
|
||||||
|
|
||||||
nullstring :=
|
|
||||||
space := $(nullstring) $(nullstring)
|
|
||||||
|
|
||||||
next: ; @echo $x$(space)$y
|
|
||||||
|
|
||||||
define multi
|
|
||||||
@echo hi
|
|
||||||
echo there
|
|
||||||
endef
|
|
||||||
|
|
||||||
ifdef BOGUS
|
|
||||||
define
|
|
||||||
@echo error
|
|
||||||
endef
|
|
||||||
endif
|
|
||||||
|
|
||||||
define outer
|
|
||||||
define inner
|
|
||||||
A = B
|
|
||||||
endef
|
|
||||||
endef
|
|
||||||
|
|
||||||
$(eval $(outer))
|
|
||||||
|
|
||||||
outer: ; @echo $(inner)
|
|
||||||
|
|
||||||
EOF
|
|
||||||
|
|
||||||
# END of Contents of MAKEFILE
|
|
||||||
|
|
||||||
close(MAKEFILE);
|
|
||||||
|
|
||||||
# TEST #1
|
|
||||||
# -------
|
|
||||||
|
|
||||||
&run_make_with_options($makefile, "", &get_logfile);
|
|
||||||
$answer = "hi\necho there\nthere\nHello\n";
|
|
||||||
&compare_output($answer, &get_logfile(1));
|
|
||||||
|
|
||||||
# TEST #2
|
|
||||||
# -------
|
|
||||||
|
|
||||||
&run_make_with_options($makefile, "next", &get_logfile);
|
|
||||||
$answer = "later foo bar\n";
|
|
||||||
&compare_output($answer, &get_logfile(1));
|
|
||||||
|
|
||||||
# TEST #3
|
|
||||||
# -------
|
|
||||||
|
|
||||||
&run_make_with_options($makefile, "BOGUS=true", &get_logfile, 512);
|
|
||||||
$answer = "$makefile:24: *** empty variable name. Stop.\n";
|
|
||||||
&compare_output($answer, &get_logfile(1));
|
|
||||||
|
|
||||||
# TEST #4
|
|
||||||
# -------
|
|
||||||
|
|
||||||
&run_make_with_options($makefile, "outer", &get_logfile);
|
|
||||||
$answer = "A = B\n";
|
|
||||||
&compare_output($answer, &get_logfile(1));
|
|
||||||
|
|
||||||
# Clean up from "old style" testing. If all the above tests are converted to
|
|
||||||
# run_make_test() syntax than this line can be removed.
|
|
||||||
$makefile = undef;
|
|
||||||
|
|
||||||
# -------------------------
|
|
||||||
# Make sure that prefix characters apply properly to define/endef values.
|
|
||||||
#
|
|
||||||
# There's a bit of oddness here if you try to use a variable to hold the
|
|
||||||
# prefix character for a define. Even though something like this:
|
|
||||||
#
|
|
||||||
# define foo
|
|
||||||
# echo bar
|
|
||||||
# endef
|
|
||||||
#
|
|
||||||
# all: ; $(V)$(foo)
|
|
||||||
#
|
|
||||||
# (where V=@) can be seen by the user to be obviously different than this:
|
|
||||||
#
|
|
||||||
# define foo
|
|
||||||
# $(V)echo bar
|
|
||||||
# endef
|
|
||||||
#
|
|
||||||
# all: ; $(foo)
|
|
||||||
#
|
|
||||||
# and the user thinks it should behave the same as when the "@" is literal
|
|
||||||
# instead of in a variable, that can't happen because by the time make
|
|
||||||
# expands the variables for the command line and sees it begins with a "@" it
|
|
||||||
# can't know anymore whether the prefix character came before the variable
|
|
||||||
# reference or was included in the first line of the variable reference.
|
|
||||||
|
|
||||||
# TEST #5
|
|
||||||
# -------
|
|
||||||
|
|
||||||
run_make_test('
|
run_make_test('
|
||||||
define FOO
|
bar = Goodbye
|
||||||
$(V1)echo hello
|
foo := $(bar)
|
||||||
$(V2)echo world
|
bar = ${ugh}
|
||||||
endef
|
ugh = Hello
|
||||||
all: ; @$(FOO)
|
all: ; @echo $(foo)
|
||||||
', '', 'hello
|
',
|
||||||
world');
|
'', "Goodbye\n");
|
||||||
|
|
||||||
# TEST #6
|
# TEST 2: Append to recursive
|
||||||
# -------
|
|
||||||
|
|
||||||
run_make_test(undef, 'V1=@ V2=@', 'hello
|
|
||||||
world');
|
|
||||||
|
|
||||||
# TEST #7
|
|
||||||
# -------
|
|
||||||
|
|
||||||
run_make_test('
|
run_make_test('
|
||||||
define FOO
|
foo = Hello
|
||||||
$(V1)echo hello
|
ugh = Goodbye
|
||||||
$(V2)echo world
|
foo += $(bar)
|
||||||
endef
|
bar = ${ugh}
|
||||||
all: ; $(FOO)
|
ugh = Hello
|
||||||
', 'V1=@', 'hello
|
all: ; @echo $(foo)
|
||||||
echo world
|
',
|
||||||
world');
|
'', "Hello Hello\n");
|
||||||
|
|
||||||
# TEST #8
|
# TEST 3: Append to simple
|
||||||
# -------
|
|
||||||
|
|
||||||
run_make_test(undef, 'V2=@', 'echo hello
|
|
||||||
hello
|
|
||||||
world');
|
|
||||||
|
|
||||||
# TEST #9
|
|
||||||
# -------
|
|
||||||
|
|
||||||
run_make_test(undef, 'V1=@ V2=@', 'hello
|
|
||||||
world');
|
|
||||||
|
|
||||||
# TEST #10
|
|
||||||
# -------
|
|
||||||
# Test the basics; a "@" internally to the variable applies to only one line.
|
|
||||||
# A "@" before the variable applies to the entire variable.
|
|
||||||
|
|
||||||
run_make_test('
|
run_make_test('
|
||||||
define FOO
|
foo := Hello
|
||||||
@echo hello
|
ugh = Goodbye
|
||||||
echo world
|
bar = ${ugh}
|
||||||
endef
|
foo += $(bar)
|
||||||
define BAR
|
ugh = Hello
|
||||||
echo hello
|
all: ; @echo $(foo)
|
||||||
echo world
|
',
|
||||||
endef
|
'', "Hello Goodbye\n");
|
||||||
|
|
||||||
all: foo bar
|
# TEST 4: Conditional pre-set
|
||||||
foo: ; $(FOO)
|
|
||||||
bar: ; @$(BAR)
|
run_make_test('
|
||||||
', '', 'hello
|
foo = Hello
|
||||||
echo world
|
ugh = Goodbye
|
||||||
world
|
bar = ${ugh}
|
||||||
hello
|
foo ?= $(bar)
|
||||||
world
|
ugh = Hello
|
||||||
');
|
all: ; @echo $(foo)
|
||||||
|
',
|
||||||
|
'', "Hello\n");
|
||||||
|
|
||||||
|
# TEST 5: Conditional unset
|
||||||
|
|
||||||
|
run_make_test('
|
||||||
|
ugh = Goodbye
|
||||||
|
bar = ${ugh}
|
||||||
|
foo ?= $(bar)
|
||||||
|
ugh = Hello
|
||||||
|
all: ; @echo $(foo)
|
||||||
|
',
|
||||||
|
'', "Hello\n");
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
@ -110,6 +110,7 @@ struct pattern_var
|
|||||||
|
|
||||||
extern char *variable_buffer;
|
extern char *variable_buffer;
|
||||||
extern struct variable_set_list *current_variable_set_list;
|
extern struct variable_set_list *current_variable_set_list;
|
||||||
|
extern struct variable *default_goal_var;
|
||||||
|
|
||||||
/* expand.c */
|
/* expand.c */
|
||||||
char *variable_buffer_output (char *ptr, const char *string, unsigned int length);
|
char *variable_buffer_output (char *ptr, const char *string, unsigned int length);
|
||||||
|
Loading…
Reference in New Issue
Block a user