Bug 58008

Summary: Отсутствует Cflags: -I${includedir} в /usr/lib64/pkgconfig/oniguruma.pc
Product: Sisyphus Reporter: Vitaly Lipatov <lav>
Component: rpm-buildAssignee: placeholder <placeholder>
Status: NEW --- QA Contact: qa-sisyphus
Severity: normal    
Priority: P5 CC: arseny, glebfm, imz, ldv, placeholder, rider, vt
Version: unstable   
Hardware: x86_64   
OS: Linux   

Description Vitaly Lipatov 2026-02-25 12:55:57 MSK
При сборке rust-кода с этой библиотекой не получается найти заголовки.

pkg-config не возвращает -I/usr/include.
далее
https://crates.io/crates/pkg-config не включает /usr/include в include_paths
далее
onig_sys не может найти oniguruma.h
там такой код:

// onig_sys/build.rs:240-245
for path in &lib.include_paths {
    let header = path.join("oniguruma.h");
    if header.exists() {
        bindgen_headers(&header.display().to_string());
        return;
    }
}


Мне кажется, у нас дефолтные пути специально убраны. Но тогда ещё было rust :)


На ALT:
$ cat /usr/lib64/pkgconfig/oniguruma.pc
prefix=/usr
exec_prefix=/usr
libdir=/usr/lib64
includedir=/usr/include
datarootdir=/usr/share
datadir=/usr/share

Name: oniguruma
Description: Regular expression library
Version: 6.9.10
Requires:
Libs: -lonig
Cflags:


На Fedora:
$ cat /usr/lib64/pkgconfig/oniguruma.pc
prefix=/usr
exec_prefix=/usr
libdir=/usr/lib64
includedir=/usr/include
datarootdir=/usr/share
datadir=/usr/share

Name: oniguruma
Description: Regular expression library
Version: 6.9.10
Requires:
Libs: -L${libdir} -lonig
Cflags: -I${includedir}
Comment 1 Anton Farygin 2026-02-25 18:09:03 MSK
Вижу что в pc.in есть желаемое, а в итоговом результате - нету.
Но у меня в пакете нет ничего специального для того, что бы чистить pc файлы. Думаю что виноват кто-то в rpmbuild:

Cleaning files in /usr/src/tmp/oniguruma-buildroot (auto)
mode of './usr/lib64/libonig.so.5.5.0' changed from 0755 (rwxr-xr-x) to 0644 (rw-r--r--)
Verifying and fixing files in /usr/src/tmp/oniguruma-buildroot (binconfig,pkgconfig,libtool,desktop,gnuconfig)
/usr/bin/onig-config:
61c61
<         show_includedir=-I/usr/include
---
>         show_includedir=
/usr/lib64/pkgconfig/oniguruma.pc: Cflags: '-I${includedir}' --> ''
/usr/lib64/pkgconfig/oniguruma.pc: Libs: '-L${libdir} -lonig' --> '-lonig'
Checking contents of files in /usr/src/tmp/oniguruma-buildroot/ (default)

$ rpm -qf /usr/lib/rpm/fixup-pkgconfig 
rpm-build-4.0.4.210-alt1.x86_64
Comment 2 Anton Farygin 2026-02-25 18:10:08 MSK
Т.к. проблема видимо глобальная, то локальные хаки глобально ничего не изменят - чинить надо rpm-build или rust-код.
Comment 3 Dmitry V. Levin 2026-02-25 18:53:35 MSK
-I/usr/include не нужен и даже вреден.  Далее следует цитата из man gcc:

You can use -I to override a system header file, substituting your own version, since these directories are searched before the standard system header file directories.  However, you should not use this option to add directories that contain vendor-supplied system header files; use -isystem for that.
Comment 4 Anton Farygin 2026-02-25 20:08:00 MSK
Дим, а насколько вообще реально то, что (при условии что все другие дистрибутивы не вычищают pc файлы) смена порядка поиска заголовков может привести к проблемам ?

Ведь чистка pc файлов рассчитана на то, что их будет использовать только gcc, а реальность оказалась такова, что есть и другие потребители и они совсем не готовы к тому, что у нас поведение меняется от апстримного.
Comment 5 Vitaly Lipatov 2026-03-05 16:44:54 MSK
(Ответ для Anton Farygin на комментарий #1)
> Вижу что в pc.in есть желаемое, а в итоговом результате - нету.
> Но у меня в пакете нет ничего специального для того, что бы чистить pc
> файлы. Думаю что виноват кто-то в rpmbuild:
...

У меня наоборот, не убраны, хотя хотелось бы:

$ cat /usr/lib64/pkgconfig/tdjson.pc
prefix=/usr

Name: tdjson
Description: Telegram Library - JSON interface (shared)
Version: 1.8.52

CFlags: -I"${prefix}/include"
Libs: -L"${prefix}/lib64" -ltdjson
Requires.private: tdjson_private


Видимо, потому что не использованы промежуточные переменные типа
libdir=/usr/lib64
includedir=/usr/include
Comment 6 Vitaly Chikunov 2026-03-05 21:52:47 MSK
При каких условиях pkg-config не возвращает -I/usr/include, а должен?

Если ошибка в pkg-config-rs, то, вроде бы, он и должен её фиксить.

Зачем у нас удаляется -I/usr/include из *.pc файлов не вполне понятно, ведь это ломает поддержку PKG_CONFIG_SYSROOT_DIR / PKG_CONFIG_SYSTEM_INCLUDE_PATH. pkg-config сам справляется с удалением -I/usr/include, но может раньше он этого не делал? Тогда это просто устарело, зачем делать за pkg-config его работу.
Comment 7 Vitaly Chikunov 2026-03-05 22:47:13 MSK
Код, который удаляет -I от 2002. Может его убрать?

Или оставить только кейс с /usr/local/include

                new_val=`printf %s "$new_val" |sed -e 's,\(^\| \+\)-I/usr\(/local\)\?/include\($\| \+\),\1\3,g'` || return 1
                        new_val=`printf %s "$new_val" |sed -e 's,\(^\| \+\)-I\${includedir}\($\| \+\),\1\2,g'` || return 1


хотя, лучше и его убрать, так как заменять просто не нужно, а паковать в /usr/local запрещено.

И оставить замену для -Wl,-rpath убрав -L

                new_val=`printf %s "$new_val" |sed -e 's#\(^\| \+\)\(-L\|-Wl,-rpath,\)/usr\(/local\)\?/'"$RPM_LIB"'\($\| \+\)#\1\4#g'` &&
                new_val=`printf %s "$new_val" |sed -e 's#\(^\| \+\)\(-L\|-Wl,-rpath,\)\('$RPM_BUILD_ROOT'\|'$RPM_BUILD_DIR'\|/usr/lib[^/]*/gcc-lib\)[^ ]*\($\| \+\)#\1\4#g'` ||
                        new_val=`printf %s "$new_val" |sed -e 's#\(^\| \+\)\(-L\|-Wl,-rpath,\)\${libdir}\($\| \+\)#\1\3#g'` || return 1

@ldv?

На мой взгляд, при обычном и правильном использовании pkg-config ничего не должно поменяться. Наладится использование PKG_CONFIG_SYSROOT_DIR / PKG_CONFIG_SYSTEM_INCLUDE_PATH (хотя очевидно, что никто этим не пользовался). Что-то поменяется если кто-то парсит *.pc files.
Comment 8 Vitaly Chikunov 2026-03-06 03:24:15 MSK
Вот тестовое/rfc задание https://git.altlinux.org/tasks/410162/