LINUX.ORG.RU

Как сделать Makefile пригодным для опакечивания?

 , ,


1

1

Обычно все программы используют 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.»


В каких случаях как надо делать:

  1. make --prefix=/usr
  2. PREFIX=/usr make
  3. make prefix=/usr
  4. 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.

★★★

Последнее исправление: Shushundr (всего исправлений: 35)

Ответ на: комментарий от aol

Требуется - копаешь, гранит грызёшь и т.д. Медленно, но продвигаешься.

Этот гранит уже давно должен быть в песок весь перегрызен и изложен в методических указаниях для студентов. Времени прошло 20 лет, как было упомянуто выше.

Я хочу, чтобы директория создавалась так, чтобы учитывался номер слота. Что мне делать? Патчить снаружи autoconfig.ac во всех пакетах? Переписывать autotools вместе с portage? Я не потяну, это слишком сложно. Кто-то же уже должен был сталкиваться с такой проблемой? Если я первый, то почему бы мне не писа́ть об этом?

Shushundr ★★★
() автор топика

Как configure передаёт $(prefix) в Makefile?

Хорошо было бы, чтобы где-нибудь в интернете просто лежал пример с ответом на вопрос именно с таким текстом. А сейчас есть только общие слова, что configure берёт файл Makefile.in и заменяет там все вхождения имён переменных вида @VARIABLE@ на значения этих переменных. Т.е. в Makefile.in хочется вписать что-то вроде

prefix=@prefix@

А пример не ищется.

То, как запускается ./configure командой

./configure --prefix=/usr

написано на каждому углу
но это и понятно, читателей больше, чем писателей.

«А искал ли ты на самом деле, или только написал о необходимости этого действия, а искать не стал?» - спросите вы меня.
Ну вот, что я нашел:
https://stackoverflow.com/questions/909151/how-do-i-pass-through-program-prefix-prefix-from-configure-to-one-of-the-child
Похоже? Похоже. Но примера в таком виде, как я хочу, там нет.

А ты возьми и просто попробуй, скажете вы.
Это, блин, долго. И психологически сложно. Одно дело - взять и сделать по учебнику, а другое сидеть и пробовать варианты из-за того, что документация - говно, а туториалов нет.

Вот в документации написано:

prefix
A prefix used in constructing the default values of the variables listed below. The default value of prefix should be /usr/local. When building the complete GNU system, the prefix will be empty and /usr will be a symbolic link to /. (If you are using Autoconf, write it as ‘@prefix@’.)
Running ‘make install’ with a different value of prefix from the one used to build the program should not recompile the program.

В генте последняя строчка очевидно нарушается. Потому что в ней EPREFIX засовывается в src_configure, и просто так выполнить src_install через emerge, а не ebuild нельзя.
Как задаётся значение по-умолчанию тоже непонятно (где-то в configure.ac?). Почему-то писать понятным образом авторы документации не умеют.

Shushundr ★★★
() автор топика
Последнее исправление: Shushundr (всего исправлений: 1)
Ответ на: комментарий от Shushundr

Или вот, если в configure надо запихнуть переменную ${MY_HTDOCSDIR}, для того, чтобы файлы инсталлировать именно туда, то надо в configure.ac записать строки

AC_ARG_VAR([MY_HTDOCSDIR], [The path to the htdocs directory])
AC_SUBST([MY_HTDOCSDIR])

и вызывать

MY_HTDOCSDIR=/path/to/htdocs ./configure

Искал поиском - ничего подобного!

UPD: есть такое:

--enable-htmldir="${MY_HTDOCSDIR}"
Shushundr ★★★
() автор топика
Последнее исправление: Shushundr (всего исправлений: 1)
Ответ на: комментарий от Shushundr

prepended

А это тонкости перевода. «DESTDIR — это переменная», { добавляемая или добавленая?} к каждому установленому целевому файлу.

писать к нему путь

Писать в настоящем времени или в прошедшем?

Зачем в имена таргетов добавили звёздочки: «install* and uninstall* targets»

Обычное регулярное выражение. Кроме install ещё есть install-strip, install-html и т.д.

Вобще я не понял, есть же проекты просто с Makefile, к ним есть ebuild. Можно было просто посмотреть и написать по образцу, но вы укатили эту тему в autotools и почему-то не создаёте новую тему.

mky ★★★★★
()
Ответ на: комментарий от mky

почему-то не создаёте новую тему

Потому что я не считаю тему новой. У меня ещё эта не решенная.

есть же проекты просто с Makefile, к ним есть ebuild.

Нет, это импоссибл. ./configure должна быть потому что это GNU Coding Guidelines:

https://www.gnu.org/prep/standards/html_node/Configuration.html
«Each GNU distribution should come with a shell script named configure»

Shushundr ★★★
() автор топика
Ответ на: комментарий от Shushundr

«Each GNU distribution should come with a shell script named configure»

Сколько лет этой фразе и сколько лет GNU?

И, если вы такой ценитель правил, немедлено удалите из свой системы bzip2 и libbz2 и только после этого продолжайте.

mky ★★★★★
()

Как я выяснил:

  1. нет лицензии правильнее GPL v3+
    Прецедент с Minix
  2. наличие файла ./configure требуется в GNU Coding Standards
    «Each GNU distribution should come with a shell script named configure.»
  3. не существует способов создать файл ./configure в обход использования GNU Autotools.
    SCons не делает этого, CMake не делает этого, Meson не делает этого
  4. PMS вообще, portage в частности, да и Autotools тоже - заточены на использование утилиты make (а не какой-нибудь другой системы сборки, типа Apache Ant). Чтобы заменить make на что-то другое надо немало переписать.
  5. У Autotools нет стандарта на установку web-приложений
  6. Документация Gentoo пропускает в схеме описание чудесной утилиты aclocal и связанной с ней директории /usr/share/aclocal/
    Там даже просто не написано, какой пакет (название, кстати, вовсе не очевидное) мёржить для установки autotools, из-за этого неясно что вписывать в зависимость своего билда, который устанавливает дополнительные макросы.

Всё это не может быть простым совпадением. Это заговор!

Shushundr ★★★
() автор топика