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)

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

Я пытаюсь прочитать руководство
https://www.gnu.org/prep/standards/html_node/DESTDIR.html
там написано:
«DESTDIR is a variable prepended to each installed target file»
Не получается распарсить. Если файл уже installed (установленный), то зачем писать к нему путь. А если файл going to be installed, то почему именно так не написали?

Зачем в имена таргетов добавили звёздочки:
«install* and uninstall* targets»
(могли бы и пояснить).

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

Двадцать лет назад [коллективный] я уже создавал такую тему

(цитирую оттуда)

Makefil-ы кое-как писать умею, в autotools - дуб-дубом

шли годы, а компетенций в области так и не прибавилось.. может, это не твоё? может, пора что-то изменить? 😊

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

не вижу корреляции между языком гайдов и накопленными компетенциями, есичесна…

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

Не копаешь - значит, не требуется )

aol ★★★★★
()

насколько я знаю, для Gentoo надо, чтобы поддерживалась переменная DESTDIR, для того, чтобы можно было собирать программы в PREFIX.

Нет.

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

Никто, кроме тебя не знает, что в этом файле.

И как потом к нему писать .ebuild? Есть ли статьи на эту тему?

Тынц?

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

Никто, кроме тебя не знает, что в этом файле.

Должны знать авторы гайдлайнов GNU. Какие в этом файле должны быть таргеты, с какими именами и зачем.

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

При чем здесь авторы гайдлайнов? Автор makefile’а может прописать (или не прописать) любые таргеты, какие ему вздумаются. Таргеты вроде install, переменные вроде DESTDIR - не более чем рекомендации. Их может и не быть.

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

ОМГ. Перестань искать готовые рецепты, да ещё и на русском. Сядь, соберись, потратит пять минут на рвзобраться и подправь свой Makefile так, чтобы он делал, что тебе нужно.

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

Там в документации столько всего написано - учитаешься:
https://www.gnu.org/software/make/manual/html_node/Install-Command-Categories.html

вот зачем тут три фазы инсталляции, почему нельзя было просто сделать три разных таргета?

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

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

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

@Pinkbyte - специально для тебя тег #gentoo не поставил, и ты всё равно пришел и стал читать (смайл влепил, причём тему до конца прочитал). Стоит ли для тебя стараться?

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

я метафорически выражался, развивайте мышление

и вообще, куда вы лезете, вы же занятые и вас отрывать не надо

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

вот поэтому я не люблю проекты на Makefile. Никогда не знаешь, о чем там очередной любитель KISS с suckless забыл или не подумал.

Lrrr ★★★★★
()

А ещё в Makefile нет переменной $(libdir), которая в gentoo функция $(get_libdir)
потому что кто же её установит?

https://devmanual.gentoo.org/ebuild-writing/functions/src_configure/configuring/index.html
я не понимаю, как работает эта строчка без autotools:
«–libdir is set from the value of the LIBDIR_${ABI} variable in profiles. »

Прекрати читать, а главное фейспалмить мои темы.

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

make all собирает не всё (потому что это перекладывается на make dist). Надо ли дособирать документацию и что там ещё бывает и добавлять дополнительные зависимости при написании ебилда?

Если надо, то как это сделать без вызова make dist ?

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

https://devmanual.gentoo.org/ebuild-writing/index.html

Всю документацию я пока не прочитал, это долго и сложно (читать).

Вот на этой странице написано, что

«The emake function should be used to call make»

На этой странице ещё немного слов про emake:
https://devmanual.gentoo.org/eclass-reference/ebuild/
(похоже она не в eclass, а прям встроенная?)

На этой странице рассказывается, что emake вызывается по-умолчанию без параметров:
https://devmanual.gentoo.org/ebuild-writing/functions/src_compile/index.html

    src_compile() {
    	if [[ -f Makefile ]] || [[ -f GNUmakefile ]] || [[ -f makefile ]]; then
    		emake || die "emake failed"
    	fi
    }

Сложно было дать гиперссылку на документацию к eclass-у, в котором она расположена? Как я должен угадать имя того екласса?

