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 |
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 |
various system-dependent variables used during compilation. It uses |
||||||
those values to create a `Makefile' in each directory of the package. |
those values to create a 'Makefile' in each directory of the package. |
||||||
It may also create one or more `.h' files containing system-dependent |
It may also create one or more '.h' files containing system-dependent |
||||||
definitions. Finally, it creates a shell script `config.status' that |
definitions. Finally, it creates a shell script 'config.status' that |
||||||
you can run in the future to recreate the current configuration, a file |
you can run in the future to recreate the current configuration, and a |
||||||
`config.cache' that saves the results of its tests to speed up |
file 'config.log' containing compiler output (useful mainly for |
||||||
reconfiguring, and a file `config.log' containing compiler output |
debugging 'configure'). |
||||||
(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 |
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 |
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 |
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' |
be considered for the next release. If you are using the cache, and at |
||||||
contains results you don't want to keep, you may remove or edit it. |
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 |
The file 'configure.ac' (or 'configure.in') is used to create |
||||||
it or regenerate `configure' using a newer version of `autoconf'. |
'configure' by a program called 'autoconf'. You need 'configure.ac' if |
||||||
|
you want to change it or regenerate 'configure' using a newer version of |
||||||
The simplest way to compile this package is: |
'autoconf'. |
||||||
|
|
||||||
1. `cd' to the directory containing the package's source code and type |
The simplest way to compile this package is: |
||||||
`./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 |
1. 'cd' to the directory containing the package's source code and type |
||||||
`sh ./configure' instead to prevent `csh' from trying to execute |
'./configure' to configure the package for your system. |
||||||
`configure' itself. |
|
||||||
|
Running 'configure' might take a while. While running, it prints |
||||||
Running `configure' takes awhile. While running, it prints some |
some messages telling which features it is checking for. |
||||||
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 |
||||||
3. Optionally, type `make check' to run any self-tests that come with |
the package, generally using the just-built uninstalled binaries. |
||||||
the package. |
|
||||||
|
4. Type 'make install' to install the programs and any data files and |
||||||
4. Type `make install' to install the programs and any data files and |
documentation. When installing into a prefix owned by root, it is |
||||||
documentation. |
recommended that the package be configured and built as a regular |
||||||
|
user, and only the 'make install' phase executed with root |
||||||
5. You can remove the program binaries and object files from the |
privileges. |
||||||
source code directory by typing `make clean'. To also remove the |
|
||||||
files that `configure' created (so you can compile the package for |
5. Optionally, type 'make installcheck' to repeat any self-tests, but |
||||||
a different kind of computer), type `make distclean'. There is |
this time using the binaries in their final installed location. |
||||||
also a `make maintainer-clean' target, but that is intended mainly |
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 |
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 |
all sorts of other programs in order to regenerate files that came |
||||||
with the distribution. |
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 |
Compilers and Options |
||||||
===================== |
===================== |
||||||
|
|
||||||
Some systems require unusual options for compilation or linking that |
Some systems require unusual options for compilation or linking that |
||||||
the `configure' script does not know about. You can give `configure' |
the 'configure' script does not know about. Run './configure --help' |
||||||
initial values for variables by setting them in the environment. Using |
for details on some of the pertinent environment variables. |
||||||
a Bourne-compatible shell, you can do that on the command line like |
|
||||||
this: |
You can give 'configure' initial values for configuration parameters |
||||||
CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure |
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: |
*Note Defining Variables::, for more details. |
||||||
env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure |
|
||||||
|
|
||||||
Compiling For Multiple Architectures |
Compiling For Multiple Architectures |
||||||
==================================== |
==================================== |
||||||
|
|
||||||
You can compile the package for more than one kind of computer at the |
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 |
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 |
own directory. To do this, you can use GNU 'make'. 'cd' to the |
||||||
supports the `VPATH' variable, such as GNU `make'. `cd' to the |
|
||||||
directory where you want the object files and executables to go and run |
directory where you want the object files and executables to go and run |
||||||
the `configure' script. `configure' automatically checks for the |
the 'configure' script. 'configure' automatically checks for the source |
||||||
source code in the directory that `configure' is in and in `..'. |
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' |
This is not guaranteed to produce working output in all cases, you |
||||||
variable, you have to compile the package for one architecture at a time |
may have to build one architecture at a time and combine the results |
||||||
in the source code directory. After you have installed the package for |
using the 'lipo' tool if you have problems. |
||||||
one architecture, use `make distclean' before reconfiguring for another |
|
||||||
architecture. |
|
||||||
|
|
||||||
Installation Names |
Installation Names |
||||||
================== |
================== |
||||||
|
|
||||||
By default, `make install' will install the package's files in |
By default, 'make install' installs the package's commands under |
||||||
`/usr/local/bin', `/usr/local/man', etc. You can specify an |
'/usr/local/bin', include files under '/usr/local/include', etc. You |
||||||
installation prefix other than `/usr/local' by giving `configure' the |
can specify an installation prefix other than '/usr/local' by giving |
||||||
option `--prefix=PATH'. |
'configure' the option '--prefix=PREFIX', where PREFIX must be an |
||||||
|
absolute file name. |
||||||
|
|
||||||
You can specify separate installation prefixes for |
You can specify separate installation prefixes for |
||||||
architecture-specific files and architecture-independent files. If you |
architecture-specific files and architecture-independent files. If you |
||||||
give `configure' the option `--exec-prefix=PATH', the package will use |
pass the option '--exec-prefix=PREFIX' to 'configure', the package uses |
||||||
PATH as the prefix for installing programs and libraries. |
PREFIX as the prefix for installing programs and libraries. |
||||||
Documentation and other data files will still use the regular prefix. |
Documentation and other data files still use the regular prefix. |
||||||
|
|
||||||
In addition, if you use an unusual directory layout you can give |
In addition, if you use an unusual directory layout you can give |
||||||
options like `--bindir=PATH' to specify different values for particular |
options like '--bindir=DIR' to specify different values for particular |
||||||
kinds of files. Run `configure --help' for a list of the directories |
kinds of files. Run 'configure --help' for a list of the directories |
||||||
you can set and what kinds of files go in them. |
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 |
||||||
If the package supports it, you can cause programs to be installed |
specifying just '--prefix' will affect all of the other directory |
||||||
with an extra prefix or suffix on their names by giving `configure' the |
specifications that were not explicitly provided. |
||||||
option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. |
|
||||||
|
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 |
Optional Features |
||||||
================= |
================= |
||||||
|
|
||||||
Some packages pay attention to `--enable-FEATURE' options to |
If the package supports it, you can cause programs to be installed |
||||||
`configure', where FEATURE indicates an optional part of the package. |
with an extra prefix or suffix on their names by giving 'configure' the |
||||||
They may also pay attention to `--with-PACKAGE' options, where PACKAGE |
option '--program-prefix=PREFIX' or '--program-suffix=SUFFIX'. |
||||||
is something like `gnu-as' or `x' (for the X Window System). The |
|
||||||
`README' should mention any `--enable-' and `--with-' options that the |
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. |
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, |
find the X include and library files automatically, but if it doesn't, |
||||||
you can use the `configure' options `--x-includes=DIR' and |
you can use the 'configure' options '--x-includes=DIR' and |
||||||
`--x-libraries=DIR' to specify their locations. |
'--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 |
Specifying the System Type |
||||||
========================== |
========================== |
||||||
|
|
||||||
There may be some features `configure' can not figure out |
There may be some features 'configure' cannot figure out |
||||||
automatically, but needs to determine by the type of host the package |
automatically, but needs to determine by the type of machine the package |
||||||
will run on. Usually `configure' can figure that out, but if it prints |
will run on. Usually, assuming the package is built to be run on the |
||||||
a message saying it can not guess the host type, give it the |
_same_ architectures, 'configure' can figure that out, but if it prints |
||||||
`--host=TYPE' option. TYPE can either be a short name for the system |
a message saying it cannot guess the machine type, give it the |
||||||
type, such as `sun4', or a canonical name with three fields: |
'--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 |
CPU-COMPANY-SYSTEM |
||||||
|
|
||||||
See the file `config.sub' for the possible values of each field. If |
where SYSTEM can have one of these forms: |
||||||
`config.sub' isn't included in this package, then this package doesn't |
|
||||||
need to know the host type. |
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 |
If you are _building_ compiler tools for cross-compiling, you should |
||||||
use the `--target=TYPE' option to select the type of system they will |
use the option '--target=TYPE' to select the type of system they will |
||||||
produce code for and the `--build=TYPE' option to select the type of |
produce code for. |
||||||
system on which you are compiling the package. |
|
||||||
|
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 |
Sharing Defaults |
||||||
================ |
================ |
||||||
|
|
||||||
If you want to set default values for `configure' scripts to share, |
If you want to set default values for 'configure' scripts to share, |
||||||
you can create a site shell script called `config.site' that gives |
you can create a site shell script called 'config.site' that gives |
||||||
default values for variables like `CC', `cache_file', and `prefix'. |
default values for variables like 'CC', 'cache_file', and 'prefix'. |
||||||
`configure' looks for `PREFIX/share/config.site' if it exists, then |
'configure' looks for 'PREFIX/share/config.site' if it exists, then |
||||||
`PREFIX/etc/config.site' if it exists. Or, you can set the |
'PREFIX/etc/config.site' if it exists. Or, you can set the |
||||||
`CONFIG_SITE' environment variable to the location of the site script. |
'CONFIG_SITE' environment variable to the location of the site script. |
||||||
A warning: not all `configure' scripts look for a 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. |
operates. |
||||||
|
|
||||||
`--cache-file=FILE' |
'--help' |
||||||
Use and save the results of the tests in FILE instead of |
'-h' |
||||||
`./config.cache'. Set FILE to `/dev/null' to disable caching, for |
Print a summary of all of the options to 'configure', and exit. |
||||||
debugging `configure'. |
|
||||||
|
'--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. |
||||||
|
|
||||||
|
'--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. |
||||||
|
|
||||||
`--help' |
'--config-cache' |
||||||
Print a summary of the options to `configure', and exit. |
'-C' |
||||||
|
Alias for '--cache-file=config.cache'. |
||||||
|
|
||||||
`--quiet' |
'--quiet' |
||||||
`--silent' |
'--silent' |
||||||
`-q' |
'-q' |
||||||
Do not print messages saying which checks are being made. To |
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). |
messages will still be shown). |
||||||
|
|
||||||
`--srcdir=DIR' |
'--srcdir=DIR' |
||||||
Look for the package's source code in directory DIR. Usually |
Look for the package's source code in directory DIR. Usually |
||||||
`configure' can determine that directory automatically. |
'configure' can determine that directory automatically. |
||||||
|
|
||||||
`--version' |
'--prefix=DIR' |
||||||
Print the version of Autoconf used to generate the `configure' |
Use DIR as the installation prefix. *note Installation Names:: for |
||||||
script, and exit. |
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 |
#!/bin/sh |
||||||
# |
|
||||||
# install - install a program, script, or datafile |
# 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: |
||||||
|
# |
||||||
|
# The above copyright notice and this permission notice shall be included in |
||||||
|
# all copies or substantial portions of the Software. |
||||||
# |
# |
||||||
# Copyright 1991 by the Massachusetts Institute of Technology |
# 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. |
||||||
# |
# |
||||||
# Permission to use, copy, modify, distribute, and sell this software and its |
# Except as contained in this notice, the name of the X Consortium shall not |
||||||
# documentation for any purpose is hereby granted without fee, provided that |
# be used in advertising or otherwise to promote the sale, use or other deal- |
||||||
# the above copyright notice appear in all copies and that both that |
# ings in this Software without prior written authorization from the X Consor- |
||||||
# copyright notice and this permission notice appear in supporting |
# tium. |
||||||
# 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 |
# FSF changes to this file are in the public domain. |
||||||
# suitability of this software for any purpose. It is provided "as is" |
|
||||||
# without express or implied warranty. |
|
||||||
# |
# |
||||||
# Calling this script install-sh is preferred over install.sh, to prevent |
# 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. |
# when there is no Makefile. |
||||||
# |
# |
||||||
# This script is compatible with the BSD install script, but was written |
# 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 |
# from scratch. |
||||||
# shared with many OS's install programs. |
|
||||||
|
tab=' ' |
||||||
|
nl=' |
||||||
|
' |
||||||
|
IFS=" $tab$nl" |
||||||
|
|
||||||
|
# Set DOITPROG to "echo" to test this script. |
||||||
|
|
||||||
# set DOITPROG to echo to test this script |
doit=${DOITPROG-} |
||||||
|
doit_exec=${doit:-exec} |
||||||
|
|
||||||
# Don't use :- since 4.3BSD and earlier shells don't like it. |
# Put in absolute file names if you don't have them in your path; |
||||||
doit="${DOITPROG-}" |
# or use environment 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} |
||||||
|
|
||||||
# put in absolute paths if you don't have them in your path; or use env. vars. |
posix_mkdir= |
||||||
|
|
||||||
mvprog="${MVPROG-mv}" |
# Desired mode of installed file. |
||||||
cpprog="${CPPROG-cp}" |
mode=0755 |
||||||
chmodprog="${CHMODPROG-chmod}" |
|
||||||
chownprog="${CHOWNPROG-chown}" |
|
||||||
chgrpprog="${CHGRPPROG-chgrp}" |
|
||||||
stripprog="${STRIPPROG-strip}" |
|
||||||
rmprog="${RMPROG-rm}" |
|
||||||
mkdirprog="${MKDIRPROG-mkdir}" |
|
||||||
|
|
||||||
transformbasename="" |
# Create dirs (including intermediate dirs) using mode 755. |
||||||
transform_arg="" |
# This is like GNU 'install' as of coreutils 8.32 (2020). |
||||||
instcmd="$mvprog" |
mkdir_umask=22 |
||||||
chmodcmd="$chmodprog 0755" |
|
||||||
chowncmd="" |
backupsuffix= |
||||||
chgrpcmd="" |
chgrpcmd= |
||||||
stripcmd="" |
chmodcmd=$chmodprog |
||||||
|
chowncmd= |
||||||
|
mvcmd=$mvprog |
||||||
rmcmd="$rmprog -f" |
rmcmd="$rmprog -f" |
||||||
mvcmd="$mvprog" |
stripcmd= |
||||||
src="" |
|
||||||
dst="" |
|
||||||
dir_arg="" |
|
||||||
|
|
||||||
while [ x"$1" != x ]; do |
|
||||||
case $1 in |
|
||||||
-c) instcmd=$cpprog |
|
||||||
shift |
|
||||||
continue;; |
|
||||||
|
|
||||||
-d) dir_arg=true |
|
||||||
shift |
|
||||||
continue;; |
|
||||||
|
|
||||||
-m) chmodcmd="$chmodprog $2" |
|
||||||
shift |
|
||||||
shift |
|
||||||
continue;; |
|
||||||
|
|
||||||
-o) chowncmd="$chownprog $2" |
|
||||||
shift |
|
||||||
shift |
|
||||||
continue;; |
|
||||||
|
|
||||||
-g) chgrpcmd="$chgrpprog $2" |
|
||||||
shift |
|
||||||
shift |
|
||||||
continue;; |
|
||||||
|
|
||||||
-s) stripcmd=$stripprog |
|
||||||
shift |
|
||||||
continue;; |
|
||||||
|
|
||||||
-t=*) transformarg=`echo $1 | sed 's/-t=//'` |
|
||||||
shift |
|
||||||
continue;; |
|
||||||
|
|
||||||
-b=*) transformbasename=`echo $1 | sed 's/-b=//'` |
|
||||||
shift |
|
||||||
continue;; |
|
||||||
|
|
||||||
*) if [ x"$src" = x ] |
|
||||||
then |
|
||||||
src=$1 |
|
||||||
else |
|
||||||
# this colon is to work around a 386BSD /bin/sh bug |
|
||||||
: |
|
||||||
dst=$1 |
|
||||||
fi |
|
||||||
shift |
|
||||||
continue;; |
|
||||||
esac |
|
||||||
done |
|
||||||
|
|
||||||
if [ x"$src" = x ] |
src= |
||||||
then |
dst= |
||||||
echo "$0: no input file specified" >&2 |
dir_arg= |
||||||
exit 1 |
dst_arg= |
||||||
else |
|
||||||
: |
|
||||||
fi |
|
||||||
|
|
||||||
if [ x"$dir_arg" != x ]; then |
copy_on_change=false |
||||||
dst=$src |
is_target_a_directory=possibly |
||||||
src="" |
|
||||||
|
|
||||||
if [ -d "$dst" ]; then |
usage="\ |
||||||
instcmd=: |
Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE |
||||||
chmodcmd="" |
or: $0 [OPTION]... SRCFILES... DIRECTORY |
||||||
else |
or: $0 [OPTION]... -t DIRECTORY SRCFILES... |
||||||
instcmd=$mkdirprog |
or: $0 [OPTION]... -d DIRECTORIES... |
||||||
fi |
|
||||||
else |
|
||||||
|
|
||||||
# Waiting for this to be detected by the "$instcmd $src $dsttmp" command |
In the 1st form, copy SRCFILE to DSTFILE. |
||||||
# might cause directories to be created, which would be especially bad |
In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. |
||||||
# if $src (and thus $dsttmp) contains '*'. |
In the 4th, create DIRECTORIES. |
||||||
|
|
||||||
if [ -f "$src" ] || [ -d "$src" ] |
Options: |
||||||
then |
--help display this help and exit. |
||||||
: |
--version display version info and exit. |
||||||
else |
|
||||||
echo "$0: $src does not exist" >&2 |
|
||||||
exit 1 |
|
||||||
fi |
|
||||||
|
|
||||||
if [ x"$dst" = x ] |
-c (ignored) |
||||||
then |
-C install only if different (preserve data modification time) |
||||||
echo "$0: no destination specified" >&2 |
-d create directories instead of installing files. |
||||||
exit 1 |
-g GROUP $chgrpprog installed files to GROUP. |
||||||
else |
-m MODE $chmodprog installed files to MODE. |
||||||
: |
-o USER $chownprog installed files to USER. |
||||||
fi |
-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. |
||||||
|
|
||||||
# If destination is a directory, append the input filename; if your system |
Environment variables override the default commands: |
||||||
# does not like double slashes in filenames, you may need to add some logic |
CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG |
||||||
|
RMPROG STRIPPROG |
||||||
|
|
||||||
if [ -d "$dst" ] |
By default, rm is invoked with -f; when overridden with RMPROG, |
||||||
then |
it's up to you to specify -f if you want it. |
||||||
dst=$dst/`basename "$src"` |
|
||||||
else |
|
||||||
: |
|
||||||
fi |
|
||||||
fi |
|
||||||
|
|
||||||
## this sed command emulates the dirname command |
If -S is not specified, no backups are attempted. |
||||||
dstdir=`echo "$dst" | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` |
|
||||||
|
|
||||||
# Make sure that the destination directory exists. |
Email bug reports to bug-automake@gnu.org. |
||||||
# this part is taken from Noah Friedman's mkinstalldirs script |
Automake home page: https://www.gnu.org/software/automake/ |
||||||
|
" |
||||||
|
|
||||||
# Skip lots of stat calls in the usual case. |
while test $# -ne 0; do |
||||||
if [ ! -d "$dstdir" ]; then |
case $1 in |
||||||
defaultIFS=' |
-c) ;; |
||||||
' |
|
||||||
IFS="${IFS-$defaultIFS}" |
|
||||||
|
|
||||||
oIFS=$IFS |
-C) copy_on_change=true;; |
||||||
# Some sh's can't handle IFS=/ for some reason. |
|
||||||
IFS='%' |
|
||||||
set - `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'` |
|
||||||
IFS=$oIFS |
|
||||||
|
|
||||||
pathcomp='' |
-d) dir_arg=true;; |
||||||
|
|
||||||
while [ $# -ne 0 ] ; do |
-g) chgrpcmd="$chgrpprog $2" |
||||||
pathcomp=$pathcomp$1 |
shift;; |
||||||
shift |
|
||||||
|
|
||||||
if [ ! -d "$pathcomp" ] ; |
--help) echo "$usage"; exit $?;; |
||||||
then |
|
||||||
$mkdirprog "$pathcomp" |
|
||||||
else |
|
||||||
: |
|
||||||
fi |
|
||||||
|
|
||||||
pathcomp=$pathcomp/ |
-m) mode=$2 |
||||||
done |
case $mode in |
||||||
fi |
*' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*) |
||||||
|
echo "$0: invalid mode: $mode" >&2 |
||||||
|
exit 1;; |
||||||
|
esac |
||||||
|
shift;; |
||||||
|
|
||||||
if [ x"$dir_arg" != x ] |
-o) chowncmd="$chownprog $2" |
||||||
then |
shift;; |
||||||
$doit $instcmd "$dst" && |
|
||||||
|
|
||||||
if [ x"$chowncmd" != x ]; then $doit $chowncmd "$dst"; else : ; fi && |
-p) cpprog="$cpprog -p";; |
||||||
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 |
|
||||||
else |
|
||||||
|
|
||||||
# If we're going to rename the final executable, determine the name now. |
-s) stripcmd=$stripprog;; |
||||||
|
|
||||||
if [ x"$transformarg" = x ] |
-S) backupsuffix="$2" |
||||||
then |
shift;; |
||||||
dstfile=`basename "$dst"` |
|
||||||
else |
|
||||||
dstfile=`basename "$dst" $transformbasename | |
|
||||||
sed $transformarg`$transformbasename |
|
||||||
fi |
|
||||||
|
|
||||||
# don't allow the sed command to completely eliminate the filename |
-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;; |
||||||
|
|
||||||
if [ x"$dstfile" = x ] |
-T) is_target_a_directory=never;; |
||||||
then |
|
||||||
dstfile=`basename "$dst"` |
|
||||||
else |
|
||||||
: |
|
||||||
fi |
|
||||||
|
|
||||||
# Make a couple of temp file names in the proper directory. |
--version) echo "$0 $scriptversion"; exit $?;; |
||||||
|
|
||||||
dsttmp=$dstdir/#inst.$$# |
--) shift |
||||||
rmtmp=$dstdir/#rm.$$# |
break;; |
||||||
|
|
||||||
# Trap to clean up temp files at exit. |
-*) echo "$0: invalid option: $1" >&2 |
||||||
|
exit 1;; |
||||||
|
|
||||||
trap 'status=$?; rm -f "$dsttmp" "$rmtmp" && exit $status' 0 |
*) break;; |
||||||
trap '(exit $?); exit' 1 2 13 15 |
esac |
||||||
|
shift |
||||||
|
done |
||||||
|
|
||||||
# Move or copy the file name to the temp name |
# We allow the use of options -d and -T together, by making -d |
||||||
|
# take the precedence; this is for compatibility with GNU install. |
||||||
|
|
||||||
$doit $instcmd "$src" "$dsttmp" && |
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 |
||||||
|
fi |
||||||
|
|
||||||
# and set any options; do chmod last to preserve setuid bits |
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 any of these fail, we abort the whole thing. If we want to |
if test $# -eq 0; then |
||||||
# ignore errors from any of these, just make sure not to ignore |
if test -z "$dir_arg"; then |
||||||
# errors from the above "$doit $instcmd $src $dsttmp" command. |
echo "$0: no input file specified." >&2 |
||||||
|
exit 1 |
||||||
|
fi |
||||||
|
# It's OK to call 'install-sh -d' without argument. |
||||||
|
# This can happen when creating conditional directories. |
||||||
|
exit 0 |
||||||
|
fi |
||||||
|
|
||||||
if [ x"$chowncmd" != x ]; then $doit $chowncmd "$dsttmp"; else :;fi && |
if test -z "$dir_arg"; then |
||||||
if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "$dsttmp"; else :;fi && |
if test $# -gt 1 || test "$is_target_a_directory" = always; then |
||||||
if [ x"$stripcmd" != x ]; then $doit $stripcmd "$dsttmp"; else :;fi && |
if test ! -d "$dst_arg"; then |
||||||
if [ x"$chmodcmd" != x ]; then $doit $chmodcmd "$dsttmp"; else :;fi && |
echo "$0: $dst_arg: Is not a directory." >&2 |
||||||
|
exit 1 |
||||||
|
fi |
||||||
|
fi |
||||||
|
fi |
||||||
|
|
||||||
# Now remove or move aside any old file at destination location. We try this |
if test -z "$dir_arg"; then |
||||||
# two ways since rm can't unlink itself on some systems and the destination |
do_exit='(exit $ret); exit $ret' |
||||||
# file might be busy for other reasons. In this case, the final cleanup |
trap "ret=129; $do_exit" 1 |
||||||
# might fail but the new file should still install successfully. |
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 |
||||||
|
u_plus_rw=,u+rw |
||||||
|
fi |
||||||
|
cp_umask=$mode$u_plus_rw;; |
||||||
|
esac |
||||||
|
fi |
||||||
|
|
||||||
{ |
for src |
||||||
if [ -f "$dstdir/$dstfile" ] |
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 "$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 test -z "$dst_arg"; then |
||||||
|
echo "$0: no destination specified." >&2 |
||||||
|
exit 1 |
||||||
|
fi |
||||||
|
dst=$dst_arg |
||||||
|
|
||||||
|
# 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 |
||||||
|
|
||||||
|
obsolete_mkdir_used=false |
||||||
|
|
||||||
|
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 |
then |
||||||
$doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null || |
if test -z "$dir_arg" || { |
||||||
$doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null || |
# Check for POSIX incompatibilities with -m. |
||||||
{ |
# HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or |
||||||
echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2 |
# other-writable bit of parent directory when it shouldn't. |
||||||
(exit 1); exit |
# 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 |
else |
||||||
: |
# Remove any dirs left behind by ancient mkdir implementations. |
||||||
|
rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null |
||||||
fi |
fi |
||||||
} && |
trap '' 0;; |
||||||
|
esac |
||||||
# Now rename the file to the real destination. |
|
||||||
|
|
||||||
$doit $mvcmd "$dsttmp" "$dstdir/$dstfile" |
|
||||||
|
|
||||||
fi && |
|
||||||
|
|
||||||
# The final little trick to "correctly" pass the exit status to the exit trap. |
if |
||||||
|
$posix_mkdir && ( |
||||||
|
umask $mkdir_umask && |
||||||
|
$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" |
||||||
|
) |
||||||
|
then : |
||||||
|
else |
||||||
|
|
||||||
|
# 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. |
||||||
|
|
||||||
|
case $dstdir in |
||||||
|
/*) prefix='/';; |
||||||
|
[-=\(\)!]*) prefix='./';; |
||||||
|
*) prefix='';; |
||||||
|
esac |
||||||
|
|
||||||
|
oIFS=$IFS |
||||||
|
IFS=/ |
||||||
|
set -f |
||||||
|
set fnord $dstdir |
||||||
|
shift |
||||||
|
set +f |
||||||
|
IFS=$oIFS |
||||||
|
|
||||||
|
prefixes= |
||||||
|
|
||||||
|
for d |
||||||
|
do |
||||||
|
test X"$d" = X && continue |
||||||
|
|
||||||
|
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 |
||||||
|
fi |
||||||
|
prefix=$prefix/ |
||||||
|
done |
||||||
|
|
||||||
|
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 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 |
||||||
|
|
||||||
|
# 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 |
||||||
|
$doit touch "$dsttmp" |
||||||
|
fi |
||||||
|
} |
||||||
|
} && |
||||||
|
$doit_exec $cpprog "$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 $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 |
||||||
|
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 |
||||||
|
|
||||||
|
# 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. |
||||||
|
{ |
||||||
|
# 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. |
||||||
|
{ |
||||||
|
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 |
||||||
|
} |
||||||
|
} && |
||||||
|
|
||||||
|
# Now rename the file to the real destination. |
||||||
|
$doit $mvcmd "$dsttmp" "$dst" |
||||||
|
} |
||||||
|
fi || exit 1 |
||||||
|
|
||||||
|
trap '' 0 |
||||||
|
fi |
||||||
|
done |
||||||
|
|
||||||
{ |
# Local variables: |
||||||
(exit 0); exit |
# 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