Makefile: установить цель, которую можно использовать из CLI или системы упаковки?

учитывая эту простую цель установки для моего 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 (непривилегированного) вызов make install вернет ошибку (для опции -o требуется суперпользователь).

Мне нужно изменить это, чтобы я мог sudo make install, make install DESTDIR=/tmp/foo или даже упаковать это в .deb или .rpm и просто вызвать цель установки из моего Makefile.

Что будет лучшим решением для меня? Заменить вызовы установки на cp ? Удалить -o и поставить chown/chmod ?

Спасибо.


person Xavier Maillard    schedule 19.08.2010    source источник


Ответы (1)


Вы можете сделать команду установки переменной, которую можно переопределить в командной строке make, например

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

Я ожидаю, что системы упаковки в любом случае смогут справиться с вашим make-файлом, потому что это то, что написали другие люди. Сборка пакетов Debian выполняется от имени пользователя root (или, скорее, обычно делает вид, что работает от имени пользователя root, через fakeroot), поэтому это позволит и увидеть изменения прав собственности.

Обратите внимание, что политика Debian будет не разрешать установленные вами разрешения, поскольку для этого требуется, чтобы все файлы принадлежали пользователю root, кроме есть веская причина не делать этого. Я не вижу причин, по которым какой-либо из файлов должен принадлежать mysql (или я пропустил какую-то специфичную для mysql причину, по которой плагины и файлы конфигурации не могут принадлежать пользователю root?). Причина в проблеме безопасности: если кому-то удастся перезаписать файлы как mysql, он не сможет внедрить код в исполняемые файлы и файлы конфигурации.

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

person Gilles 'SO- stop being evil'    schedule 19.08.2010
comment
Я знаю, что в Debian сборка пакета может быть фальсифицирована как root. В чем я не уверен, так это в том, как это делается в системе RPMbuild. mysql:mysql требуется в нашей среде и продукте mysql-zrm, насколько мне известно. - person Xavier Maillard; 19.08.2010