Makefile:可以从CLI或包装系统安装目标吗?

时间:2010-08-19 08:13:31

标签: makefile rpmbuild rpm-spec

给出了我的Makefile的简单安装目标:

install: zrm $(CONF)
        install -D -m 0755 -o mysql -g mysql conf/lvm0.conf $(DESTDIR)/$(CONFDIR)/lvm0/mysql-zrm.conf
        install -D -m 0755 -o mysql -g mysql conf/inc1.conf $(DESTDIR)/$(CONFDIR)/inc1/mysql-zrm.conf
        install -D -m 0755 -o mysql -g mysql conf/dump0.conf $(DESTDIR)/$(CONFDIR)/dump0/mysql-zrm.conf

        install -d -m 0755 -o mysql -g mysql $(DESTDIR)/$(PLUGIN)
        install    -m 0755 -o mysql -g mysql post-backup-st-zrm.pl $(DESTDIR)/$(PLUGIN)

        install -d -m 0755 -o root -g root $(DESTDIR)/$(BINDIR)
        install    -m 4755 -o root -g root zrm $(DESTDIR)/$(BINDIR)

我可以简单地make install作为 root (或使用sudo),它会很好地安装。 作为foo( unprivileged )用户,调用make install将返回错误(-o选项需要超级用户)。

我需要更改它,以便我可以同时sudo make installmake install DESTDIR=/tmp/foo或者将它打包成.deb或.rpm,然后从我的Makefile中调用安装目标。

对我来说最好的解决方案是什么?将安装调用替换为cp?删除-o并放入chown / chmod?

谢谢。

1 个答案:

答案 0 :(得分:1)

您可以使install命令成为可以在make命令行上覆盖的变量,例如

INSTALL_USER = mysql
INSTALL_GROUP = mysql
INSTALL = install -d -m 0755 -o $(INSTALL_USER) -g $(INSTALL_GROUP)
INSTALL_DIR = $(INSTALL) -d

我希望包装系统能够应对你的makefile,因为它是其他人写的东西。 Debian软件包构建以root身份运行(或者通常假装以root身份运行,通过fakeroot),因此它将允许并查看所有权更改。

请注意Debian policynot allow the permissions you set,因为它要求所有文件归root所有,除非有令人信服的理由不这样做。我看不出mysql拥有任何文件的原因(或者我错过了一些特定于mysql的原因,为什么插件和配置文件不能由root拥有?)。原因是安全问题:如果有人设法将文件覆盖为mysql,则他们应该无法将代码注入可执行文件和配置文件。

由于分发维护者可能希望覆盖您设置的权限,因此不要为此烦恼。