mirror of
https://https.git.savannah.gnu.org/git/autoconf.git
synced 2026-01-26 15:03:22 +00:00
Stop documenting Tru64
* doc/autoconf.texi: Simplify manual by removing coverage of Ultrix, OSF/1, Tru64, and DEC Alpha. HP stopped supporting the last release at the end of 2012, so this platform is long dead. (Long Lines in Makefiles, Tru64 Directory Magic): Remove.
This commit is contained in:
parent
3172b740fa
commit
21cbb24bf5
@ -530,7 +530,6 @@ Portable Make Programming
|
||||
* Special Chars in Names:: Special characters in macro names
|
||||
* Backslash-Newline-Empty:: Empty lines after backslash-newline
|
||||
* Backslash-Newline Comments:: Spanning comments across line boundaries
|
||||
* Long Lines in Makefiles:: Line length limitations
|
||||
* Macros and Submakes:: @code{make macro=value} and submakes
|
||||
* The Make Macro MAKEFLAGS:: @code{$(MAKEFLAGS)} portability issues
|
||||
* The Make Macro SHELL:: @code{$(SHELL)} portability issues
|
||||
@ -552,7 +551,6 @@ Portable Make Programming
|
||||
* VPATH and Double-colon:: Problems with @samp{::} on ancient hosts
|
||||
* $< in Explicit Rules:: @code{$<} does not work in ordinary rules
|
||||
* Automatic Rule Rewriting:: @code{VPATH} goes wild on Solaris
|
||||
* Tru64 Directory Magic:: @command{mkdir} goes wild on Tru64
|
||||
* Make Target Lookup:: More details about @code{VPATH} lookup
|
||||
|
||||
Portable C and C++ Programming
|
||||
@ -5008,12 +5006,10 @@ portability.
|
||||
@c @fuindex va_list
|
||||
@prindex @code{va_list}
|
||||
@code{va_list} is not necessarily just a pointer. It can be a
|
||||
@code{struct} (e.g., @command{gcc} on Alpha), which means @code{NULL} is
|
||||
not portable. Or it can be an array (e.g., @command{gcc} in some
|
||||
PowerPC configurations), which means as a function parameter it can be
|
||||
@code{struct}, which means @code{NULL} is not portable.
|
||||
Or it can be an array, which means as a function parameter it can be
|
||||
effectively call-by-reference and library routines might modify the
|
||||
value back in the caller (e.g., @code{vsnprintf} in the GNU C Library
|
||||
2.1).
|
||||
value back in the caller.
|
||||
|
||||
@item Signed @code{>>}
|
||||
Normally the C @code{>>} right shift of a signed type replicates the
|
||||
@ -7200,7 +7196,7 @@ AC_CHECK_SIZEOF([int *])
|
||||
@end example
|
||||
|
||||
@noindent
|
||||
defines @code{SIZEOF_INT_P} to be 8 on DEC Alpha AXP systems.
|
||||
defines @code{SIZEOF_INT_P} to be 8 on x86-64 systems.
|
||||
|
||||
This macro caches its result in the @code{ac_cv_sizeof_@var{type-or-expr}}
|
||||
variable, with @samp{*} mapped to @samp{p} and other characters not
|
||||
@ -7649,11 +7645,6 @@ your code. However, given that the compiler does not support
|
||||
program compiles, when it wouldn't before.
|
||||
@xref{Volatile Objects}, for more about @code{volatile}.
|
||||
|
||||
In general, the @code{volatile} keyword is a standard C feature, so
|
||||
you might expect that @code{volatile} is available only when
|
||||
@code{__STDC__} is defined. However, Ultrix 4.3's native compiler does
|
||||
support volatile, but does not define @code{__STDC__}.
|
||||
|
||||
This macro is obsolescent, as current C compilers support @code{volatile}.
|
||||
New programs need not use this macro.
|
||||
@end defmac
|
||||
@ -15650,11 +15641,6 @@ packages. There is no extra charge for these packages, but they are
|
||||
not part of a minimal OS install and therefore some installations may
|
||||
not have it.
|
||||
|
||||
Starting with Tru64 Version 4.0, the Korn shell @command{/usr/bin/ksh}
|
||||
is also available as @command{/usr/bin/posix/sh}. If the environment
|
||||
variable @env{BIN_SH} is set to @code{xpg4}, subsidiary invocations of
|
||||
the standard shell conform to Posix.
|
||||
|
||||
@item Pdksh
|
||||
@prindex @samp{pdksh}
|
||||
A public-domain clone of the Korn shell called @command{pdksh} is widely
|
||||
@ -15922,25 +15908,6 @@ $ @kbd{bash -c 'foo=0; @{ foo=1; @} 2>/dev/null; echo $foo'}
|
||||
1
|
||||
@end example
|
||||
|
||||
When catering to old systems, don't redirect the same file descriptor
|
||||
several times, as you are doomed to failure under Ultrix.
|
||||
|
||||
@example
|
||||
ULTRIX V4.4 (Rev. 69) System #31: Thu Aug 10 19:42:23 GMT 1995
|
||||
UWS V4.4 (Rev. 11)
|
||||
$ @kbd{eval 'echo matter >fullness' >void}
|
||||
illegal io
|
||||
$ @kbd{eval '(echo matter >fullness)' >void}
|
||||
illegal io
|
||||
$ @kbd{(eval '(echo matter >fullness)') >void}
|
||||
Ambiguous output redirect.
|
||||
@end example
|
||||
|
||||
@noindent
|
||||
In each case the expected result is of course @file{fullness} containing
|
||||
@samp{matter} and @file{void} being empty. However, this bug is
|
||||
probably not of practical concern to modern platforms.
|
||||
|
||||
Solaris 10 @command{sh} will try to optimize away a @command{:} command
|
||||
(even if it is redirected) in a loop after the first iteration, or in a
|
||||
shell function after the first call:
|
||||
@ -16554,25 +16521,6 @@ $ @kbd{dash -c 'set a b c d e f g h i j; echo $10 $@{1@}0'}
|
||||
j a0
|
||||
@end example
|
||||
|
||||
@item $@{@var{var}:-@var{value}@}
|
||||
@itemx $@{@var{var}:=@var{value}@}
|
||||
@itemx $@{@var{var}:?@var{value}@}
|
||||
@itemx $@{@var{var}:+@var{value}@}
|
||||
@c Info cannot handle ':' in index entries.
|
||||
@ifnotinfo
|
||||
@cindex @code{$@{@var{var}:-@var{value}@}}
|
||||
@cindex @code{$@{@var{var}:=@var{value}@}}
|
||||
@cindex @code{$@{@var{var}:?@var{value}@}}
|
||||
@cindex @code{$@{@var{var}:+@var{value}@}}
|
||||
@end ifnotinfo
|
||||
Old BSD shells, including the Ultrix @code{sh}, don't accept the
|
||||
colon for any shell substitution, and complain and die.
|
||||
Similarly for @code{$@{@var{var}:=@var{value}@}},
|
||||
@code{$@{@var{var}:?@var{value}@}}, etc.
|
||||
However, all shells that support functions allow the use of colon in
|
||||
shell substitution, and since m4sh requires functions, you can portably
|
||||
use null variable substitution patterns in configure scripts.
|
||||
|
||||
@item $@{@var{var}-@var{value}@}
|
||||
@itemx $@{@var{var}:-@var{value}@}
|
||||
@itemx $@{@var{var}=@var{value}@}
|
||||
@ -17122,11 +17070,6 @@ $ @kbd{zsh -c 'false; $empty; echo $?'}
|
||||
Many shells reserve @samp{$_} for various purposes, e.g., the name of
|
||||
the last command executed.
|
||||
|
||||
@item BIN_SH
|
||||
@evindex BIN_SH
|
||||
In Tru64, if @env{BIN_SH} is set to @code{xpg4}, subsidiary invocations of
|
||||
the standard shell conform to Posix.
|
||||
|
||||
@item CDPATH
|
||||
@evindex CDPATH
|
||||
When this variable is set it specifies a list of directories to search
|
||||
@ -17896,16 +17839,6 @@ Even with this, Solaris @command{ksh} matches a backslash if the set
|
||||
contains any
|
||||
of the characters @samp{|}, @samp{&}, @samp{(}, or @samp{)}.
|
||||
|
||||
Conversely, Tru64 @command{ksh} (circa 2003) erroneously always matches
|
||||
a closing parenthesis if not specified in a character class:
|
||||
|
||||
@example
|
||||
$ @kbd{case foo in *\)*) echo fail ;; esac}
|
||||
fail
|
||||
$ @kbd{case foo in *')'*) echo fail ;; esac}
|
||||
fail
|
||||
@end example
|
||||
|
||||
Some shells, such as Ash 0.3.8, are confused by an empty
|
||||
@code{case}/@code{esac}:
|
||||
|
||||
@ -18438,9 +18371,7 @@ Also please see the discussion of the @command{cd} command.
|
||||
@c -----------------
|
||||
@prindex @command{read}
|
||||
No options are portable, not even support @option{-r} (Solaris 10
|
||||
@command{/bin/sh} for example). Tru64/OSF 5.1 @command{sh} treats
|
||||
@command{read} as a special built-in, so it may exit if input is
|
||||
redirected from a non-existent or unreadable file.
|
||||
@command{/bin/sh} for example).
|
||||
|
||||
|
||||
@anchor{set}
|
||||
@ -18559,23 +18490,6 @@ $ @kbd{sh -c 'set -e; false `true` && echo notreached; echo ok'}
|
||||
$
|
||||
@end example
|
||||
|
||||
Portable scripts should not use @samp{set -e} if @command{trap} is used
|
||||
to install an exit handler. This is because Tru64/OSF 5.1 @command{sh}
|
||||
sometimes enters the trap handler with the exit status of the command
|
||||
prior to the one that triggered the errexit handler:
|
||||
|
||||
@example
|
||||
$ @kbd{sh -ec 'trap '\''echo $?'\'' 0; false'}
|
||||
0
|
||||
$ @kbd{sh -c 'set -e; trap '\''echo $?'\'' 0; false'}
|
||||
1
|
||||
@end example
|
||||
|
||||
@noindent
|
||||
Thus, when writing a script in M4sh, rather than trying to rely on
|
||||
@samp{set -e}, it is better to use @samp{AS_EXIT}
|
||||
where it is desirable to abort on failure.
|
||||
|
||||
@cindex @command{set -b}
|
||||
@cindex @command{set -m}
|
||||
Job control is not provided by all shells, so the use of @samp{set -m}
|
||||
@ -19087,9 +19001,9 @@ In code portable to both traditional and modern Awk, @code{FS} must be a
|
||||
string containing just one ordinary character, and similarly for the
|
||||
field-separator argument to @code{split}.
|
||||
|
||||
Traditional Awk has a limit of 99 fields in a record. Since some Awk
|
||||
implementations, like Tru64's, split the input even if you don't refer
|
||||
to any field in the script, to circumvent this problem, set @samp{FS}
|
||||
Traditional Awk has a limit of 99 fields in a record
|
||||
and splits the input even if you don't refer to any field in the script.
|
||||
To circumvent this problem, set @samp{FS}
|
||||
to an unusual character and use @code{split}.
|
||||
|
||||
Traditional Awk has a limit of at most 99 bytes in a number formatted by
|
||||
@ -19261,25 +19175,19 @@ you can't use the name of the kernel as an indicator of the behavior.
|
||||
@item @command{date}
|
||||
@c -----------------
|
||||
@prindex @command{date}
|
||||
Some versions of @command{date} do not recognize special @samp{%} directives,
|
||||
and unfortunately, instead of complaining, they just pass them through,
|
||||
When most versions of @command{date} do not recognize a @samp{%}
|
||||
conversion specification, they quietly pass it through,
|
||||
and exit with success:
|
||||
|
||||
@example
|
||||
$ @kbd{uname -a}
|
||||
OSF1 medusa.sis.pasteur.fr V5.1 732 alpha
|
||||
$ @kbd{date "+%s"}
|
||||
%s
|
||||
$ @kbd{date --version | head -n 1}
|
||||
date (GNU coreutils) 9.5
|
||||
$ @kbd{date +'%H:%M %Q'}
|
||||
17:25 %Q
|
||||
@end example
|
||||
|
||||
|
||||
@item @command{diff}
|
||||
@c -----------------
|
||||
@prindex @command{diff}
|
||||
Option @option{-u} is nonportable.
|
||||
|
||||
Some implementations, such as Tru64's, fail when comparing to
|
||||
@file{/dev/null}. Use an empty file instead.
|
||||
@noindent
|
||||
However, this behavior is not required by Posix.
|
||||
|
||||
|
||||
@item @command{dirname}
|
||||
@ -19467,15 +19375,7 @@ outputs @samp{a} on most hosts, but @samp{aa} on QNX 4.25. A
|
||||
simple workaround consists of testing @command{expr} and using a variable
|
||||
set to @command{expr} or to @command{false} according to the result.
|
||||
|
||||
Tru64 @command{expr} incorrectly treats the result as a number, if it
|
||||
can be interpreted that way:
|
||||
|
||||
@example
|
||||
$ @kbd{expr 00001 : '.*\(...\)'}
|
||||
1
|
||||
@end example
|
||||
|
||||
On HP-UX 11, @command{expr} only supports a single
|
||||
On HP-UX 11, @command{expr} supports only a single
|
||||
sub-expression.
|
||||
|
||||
@example
|
||||
@ -19493,8 +19393,6 @@ replacement @code{grep -F}. Also, some traditional implementations do
|
||||
not work on long input lines. To work around these problems, invoke
|
||||
@code{AC_PROG_FGREP} and then use @code{$FGREP}.
|
||||
|
||||
Tru64/OSF 5.1 @command{fgrep} does not match an empty pattern.
|
||||
|
||||
|
||||
@item @command{find}
|
||||
@c -----------------
|
||||
@ -19933,10 +19831,7 @@ x
|
||||
@end example
|
||||
|
||||
The @option{-e} option is mostly portable.
|
||||
However, its argument
|
||||
cannot start with @samp{a}, @samp{c}, or @samp{i},
|
||||
as this runs afoul of a Tru64 5.1 bug.
|
||||
Also, its argument cannot be empty, as this fails on AIX 5.3.
|
||||
However, its argument cannot be empty, as this fails on AIX 7.3.
|
||||
Some people prefer to use @samp{-e}:
|
||||
|
||||
@example
|
||||
@ -20328,7 +20223,6 @@ itself.
|
||||
* Special Chars in Names:: Special characters in macro names
|
||||
* Backslash-Newline-Empty:: Empty lines after backslash-newline
|
||||
* Backslash-Newline Comments:: Spanning comments across line boundaries
|
||||
* Long Lines in Makefiles:: Line length limitations
|
||||
* Macros and Submakes:: @code{make macro=value} and submakes
|
||||
* The Make Macro MAKEFLAGS:: @code{$(MAKEFLAGS)} portability issues
|
||||
* The Make Macro SHELL:: @code{$(SHELL)} portability issues
|
||||
@ -20489,13 +20383,6 @@ line with @code{#}, not only the first.
|
||||
# baz
|
||||
@end example
|
||||
|
||||
@node Long Lines in Makefiles
|
||||
@section Long Lines in Makefiles
|
||||
|
||||
Tru64 5.1's @command{make} has been reported to crash when given a
|
||||
makefile with lines longer than around 20 kB. Earlier versions are
|
||||
reported to exit with @code{Line too long} diagnostics.
|
||||
|
||||
@node Macros and Submakes
|
||||
@section @code{make macro=value} and Submakes
|
||||
|
||||
@ -20613,16 +20500,22 @@ MAKEFLAGS = --unix -k
|
||||
@cindex @code{SHELL} and @command{make}
|
||||
@cindex @command{make} and @code{SHELL}
|
||||
|
||||
Posix-compliant @command{make} internally uses the @code{$(SHELL)}
|
||||
Many @command{make} implementations use the the @code{$(SHELL)}
|
||||
macro to spawn shell processes and execute Make rules. This
|
||||
is a builtin macro supplied by @command{make}, but it can be modified
|
||||
by a makefile or by a command-line argument.
|
||||
is a builtin macro with a default value upplied by @command{make};
|
||||
the default can be overridden by a makefile or by a command-line argument,
|
||||
though not by the environment.
|
||||
|
||||
Not all @command{make} implementations define this @code{SHELL} macro.
|
||||
Tru64
|
||||
@command{make} is an example; this implementation always uses
|
||||
@code{/bin/sh}. So it's a good idea to always define @code{SHELL} in
|
||||
your makefiles. If you use Autoconf, do
|
||||
Other @command{make} implementations use other ways to spawn shell
|
||||
processes, and the Posix standard for @command{make} says that portable
|
||||
makefiles should neither define nor use the @code{$(SHELL)} macro.
|
||||
|
||||
Despite this prohibition, in practice it does not hurt to define and
|
||||
then possibly use @code{SHELL} in your makefiles and in some cases it
|
||||
can help your builds use a better shell to spawn shell processes.
|
||||
So it's a good idea to define @code{SHELL} in
|
||||
your makefiles. If you use Autoconf, you can use
|
||||
its standard output variable @code{SHELL} as follows:
|
||||
|
||||
@example
|
||||
SHELL = @@SHELL@@
|
||||
@ -20632,8 +20525,8 @@ SHELL = @@SHELL@@
|
||||
If you use Automake, this is done for you.
|
||||
|
||||
Do not force @code{SHELL = /bin/sh} because that is not correct
|
||||
everywhere. Remember, @file{/bin/sh} is not Posix compliant on many
|
||||
systems, such as FreeBSD 4, NetBSD 3, AIX 3, Solaris 10, or Tru64.
|
||||
everywhere. Remember, @file{/bin/sh} is not Posix compliant on some
|
||||
systems, such as Solaris 10.
|
||||
Additionally, DJGPP lacks @code{/bin/sh}, and when its
|
||||
GNU @command{make} port sees such a setting it enters a
|
||||
special emulation mode where features like pipes and redirections are
|
||||
@ -20645,43 +20538,18 @@ benefit from the same improved shell, such as @command{bash} or
|
||||
you aren't fighting two different sets of shell bugs between the two
|
||||
contexts.
|
||||
|
||||
Posix-compliant @command{make} should never acquire the value of
|
||||
$(SHELL) from the environment, even when @code{make -e} is used
|
||||
(otherwise, think about what would happen to your rules if
|
||||
@code{SHELL=/bin/tcsh}).
|
||||
|
||||
However not all @command{make} implementations have this exception.
|
||||
For instance it's not surprising that Tru64 @command{make} doesn't
|
||||
protect @code{SHELL}, since it doesn't use it.
|
||||
|
||||
@example
|
||||
$ @kbd{cat Makefile}
|
||||
SHELL = /bin/sh
|
||||
FOO = foo
|
||||
all:
|
||||
@@printf '%s\n' '$(SHELL)'
|
||||
@@printf '%s\n' '$(FOO)'
|
||||
$ @kbd{env SHELL=/bin/tcsh FOO=bar make -e} # Tru64 Make
|
||||
/bin/tcsh
|
||||
bar
|
||||
$ @kbd{env SHELL=/bin/tcsh FOO=bar gmake -e} # GNU make
|
||||
/bin/sh
|
||||
bar
|
||||
@end example
|
||||
|
||||
Conversely, @command{make} is not supposed to export any changes to the
|
||||
macro @code{SHELL} to child processes. Again, many implementations
|
||||
break this rule:
|
||||
Do not rely on whether @command{make}'s @code{SHELL} settings are
|
||||
exported to subprocesses, as implementations differ:
|
||||
|
||||
@example
|
||||
$ @kbd{cat Makefile}
|
||||
all:
|
||||
@@printf '%s\n' '$(SHELL)'
|
||||
@@printenv SHELL
|
||||
$ @kbd{env SHELL=sh make -e SHELL=/bin/ksh} # BSD Make, GNU make 3.80
|
||||
$ @kbd{env SHELL=/bin/sh make -e SHELL=/bin/ksh} # BSD make, AIX make
|
||||
/bin/ksh
|
||||
/bin/ksh
|
||||
$ @kbd{env SHELL=sh gmake -e SHELL=/bin/ksh} # GNU make 3.81
|
||||
$ @kbd{env SHELL=/bin/sh make -e SHELL=/bin/ksh} # GNU make
|
||||
/bin/ksh
|
||||
sh
|
||||
@end example
|
||||
@ -20832,36 +20700,20 @@ standard output, and may remove leading whitespace from output lines.
|
||||
@cindex Comments in @file{Makefile} rules
|
||||
@cindex @file{Makefile} rules and comments
|
||||
|
||||
Never put comments in a rule.
|
||||
Do not try to put comments (lines beginning with @samp{#}) in a rule, as
|
||||
they end the rule. It is OK for a rule line to start with a tab
|
||||
followed by @samp{#}, as a comment passed to a shell that does nothing.
|
||||
|
||||
Some @command{make} treat anything starting with a tab as a command for
|
||||
the current rule, even if the tab is immediately followed by a @code{#}.
|
||||
The @command{make} from Tru64 Unix V5.1 is one of them. The following
|
||||
makefile runs @code{# foo} through the shell.
|
||||
|
||||
@example
|
||||
all:
|
||||
# foo
|
||||
@end example
|
||||
|
||||
As a workaround, you can use the @command{:} no-op command with a string
|
||||
argument that gets ignored:
|
||||
|
||||
@example
|
||||
all:
|
||||
: "foo"
|
||||
@end example
|
||||
|
||||
Conversely, if you want to use the @samp{#} character in some command,
|
||||
you can only do so by expanding it inside a rule (@pxref{Comments in
|
||||
Make Macros}). So for example, if @samp{COMMENT_CHAR} is substituted by
|
||||
@command{config.status} as @samp{#}, then the following substitutes
|
||||
@samp{@@COMMENT_CHAR@@} in a generated header:
|
||||
To use the @samp{#} character in a command, put it in a rule not a
|
||||
macro, as the character cannot portably appear in macros
|
||||
(@pxref{Comments in Make Macros}). So for example, assuming the output
|
||||
variable @code{COMMENT_CHAR} stands for @samp{#}, the following replaces
|
||||
@samp{@@COMMENT_CHAR@@} by @samp{#} in a generated header:
|
||||
|
||||
@example
|
||||
foo.h: foo.h.in
|
||||
sed -e 's|@@''COMMENT_CHAR''@@|@@COMMENT_CHAR@@|g' \
|
||||
$(srcdir)/foo.h.in > $@@
|
||||
'$(srcdir)/foo.h.in' > $@@
|
||||
@end example
|
||||
|
||||
The funny shell quoting avoids a substitution at @command{config.status}
|
||||
@ -20874,20 +20726,18 @@ run time of the left-hand side of the @command{sed} @samp{s} command.
|
||||
|
||||
In shell scripts, newlines can be used inside string literals. But in
|
||||
the shell statements of @file{Makefile} rules, this is not possible:
|
||||
A newline not preceded by a backslash is a separator between shell
|
||||
statements. Whereas a newline that is preceded by a backslash becomes
|
||||
part of the shell statement according to POSIX, but gets replaced,
|
||||
together with the backslash that precedes it, by a space in GNU
|
||||
@command{make} 3.80 and older. So, how can a newline be used in a string
|
||||
literal?
|
||||
a newline not preceded by a backslash separates commands, whereas a
|
||||
newline preceded by a backslash becomes part of the shell statement.
|
||||
So, how can a newline be used in a string literal?
|
||||
|
||||
The trick is to set up a shell variable that contains a newline.
|
||||
For example, in order to create a multi-line @samp{sed} expression that
|
||||
inserts an empty line after every line of a file, this code can be used:
|
||||
The trick is to set up a shell variable @code{nl} that contains a newline.
|
||||
For example, the following uses a multi-line @samp{sed} expression that
|
||||
appends an empty line after every line of a file:
|
||||
|
||||
@example
|
||||
eval $$(printf 'nl="\n"\n'); \
|
||||
sed -e "s/\$$/\\$$@{nl@}/" < input > output
|
||||
output: input
|
||||
eval "$$(printf 'nl="\n"\n')"; \
|
||||
sed "a\\$$nl" input >$@@
|
||||
@end example
|
||||
|
||||
@node Comments in Make Macros
|
||||
@ -20895,23 +20745,20 @@ sed -e "s/\$$/\\$$@{nl@}/" < input > output
|
||||
@cindex Comments in @file{Makefile} macros
|
||||
@cindex @file{Makefile} macros and comments
|
||||
|
||||
Avoid putting comments in macro values as far as possible. Posix
|
||||
specifies that the text starting from the @samp{#} sign until the end of
|
||||
the line is to be ignored, which has the unfortunate effect of
|
||||
disallowing them even within quotes. Thus, the following might lead to
|
||||
a syntax error at compile time:
|
||||
In macro definitions, text from @samp{#} until line end is ignored,
|
||||
which has the unfortunate effect of disallowing @samp{#} even in quotes.
|
||||
Thus, the following does not work:
|
||||
|
||||
@example
|
||||
CPPFLAGS = "-DCOMMENT_CHAR='#'"
|
||||
@end example
|
||||
|
||||
@noindent
|
||||
as @samp{CPPFLAGS} may be expanded to @samp{"-DCOMMENT_CHAR='}.
|
||||
as @samp{CPPFLAGS} is expanded to @samp{"-DCOMMENT_CHAR='}.
|
||||
|
||||
Most @command{make} implementations disregard this and treat single and
|
||||
double quotes specially here. Also, GNU @command{make} lets you put
|
||||
GNU @command{make}, when not in Posix mode, lets you put
|
||||
@samp{#} into a macro value by escaping it with a backslash, i.e.,
|
||||
@samp{\#}. However, neither of these usages are portable.
|
||||
@samp{\#}. However, this usage is not portable.
|
||||
@xref{Comments in Make Rules}, for a portable alternative.
|
||||
|
||||
Even without quoting involved, comments can have surprising effects,
|
||||
@ -20971,7 +20818,7 @@ environment variables:
|
||||
$ @kbd{echo 'print: ; @@echo "x$(foo)x$(bar)x"' |
|
||||
foo=' f f ' make -f - bar=' b b '}
|
||||
x f f xb b x # AIX, BSD, GNU make
|
||||
xf f xb b x # HP-UX, IRIX, Tru64/OSF make
|
||||
xf f xb b x # HP-UX
|
||||
x f f xb bx # Solaris make
|
||||
@end example
|
||||
|
||||
@ -21051,7 +20898,6 @@ implementations.
|
||||
* VPATH and Double-colon:: Problems with @samp{::} on ancient hosts
|
||||
* $< in Explicit Rules:: @code{$<} does not work in ordinary rules
|
||||
* Automatic Rule Rewriting:: @code{VPATH} goes wild on Solaris
|
||||
* Tru64 Directory Magic:: @command{mkdir} goes wild on Tru64
|
||||
* Make Target Lookup:: More details about @code{VPATH} lookup
|
||||
@end menu
|
||||
|
||||
@ -21100,7 +20946,7 @@ whole thing manually. @xref{Build Directories}.
|
||||
@cindex @code{VPATH} and automatic rule rewriting
|
||||
@cindex automatic rule rewriting and @code{VPATH}
|
||||
|
||||
Some @command{make} implementations, such as Solaris and Tru64,
|
||||
Some @command{make} implementations, such as Solaris,
|
||||
search for prerequisites in @code{VPATH} and
|
||||
then rewrite each occurrence as a plain word in the rule.
|
||||
For instance:
|
||||
@ -21162,8 +21008,8 @@ f.c: if.c
|
||||
|
||||
@noindent
|
||||
However, the ``prerequisite rewriting'' still applies here. So if
|
||||
@file{if.c} is in @file{../pkg/src}, Solaris and Tru64 @command{make}
|
||||
execute
|
||||
@file{if.c} is in @file{../pkg/src}, Solaris @command{make}
|
||||
executes
|
||||
|
||||
@smallexample
|
||||
cp `test -f ../pkg/src/if.c || echo ../pkg/src/`if.c f.c
|
||||
@ -21298,69 +21144,8 @@ install-HEADERS: $(HEADERS)
|
||||
done
|
||||
@end example
|
||||
|
||||
Automake does something similar. However the above hack works only if
|
||||
the files listed in @code{HEADERS} are in the current directory or a
|
||||
subdirectory; they should not be in an enclosing directory. If we had
|
||||
@code{HEADERS = ../f.h}, the above fragment would fail in a VPATH
|
||||
build with Tru64 @command{make}. The reason is that not only does
|
||||
Tru64 @command{make} rewrite dependencies, but it also simplifies
|
||||
them. Hence @code{../f.h} becomes @code{../pkg/f.h} instead of
|
||||
@code{../pkg/src/../f.h}. This obviously defeats any attempt to strip
|
||||
a leading @file{../pkg/src/} component.
|
||||
|
||||
The following example makes the behavior of Tru64 @command{make}
|
||||
more apparent.
|
||||
|
||||
@example
|
||||
$ @kbd{cat Makefile}
|
||||
VPATH = sub
|
||||
all: ../foo
|
||||
echo ../foo
|
||||
$ @kbd{ls}
|
||||
Makefile foo
|
||||
$ @kbd{make}
|
||||
echo foo
|
||||
foo
|
||||
@end example
|
||||
|
||||
@noindent
|
||||
Dependency @file{../foo} was found in @file{sub/../foo}, but Tru64
|
||||
@command{make} simplified it as @file{foo}. (Note that the @file{sub/}
|
||||
directory does not even exist, this just means that the simplification
|
||||
occurred before the file was checked for.)
|
||||
|
||||
|
||||
@node Tru64 Directory Magic
|
||||
@subsection Tru64 @command{make} Creates Prerequisite Directories Magically
|
||||
@cindex @code{VPATH} and prerequisite directories
|
||||
@cindex prerequisite directories and @code{VPATH}
|
||||
|
||||
When a prerequisite is a subdirectory of @code{VPATH}, Tru64
|
||||
@command{make} creates it in the current directory.
|
||||
|
||||
@example
|
||||
$ @kbd{mkdir -p foo/bar build}
|
||||
$ @kbd{cd build}
|
||||
$ @kbd{cat >Makefile <<END
|
||||
VPATH = ..
|
||||
all: foo/bar
|
||||
END}
|
||||
$ @kbd{make}
|
||||
mkdir foo
|
||||
mkdir foo/bar
|
||||
@end example
|
||||
|
||||
This can yield unexpected results if a rule uses a manual @code{VPATH}
|
||||
search as presented before.
|
||||
|
||||
@example
|
||||
VPATH = ..
|
||||
all : foo/bar
|
||||
command `test -d foo/bar || echo ../`foo/bar
|
||||
@end example
|
||||
|
||||
The above @command{command} is run on the empty @file{foo/bar}
|
||||
directory that was created in the current directory.
|
||||
Automake does something similar.
|
||||
|
||||
@node Make Target Lookup
|
||||
@subsection Make Target Lookup
|
||||
@ -21412,10 +21197,6 @@ Building ../bar.x
|
||||
$ @kbd{fmake} # FreeBSD make, OpenBSD make
|
||||
Building foo.x
|
||||
Building bar.x
|
||||
$ @kbd{tmake} # Tru64 make
|
||||
Building foo.x
|
||||
Building bar.x
|
||||
$ @kbd{touch ../bar.x}
|
||||
$ @kbd{make} # GNU make
|
||||
Building foo.x
|
||||
$ @kbd{pmake} # NetBSD make
|
||||
@ -21423,13 +21204,10 @@ Building foo.x
|
||||
$ @kbd{fmake} # FreeBSD make, OpenBSD make
|
||||
Building foo.x
|
||||
Building bar.x
|
||||
$ @kbd{tmake} # Tru64 make
|
||||
Building foo.x
|
||||
Building bar.x
|
||||
@end example
|
||||
|
||||
Note how NetBSD @command{make} updates @file{../bar.x} in its
|
||||
VPATH location, and how FreeBSD, OpenBSD, and Tru64
|
||||
VPATH location, and how FreeBSD and OpenBSD
|
||||
@command{make} always
|
||||
update @file{bar.x}, even when @file{../bar.x} is up to date.
|
||||
|
||||
@ -21468,18 +21246,13 @@ echo Building bar.x
|
||||
cp bar.x bar.y
|
||||
cp: cannot stat 'bar.x': No such file or directory
|
||||
*** Error code 1
|
||||
$ @kbd{tmake} # Tru64 make
|
||||
Building bar.x
|
||||
cp: bar.x: No such file or directory
|
||||
*** Exit 1
|
||||
@end example
|
||||
|
||||
Note that if you drop away the command from the @code{bar.x: newer.x}
|
||||
rule, GNU @command{make} magically starts to work: it
|
||||
knows that @code{bar.x} hasn't been updated, therefore it doesn't
|
||||
discard the result from @code{VPATH} (@file{../bar.x}) in succeeding
|
||||
uses. Tru64 also works, but FreeBSD and OpenBSD
|
||||
still don't.
|
||||
uses. FreeBSD and OpenBSD still don't work, though.
|
||||
|
||||
@example
|
||||
$ @kbd{cat Makefile}
|
||||
@ -21501,8 +21274,6 @@ $ @kbd{fmake} # FreeBSD make, OpenBSD make
|
||||
cp bar.x bar.y
|
||||
cp: cannot stat 'bar.x': No such file or directory
|
||||
*** Error code 1
|
||||
$ @kbd{tmake} # Tru64 make
|
||||
cp ../bar.x bar.y
|
||||
@end example
|
||||
|
||||
It seems the sole solution that would please every @command{make}
|
||||
@ -22381,9 +22152,9 @@ avoids any confusion. Avoiding the warning is as simple as creating the
|
||||
correct symlinks naming the cross tools.
|
||||
|
||||
@cindex @command{config.sub}
|
||||
@command{configure} recognizes short aliases for many system types; for
|
||||
example, @samp{decstation} can be used instead of
|
||||
@samp{mips-dec-ultrix4.2}. @command{configure} runs a script called
|
||||
@command{configure} recognizes short aliases for some system types; for
|
||||
example, @samp{mingw64} can be used instead of
|
||||
@samp{x86_64-pc-mingw64}. @command{configure} runs a script called
|
||||
@command{config.sub} to canonicalize system type aliases.
|
||||
|
||||
This section deliberately omits the description of the obsolete
|
||||
@ -22476,8 +22247,8 @@ program or library.
|
||||
|
||||
@example
|
||||
AS_CASE([$host],
|
||||
[alpha*-*-*], [CYCLE_OBJ=rpcc.o],
|
||||
[i?86-*-*], [CYCLE_OBJ=rdtsc.o],
|
||||
[aarch64*-*-*], [CYCLE_OBJ=pmccntr.o],
|
||||
[i?86-*-*], [CYCLE_OBJ=rdtsc.o],
|
||||
[CYCLE_OBJ=""])
|
||||
AC_SUBST([CYCLE_OBJ])
|
||||
@end example
|
||||
@ -22489,7 +22260,7 @@ so some runtime capability checks may be necessary too.
|
||||
|
||||
@example
|
||||
AS_CASE([$host],
|
||||
[alpha*-*-*], [AC_CONFIG_LINKS([dither.c:alpha/dither.c])],
|
||||
[aarch64*-*-*], [AC_CONFIG_LINKS([dither.c:aarch64/dither.c])],
|
||||
[powerpc*-*-*], [AC_CONFIG_LINKS([dither.c:powerpc/dither.c])],
|
||||
[AC_CONFIG_LINKS([dither.c:generic/dither.c])])
|
||||
@end example
|
||||
@ -25126,11 +24897,11 @@ For backward compatibility, @command{configure} accepts a system
|
||||
type as an option by itself. Such an option overrides the
|
||||
defaults for build, host, and target system types. The following
|
||||
configure statement configures a cross toolchain that runs on
|
||||
NetBSD/alpha but generates code for GNU Hurd/sparc,
|
||||
NetBSD/aarch64 but generates code for GNU Hurd/riscv64,
|
||||
which is also the build platform.
|
||||
|
||||
@example
|
||||
./configure --host=alpha-netbsd sparc-gnu
|
||||
./configure --host=aarch64-netbsd riscv64-gnu
|
||||
@end example
|
||||
|
||||
@sp 1
|
||||
@ -27355,7 +27126,7 @@ introduced in this document.
|
||||
@c LocalWords: mkdir exe uname OpenBSD Fileutils mktemp umask TMPDIR guid os
|
||||
@c LocalWords: fooXXXXXX Unicos utimes hpux hppa unescaped SUBST'ed
|
||||
@c LocalWords: pmake DOS's gmake ifoo DESTDIR autoconfiscated pc coff mips gg
|
||||
@c LocalWords: dec ultrix cpu wildcards rpcc rdtsc powerpc readline
|
||||
@c LocalWords: cpu wildcards rpcc rdtsc powerpc readline
|
||||
@c LocalWords: withval vxworks gless localcache usr LOFF loff CYGWIN Cygwin
|
||||
@c LocalWords: cygwin SIGLIST siglist SYSNDIR SYSDIR ptx lseq rusage elif MSC
|
||||
@c LocalWords: lfoo POUNDBANG lsun NIS getpwnam SYSCALLS RSH INTL lintl aix
|
||||
@ -27404,7 +27175,7 @@ introduced in this document.
|
||||
@c LocalWords: TESTA TESTB TESTC hoc xpg xxyzzyz dtksh nosuch fifos
|
||||
@c LocalWords: fifo Stardent sig WIF WIFSIGNALED SIGQUIT tty perl ret
|
||||
@c LocalWords: SIGINT NUL SFN PRN aeiou MSYS SIGTERM xhi arith UWIN
|
||||
@c LocalWords: CLICOLOR FPATH POSIXLY Shellshock CVE OSF doit ec ci
|
||||
@c LocalWords: CLICOLOR FPATH POSIXLY Shellshock CVE doit ec ci
|
||||
@c LocalWords: notreached cim nc ACL faccessat Alexandre getline sqrt
|
||||
@c LocalWords: CONVFMT FS OFMT CDS chgrp futimens utimensat oo esc od
|
||||
@c LocalWords: ownerships mape readdir mkfifo mknod testsuites XSI rf
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user