На самой странице ничего не сказано ни про передачу DESTDIR, ни про передачу ROOT, ни про передачу get_libdir, ни про PREFIX. Как это всё должно попасть в Makefile.

На странице
https://devmanual.gentoo.org/eclass-reference/ebuild/
есть про DESTDIR, но нет про PREFIX, get_libdir, ROOT:

src_install() {
    if [[ -f Makefile || -f GNUmakefile || -f makefile ]] ; then
        emake DESTDIR="${D}" install
    fi
    ...
}

И главное, хоть бы сослались на то, что надо ещё сделать дополнительно. А то так написано, что будет работать как есть, а на самом деле - не будет. Руководство разработчиков - источник недоделок и багов, куда это годится?

Где примеры? Или хотя бы гиперссылки на них? (смотреть в дереве не предлагать, по умолчанию же)

Кроме всего этого мне надо, чтобы установленные .pc-файлы содержали правильный контент и учитывали EPREFIX. И ещё надо регенерировать кеш шареных библиотек в pkg_postinst, наверное, чтобы это работало как для пакетов из исходников, так и для пакетов из бинарников. Как мне эту операцию отделить - как написано в руководстве GNU make или особым гентушным способом?

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

Почему в строке emake DESTDIR="${D}" install используется переменная $D, а не $ED ?

Где вообще документация на emake, мне что, вместо этого, надо читать документацию на einstall (которая deprecated)?

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

потому что надо emake DESTDIR="${D}" prefix="${EPREFIX}" libdir="$(get_libdir)" install

Документация на emake говорят что в PMS, но примеры там негодные (не работают с установкой в EPREFIX).

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

Просто добавь autotools или cmake или meson. Ни в коем случае не правь makefile, иначе волосы не вырастут.

А знаешь, для бизон-1.25 мне было быстрее CMakeLists.txt написать с 0, чем разбираться в автокрэп говне из 90х. Вполне допускаю, что с мамиными самописными мейкфайлами может быть также.

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

Ты же все равно делаешь по-своему

Дело в том, что Makefile не мой. А automake всё перегенерирует (то есть портит и стирает). Уверен, что если попросить руководство по преобразованию рандомного Makefile в файл configure.ac, то вы тоже ничего хорошего не скажете, как и на вопрос этого топика.

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

У меня есть универсальное руководство – RTFM.

Конкретный совет для этого топика – показываешь текст Makefile (он ведь небольшой) или ссылку на проект и просишь помочь разобраться с проблемами.

Negorro
()

Makefile не опакечивают. В конечный пакет обычно идут только результаты сборки.

Необязательно полагаться на правило install в файле. Если это нечто простое (создается только один бинарник), то достаточно скопировать в usr/bin/ пакета.

xDShot ★★★★★
()

Некоторые говорят, что создать Makefile можно не только при помощи Autotools. Но что бы вы думали? Поддержка Autotools таки зашита прямо в portage.

Слава функции econf, описанной в пункте «12.3.8 Build commands» документа Package Manager Specfication.
К передаваемым туда параметрам вполне приписан смысл, и если его изъять, то что-нибудь может отломаться.

Например поддержка «–disable-static» для EAPI 8.
«This option will only be passed if the string –disable-static occurs in the output of configure –help.»

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

Я ещё вот чего не понимаю. Когда выполняется команда make install, результат сборки репозитория устанавливается куда-то там в prefix (так, как у него по-умолчанию этот prefix устанавливается). Но ещё ведь, кроме prefix, надо знать имя пакета. А оно может не совпадать с именем репозитория. А имя репозитория может ни с чем не совпадать тоже. Получается, что «имя пакета по-умолчанию» должно быть прошито в Makefile. А это нелогично, потому что имена пакетов - внешние сущности, и даются позднее, при опакечивании.

Логично было бы тогда устанавливать в ${DESTDIR}$(prefix)/${PN}/, а этот самый ${PN} передавать снаружи, верно? И слот тоже: ${PN}-${SLOT}…

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