我目前正在尝试使用autotools构建和安装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模块更合适的选择。如何更改安装配置?
答案 0 :(得分:3)
按顺序解决你的两件事:
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
Makefile.am
中的。
如果要将实时版本直接安装到系统中(或正在构建二进制包),请将--with-libsecuritydir=/lib/security
传递给configure
。