Bug 52754 - AutoReq from cmt files?
Summary: AutoReq from cmt files?
Status: REOPENED
Alias: None
Product: Sisyphus
Classification: Development
Component: rpm-build-ocaml (show other bugs)
Version: unstable
Hardware: x86 Linux
: P5 normal
Assignee: Anton Farygin
QA Contact: qa-sisyphus
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2025-01-19 10:01 MSK by Vitaly Chikunov
Modified: 2025-01-23 15:54 MSK (History)
1 user (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Vitaly Chikunov 2025-01-19 10:01:28 MSK
Вы уверены, что стоит все символы из .cmt файлов добавлять в Requires?

При сборке Why3 из-за этого туда попадает 169 внутренних "интерфейсов" и порождающие анметы, которые не устранить.

Например, в Fedora в их ocamldeps .cmt не парсятся:
  https://github.com/rpm-software-management/rpm/blob/master/scripts/ocamldeps.sh

Пока я попробовал сделать так, чтоб не отключать autoreq ocaml полностью:

  %add_ocaml_req_skip ?cmt_requires.*

Но, он явно для этого не был предназначен.
Comment 1 Anton Farygin 2025-01-19 18:29:37 MSK
К сожалению да, уверен. Без них многие зависимости между всеми devel пакетами ocaml автоматически не вычисляются и приходится делать много ручной работы.

req_skip для такого случая нормальное явление.
Comment 2 Anton Farygin 2025-01-19 18:46:00 MSK
При следующем обновлении ocaml сделаю ещё один заход на его зависимости, посмотрю можно ли что-то с этим сделать.

Вся проблема в том, что апстрим не предполагает разделение пакетов на devel и runtime части и если всё паковать в один пакет - то без cmt зависимостей всё находится. Если разбивать, то приходится часть сборочных зависимостей добавлять вручную и они становятся несоответствующими перечисленным в opam файле.

Но так было во времена ocaml 4.14 - с новым 5.3 я не проверял, возможно ситуация улучшилась.
Comment 3 Vitaly Chikunov 2025-01-20 01:19:32 MSK
1. Если дело только в связи devel и runtime, то в чем проблема подхода с `Requires: ocaml-%name = %EVR` в ocaml-%name-devel? Решать лишние зависимости сложнее чем прописать эту строку.

2. Проблема в %add_ocaml_req_skip в том что добавлять туда 169 интерфейсов придется вручную, что сложно (их список можно определить только читая лог сборочницы) и некрасиво.

3. Проблема предложенного костыля с %add_ocaml_req_skip что при тюнинге RE он сломается.

4. Хотел еще предложить абстрактную идею, может стоит усовершенствовать `ocamlobjinfo -format-reqprov`, раз это наш код, чтоб он не выводил локальные интерфейсы. ocamlobjinfo -shape показывает кое какую информацию по которой можно предположить локальность интерфейса.

 builder@x86_64:~/tmp/why3-buildroot$ ocamlobjinfo -shape ./usr/lib64/ocaml/why3/why3.cmt | grep Stdlib__Arg
         f8e8890965c203c25968b7219e7d0d37        Stdlib__Arg
 builder@x86_64:~/tmp/why3-buildroot$
 builder@x86_64:~/tmp/why3-buildroot$ ocamlobjinfo -shape ./usr/lib64/ocaml/why3/why3.cmt | grep Why3printer
         3ead4b7364cdbdd1a793c713d8894f4c        Why3printer
  "Why3printer"[module] -> CU Why3printer;

5. Если локальные интерфейсы надо выводить, то надо их выводить и в Provides, разве это не баг autoreq?
Comment 4 Vitaly Chikunov 2025-01-20 01:47:13 MSK
Если нужна только авто-зависимость между devel пакетами может парсить META, там же есть 

  builder@x86_64:~/tmp/why3-buildroot/usr/lib64/ocaml/why3$ grep req META
  requires = "menhirLib re unix zarith dynlink zip   sexplib"
Comment 5 Anton Farygin 2025-01-20 09:34:07 MSK
(In reply to Vitaly Chikunov from comment #3)
> 1. Если дело только в связи devel и runtime, то в чем проблема подхода с
> `Requires: ocaml-%name = %EVR` в ocaml-%name-devel? Решать лишние
> зависимости сложнее чем прописать эту строку.

Нет, проблема не в связи devel и runtime, а в связи devel одного пакета с devel других пакетов.

> 
> 2. Проблема в %add_ocaml_req_skip в том что добавлять туда 169 интерфейсов
> придется вручную, что сложно (их список можно определить только читая лог
> сборочницы) и некрасиво.

Согласен.

> 
> 3. Проблема предложенного костыля с %add_ocaml_req_skip что при тюнинге RE
> он сломается.
> 
> 4. Хотел еще предложить абстрактную идею, может стоит усовершенствовать
> `ocamlobjinfo -format-reqprov`, раз это наш код, чтоб он не выводил
> локальные интерфейсы. ocamlobjinfo -shape показывает кое какую информацию по
> которой можно предположить локальность интерфейса.

Сейчас это не наш код - это модифицированный апстримный код, а модификация только меняет формат вывода, не делая больше ничего в плане логики.

> 
>  builder@x86_64:~/tmp/why3-buildroot$ ocamlobjinfo -shape
> ./usr/lib64/ocaml/why3/why3.cmt | grep Stdlib__Arg
>          f8e8890965c203c25968b7219e7d0d37        Stdlib__Arg
>  builder@x86_64:~/tmp/why3-buildroot$
>  builder@x86_64:~/tmp/why3-buildroot$ ocamlobjinfo -shape
> ./usr/lib64/ocaml/why3/why3.cmt | grep Why3printer
>          3ead4b7364cdbdd1a793c713d8894f4c        Why3printer
>   "Why3printer"[module] -> CU Why3printer;
> 
> 5. Если локальные интерфейсы надо выводить, то надо их выводить и в
> Provides, разве это не баг autoreq?

Это опять же проблема апстримного кода. 
У локальных интерфейсов точно есть реализация ? Такое ощущение что это та же ошибка:
https://github.com/ocaml/ocaml/issues/9050
Comment 6 Anton Farygin 2025-01-20 10:09:24 MSK
(In reply to Vitaly Chikunov from comment #4)
> Если нужна только авто-зависимость между devel пакетами может парсить META,
> там же есть 
> 
>   builder@x86_64:~/tmp/why3-buildroot/usr/lib64/ocaml/why3$ grep req META
>   requires = "menhirLib re unix zarith dynlink zip   sexplib"

тогда, видимо, надо все META перенести в devel. И ещё есть несколько пакетов, в которых META отстутсвуют (начиная с самого ocaml).

На самом деле, конечно, гораздо интереснее вместо META парсить dune - но ещё остались пакеты, собираемые через findlib и dune есть в меньшем объёме чем META.
Comment 7 Anton Farygin 2025-01-20 15:30:37 MSK
Переоткрою что бы не потерять и не забыть что надо сделать.
1) META точно надо перенести в devel
2) надо посмотреть, получится ли в runtime пакете оставить только cmxs и cma (первая рантайм для бинарей, вторая для байткода). Сейчас из cmxs вообще не выгребаются зависимости. Этот код надо ещё добавить в ocamlobjinfo
3) это изменение желательно делать при выходе новой версии ocaml (когда пересобираются все пакеты), что бы не было конфликтов между devel и runtime пакетами разных сборок.
Comment 8 Anton Farygin 2025-01-21 14:28:42 MSK
Сделал ещё один подход.

