Как исполняемые файлы в Linux знают, где взять файлы данных? - PullRequest
1 голос
/ 15 марта 2010

Программы в Linux устанавливают данные для программ в $PREFIX/share/programname, как программа узнает, где она находится, нужно ли ее компилировать?

Было бы целесообразно предположить, что двоичный файл находится в $PREFIX/bin, и использовать это для определения $PREFIX?

Это нужно только для работы в Linux, и, в частности, я использую C.

Ответы [ 4 ]

2 голосов
/ 15 марта 2010

Это полностью зависит от программы.Распространенным шаблоном является определение PREFIX как директивы препроцессора.GNU autoconf имеет стандартные имена и позволяет их переопределять во время настройки.

1 голос
/ 15 марта 2010

Давайте рассмотрим гипотетически:

Вы компилируете программу 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, которые они добавляют.

Короче говоря, не одно поведение подходит всем, но это краткий обзор того, как оно обычно работает.

1 голос
/ 15 марта 2010

Как указала p00ya, это зависит от программы. Я бы сказал, что большинство программ имеют значение по умолчанию во время компиляции, а некоторые также используют переменную окружения, чтобы найти свои файлы данных; Техника переменных среды может быть полезна, если вы не распространяете источники своего программного обеспечения и не ожидаете, что администраторы или сопровождающие пакеты перекомпилируют его для своей системы. Если вы планируете использовать переменную среды, вам, вероятно, следует сгенерировать сценарии-оболочки с правильными путями во время установки или предоставить своим пользователям соответствующие инструкции (то есть, что добавить в их сценарий инициализации оболочки).

0 голосов
/ 15 марта 2010

Один из файлов, создаваемых autotools, является config.h, и именно здесь хранятся различные пути. Вы можете настроить config.h.in, чтобы добавить дополнительные пути для вашего приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...