Давайте рассмотрим гипотетически:
Вы компилируете программу foo
которая нуждается в версии libfoo
, которая
новее, чем предоставленный
система. Вам не хватает адекватных привилегий
обновить систему libfoo
,
дополнительно программа хочет
поместите файлы в / etc, где вы
нет разрешения на запись. Как
не могли бы вы скомпилировать и установить
Программа
Большинство программ для конфигурирования сборки предлагают гораздо больше, чем просто --prefix
, многие дают вам возможность указать местоположение конфигурации системы (--sysconfdir
), место для поиска общих библиотек по умолчанию (--libdir
), место для хранения скомпилированных исполняемых файлов (--bindir
) и других ярлыков «все в одном», таких как --datarootdir
.
На самом деле:
tpost@tpost-desktop:~/Desktop/oss-projects/srce/srce.hg$ ./configure --help
`configure' configures SRCE 1.0.9 to adapt to many kinds of systems.
Usage: ./configure [OPTION]... [VAR=VALUE]...
To assign environment variables (e.g., CC, CFLAGS...), specify them as
VAR=VALUE. See below for descriptions of some of the useful variables.
Defaults for the options are specified in brackets.
Configuration:
-h, --help display this help and exit
--help=short display options specific to this package
--help=recursive display the short help of all the included packages
-V, --version display version information and exit
-q, --quiet, --silent do not print `checking...' messages
--cache-file=FILE cache test results in FILE [disabled]
-C, --config-cache alias for `--cache-file=config.cache'
-n, --no-create do not create output files
--srcdir=DIR find the sources in DIR [configure dir or `..']
Installation directories:
--prefix=PREFIX install architecture-independent files in PREFIX
[/usr/local]
--exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
[PREFIX]
By default, `make install' will install all the files in
`/usr/local/bin', `/usr/local/lib' etc. You can specify
an installation prefix other than `/usr/local' using `--prefix',
for instance `--prefix=$HOME'.
For better control, use the options below.
Fine tuning of the installation directories:
--bindir=DIR user executables [EPREFIX/bin]
--sbindir=DIR system admin executables [EPREFIX/sbin]
--libexecdir=DIR program executables [EPREFIX/libexec]
--sysconfdir=DIR read-only single-machine data [PREFIX/etc]
--sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
--localstatedir=DIR modifiable single-machine data [PREFIX/var]
--libdir=DIR object code libraries [EPREFIX/lib]
--includedir=DIR C header files [PREFIX/include]
--oldincludedir=DIR C header files for non-gcc [/usr/include]
--datarootdir=DIR read-only arch.-independent data root [PREFIX/share]
--datadir=DIR read-only architecture-independent data [DATAROOTDIR]
--infodir=DIR info documentation [DATAROOTDIR/info]
--localedir=DIR locale-dependent data [DATAROOTDIR/locale]
--mandir=DIR man documentation [DATAROOTDIR/man]
--docdir=DIR documentation root [DATAROOTDIR/doc/srce]
--htmldir=DIR html documentation [DOCDIR]
--dvidir=DIR dvi documentation [DOCDIR]
--pdfdir=DIR pdf documentation [DOCDIR]
--psdir=DIR ps documentation [DOCDIR]
Optional Features and Packages:
--disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
--enable-FEATURE[=ARG] include FEATURE [ARG=yes]
--with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
--without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
--enable-unsafe enable unsafe operation [default=no]
--with-user specify the system user [default=root]
Some influential environment variables:
CC C compiler command
CFLAGS C compiler flags
LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a
nonstandard directory <lib dir>
CPPFLAGS C/C++/Objective C preprocessor flags, e.g. -I<include dir> if
you have headers in a nonstandard directory <include dir>
CPP C preprocessor
Use these variables to override the choices made by `configure' or to help
it to find libraries and programs with nonstandard names/locations.
Report bugs to <foo@foo.com>.
Если программа на самом деле правильно использует инструмент конфигурации системы сборки, это позволяет вам точно настроить каждую ручку, которая определяет процесс сборки. Например, вы можете захотеть, чтобы --prefix был / home, но использовать место где-то в / usr / share для пользовательской версии libfoo, которую root разместил для людей, которые по какой-либо причине не могут использовать системную версию.
Некоторые из этих путей устанавливаются, когда программа linked
, не просто скомпилирована, но да, они являются частью результирующего объекта ELF. Другие файлы, которые устанавливаются в виде простого текста (например, файлы конфигурации, интерпретируемые языки и т. Д.):
- Изменено или сгенерировано en situ, чтобы они содержали указанные вами пути
- Достаточно умен, чтобы искать нужные файлы, учитывая настройку PATH
- Достаточно умен, чтобы искать нужные им файлы, даже за пределами PATH (переменные env здесь обычно включаются)
Обычно это комбинация трех.
Давайте посмотрим на фиктивный файл foo.ini.in
, который будет использоваться для создания реального файла foo.ini:
[global]
output_path=@prefix@/var/spool
Который, если сконфигурирован с --prefix = / home / sam, выдает foo.ini, который выглядит следующим образом:
[global]
output_path=/home/sam/var/spool
Обратите внимание, что вышеупомянутое является автоконфектоцентричным, но оно иллюстрирует концепцию.
Другая важная вещь, которую нужно понять, это то, что не все программы, которые используют инструмент конфигурации сборки, на самом деле используют предпочтения, которые он позволяет вам установить. Я видел много программ, которые просто подчиняются опциям --prefix и --with-somelib / --without-somelib, которые они добавляют.
Короче говоря, не одно поведение подходит всем, но это краткий обзор того, как оно обычно работает.