В devel пакете остаются:
      -regex '.*\\\.(a|o|cmi|cmt|cmti|cmx|cmxa|ml|mli|exe)$' \\\

В runtime:
      -regex '.*\\\.(cmo|cma|cmxs|so|js)$' \\\

зависимости вида cmx забираю из cmxs
зависимости вида cmi - из cma
Интерфейсы должны быть в runtime части, т.к. Dynlink их использует при динамической подгрузке библиотек.

если я зависимости вида cmt убираю, то автоматического определения зависимостей между devel пакетами не остаётся.

Для why3 предлагаю просто удалить cmt файлы. По идее они не обязательны для работы, если why3 их как-то специально не использует.
Comment 9 Anton Farygin 2025-01-23 15:54:56 MSK
перенёс META в devel пакет, перенёс весь байткод в runtime пакет. Отключил cmt/cmti.

Там, где есть нативная компиляция - зависимости считаются прекрасно.
На  i586 кроме как cmt/cmti брать зависимости неоткуда (если считать их по хешам символов):

/usr/lib/ocaml/csexp/META
/usr/lib/ocaml/csexp/csexp.cmt
/usr/lib/ocaml/csexp/csexp.cmti
/usr/lib/ocaml/csexp/csexp.ml
/usr/lib/ocaml/csexp/csexp.mli
/usr/lib/ocaml/csexp/dune-package
/usr/lib/ocaml/csexp/opam

dune-package еть не везде - много где на dune не перешли и переходить принципиально отказываются. там же нет и opam. 
META есть почти везде.

Видимо других вариантов, кроме как генерация зависимостей из META пока нет.