/usr/local. Автоматически сгенерированные рецепты make install самостоятельно распределяют все компоненты по поддиректориям. Однако, как было сказано ранее, установка в /usr/local требует прав суперпользователя:
[user@VM syscall-master]$ autoreconf -fisv<...>[user@VM syscall-master]$ ./configure<...>[user@VM syscall-master]$ make installMaking install in src <...> /usr/bin/mkdir -p '/usr/local/lib' /bin/sh ../libtool --mode=install /usr/bin/ginstall -c libsyscall.la '/usr/local/lib' libtool: install: /usr/bin/ginstall -c .libs/libsyscall.so.0.0.0 /usr/local/lib/libsyscall.so.0.0.0 /usr/bin/ginstall: cannot create regular file '/usr/local/lib/libsyscall.so.0.0.0': Permission denied <...>[user@VM syscall-master]$ tree /usr/local/usr/local ├── bin │ └── hypersh ├── doc ├── etc ├── games ├── include ├── lib ├── lib64 ├── libexec ├── libx32 ├── man ├── sbin └── share ├── info └── man 15 directories, 1 file
Важно
[root@VM ~]# cd /home/user/syscall-master/[root@VM syscall-master]# make installMaking install in src <...> /usr/bin/mkdir -p '/usr/local/lib' /bin/sh ../libtool --mode=install /usr/bin/ginstall -c libsyscall.la '/usr/local/lib' libtool: install: /usr/bin/ginstall -c .libs/libsyscall.so.0.0.0 /usr/local/lib/libsyscall.so.0.0.0 libtool: install: (cd /usr/local/lib && { ln -s -f libsyscall.so.0.0.0 libsyscall.so.0 || { rm -f libsyscall.so.0 && ln -s libsyscall.so.0.0.0 libsyscall.so.0; }; }) libtool: install: (cd /usr/local/lib && { ln -s -f libsyscall.so.0.0.0 libsyscall.so || { rm -f libsyscall.so && ln -s libsyscall.so.0.0.0 libsyscall.so; }; }) libtool: install: /usr/bin/ginstall -c .libs/libsyscall.lai /usr/local/lib/libsyscall.la /usr/bin/mkdir -p '/usr/local/bin' /bin/sh ../libtool --mode=install /usr/bin/ginstall -c syscall '/usr/local/bin' libtool: install: /usr/bin/ginstall -c .libs/syscall /usr/local/bin/syscall /usr/bin/mkdir -p '/usr/local/share/man/man1' /usr/bin/ginstall -c -m 644 syscall.1 '/usr/local/share/man/man1'[root@VM syscall-master]# tree /usr/local/usr/local ├── bin │ ├── hypersh │ └── syscall ├── doc ├── etc ├── games ├── include ├── lib │ ├── libsyscall.la │ ├── libsyscall.so -> libsyscall.so.0.0.0 │ ├── libsyscall.so.0 -> libsyscall.so.0.0.0 │ └── libsyscall.so.0.0.0 ├── lib64 ├── libexec ├── libx32 ├── man ├── sbin └── share ├── info └── man └── man1 └── syscall.1 16 directories, 8 files[root@VM syscall-master]#
/usr/local не является единственным местом установки даже среди общепринятых. Более того, никто не ограничивает пользователя, разбирающегося в собственных действиях, производить установку в любые места системы с оговоркой готовности пользователя самостоятельно настраивать загрузку динамических библиотек.
configure существует ключ --prefix=, использующийся для указания места установки программы:
[user@VM syscall-master]$ tree /tmp//tmp/ ├── systemd-private-cf21b62e498d45469bbfe8c619515c2b-chronyd.service-1UNCOt [error opening dir] └── systemd-private-cf21b62e498d45469bbfe8c619515c2b-systemd-logind.service-pFMnpU [error opening dir] 3 directories, 0 files[user@VM syscall-master]$ ./configure --prefix=/tmp/qq<...>[user@VM syscall-master]$ make installMaking install in src <...> /bin/sh ../libtool --mode=install /usr/bin/ginstall -c libsyscall.la '/tmp/qq/lib' libtool: install: /usr/bin/ginstall -c .libs/libsyscall.so.0.0.0 /tmp/qq/lib/libsyscall.so.0.0.0 libtool: install: (cd /tmp/qq/lib && { ln -s -f libsyscall.so.0.0.0 libsyscall.so.0 || { rm -f libsyscall.so.0 && ln -s libsyscall.so.0.0.0 libsyscall.so.0; }; }) libtool: install: (cd /tmp/qq/lib && { ln -s -f libsyscall.so.0.0.0 libsyscall.so || { rm -f libsyscall.so && ln -s libsyscall.so.0.0.0 libsyscall.so; }; }) libtool: install: /usr/bin/ginstall -c .libs/libsyscall.lai /tmp/qq/lib/libsyscall.la libtool: finish: PATH="/home/user/.gemie/bin:/home/user/bin:/usr/bin:/bin:/usr/local/bin:/usr/games:/sbin" ldconfig -n /tmp/qq/lib ---------------------------------------------------------------------- Libraries have been installed in: /tmp/qq/lib If you ever happen to want to link against installed libraries in a given directory, LIBDIR, you must either use libtool, and specify the full pathname of the library, or use the '-LLIBDIR' flag during linking and do at least one of the following: - add LIBDIR to the 'LD_LIBRARY_PATH' environment variable during execution - add LIBDIR to the 'LD_RUN_PATH' environment variable during linking - use the '-Wl,-rpath -Wl,LIBDIR' linker flag - have your system administrator add LIBDIR to '/etc/ld.so.conf' See any operating system documentation about shared libraries for more information, such as the ld(1) and ld.so(8) manual pages. ---------------------------------------------------------------------- /usr/bin/mkdir -p '/tmp/qq/bin' /bin/sh ../libtool --mode=install /usr/bin/ginstall -c syscall '/tmp/qq/bin' libtool: install: /usr/bin/ginstall -c .libs/syscall /tmp/qq/bin/syscall /usr/bin/mkdir -p '/tmp/qq/share/man/man1' /usr/bin/ginstall -c -m 644 syscall.1 '/tmp/qq/share/man/man1'[user@VM syscall-master]$ tree /tmp/qq/tmp/qq ├── bin │ └── syscall ├── lib │ ├── libsyscall.la │ ├── libsyscall.so -> libsyscall.so.0.0.0 │ ├── libsyscall.so.0 -> libsyscall.so.0.0.0 │ └── libsyscall.so.0.0.0 └── share └── man └── man1 └── syscall.1 6 directories, 6 files[user@VM syscall-master]$
configure.ac. Для этого в Autotools предусмотрены специальные макросы:
AC_PREFIX_DEFAULT(<каталог>) используется для явного указания пути установки по умолчанию взамен /usr/local;
AC_PREFIX_PROGRAM(<путь>) позволяет указать не явный путь установки, а уже установленную программу для использования её места установки (если он описан в PATH). Например, если программой выбрана gcc, и PATH содержит путь к /usr/local/gnu/bin/gcc, путём установки будет выбран /usr/local/gnu.
syscall-master/configure.ac
<...> AM_INIT_AUTOMAKE([foreign subdir-objects]) LT_INIT([disable-static]) AC_CONFIG_HEADERS([config.h]) AC_PREFIX_DEFAULT([/tmp/QKRQ]) DX_INIT_DOXYGEN([syscall], [Doxyfile], [doxygen-doc]) <...>@user
[user@VM syscall-master]$ autoreconf -fisv<...>[user@VM syscall-master]$ ./configure<...>[user@VM syscall-master]$ make installMaking install in src <...> /usr/bin/mkdir -p '/tmp/QKRQ/lib' /bin/sh ../libtool --mode=install /usr/bin/ginstall -c libsyscall.la '/tmp/QKRQ/lib' libtool: install: /usr/bin/ginstall -c .libs/libsyscall.so.0.0.0 /tmp/QKRQ/lib/libsyscall.so.0.0.0 libtool: install: (cd /tmp/QKRQ/lib && { ln -s -f libsyscall.so.0.0.0 libsyscall.so.0 || { rm -f libsyscall.so.0 && ln -s libsyscall.so.0.0.0 libsyscall.so.0; }; }) libtool: install: (cd /tmp/QKRQ/lib && { ln -s -f libsyscall.so.0.0.0 libsyscall.so || { rm -f libsyscall.so && ln -s libsyscall.so.0.0.0 libsyscall.so; }; }) libtool: install: /usr/bin/ginstall -c .libs/libsyscall.lai /tmp/QKRQ/lib/libsyscall.la libtool: finish: PATH="/home/user/.gemie/bin:/home/user/bin:/usr/bin:/bin:/usr/local/bin:/usr/games:/sbin" ldconfig -n /tmp/QKRQ/lib ---------------------------------------------------------------------- Libraries have been installed in: /tmp/QKRQ/lib If you ever happen to want to link against installed libraries in a given directory, LIBDIR, you must either use libtool, and specify the full pathname of the library, or use the '-LLIBDIR' flag during linking and do at least one of the following: - add LIBDIR to the 'LD_LIBRARY_PATH' environment variable during execution - add LIBDIR to the 'LD_RUN_PATH' environment variable during linking - use the '-Wl,-rpath -Wl,LIBDIR' linker flag - have your system administrator add LIBDIR to '/etc/ld.so.conf' See any operating system documentation about shared libraries for more information, such as the ld(1) and ld.so(8) manual pages. ---------------------------------------------------------------------- /usr/bin/mkdir -p '/tmp/QKRQ/bin' /bin/sh ../libtool --mode=install /usr/bin/ginstall -c syscall '/tmp/QKRQ/bin' libtool: install: /usr/bin/ginstall -c .libs/syscall /tmp/QKRQ/bin/syscall /usr/bin/mkdir -p '/tmp/QKRQ/share/man/man1' /usr/bin/ginstall -c -m 644 syscall.1 '/tmp/QKRQ/share/man/man1'[user@VM syscall-master]$ tree tmptmp [error opening dir] 0 directories, 0 files[user@VM syscall-master]$ tree /tmp/tmp ├── QKRQ │ ├── bin │ │ └── syscall │ ├── lib │ │ ├── libsyscall.la │ │ ├── libsyscall.so -> libsyscall.so.0.0.0 │ │ ├── libsyscall.so.0 -> libsyscall.so.0.0.0 │ │ └── libsyscall.so.0.0.0 │ └── share │ └── man │ └── man1 │ └── syscall.1 ├── qq │ ├── bin │ │ └── syscall │ ├── lib │ │ ├── libsyscall.la │ │ ├── libsyscall.so -> libsyscall.so.0.0.0 │ │ ├── libsyscall.so.0 -> libsyscall.so.0.0.0 │ │ └── libsyscall.so.0.0.0 │ └── share │ └── man │ └── man1 │ └── syscall.1 ├── systemd-private-cf21b62e498d45469bbfe8c619515c2b-chronyd.service-1UNCOt [error opening dir] └── systemd-private-cf21b62e498d45469bbfe8c619515c2b-systemd-logind.service-pFMnpU [error opening dir] 15 directories, 12 files[user@VM syscall-master]$