Обычно все программы используют autotools, и там всё из коробке. Но вот попалась программа, которая собирается просто при помощи Makefile (и это очень простой файл, не следует никаким соглашениям).
Что надо сделать с Makefile, чтобы он стал пригодным для опакечивания? И как потом к нему писать .ebuild? Есть ли статьи на эту тему?
В то же время, насколько я знаю, для Gentoo надо, чтобы поддерживалась переменная DESTDIR, для того, чтобы можно было собирать программы в PREFIX.
О том, что можно писа́ть
make prefix=/usr
а не только
PREFIX=/usr make
сказано в пункте 9.5 Overriding Variables руководства по GNU make.
«If you specify a value in this way, all ordinary assignments of the same variable in the makefile are ignored; we say they have been overridden by the command line argument.»
В каких случаях как надо делать:
make --prefix=/usr
PREFIX=/usr make
make prefix=/usr
make PREFIX=/usr
первое не сработает, потому что параметры make принимает другие
второе не сработает, потому что буквы заглавные, а не строчные
четвёртое тоже не сработает
Почему PREFIX
и prefix
пишут то большими, то маленькими буквами?
Маленькими буквами написан пример в пункте 16.5 Variables for Installation Directories
«Installers are expected to override these values when calling make (e.g., make prefix=/usr install) or configure (e.g., configure –prefix=/usr).»
И пришло такое написание в руководство GNU make из пункта 7.2.5 Variables for Installation Directories документа GNU Coding Standards
Большими буквами называется переменная окружения EPREFIX, описанная в Gentoo wiki.
В autotools.eclass существует функция eautoreconf, которая вызывает что-то там…
«autotools_run_tool –at-m4flags autoconf «$@»»
Пример использования eautoreconf в ebuild-файле:
src_configure() {
# Вызывать autoreconf должны авторы распространяемого архива
# где-то внутри make dist
# Но если автор ебилда пробует архив стянуть с github, то
# отсутствие документации для make dist вручную это косяк Gentoo
# не проводить же сначала локальную сборку архива make dist
# а затем распаковку и всё это только чтобы вызов make прошел
# Просто поместить eautoreconf билде недостаточно
econf
}
функции autotools_src_configure не видно, поэтому явный вызов eautoreconf
надо (если надо) вписывать в текст .ebuild-файла.
В документации на ./configure пишут:
«There are two ways to change the default: when creating configure, and when running it.»
«To accomplish that, use the AC_PREFIX_DEFAULT macro.»
«The user of configure can select a different prefix using the –prefix and –exec-prefix options.»
И написано там это маленькими буквами:
# AC_PREFIX_DEFAULT(PREFIX) # ------------------------- AC_DEFUN([AC_PREFIX_DEFAULT], [m4_divert_text([DEFAULTS], [ac_default_prefix=$1])])
Вызвать только eautoreconf недостаточно, ещё можно вызвать пару функций из autotools.eclass
eautoconf
Runs autoconf.
eautomake
Runs automake.
Вызов программы ./configure выполняется при помощи функции econf
внутри src_configure
Передача переменной окружения EPREFIX через параметр --prefix
задокументирована в руководстве по разработке ебилдов:
«econf is designed to work with configure scripts generated by GNU Autoconf. It first passes the default options listed below to the configure script, followed by any additional parameters passed to econf.
--prefix="${EPREFIX}"/usr
--libdir
is set from the value of the LIBDIR_${ABI} variable in profiles.
Как параметр –prefix обрабатывается внутри ./configure остаётся загадкой. Но из написанного можно предположить, что название PREFIX заглавными буквами (без первой буквы E) это фантазия и нигде не используется.
Зачем в Gentoo назвали переменную EPREFIX, если переменной c именем PREFIX нигде нет? Зачем было добавлять лишнюю букву?
https://devmanual.gentoo.org/ebuild-writing/variables/index.html
EPREFIX
The normalised offset-prefix path of an offset installation. See Gentoo Prefix Technical Documentation for more information.
но там тоже про PREFIX ничего нет.
Зато есть в вопросах у пользователей Ubuntu - https://askubuntu.com/questions/891835/what-does-prefix-do-exactly-when-used-in-configure
вероятно негентушные дистрибутивы всё-таки имеют слово PREFIX заглавными буквами? Что там в документации по Debian? И в примере попроще и в примере посложнее используются конкретные значения, переменная окружения PREFIX не упоминается.
Может GNU make не учитывает регистр в названиях переменных?
В пункте 6 How to Use Variables написано:
«Variable names are case-sensitive.»
В пункте 6.10 Variables from the Environment написано:
«Every environment variable that make sees when it starts up is transformed into a make variable with the same name and value.»
А вот здесь мало того, что предлагают использовать заглавные буквы, так ещё и пишут, что это работает. Странно, не должно бы.
И по факту не работает:
$ cat Makefile
.SILENT: all
.PHONY: all
all:
echo prefix=$(prefix)
$ make prefix=/usr
prefix=/usr
$ PREFIX=/usr make
prefix=
Где вообще описан «стандарт» установки программ при помощи
./configure
make
make install
Почему надо делать именно так? В большом количестве книг? Пользователи привыкли? Так GNU Make не единственная, есть другие, (но они хуже, к ним не пользователи не привыкли)
Использование emake прописано прямо в Package Manager Specification (PMS).
Поэтому использование операционной системы Gentoo тормозит прогресс и переход на Cmake.