Куда поместить вспомогательные скрипты с GNU autoconf / automake?

Я работаю над проектом, который будет распространяться с GNU autoconf / automake, и у меня есть набор сценариев bash, которые вызывают сценарии awk. Я бы хотел, чтобы сценарии bash попали в $ PATH, но не сценарии awk. Как мне их вставить в проект? Следует ли их ставить вместе с другими двоичными файлами?

Кроме того, есть ли способ определить окончательное расположение файла после установки? Я предполагаю, что / usr / local / bin не всегда там, где заканчиваются исполняемые файлы ...


person user17925    schedule 18.09.2008    source источник


Ответы (4)


Добавьте что-то подобное в Makefile.am

scriptsdir = $(prefix)/bin
scripts_DATA = awkscript1 awkscript2

В этом случае он установит awkscript в $ (prefix) / bin (вы также можете использовать $ (bindir)).

Примечание. Не забывайте, что первый должен называться name + dir (scripts -> scriptsdir), а второй - name + _DATA (scripts -> scripts_DATA).

person terminus    schedule 18.09.2008
comment
Ох, нет. Используйте pkglibexec_DATA или pkglibexec_SCRIPTS, которые будут установлены (по умолчанию) в $prefix/libexec/$package. Для этого нужен libexecdir: docs.redhat.com/docs/en-US/Red_Hat_Enterprise_Linux/3/html/ Каталог libexec / содержит небольшие вспомогательные программы, вызываемые другими программами. Это также означает, что если вы используете дистрибутив, которому не нравится libexec, упаковщик может изменить расположение этих сценариев, передав --libexecdir=/usr/lib в configure. См. Также gnu.org/software/automake/manual/automake.html# Униформа - person Jack Kelly; 27.07.2012
comment
В чем разница между libexec_SCRIPTS или libexec_PROGRAMS и pkglibexec_SCRIPTS или pkglibexec_PROGRAMS? - person CMCDragonkai; 03.11.2016
comment
Есть ли какая-то глобальная libexec и специфичная для пакета libexec? Предназначен ли этот глобальный libexec для выполнения другими программами, но не пользователями, в то время как пакет libexec предназначен только для использования программами в вашем пакете? - person CMCDragonkai; 03.11.2016

Вы можете просто перечислить скрипты, которые хотите установить в Makefile.am:

bin_SCRIPTS = foo bar

Это приведет к установке foo и bar во время make install. Чтобы получить путь к их окончательному местоположению, вы можете использовать @ bindir @ в foo.in и позволить настроить build foo за вас. Например, в configure.ac:

AC_CONFIG_FILES([foo bar])

а затем в foo.in:

#!/bin/sh

prefix=@prefix@
exec_prefix=@exec_prefix@
bindir=@bindir@
echo bindir = $bindir

Имейте в виду, что человек, запускающий configure, может указать любой из --prefix, --exec_prefix или --bindir, а установка может быть перенаправлена ​​с помощью DESTDIR. При использовании описанной здесь техники DESTDIR не будет приниматься во внимание, и сценарий будет установлен в месте, отличном от пути, который он будет отображать. Это задумано и является правильным поведением, поскольку обычно установка DESTDIR используется для создания архива, который в конечном итоге будет распакован в файловую систему таким образом, что bindir в сценарии станет действительным.

person William Pursell    schedule 24.01.2012
comment
Это правильный ответ, и он должен был быть отмечен галочкой. +1 - person ptomato; 25.01.2012
comment
@Andras budinszky предлагает использовать dist_bin_SCRIPTS, но в данном случае это неверно. Файл foo не должен находиться в архиве дистрибутива, потому что он будет создан из foo.in, который будет находиться в архиве из-за его появления в AC_CONFIG_FILES. - person William Pursell; 21.03.2013

Джонатан, в ответ на ваш дополнительный вопрос: если вы хотите заменить значение prefix во время сборки, вам необходимо:

  1. переименуйте свой скрипт myscript в myscript.in
  2. добавьте правило в configure.ac для его генерации внизу
  3. используйте созданный мной макрос под названием AS_AC_EXPAND
  4. используйте это так:

    AS_AC_EXPAND (BINDIR, $ bindir)

  5. в вашем 'myscript.in' теперь вы можете использовать @ BINDIR @, и он будет расширен до полного пути, по которому в конечном итоге будет установлен сценарий.

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

person Thomas Vander Stichele    schedule 01.10.2008
comment
m4sh резервирует для себя те имена, которые начинаются с AS_. Называя макрос AS_, вы попираете пространство имен m4sh. Прочтите раздел 10.2 документации autoconf. - person William Pursell; 25.01.2012
comment
Где ваш AS_AC_EXPAND макрос !? - person CMCDragonkai; 03.11.2016

Если сценарии awk не попадают в основной каталог bin (префикс / bin), вам необходимо поместить их в соответствующий подкаталог - возможно, lib, но, возможно, libexec или share (поскольку сценарии awk, вероятно, нейтральны к платформе) .

Правильно: программное обеспечение не обязательно попадет в / usr / local / bin; на моей машине / usr / local / bin управляется MIS, поэтому все устанавливаемое мной программное обеспечение находится в / usr / gnu /. Я использую: ./configure --prefix = / usr / gnu, чтобы установить программное обеспечение там, где я хочу.

Вы можете встроить значение PREFIX в сценарии bash - по сути, вы «скомпилируете» сценарии, включив в них место установки. Помните о проблемах во время тестирования сборки - вам может потребоваться сначала найти сценарии относительно текущего каталога, а затем относительно PREFIX.

person Jonathan Leffler    schedule 18.09.2008
comment
Как заставить automake заменить $ {prefix} в сценариях bash? я должен сделать их своего рода элементом _BIN, а не элементом _DATA? - person user17925; 18.09.2008