Сборка модуля PAM и установка в /lib/security

В настоящее время я пытаюсь создать и установить модуль PAM с помощью автоинструментов. Хотя процесс сборки проходит гладко, цель install ведет себя не так, как хотелось бы.

$ make install
bash ../libtool --mode=install install -c pam_mymodule.la '/usr/local/lib'

В приведенном выше фрагменте вывода я удалил абсолютные пути к исполняемым файлам GNU.

В этом звонке меня беспокоят две вещи:

  • make пытается переместить файл pam_mymodule.la, а я бы предпочел переместить файл .libs/pam_mymodule.so.
  • make пытается переместить его в /usr/local/lib, тогда как /lib/security является более подходящим выбором для модулей PAM.

Как я могу изменить конфигурацию установки?


person John WH Smith    schedule 25.09.2014    source источник
comment
Связанный: stackoverflow.com/questions/8669303/   -  person ptomato    schedule 26.09.2014


Ответы (1)


Чтобы решить ваши две вещи по порядку:

  • Скрипт libtool перехватывает эту инструкцию install и также устанавливает файл .so в соответствующее место.

  • Он помещает его в /usr/local/lib, вероятно, потому, что вы указали его в lib_LTLIBRARIES (хотя я не могу быть уверен, что вы не показываете свой код), а для вашего --prefix установлено значение по умолчанию /usr/local.

Последнее сложно, поскольку официальная позиция Autotools заключается в том, что все установленные пользователем программы относятся к /usr, в то время как многие другие инструменты ожидают, что все будет в /lib/something. Вот один из способов сделать это, который лично я считаю неправильным:

# Don't do this
libsecuritydir = /lib/security
libsecurity_LTLIBRARIES = pam_mymodule.la

Это обходит --prefix, что будет ужасно, ужасно неправильно, если вы попытаетесь выполнить локальную установку вашего пакета без записи непосредственно в вашу действующую систему, что, поверьте мне, вы захотите сделать в какой-то момент. Это также помешает вам упаковать вашу программу в системы упаковки большинства дистрибутивов Linux.

Правильный способ — переложить ответственность на того, кто устанавливает пакет: добавить аргумент --with-libsecuritydir к configure.ac, используя AC_ARG_WITH, и пусть по умолчанию он равен $(libdir)/security:

AC_ARG_WITH([libsecuritydir],
    [AS_HELP_STRING([--with-libsecuritydir],
        [Directory for PAM modules, pass /lib/security for live install])],
    [], [with_libsecuritydir='$(libdir)/security'])
AC_SUBST([libsecuritydir], [$with_libsecuritydir])

а потом просто делай

libsecurity_LTLIBRARIES = pam_mymodule.la

in Makefile.am.

Если вы хотите установить живую версию непосредственно в свою систему (или собираете бинарный пакет), передайте --with-libsecuritydir=/lib/security в configure.

person ptomato    schedule 26.09.2014
comment
Отлично спасибо! Я боялся, что столкнусь с некоторыми проблемами, связанными с переносимостью, но использование опции действительно кажется лучшим решением. Небольшое примечание: ваш AS_IF может захотеть протестировать против x вместо xno, иначе libsecuritydir останется пустым, когда опция вообще не указана (если только вы явно не используете --with-libsecuritydir=no. - person John WH Smith; 27.09.2014
comment
Правда, для этого я должен был использовать четвертый параметр action-if-not-given AC_ARG_WITH. Я отредактирую ответ. - person ptomato; 27.09.2014