2014-11-10 3 views
2

У меня возникли проблемы с пониманием того, как toolchain autoconf имеет дело с сценариями инициализации - скрипты, которые обычно помещаются в /etc/init.d/, чтобы запустить/остановить демоны или службы.Autoconf и скрипты инициализации

autoconf Набор инструментов определяет кучу prenamed переменных каталога установки, как $bindir (где исполняемые файлы идут, как правило, /usr/local/bin) или $includedir (для заголовочных файлов, вероятно, /usr/include), и так далее.

Но как насчет файлов инициализации, которые идут в /etc/init.d? Чтение по list of directory variables, я не вижу ничего, что соответствует что-то вроде /etc/init.d/

Так что это обычная практика здесь? Мне просто нужно выбрать переменную каталога установки и переопределить ее с помощью AC_SUBST, чтобы я мог установить скрипты на /etc/init.d?

+0

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

ответ

0

Согласно this (до некоторой степени датированный), Autotools могут быть не совсем подходящими для этого. Тем не менее эти инструкции были предоставлены (воспроизведены с небольшими изменениями):

EXTRA_DIST = bootscript 

install-exec-hook: 
     cp $(srcdir)/bootscript /etc/init.d 
     cd /etc/rc3.d && $(LN_S) ../init.d/bootscript S900bootscript 
     cd /etc/rc4.d && $(LN_S) ../init.d/bootscript S900bootscript 
     cd /etc/rc5.d && $(LN_S) ../init.d/bootscript S900bootscript 
2

Самый простой ответ; в директории исходного уровня Makefile.am: вверху

# Install my_script in $(bindir) and distribute it. 
dist_bin_SCRIPTS = my_script 

Итак, $(bindir) по умолчанию для сценариев.

-

Для более надежной реализации, которая фактически охватывает сценарии для демонами/услуг (первой ссылкой на авторитетный источник):

Там нет необходимости для EXTRA_DIST или любого правила сборки : Automake передает их из AC_CONFIG_FILES (см. Требования). CLEANFILES по-прежнему полезен, потому что по умолчанию Automake очистит цели AC_CONFIG_FILES в distclean, а не чист.

Ссылка на источник (http://www.gnu.org/software/automake/manual/html_node/Scripts.html):

Примеры:

Установите в другое место:

# Yes, even though its `init_d_SCRIPTS`, we use `init_ddir`, 
# with-out a second underscore. 
init_ddir = $(sysconfdir)/rc.d/init.d 
init_d_SCRIPTS = <yourscript> 
# CLEANFILES = $(init_d_SCRIPTS) 

Обратите внимание, что $(sysconfdir)$(prefix)/etc представляет; базовый путь до init.d или rc.d/init.d, и вы можете/должны (?) un -комментировать строку CLEANFILES в любом примере, если ваш скрипт инициализации создается Autotools.

Или установить местоположение по умолчанию:

bin_SCRIPTS = <yourscript> 
# CLEANFILES = $(bin_SCRIPTS) 

Какой будет $(bindir)

EDIT:

Обе приведенные выше примеры предполагают, что Вы имеете Autotools генерировать init_d_SCRIPTS файлы, но что, если мы хотим распространять уже созданный скрипт и установить это в наш $(init_ddir) местоположение?

init_ddir = $(sysconfdir)/init.d 
dist_init_d_SCRIPTS = <yourscript> 

Хитрость заключается в том, что dist не нужно следовать _bin_SCRIPTS, это может быть dist_<your_var>_SCRIPTS. Первичный SCRIPTS позволяет Autotools знать, что значение является скриптом и как его обрабатывать, а ключевое слово dist в начале предупреждает Automake о том, что он не собирается создавать файл для нас - и инструктирует Automake не искать makefile в исходном каталоге скрипта.

Я хотел добавить это небольшое редактирование, так как мне просто пришлось внести исправление самостоятельно для сценария, который я распространяю с моим источником.

-

Extra

Для тех, кто будет следующим беспокоиться об их инициализации сценарии в отношении упаковки (в частности Debian упаковки) - что делает это напоминание для себя более или менее -> внешнего вида здесь:

https://www.debian.org/doc/manuals/maint-guide/dother.en.html#initd

Погрешность (s) я получал включен debuild пытается установить файл init.d и файл конф непосредственно в /etc и /etc/init.d в корне моей файловой системы, а не в debian/<package>/<location>, как это предполагается во время сборки пакета.

Я обнаружил, что в конечном итоге мне пришлось удалить добавленное правило, которое было предоставлено в учебниках по упаковке для Debian, где они переопределяют dh_auto_install. В частности, этот бит в debian/rules:

#!/usr/bin/make -f 
%: 
    dh [email protected] 

# If installing an upstream init.d script: 
override_dh_installinit: 
    dh_installinit --name=<scriptname> --onlyscripts 

# Remove the following: 
# override_dh_auto_install: 
# $(MAKE) DESTDIR=$$(pwd)/debian/<package> prefix=/usr install 

После удаления этого правила (что не было необходимости, чтобы удалить только после добавления моего init.d скрипт и файл конф) все генерируемый и скомпилированы абсолютно прекрасно .... В том числе - в факт - сброс бункеров в их пункт назначения с использованием префикса /usr, что и было желательным эффектом переопределения в первую очередь.

Переопределение вызова dh_installinit говорит debuild о том, чтобы не устанавливать скрипт инициализации в качестве make-файла и указывать только на вызовы update-rc.d для регистрации скрипта с системой. Я решил назвать сценарий, отличный от пакета; и поэтому мне нужно было передать параметр --name =.

Надеюсь, что это поможет кому-то, я знаю, что это поможет мне в будущем, если этот ответ будет разрешен для существования.