parent
57b4a6a9e5
commit
c252132f39
@ -1,183 +1,368 @@ |
||||
Installation Instructions |
||||
************************* |
||||
|
||||
Copyright (C) 1994-1996, 1999-2002, 2004-2017, 2020-2021 Free |
||||
Software Foundation, Inc. |
||||
|
||||
Copying and distribution of this file, with or without modification, |
||||
are permitted in any medium without royalty provided the copyright |
||||
notice and this notice are preserved. This file is offered as-is, |
||||
without warranty of any kind. |
||||
|
||||
Basic Installation |
||||
================== |
||||
|
||||
These are generic installation instructions. |
||||
Briefly, the shell command './configure && make && make install' |
||||
should configure, build, and install this package. The following |
||||
more-detailed instructions are generic; see the 'README' file for |
||||
instructions specific to this package. Some packages provide this |
||||
'INSTALL' file but do not implement all of the features documented |
||||
below. The lack of an optional feature in a given package is not |
||||
necessarily a bug. More recommendations for GNU packages can be found |
||||
in *note Makefile Conventions: (standards)Makefile Conventions. |
||||
|
||||
The `configure' shell script attempts to guess correct values for |
||||
The 'configure' shell script attempts to guess correct values for |
||||
various system-dependent variables used during compilation. It uses |
||||
those values to create a `Makefile' in each directory of the package. |
||||
It may also create one or more `.h' files containing system-dependent |
||||
definitions. Finally, it creates a shell script `config.status' that |
||||
you can run in the future to recreate the current configuration, a file |
||||
`config.cache' that saves the results of its tests to speed up |
||||
reconfiguring, and a file `config.log' containing compiler output |
||||
(useful mainly for debugging `configure'). |
||||
those values to create a 'Makefile' in each directory of the package. |
||||
It may also create one or more '.h' files containing system-dependent |
||||
definitions. Finally, it creates a shell script 'config.status' that |
||||
you can run in the future to recreate the current configuration, and a |
||||
file 'config.log' containing compiler output (useful mainly for |
||||
debugging 'configure'). |
||||
|
||||
It can also use an optional file (typically called 'config.cache' and |
||||
enabled with '--cache-file=config.cache' or simply '-C') that saves the |
||||
results of its tests to speed up reconfiguring. Caching is disabled by |
||||
default to prevent problems with accidental use of stale cache files. |
||||
|
||||
If you need to do unusual things to compile the package, please try |
||||
to figure out how `configure' could check whether to do them, and mail |
||||
diffs or instructions to the address given in the `README' so they can |
||||
be considered for the next release. If at some point `config.cache' |
||||
contains results you don't want to keep, you may remove or edit it. |
||||
to figure out how 'configure' could check whether to do them, and mail |
||||
diffs or instructions to the address given in the 'README' so they can |
||||
be considered for the next release. If you are using the cache, and at |
||||
some point 'config.cache' contains results you don't want to keep, you |
||||
may remove or edit it. |
||||
|
||||
The file `configure.in' is used to create `configure' by a program |
||||
called `autoconf'. You only need `configure.in' if you want to change |
||||
it or regenerate `configure' using a newer version of `autoconf'. |
||||
The file 'configure.ac' (or 'configure.in') is used to create |
||||
'configure' by a program called 'autoconf'. You need 'configure.ac' if |
||||
you want to change it or regenerate 'configure' using a newer version of |
||||
'autoconf'. |
||||
|
||||
The simplest way to compile this package is: |
||||
|
||||
1. `cd' to the directory containing the package's source code and type |
||||
`./configure' to configure the package for your system. If you're |
||||
using `csh' on an old version of System V, you might need to type |
||||
`sh ./configure' instead to prevent `csh' from trying to execute |
||||
`configure' itself. |
||||
1. 'cd' to the directory containing the package's source code and type |
||||
'./configure' to configure the package for your system. |
||||
|
||||
Running `configure' takes awhile. While running, it prints some |
||||
messages telling which features it is checking for. |
||||
Running 'configure' might take a while. While running, it prints |
||||
some messages telling which features it is checking for. |
||||
|
||||
2. Type `make' to compile the package. |
||||
2. Type 'make' to compile the package. |
||||
|
||||
3. Optionally, type `make check' to run any self-tests that come with |
||||
the package. |
||||
3. Optionally, type 'make check' to run any self-tests that come with |
||||
the package, generally using the just-built uninstalled binaries. |
||||
|
||||
4. Type `make install' to install the programs and any data files and |
||||
documentation. |
||||
4. Type 'make install' to install the programs and any data files and |
||||
documentation. When installing into a prefix owned by root, it is |
||||
recommended that the package be configured and built as a regular |
||||
user, and only the 'make install' phase executed with root |
||||
privileges. |
||||
|
||||
5. You can remove the program binaries and object files from the |
||||
source code directory by typing `make clean'. To also remove the |
||||
files that `configure' created (so you can compile the package for |
||||
a different kind of computer), type `make distclean'. There is |
||||
also a `make maintainer-clean' target, but that is intended mainly |
||||
5. Optionally, type 'make installcheck' to repeat any self-tests, but |
||||
this time using the binaries in their final installed location. |
||||
This target does not install anything. Running this target as a |
||||
regular user, particularly if the prior 'make install' required |
||||
root privileges, verifies that the installation completed |
||||
correctly. |
||||
|
||||
6. You can remove the program binaries and object files from the |
||||
source code directory by typing 'make clean'. To also remove the |
||||
files that 'configure' created (so you can compile the package for |
||||
a different kind of computer), type 'make distclean'. There is |
||||
also a 'make maintainer-clean' target, but that is intended mainly |
||||
for the package's developers. If you use it, you may have to get |
||||
all sorts of other programs in order to regenerate files that came |
||||
with the distribution. |
||||
|
||||
7. Often, you can also type 'make uninstall' to remove the installed |
||||
files again. In practice, not all packages have tested that |
||||
uninstallation works correctly, even though it is required by the |
||||
GNU Coding Standards. |
||||
|
||||
8. Some packages, particularly those that use Automake, provide 'make |
||||
distcheck', which can by used by developers to test that all other |
||||
targets like 'make install' and 'make uninstall' work correctly. |
||||
This target is generally not run by end users. |
||||
|
||||
Compilers and Options |
||||
===================== |
||||
|
||||
Some systems require unusual options for compilation or linking that |
||||
the `configure' script does not know about. You can give `configure' |
||||
initial values for variables by setting them in the environment. Using |
||||
a Bourne-compatible shell, you can do that on the command line like |
||||
this: |
||||
CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure |
||||
the 'configure' script does not know about. Run './configure --help' |
||||
for details on some of the pertinent environment variables. |
||||
|
||||
You can give 'configure' initial values for configuration parameters |
||||
by setting variables in the command line or in the environment. Here is |
||||
an example: |
||||
|
||||
./configure CC=c99 CFLAGS=-g LIBS=-lposix |
||||
|
||||
Or on systems that have the `env' program, you can do it like this: |
||||
env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure |
||||
*Note Defining Variables::, for more details. |
||||
|
||||
Compiling For Multiple Architectures |
||||
==================================== |
||||
|
||||
You can compile the package for more than one kind of computer at the |
||||
same time, by placing the object files for each architecture in their |
||||
own directory. To do this, you must use a version of `make' that |
||||
supports the `VPATH' variable, such as GNU `make'. `cd' to the |
||||
own directory. To do this, you can use GNU 'make'. 'cd' to the |
||||
directory where you want the object files and executables to go and run |
||||
the `configure' script. `configure' automatically checks for the |
||||
source code in the directory that `configure' is in and in `..'. |
||||
the 'configure' script. 'configure' automatically checks for the source |
||||
code in the directory that 'configure' is in and in '..'. This is known |
||||
as a "VPATH" build. |
||||
|
||||
With a non-GNU 'make', it is safer to compile the package for one |
||||
architecture at a time in the source code directory. After you have |
||||
installed the package for one architecture, use 'make distclean' before |
||||
reconfiguring for another architecture. |
||||
|
||||
On MacOS X 10.5 and later systems, you can create libraries and |
||||
executables that work on multiple system types--known as "fat" or |
||||
"universal" binaries--by specifying multiple '-arch' options to the |
||||
compiler but only a single '-arch' option to the preprocessor. Like |
||||
this: |
||||
|
||||
./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ |
||||
CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ |
||||
CPP="gcc -E" CXXCPP="g++ -E" |
||||
|
||||
If you have to use a `make' that does not supports the `VPATH' |
||||
variable, you have to compile the package for one architecture at a time |
||||
in the source code directory. After you have installed the package for |
||||
one architecture, use `make distclean' before reconfiguring for another |
||||
architecture. |
||||
This is not guaranteed to produce working output in all cases, you |
||||
may have to build one architecture at a time and combine the results |
||||
using the 'lipo' tool if you have problems. |
||||
|
||||
Installation Names |
||||
================== |
||||
|
||||
By default, `make install' will install the package's files in |
||||
`/usr/local/bin', `/usr/local/man', etc. You can specify an |
||||
installation prefix other than `/usr/local' by giving `configure' the |
||||
option `--prefix=PATH'. |
||||
By default, 'make install' installs the package's commands under |
||||
'/usr/local/bin', include files under '/usr/local/include', etc. You |
||||
can specify an installation prefix other than '/usr/local' by giving |
||||
'configure' the option '--prefix=PREFIX', where PREFIX must be an |
||||
absolute file name. |
||||
|
||||
You can specify separate installation prefixes for |
||||
architecture-specific files and architecture-independent files. If you |
||||
give `configure' the option `--exec-prefix=PATH', the package will use |
||||
PATH as the prefix for installing programs and libraries. |
||||
Documentation and other data files will still use the regular prefix. |
||||
pass the option '--exec-prefix=PREFIX' to 'configure', the package uses |
||||
PREFIX as the prefix for installing programs and libraries. |
||||
Documentation and other data files still use the regular prefix. |
||||
|
||||
In addition, if you use an unusual directory layout you can give |
||||
options like `--bindir=PATH' to specify different values for particular |
||||
kinds of files. Run `configure --help' for a list of the directories |
||||
you can set and what kinds of files go in them. |
||||
|
||||
If the package supports it, you can cause programs to be installed |
||||
with an extra prefix or suffix on their names by giving `configure' the |
||||
option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. |
||||
options like '--bindir=DIR' to specify different values for particular |
||||
kinds of files. Run 'configure --help' for a list of the directories |
||||
you can set and what kinds of files go in them. In general, the default |
||||
for these options is expressed in terms of '${prefix}', so that |
||||
specifying just '--prefix' will affect all of the other directory |
||||
specifications that were not explicitly provided. |
||||
|
||||
The most portable way to affect installation locations is to pass the |
||||
correct locations to 'configure'; however, many packages provide one or |
||||
both of the following shortcuts of passing variable assignments to the |
||||
'make install' command line to change installation locations without |
||||
having to reconfigure or recompile. |
||||
|
||||
The first method involves providing an override variable for each |
||||
affected directory. For example, 'make install |
||||
prefix=/alternate/directory' will choose an alternate location for all |
||||
directory configuration variables that were expressed in terms of |
||||
'${prefix}'. Any directories that were specified during 'configure', |
||||
but not in terms of '${prefix}', must each be overridden at install time |
||||
for the entire installation to be relocated. The approach of makefile |
||||
variable overrides for each directory variable is required by the GNU |
||||
Coding Standards, and ideally causes no recompilation. However, some |
||||
platforms have known limitations with the semantics of shared libraries |
||||
that end up requiring recompilation when using this method, particularly |
||||
noticeable in packages that use GNU Libtool. |
||||
|
||||
The second method involves providing the 'DESTDIR' variable. For |
||||
example, 'make install DESTDIR=/alternate/directory' will prepend |
||||
'/alternate/directory' before all installation names. The approach of |
||||
'DESTDIR' overrides is not required by the GNU Coding Standards, and |
||||
does not work on platforms that have drive letters. On the other hand, |
||||
it does better at avoiding recompilation issues, and works well even |
||||
when some directory options were not specified in terms of '${prefix}' |
||||
at 'configure' time. |
||||
|
||||
Optional Features |
||||
================= |
||||
|
||||
Some packages pay attention to `--enable-FEATURE' options to |
||||
`configure', where FEATURE indicates an optional part of the package. |
||||
They may also pay attention to `--with-PACKAGE' options, where PACKAGE |
||||
is something like `gnu-as' or `x' (for the X Window System). The |
||||
`README' should mention any `--enable-' and `--with-' options that the |
||||
If the package supports it, you can cause programs to be installed |
||||
with an extra prefix or suffix on their names by giving 'configure' the |
||||
option '--program-prefix=PREFIX' or '--program-suffix=SUFFIX'. |
||||
|
||||
Some packages pay attention to '--enable-FEATURE' options to |
||||
'configure', where FEATURE indicates an optional part of the package. |
||||
They may also pay attention to '--with-PACKAGE' options, where PACKAGE |
||||
is something like 'gnu-as' or 'x' (for the X Window System). The |
||||
'README' should mention any '--enable-' and '--with-' options that the |
||||
package recognizes. |
||||
|
||||
For packages that use the X Window System, `configure' can usually |
||||
For packages that use the X Window System, 'configure' can usually |
||||
find the X include and library files automatically, but if it doesn't, |
||||
you can use the `configure' options `--x-includes=DIR' and |
||||
`--x-libraries=DIR' to specify their locations. |
||||
you can use the 'configure' options '--x-includes=DIR' and |
||||
'--x-libraries=DIR' to specify their locations. |
||||
|
||||
Some packages offer the ability to configure how verbose the |
||||
execution of 'make' will be. For these packages, running './configure |
||||
--enable-silent-rules' sets the default to minimal output, which can be |
||||
overridden with 'make V=1'; while running './configure |
||||
--disable-silent-rules' sets the default to verbose, which can be |
||||
overridden with 'make V=0'. |
||||
|
||||
Particular systems |
||||
================== |
||||
|
||||
On HP-UX, the default C compiler is not ANSI C compatible. If GNU CC |
||||
is not installed, it is recommended to use the following options in |
||||
order to use an ANSI C compiler: |
||||
|
||||
./configure CC="cc -Ae -D_XOPEN_SOURCE=500" |
||||
|
||||
and if that doesn't work, install pre-built binaries of GCC for HP-UX. |
||||
|
||||
HP-UX 'make' updates targets which have the same timestamps as their |
||||
prerequisites, which makes it generally unusable when shipped generated |
||||
files such as 'configure' are involved. Use GNU 'make' instead. |
||||
|
||||
On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot |
||||
parse its '<wchar.h>' header file. The option '-nodtk' can be used as a |
||||
workaround. If GNU CC is not installed, it is therefore recommended to |
||||
try |
||||
|
||||
./configure CC="cc" |
||||
|
||||
and if that doesn't work, try |
||||
|
||||
./configure CC="cc -nodtk" |
||||
|
||||
On Solaris, don't put '/usr/ucb' early in your 'PATH'. This |
||||
directory contains several dysfunctional programs; working variants of |
||||
these programs are available in '/usr/bin'. So, if you need '/usr/ucb' |
||||
in your 'PATH', put it _after_ '/usr/bin'. |
||||
|
||||
On Haiku, software installed for all users goes in '/boot/common', |
||||
not '/usr/local'. It is recommended to use the following options: |
||||
|
||||
./configure --prefix=/boot/common |
||||
|
||||
Specifying the System Type |
||||
========================== |
||||
|
||||
There may be some features `configure' can not figure out |
||||
automatically, but needs to determine by the type of host the package |
||||
will run on. Usually `configure' can figure that out, but if it prints |
||||
a message saying it can not guess the host type, give it the |
||||
`--host=TYPE' option. TYPE can either be a short name for the system |
||||
type, such as `sun4', or a canonical name with three fields: |
||||
There may be some features 'configure' cannot figure out |
||||
automatically, but needs to determine by the type of machine the package |
||||
will run on. Usually, assuming the package is built to be run on the |
||||
_same_ architectures, 'configure' can figure that out, but if it prints |
||||
a message saying it cannot guess the machine type, give it the |
||||
'--build=TYPE' option. TYPE can either be a short name for the system |
||||
type, such as 'sun4', or a canonical name which has the form: |
||||
|
||||
CPU-COMPANY-SYSTEM |
||||
|
||||
See the file `config.sub' for the possible values of each field. If |
||||
`config.sub' isn't included in this package, then this package doesn't |
||||
need to know the host type. |
||||
where SYSTEM can have one of these forms: |
||||
|
||||
OS |
||||
KERNEL-OS |
||||
|
||||
See the file 'config.sub' for the possible values of each field. If |
||||
'config.sub' isn't included in this package, then this package doesn't |
||||
need to know the machine type. |
||||
|
||||
If you are building compiler tools for cross-compiling, you can also |
||||
use the `--target=TYPE' option to select the type of system they will |
||||
produce code for and the `--build=TYPE' option to select the type of |
||||
system on which you are compiling the package. |
||||
If you are _building_ compiler tools for cross-compiling, you should |
||||
use the option '--target=TYPE' to select the type of system they will |
||||
produce code for. |
||||
|
||||
If you want to _use_ a cross compiler, that generates code for a |
||||
platform different from the build platform, you should specify the |
||||
"host" platform (i.e., that on which the generated programs will |
||||
eventually be run) with '--host=TYPE'. |
||||
|
||||
Sharing Defaults |
||||
================ |
||||
|
||||
If you want to set default values for `configure' scripts to share, |
||||
you can create a site shell script called `config.site' that gives |
||||
default values for variables like `CC', `cache_file', and `prefix'. |
||||
`configure' looks for `PREFIX/share/config.site' if it exists, then |
||||
`PREFIX/etc/config.site' if it exists. Or, you can set the |
||||
`CONFIG_SITE' environment variable to the location of the site script. |
||||
A warning: not all `configure' scripts look for a site script. |
||||
If you want to set default values for 'configure' scripts to share, |
||||
you can create a site shell script called 'config.site' that gives |
||||
default values for variables like 'CC', 'cache_file', and 'prefix'. |
||||
'configure' looks for 'PREFIX/share/config.site' if it exists, then |
||||
'PREFIX/etc/config.site' if it exists. Or, you can set the |
||||
'CONFIG_SITE' environment variable to the location of the site script. |
||||
A warning: not all 'configure' scripts look for a site script. |
||||
|
||||
Operation Controls |
||||
Defining Variables |
||||
================== |
||||
|
||||
`configure' recognizes the following options to control how it |
||||
Variables not defined in a site shell script can be set in the |
||||
environment passed to 'configure'. However, some packages may run |
||||
configure again during the build, and the customized values of these |
||||
variables may be lost. In order to avoid this problem, you should set |
||||
them in the 'configure' command line, using 'VAR=value'. For example: |
||||
|
||||
./configure CC=/usr/local2/bin/gcc |
||||
|
||||
causes the specified 'gcc' to be used as the C compiler (unless it is |
||||
overridden in the site shell script). |
||||
|
||||
Unfortunately, this technique does not work for 'CONFIG_SHELL' due to an |
||||
Autoconf limitation. Until the limitation is lifted, you can use this |
||||
workaround: |
||||
|
||||
CONFIG_SHELL=/bin/bash ./configure CONFIG_SHELL=/bin/bash |
||||
|
||||
'configure' Invocation |
||||
====================== |
||||
|
||||
'configure' recognizes the following options to control how it |
||||
operates. |
||||
|
||||
`--cache-file=FILE' |
||||
Use and save the results of the tests in FILE instead of |
||||
`./config.cache'. Set FILE to `/dev/null' to disable caching, for |
||||
debugging `configure'. |
||||
'--help' |
||||
'-h' |
||||
Print a summary of all of the options to 'configure', and exit. |
||||
|
||||
`--help' |
||||
Print a summary of the options to `configure', and exit. |
||||
'--help=short' |
||||
'--help=recursive' |
||||
Print a summary of the options unique to this package's |
||||
'configure', and exit. The 'short' variant lists options used only |
||||
in the top level, while the 'recursive' variant lists options also |
||||
present in any nested packages. |
||||
|
||||
`--quiet' |
||||
`--silent' |
||||
`-q' |
||||
'--version' |
||||
'-V' |
||||
Print the version of Autoconf used to generate the 'configure' |
||||
script, and exit. |
||||
|
||||
'--cache-file=FILE' |
||||
Enable the cache: use and save the results of the tests in FILE, |
||||
traditionally 'config.cache'. FILE defaults to '/dev/null' to |
||||
disable caching. |
||||
|
||||
'--config-cache' |
||||
'-C' |
||||
Alias for '--cache-file=config.cache'. |
||||
|
||||
'--quiet' |
||||
'--silent' |
||||
'-q' |
||||
Do not print messages saying which checks are being made. To |
||||
suppress all normal output, redirect it to `/dev/null' (any error |
||||
suppress all normal output, redirect it to '/dev/null' (any error |
||||
messages will still be shown). |
||||
|
||||
`--srcdir=DIR' |
||||
'--srcdir=DIR' |
||||
Look for the package's source code in directory DIR. Usually |
||||
`configure' can determine that directory automatically. |
||||
'configure' can determine that directory automatically. |
||||
|
||||
`--version' |
||||
Print the version of Autoconf used to generate the `configure' |
||||
script, and exit. |
||||
'--prefix=DIR' |
||||
Use DIR as the installation prefix. *note Installation Names:: for |
||||
more details, including other options available for fine-tuning the |
||||
installation locations. |
||||
|
||||
`configure' also accepts some other, not widely useful, options. |
||||
'--no-create' |
||||
'-n' |
||||
Run the configure checks, but stop before creating any output |
||||
files. |
||||
|
||||
'configure' also accepts some other, not widely useful, options. Run |
||||
'configure --help' for more details. |
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,348 @@ |
||||
#! /bin/sh |
||||
# Wrapper for compilers which do not understand '-c -o'. |
||||
|
||||
scriptversion=2018-03-07.03; # UTC |
||||
|
||||
# Copyright (C) 1999-2021 Free Software Foundation, Inc. |
||||
# Written by Tom Tromey <tromey@cygnus.com>. |
||||
# |
||||
# This program is free software; you can redistribute it and/or modify |
||||
# it under the terms of the GNU General Public License as published by |
||||
# the Free Software Foundation; either version 2, or (at your option) |
||||
# any later version. |
||||
# |
||||
# This program is distributed in the hope that it will be useful, |
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
# GNU General Public License for more details. |
||||
# |
||||
# You should have received a copy of the GNU General Public License |
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>. |
||||
|
||||
# As a special exception to the GNU General Public License, if you |
||||
# distribute this file as part of a program that contains a |
||||
# configuration script generated by Autoconf, you may include it under |
||||
# the same distribution terms that you use for the rest of that program. |
||||
|
||||
# This file is maintained in Automake, please report |
||||
# bugs to <bug-automake@gnu.org> or send patches to |
||||
# <automake-patches@gnu.org>. |
||||
|
||||
nl=' |
||||
' |
||||
|
||||
# We need space, tab and new line, in precisely that order. Quoting is |
||||
# there to prevent tools from complaining about whitespace usage. |
||||
IFS=" "" $nl" |
||||
|
||||
file_conv= |
||||
|
||||
# func_file_conv build_file lazy |
||||
# Convert a $build file to $host form and store it in $file |
||||
# Currently only supports Windows hosts. If the determined conversion |
||||
# type is listed in (the comma separated) LAZY, no conversion will |
||||
# take place. |
||||
func_file_conv () |
||||
{ |
||||
file=$1 |
||||
case $file in |
||||
/ | /[!/]*) # absolute file, and not a UNC file |
||||
if test -z "$file_conv"; then |
||||
# lazily determine how to convert abs files |
||||
case `uname -s` in |
||||
MINGW*) |
||||
file_conv=mingw |
||||
;; |
||||
CYGWIN* | MSYS*) |
||||
file_conv=cygwin |
||||
;; |
||||
*) |
||||
file_conv=wine |
||||
;; |
||||
esac |
||||
fi |
||||
case $file_conv/,$2, in |
||||
*,$file_conv,*) |
||||
;; |
||||
mingw/*) |
||||
file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` |
||||
;; |
||||
cygwin/* | msys/*) |
||||
file=`cygpath -m "$file" || echo "$file"` |
||||
;; |
||||
wine/*) |
||||
file=`winepath -w "$file" || echo "$file"` |
||||
;; |
||||
esac |
||||
;; |
||||
esac |
||||
} |
||||
|
||||
# func_cl_dashL linkdir |
||||
# Make cl look for libraries in LINKDIR |
||||
func_cl_dashL () |
||||
{ |
||||
func_file_conv "$1" |
||||
if test -z "$lib_path"; then |
||||
lib_path=$file |
||||
else |
||||
lib_path="$lib_path;$file" |
||||
fi |
||||
linker_opts="$linker_opts -LIBPATH:$file" |
||||
} |
||||
|
||||
# func_cl_dashl library |
||||
# Do a library search-path lookup for cl |
||||
func_cl_dashl () |
||||
{ |
||||
lib=$1 |
||||
found=no |
||||
save_IFS=$IFS |
||||
IFS=';' |
||||
for dir in $lib_path $LIB |
||||
do |
||||
IFS=$save_IFS |
||||
if $shared && test -f "$dir/$lib.dll.lib"; then |
||||
found=yes |
||||
lib=$dir/$lib.dll.lib |
||||
break |
||||
fi |
||||
if test -f "$dir/$lib.lib"; then |
||||
found=yes |
||||
lib=$dir/$lib.lib |
||||
break |
||||
fi |
||||
if test -f "$dir/lib$lib.a"; then |
||||
found=yes |
||||
lib=$dir/lib$lib.a |
||||
break |
||||
fi |
||||
done |
||||
IFS=$save_IFS |
||||
|
||||
if test "$found" != yes; then |
||||
lib=$lib.lib |
||||
fi |
||||
} |
||||
|
||||
# func_cl_wrapper cl arg... |
||||
# Adjust compile command to suit cl |
||||
func_cl_wrapper () |
||||
{ |
||||
# Assume a capable shell |
||||
lib_path= |
||||
shared=: |
||||
linker_opts= |
||||
for arg |
||||
do |
||||
if test -n "$eat"; then |
||||
eat= |
||||
else |
||||
case $1 in |
||||
-o) |
||||
# configure might choose to run compile as 'compile cc -o foo foo.c'. |
||||
eat=1 |
||||
case $2 in |
||||
*.o | *.[oO][bB][jJ]) |
||||
func_file_conv "$2" |
||||
set x "$@" -Fo"$file" |
||||
shift |
||||
;; |
||||
*) |
||||
func_file_conv "$2" |
||||
set x "$@" -Fe"$file" |
||||
shift |
||||
;; |
||||
esac |
||||
;; |
||||
-I) |
||||
eat=1 |
||||
func_file_conv "$2" mingw |
||||
set x "$@" -I"$file" |
||||
shift |
||||
;; |
||||
-I*) |
||||
func_file_conv "${1#-I}" mingw |
||||
set x "$@" -I"$file" |
||||
shift |
||||
;; |
||||
-l) |
||||
eat=1 |
||||
func_cl_dashl "$2" |
||||
set x "$@" "$lib" |
||||
shift |
||||
;; |
||||
-l*) |
||||
func_cl_dashl "${1#-l}" |
||||
set x "$@" "$lib" |
||||
shift |
||||
;; |
||||
-L) |
||||
eat=1 |
||||
func_cl_dashL "$2" |
||||
;; |
||||
-L*) |
||||
func_cl_dashL "${1#-L}" |
||||
;; |
||||
-static) |
||||
shared=false |
||||
;; |
||||
-Wl,*) |
||||
arg=${1#-Wl,} |
||||
save_ifs="$IFS"; IFS=',' |
||||
for flag in $arg; do |
||||
IFS="$save_ifs" |
||||
linker_opts="$linker_opts $flag" |
||||
done |
||||
IFS="$save_ifs" |
||||
;; |
||||
-Xlinker) |
||||
eat=1 |
||||
linker_opts="$linker_opts $2" |
||||
;; |
||||
-*) |
||||
set x "$@" "$1" |
||||
shift |
||||
;; |
||||
*.cc | *.CC | *.cxx | *.CXX | *.[cC]++) |
||||
func_file_conv "$1" |
||||
set x "$@" -Tp"$file" |
||||
shift |
||||
;; |
||||
*.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) |
||||
func_file_conv "$1" mingw |
||||
set x "$@" "$file" |
||||
shift |
||||
;; |
||||
*) |
||||
set x "$@" "$1" |
||||
shift |
||||
;; |
||||
esac |
||||
fi |
||||
shift |
||||
done |
||||
if test -n "$linker_opts"; then |
||||
linker_opts="-link$linker_opts" |
||||
fi |
||||
exec "$@" $linker_opts |
||||
exit 1 |
||||
} |
||||
|
||||
eat= |
||||
|
||||
case $1 in |
||||
'') |
||||
echo "$0: No command. Try '$0 --help' for more information." 1>&2 |
||||
exit 1; |
||||
;; |
||||
-h | --h*) |
||||
cat <<\EOF |
||||
Usage: compile [--help] [--version] PROGRAM [ARGS] |
||||
|
||||
Wrapper for compilers which do not understand '-c -o'. |
||||
Remove '-o dest.o' from ARGS, run PROGRAM with the remaining |
||||
arguments, and rename the output as expected. |
||||
|
||||
If you are trying to build a whole package this is not the |
||||
right script to run: please start by reading the file 'INSTALL'. |
||||
|
||||
Report bugs to <bug-automake@gnu.org>. |
||||
EOF |
||||
exit $? |
||||
;; |
||||
-v | --v*) |
||||
echo "compile $scriptversion" |
||||
exit $? |
||||
;; |
||||
cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \ |
||||
icl | *[/\\]icl | icl.exe | *[/\\]icl.exe ) |
||||
func_cl_wrapper "$@" # Doesn't return... |
||||
;; |
||||
esac |
||||
|
||||
ofile= |
||||
cfile= |
||||
|
||||
for arg |
||||
do |
||||
if test -n "$eat"; then |
||||
eat= |
||||
else |
||||
case $1 in |
||||
-o) |
||||
# configure might choose to run compile as 'compile cc -o foo foo.c'. |
||||
# So we strip '-o arg' only if arg is an object. |
||||
eat=1 |
||||
case $2 in |
||||
*.o | *.obj) |
||||
ofile=$2 |
||||
;; |
||||
*) |
||||
set x "$@" -o "$2" |
||||
shift |
||||
;; |
||||
esac |
||||
;; |
||||
*.c) |
||||
cfile=$1 |
||||
set x "$@" "$1" |
||||
shift |
||||
;; |
||||
*) |
||||
set x "$@" "$1" |
||||
shift |
||||
;; |
||||
esac |
||||
fi |
||||
shift |
||||
done |
||||
|
||||
if test -z "$ofile" || test -z "$cfile"; then |
||||
# If no '-o' option was seen then we might have been invoked from a |
||||
# pattern rule where we don't need one. That is ok -- this is a |
||||
# normal compilation that the losing compiler can handle. If no |
||||
# '.c' file was seen then we are probably linking. That is also |
||||
# ok. |
||||
exec "$@" |
||||
fi |
||||
|
||||
# Name of file we expect compiler to create. |
||||
cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` |
||||
|
||||
# Create the lock directory. |
||||
# Note: use '[/\\:.-]' here to ensure that we don't use the same name |
||||
# that we are using for the .o file. Also, base the name on the expected |
||||
# object file name, since that is what matters with a parallel build. |
||||
lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d |
||||
while true; do |
||||
if mkdir "$lockdir" >/dev/null 2>&1; then |
||||
break |
||||
fi |
||||
sleep 1 |
||||
done |
||||
# FIXME: race condition here if user kills between mkdir and trap. |
||||
trap "rmdir '$lockdir'; exit 1" 1 2 15 |
||||
|
||||
# Run the compile. |
||||
"$@" |
||||
ret=$? |
||||
|
||||
if test -f "$cofile"; then |
||||
test "$cofile" = "$ofile" || mv "$cofile" "$ofile" |
||||
elif test -f "${cofile}bj"; then |
||||
test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" |
||||
fi |
||||
|
||||
rmdir "$lockdir" |
||||
exit $ret |
||||
|
||||
# Local Variables: |
||||
# mode: shell-script |
||||
# sh-indentation: 2 |
||||
# eval: (add-hook 'before-save-hook 'time-stamp) |
||||
# time-stamp-start: "scriptversion=" |
||||
# time-stamp-format: "%:y-%02m-%02d.%02H" |
||||
# time-stamp-time-zone: "UTC0" |
||||
# time-stamp-end: "; # UTC" |
||||
# End: |
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,276 +1,541 @@ |
||||
#!/bin/sh |
||||
# |
||||
# install - install a program, script, or datafile |
||||
# This comes from X11R5 (mit/util/scripts/install.sh). |
||||
|
||||
scriptversion=2020-11-14.01; # UTC |
||||
|
||||
# This originates from X11R5 (mit/util/scripts/install.sh), which was |
||||
# later released in X11R6 (xc/config/util/install.sh) with the |
||||
# following copyright and license. |
||||
# |
||||
# Copyright (C) 1994 X Consortium |
||||
# |
||||
# Permission is hereby granted, free of charge, to any person obtaining a copy |
||||
# of this software and associated documentation files (the "Software"), to |
||||
# deal in the Software without restriction, including without limitation the |
||||
# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or |
||||
# sell copies of the Software, and to permit persons to whom the Software is |
||||
# furnished to do so, subject to the following conditions: |
||||
# |
||||
# Copyright 1991 by the Massachusetts Institute of Technology |
||||
# The above copyright notice and this permission notice shall be included in |
||||
# all copies or substantial portions of the Software. |
||||
# |
||||
# Permission to use, copy, modify, distribute, and sell this software and its |
||||
# documentation for any purpose is hereby granted without fee, provided that |
||||
# the above copyright notice appear in all copies and that both that |
||||
# copyright notice and this permission notice appear in supporting |
||||
# documentation, and that the name of M.I.T. not be used in advertising or |
||||
# publicity pertaining to distribution of the software without specific, |
||||
# written prior permission. M.I.T. makes no representations about the |
||||
# suitability of this software for any purpose. It is provided "as is" |
||||
# without express or implied warranty. |
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
||||
# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN |
||||
# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- |
||||
# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
||||
# |
||||
# Except as contained in this notice, the name of the X Consortium shall not |
||||
# be used in advertising or otherwise to promote the sale, use or other deal- |
||||
# ings in this Software without prior written authorization from the X Consor- |
||||
# tium. |
||||
# |
||||
# |
||||
# FSF changes to this file are in the public domain. |
||||
# |
||||
# Calling this script install-sh is preferred over install.sh, to prevent |
||||
# `make' implicit rules from creating a file called install from it |
||||
# 'make' implicit rules from creating a file called install from it |
||||
# when there is no Makefile. |
||||
# |
||||
# This script is compatible with the BSD install script, but was written |
||||
# from scratch. It can only install one file at a time, a restriction |
||||
# shared with many OS's install programs. |
||||
# from scratch. |
||||
|
||||
tab=' ' |
||||
nl=' |
||||
' |
||||
IFS=" $tab$nl" |
||||
|
||||
# set DOITPROG to echo to test this script |
||||
# Set DOITPROG to "echo" to test this script. |
||||
|
||||
# Don't use :- since 4.3BSD and earlier shells don't like it. |
||||
doit="${DOITPROG-}" |
||||
doit=${DOITPROG-} |
||||
doit_exec=${doit:-exec} |
||||
|
||||
# Put in absolute file names if you don't have them in your path; |
||||
# or use environment vars. |
||||
|
||||
# put in absolute paths if you don't have them in your path; or use env. vars. |
||||
chgrpprog=${CHGRPPROG-chgrp} |
||||
chmodprog=${CHMODPROG-chmod} |
||||
chownprog=${CHOWNPROG-chown} |
||||
cmpprog=${CMPPROG-cmp} |
||||
cpprog=${CPPROG-cp} |
||||
mkdirprog=${MKDIRPROG-mkdir} |
||||
mvprog=${MVPROG-mv} |
||||
rmprog=${RMPROG-rm} |
||||
stripprog=${STRIPPROG-strip} |
||||
|
||||
mvprog="${MVPROG-mv}" |
||||
cpprog="${CPPROG-cp}" |
||||
chmodprog="${CHMODPROG-chmod}" |
||||
chownprog="${CHOWNPROG-chown}" |
||||
chgrpprog="${CHGRPPROG-chgrp}" |
||||
stripprog="${STRIPPROG-strip}" |
||||
rmprog="${RMPROG-rm}" |
||||
mkdirprog="${MKDIRPROG-mkdir}" |
||||
posix_mkdir= |
||||
|
||||
transformbasename="" |
||||
transform_arg="" |
||||
instcmd="$mvprog" |
||||
chmodcmd="$chmodprog 0755" |
||||
chowncmd="" |
||||
chgrpcmd="" |
||||
stripcmd="" |
||||
rmcmd="$rmprog -f" |
||||
mvcmd="$mvprog" |
||||
src="" |
||||
dst="" |
||||
dir_arg="" |
||||
# Desired mode of installed file. |
||||
mode=0755 |
||||
|
||||
while [ x"$1" != x ]; do |
||||
# Create dirs (including intermediate dirs) using mode 755. |
||||
# This is like GNU 'install' as of coreutils 8.32 (2020). |
||||
mkdir_umask=22 |
||||
|
||||
backupsuffix= |
||||
chgrpcmd= |
||||
chmodcmd=$chmodprog |
||||
chowncmd= |
||||
mvcmd=$mvprog |
||||
rmcmd="$rmprog -f" |
||||
stripcmd= |
||||
|
||||
src= |
||||
dst= |
||||
dir_arg= |
||||
dst_arg= |
||||
|
||||
copy_on_change=false |
||||
is_target_a_directory=possibly |
||||
|
||||
usage="\ |
||||
Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE |
||||
or: $0 [OPTION]... SRCFILES... DIRECTORY |
||||
or: $0 [OPTION]... -t DIRECTORY SRCFILES... |
||||
or: $0 [OPTION]... -d DIRECTORIES... |
||||
|
||||
In the 1st form, copy SRCFILE to DSTFILE. |
||||
In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. |
||||
In the 4th, create DIRECTORIES. |
||||
|
||||
Options: |
||||
--help display this help and exit. |
||||
--version display version info and exit. |
||||
|
||||
-c (ignored) |
||||
-C install only if different (preserve data modification time) |
||||
-d create directories instead of installing files. |
||||
-g GROUP $chgrpprog installed files to GROUP. |
||||
-m MODE $chmodprog installed files to MODE. |
||||
-o USER $chownprog installed files to USER. |
||||
-p pass -p to $cpprog. |
||||
-s $stripprog installed files. |
||||
-S SUFFIX attempt to back up existing files, with suffix SUFFIX. |
||||
-t DIRECTORY install into DIRECTORY. |
||||
-T report an error if DSTFILE is a directory. |
||||
|
||||
Environment variables override the default commands: |
||||
CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG |
||||
RMPROG STRIPPROG |
||||
|
||||
By default, rm is invoked with -f; when overridden with RMPROG, |
||||
it's up to you to specify -f if you want it. |
||||
|
||||
If -S is not specified, no backups are attempted. |
||||
|
||||
Email bug reports to bug-automake@gnu.org. |
||||
Automake home page: https://www.gnu.org/software/automake/ |
||||
" |
||||
|
||||
while test $# -ne 0; do |
||||
case $1 in |
||||
-c) instcmd=$cpprog |
||||
shift |
||||
continue;; |
||||
-c) ;; |
||||
|
||||
-d) dir_arg=true |
||||
shift |
||||
continue;; |
||||
-C) copy_on_change=true;; |
||||
|
||||
-m) chmodcmd="$chmodprog $2" |
||||
shift |
||||
shift |
||||
continue;; |
||||
-d) dir_arg=true;; |
||||
|
||||
-g) chgrpcmd="$chgrpprog $2" |
||||
shift;; |
||||
|
||||
--help) echo "$usage"; exit $?;; |
||||
|
||||
-m) mode=$2 |
||||
case $mode in |
||||
*' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*) |
||||
echo "$0: invalid mode: $mode" >&2 |
||||
exit 1;; |
||||
esac |
||||
shift;; |
||||
|
||||
-o) chowncmd="$chownprog $2" |
||||
shift |
||||
shift |
||||
continue;; |
||||
shift;; |
||||
|
||||
-g) chgrpcmd="$chgrpprog $2" |
||||
shift |
||||
shift |
||||
continue;; |
||||
-p) cpprog="$cpprog -p";; |
||||
|
||||
-s) stripcmd=$stripprog |
||||
shift |
||||
continue;; |
||||
-s) stripcmd=$stripprog;; |
||||
|
||||
-t=*) transformarg=`echo $1 | sed 's/-t=//'` |
||||
shift |
||||
continue;; |
||||
-S) backupsuffix="$2" |
||||
shift;; |
||||
|
||||
-t) |
||||
is_target_a_directory=always |
||||
dst_arg=$2 |
||||
# Protect names problematic for 'test' and other utilities. |
||||
case $dst_arg in |
||||
-* | [=\(\)!]) dst_arg=./$dst_arg;; |
||||
esac |
||||
shift;; |
||||
|
||||
-T) is_target_a_directory=never;; |
||||
|
||||
--version) echo "$0 $scriptversion"; exit $?;; |
||||
|
||||
-b=*) transformbasename=`echo $1 | sed 's/-b=//'` |
||||
--) shift |
||||
break;; |
||||
|
||||
-*) echo "$0: invalid option: $1" >&2 |
||||
exit 1;; |
||||
|
||||
*) break;; |
||||
esac |
||||
shift |
||||
continue;; |
||||
done |
||||
|
||||
*) if [ x"$src" = x ] |
||||
then |
||||
src=$1 |
||||
else |
||||
# this colon is to work around a 386BSD /bin/sh bug |
||||
: |
||||
dst=$1 |
||||
# We allow the use of options -d and -T together, by making -d |
||||
# take the precedence; this is for compatibility with GNU install. |
||||
|
||||
if test -n "$dir_arg"; then |
||||
if test -n "$dst_arg"; then |
||||
echo "$0: target directory not allowed when installing a directory." >&2 |
||||
exit 1 |
||||
fi |
||||
shift |
||||
continue;; |
||||
fi |
||||
|
||||
if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then |
||||
# When -d is used, all remaining arguments are directories to create. |
||||
# When -t is used, the destination is already specified. |
||||
# Otherwise, the last argument is the destination. Remove it from $@. |
||||
for arg |
||||
do |
||||
if test -n "$dst_arg"; then |
||||
# $@ is not empty: it contains at least $arg. |
||||
set fnord "$@" "$dst_arg" |
||||
shift # fnord |
||||
fi |
||||
shift # arg |
||||
dst_arg=$arg |
||||
# Protect names problematic for 'test' and other utilities. |
||||
case $dst_arg in |
||||
-* | [=\(\)!]) dst_arg=./$dst_arg;; |
||||
esac |
||||
done |
||||
fi |
||||
|
||||
if [ x"$src" = x ] |
||||
then |
||||
echo "$0: no input file specified" >&2 |
||||
if test $# -eq 0; then |
||||
if test -z "$dir_arg"; then |
||||
echo "$0: no input file specified." >&2 |
||||
exit 1 |
||||
else |
||||
: |
||||
fi |
||||
# It's OK to call 'install-sh -d' without argument. |
||||
# This can happen when creating conditional directories. |
||||
exit 0 |
||||
fi |
||||
|
||||
if [ x"$dir_arg" != x ]; then |
||||
dst=$src |
||||
src="" |
||||
if test -z "$dir_arg"; then |
||||
if test $# -gt 1 || test "$is_target_a_directory" = always; then |
||||
if test ! -d "$dst_arg"; then |
||||
echo "$0: $dst_arg: Is not a directory." >&2 |
||||
exit 1 |
||||
fi |
||||
fi |
||||
fi |
||||
|
||||
if [ -d "$dst" ]; then |
||||
instcmd=: |
||||
chmodcmd="" |
||||
if test -z "$dir_arg"; then |
||||
do_exit='(exit $ret); exit $ret' |
||||
trap "ret=129; $do_exit" 1 |
||||
trap "ret=130; $do_exit" 2 |
||||
trap "ret=141; $do_exit" 13 |
||||
trap "ret=143; $do_exit" 15 |
||||
|
||||
# Set umask so as not to create temps with too-generous modes. |
||||
# However, 'strip' requires both read and write access to temps. |
||||
case $mode in |
||||
# Optimize common cases. |
||||
*644) cp_umask=133;; |
||||
*755) cp_umask=22;; |
||||
|
||||
*[0-7]) |
||||
if test -z "$stripcmd"; then |
||||
u_plus_rw= |
||||
else |
||||
u_plus_rw='% 200' |
||||
fi |
||||
cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; |
||||
*) |
||||
if test -z "$stripcmd"; then |
||||
u_plus_rw= |
||||
else |
||||
instcmd=$mkdirprog |
||||
u_plus_rw=,u+rw |
||||
fi |
||||
cp_umask=$mode$u_plus_rw;; |
||||
esac |
||||
fi |
||||
|
||||
for src |
||||
do |
||||
# Protect names problematic for 'test' and other utilities. |
||||
case $src in |
||||
-* | [=\(\)!]) src=./$src;; |
||||
esac |
||||
|
||||
if test -n "$dir_arg"; then |
||||
dst=$src |
||||
dstdir=$dst |
||||
test -d "$dstdir" |
||||
dstdir_status=$? |
||||
# Don't chown directories that already exist. |
||||
if test $dstdir_status = 0; then |
||||
chowncmd="" |
||||
fi |
||||
else |
||||
|
||||
# Waiting for this to be detected by the "$instcmd $src $dsttmp" command |
||||
# Waiting for this to be detected by the "$cpprog $src $dsttmp" command |
||||
# might cause directories to be created, which would be especially bad |
||||
# if $src (and thus $dsttmp) contains '*'. |
||||
if test ! -f "$src" && test ! -d "$src"; then |
||||
echo "$0: $src does not exist." >&2 |
||||
exit 1 |
||||
fi |
||||
|
||||
if [ -f "$src" ] || [ -d "$src" ] |
||||
then |
||||
: |
||||
else |
||||
echo "$0: $src does not exist" >&2 |
||||
if test -z "$dst_arg"; then |
||||
echo "$0: no destination specified." >&2 |
||||
exit 1 |
||||
fi |
||||
dst=$dst_arg |
||||
|
||||
if [ x"$dst" = x ] |
||||
then |
||||
echo "$0: no destination specified" >&2 |
||||
# If destination is a directory, append the input filename. |
||||
if test -d "$dst"; then |
||||
if test "$is_target_a_directory" = never; then |
||||
echo "$0: $dst_arg: Is a directory" >&2 |
||||
exit 1 |
||||
fi |
||||
dstdir=$dst |
||||
dstbase=`basename "$src"` |
||||
case $dst in |
||||
*/) dst=$dst$dstbase;; |
||||
*) dst=$dst/$dstbase;; |
||||
esac |
||||
dstdir_status=0 |
||||
else |
||||
: |
||||
dstdir=`dirname "$dst"` |
||||
test -d "$dstdir" |
||||
dstdir_status=$? |
||||
fi |
||||
fi |
||||
|
||||
case $dstdir in |
||||
*/) dstdirslash=$dstdir;; |
||||
*) dstdirslash=$dstdir/;; |
||||
esac |
||||
|
||||
# If destination is a directory, append the input filename; if your system |
||||
# does not like double slashes in filenames, you may need to add some logic |
||||
obsolete_mkdir_used=false |
||||
|
||||
if [ -d "$dst" ] |
||||
then |
||||
dst=$dst/`basename "$src"` |
||||
if test $dstdir_status != 0; then |
||||
case $posix_mkdir in |
||||
'') |
||||
# With -d, create the new directory with the user-specified mode. |
||||
# Otherwise, rely on $mkdir_umask. |
||||
if test -n "$dir_arg"; then |
||||
mkdir_mode=-m$mode |
||||
else |
||||
: |
||||
mkdir_mode= |
||||
fi |
||||
|
||||
posix_mkdir=false |
||||
# The $RANDOM variable is not portable (e.g., dash). Use it |
||||
# here however when possible just to lower collision chance. |
||||
tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ |
||||
|
||||
trap ' |
||||
ret=$? |
||||
rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null |
||||
exit $ret |
||||
' 0 |
||||
|
||||
# Because "mkdir -p" follows existing symlinks and we likely work |
||||
# directly in world-writeable /tmp, make sure that the '$tmpdir' |
||||
# directory is successfully created first before we actually test |
||||
# 'mkdir -p'. |
||||
if (umask $mkdir_umask && |
||||
$mkdirprog $mkdir_mode "$tmpdir" && |
||||
exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1 |
||||
then |
||||
if test -z "$dir_arg" || { |
||||
# Check for POSIX incompatibilities with -m. |
||||
# HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or |
||||
# other-writable bit of parent directory when it shouldn't. |
||||
# FreeBSD 6.1 mkdir -m -p sets mode of existing directory. |
||||
test_tmpdir="$tmpdir/a" |
||||
ls_ld_tmpdir=`ls -ld "$test_tmpdir"` |
||||
case $ls_ld_tmpdir in |
||||
d????-?r-*) different_mode=700;; |
||||
d????-?--*) different_mode=755;; |
||||
*) false;; |
||||
esac && |
||||
$mkdirprog -m$different_mode -p -- "$test_tmpdir" && { |
||||
ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"` |
||||
test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" |
||||
} |
||||
} |
||||
then posix_mkdir=: |
||||
fi |
||||
rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" |
||||
else |
||||
# Remove any dirs left behind by ancient mkdir implementations. |
||||
rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null |
||||
fi |
||||
trap '' 0;; |
||||
esac |
||||
|
||||
## this sed command emulates the dirname command |
||||
dstdir=`echo "$dst" | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` |
||||
if |
||||
$posix_mkdir && ( |
||||
umask $mkdir_umask && |
||||
$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" |
||||
) |
||||
then : |
||||
else |
||||
|
||||
# Make sure that the destination directory exists. |
||||
# this part is taken from Noah Friedman's mkinstalldirs script |
||||
# mkdir does not conform to POSIX, |
||||
# or it failed possibly due to a race condition. Create the |
||||
# directory the slow way, step by step, checking for races as we go. |
||||
|
||||
# Skip lots of stat calls in the usual case. |
||||
if [ ! -d "$dstdir" ]; then |
||||
defaultIFS=' |
||||
' |
||||
IFS="${IFS-$defaultIFS}" |
||||
case $dstdir in |
||||
/*) prefix='/';; |
||||
[-=\(\)!]*) prefix='./';; |
||||
*) prefix='';; |
||||
esac |
||||
|
||||
oIFS=$IFS |
||||
# Some sh's can't handle IFS=/ for some reason. |
||||
IFS='%' |
||||
set - `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'` |
||||
IFS=/ |
||||
set -f |
||||
set fnord $dstdir |
||||
shift |
||||
set +f |
||||
IFS=$oIFS |
||||
|
||||
pathcomp='' |
||||
prefixes= |
||||
|
||||
while [ $# -ne 0 ] ; do |
||||
pathcomp=$pathcomp$1 |
||||
shift |
||||
for d |
||||
do |
||||
test X"$d" = X && continue |
||||
|
||||
if [ ! -d "$pathcomp" ] ; |
||||
then |
||||
$mkdirprog "$pathcomp" |
||||
prefix=$prefix$d |
||||
if test -d "$prefix"; then |
||||
prefixes= |
||||
else |
||||
if $posix_mkdir; then |
||||
(umask $mkdir_umask && |
||||
$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break |
||||
# Don't fail if two instances are running concurrently. |
||||
test -d "$prefix" || exit 1 |
||||
else |
||||
: |
||||
case $prefix in |
||||
*\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; |
||||
*) qprefix=$prefix;; |
||||
esac |
||||
prefixes="$prefixes '$qprefix'" |
||||
fi |
||||
|
||||
pathcomp=$pathcomp/ |
||||
done |
||||
fi |
||||
prefix=$prefix/ |
||||
done |
||||
|
||||
if [ x"$dir_arg" != x ] |
||||
then |
||||
$doit $instcmd "$dst" && |
||||
if test -n "$prefixes"; then |
||||
# Don't fail if two instances are running concurrently. |
||||
(umask $mkdir_umask && |
||||
eval "\$doit_exec \$mkdirprog $prefixes") || |
||||
test -d "$dstdir" || exit 1 |
||||
obsolete_mkdir_used=true |
||||
fi |
||||
fi |
||||
fi |
||||
|
||||
if [ x"$chowncmd" != x ]; then $doit $chowncmd "$dst"; else : ; fi && |
||||
if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "$dst"; else : ; fi && |
||||
if [ x"$stripcmd" != x ]; then $doit $stripcmd "$dst"; else : ; fi && |
||||
if [ x"$chmodcmd" != x ]; then $doit $chmodcmd "$dst"; else : ; fi |
||||
if test -n "$dir_arg"; then |
||||
{ test -z "$chowncmd" || $doit $chowncmd "$dst"; } && |
||||
{ test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && |
||||
{ test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || |
||||
test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 |
||||
else |
||||
|
||||
# If we're going to rename the final executable, determine the name now. |
||||
|
||||
if [ x"$transformarg" = x ] |
||||
then |
||||
dstfile=`basename "$dst"` |
||||
# Make a couple of temp file names in the proper directory. |
||||
dsttmp=${dstdirslash}_inst.$$_ |
||||
rmtmp=${dstdirslash}_rm.$$_ |
||||
|
||||
# Trap to clean up those temp files at exit. |
||||
trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 |
||||
|
||||
# Copy the file name to the temp name. |
||||
(umask $cp_umask && |
||||
{ test -z "$stripcmd" || { |
||||
# Create $dsttmp read-write so that cp doesn't create it read-only, |
||||
# which would cause strip to fail. |
||||
if test -z "$doit"; then |
||||
: >"$dsttmp" # No need to fork-exec 'touch'. |
||||
else |
||||
dstfile=`basename "$dst" $transformbasename | |
||||
sed $transformarg`$transformbasename |
||||
$doit touch "$dsttmp" |
||||
fi |
||||
} |
||||
} && |
||||
$doit_exec $cpprog "$src" "$dsttmp") && |
||||
|
||||
# don't allow the sed command to completely eliminate the filename |
||||
|
||||
if [ x"$dstfile" = x ] |
||||
# and set any options; do chmod last to preserve setuid bits. |
||||
# |
||||
# If any of these fail, we abort the whole thing. If we want to |
||||
# ignore errors from any of these, just make sure not to ignore |
||||
# errors from the above "$doit $cpprog $src $dsttmp" command. |
||||
# |
||||
{ test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && |
||||
{ test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && |
||||
{ test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && |
||||
{ test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && |
||||
|
||||
# If -C, don't bother to copy if it wouldn't change the file. |
||||
if $copy_on_change && |
||||
old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && |
||||
new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && |
||||
set -f && |
||||
set X $old && old=:$2:$4:$5:$6 && |
||||
set X $new && new=:$2:$4:$5:$6 && |
||||
set +f && |
||||
test "$old" = "$new" && |
||||
$cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 |
||||
then |
||||
dstfile=`basename "$dst"` |
||||
rm -f "$dsttmp" |
||||
else |
||||
: |
||||
# If $backupsuffix is set, and the file being installed |
||||
# already exists, attempt a backup. Don't worry if it fails, |
||||
# e.g., if mv doesn't support -f. |
||||
if test -n "$backupsuffix" && test -f "$dst"; then |
||||
$doit $mvcmd -f "$dst" "$dst$backupsuffix" 2>/dev/null |
||||
fi |
||||
|
||||
# Make a couple of temp file names in the proper directory. |
||||
|
||||
dsttmp=$dstdir/#inst.$$# |
||||
rmtmp=$dstdir/#rm.$$# |
||||
|
||||
# Trap to clean up temp files at exit. |
||||
|
||||
trap 'status=$?; rm -f "$dsttmp" "$rmtmp" && exit $status' 0 |
||||
trap '(exit $?); exit' 1 2 13 15 |
||||
|
||||
# Move or copy the file name to the temp name |
||||
|
||||
$doit $instcmd "$src" "$dsttmp" && |
||||
|
||||
# and set any options; do chmod last to preserve setuid bits |
||||
|
||||
# If any of these fail, we abort the whole thing. If we want to |
||||
# ignore errors from any of these, just make sure not to ignore |
||||
# errors from the above "$doit $instcmd $src $dsttmp" command. |
||||
|
||||
if [ x"$chowncmd" != x ]; then $doit $chowncmd "$dsttmp"; else :;fi && |
||||
if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "$dsttmp"; else :;fi && |
||||
if [ x"$stripcmd" != x ]; then $doit $stripcmd "$dsttmp"; else :;fi && |
||||
if [ x"$chmodcmd" != x ]; then $doit $chmodcmd "$dsttmp"; else :;fi && |
||||
|
||||
# Now remove or move aside any old file at destination location. We try this |
||||
# two ways since rm can't unlink itself on some systems and the destination |
||||
# file might be busy for other reasons. In this case, the final cleanup |
||||
# might fail but the new file should still install successfully. |
||||
# Rename the file to the real destination. |
||||
$doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || |
||||
|
||||
# The rename failed, perhaps because mv can't rename something else |
||||
# to itself, or perhaps because mv is so ancient that it does not |
||||
# support -f. |
||||
{ |
||||
if [ -f "$dstdir/$dstfile" ] |
||||
then |
||||
$doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null || |
||||
$doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null || |
||||
# Now remove or move aside any old file at destination location. |
||||
# We try this two ways since rm can't unlink itself on some |
||||
# systems and the destination file might be busy for other |
||||
# reasons. In this case, the final cleanup might fail but the new |
||||
# file should still install successfully. |
||||
{ |
||||
echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2 |
||||
(exit 1); exit |
||||
test ! -f "$dst" || |
||||
$doit $rmcmd "$dst" 2>/dev/null || |
||||
{ $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && |
||||
{ $doit $rmcmd "$rmtmp" 2>/dev/null; :; } |
||||
} || |
||||
{ echo "$0: cannot unlink or rename $dst" >&2 |
||||
(exit 1); exit 1 |
||||
} |
||||
else |
||||
: |
||||
fi |
||||
} && |
||||
|
||||
# Now rename the file to the real destination. |
||||
$doit $mvcmd "$dsttmp" "$dst" |
||||
} |
||||
fi || exit 1 |
||||
|
||||
$doit $mvcmd "$dsttmp" "$dstdir/$dstfile" |
||||
|
||||
fi && |
||||
|
||||
# The final little trick to "correctly" pass the exit status to the exit trap. |
||||
trap '' 0 |
||||
fi |
||||
done |
||||
|
||||
{ |
||||
(exit 0); exit |
||||
} |
||||
# Local variables: |
||||
# eval: (add-hook 'before-save-hook 'time-stamp) |
||||
# time-stamp-start: "scriptversion=" |
||||
# time-stamp-format: "%:y-%02m-%02d.%02H" |
||||
# time-stamp-time-zone: "UTC0" |
||||
# time-stamp-end: "; # UTC" |
||||
# End: |
||||
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in new issue