Created attachment 10259 [details] Исправление с зашитым UTF-8 При работе с KiCAD столкнулся с тем, что библиотеки проекта не находятся, если путь до проекта содержит русские буквы. Библиотеки проекта ищутся относительно переменной окружения KIPRJMOD. И оказалось, что если там есть что-то кроме ASCII, то wxGetEnv() возвращает пустую строку. Насколько я понимаю, проблема там на стр. 1330 модуля utilsunx.cpp (http://git.altlinux.org/gears/w/wxGTK3.0.git?p=wxGTK3.0.git;a=blob;f=src/unix/utilsunx.cpp;h=b9664094228d2deb1a7a00709dfac073734c8bfc;hb=3274364fc9016f31e61c8fd489fcb7a8ac9e33d9#l1330): 1321 bool wxGetEnv(const wxString& var, wxString *value) 1322 { 1323 // wxGetenv is defined as getenv() 1324 char *p = wxGetenv(var); 1325 if ( !p ) 1326 return false; 1327 1328 if ( value ) 1329 { 1330 *value = p; 1331 } 1332 1333 return true; 1334 } Здесь char* присваивается wxString*. Магия C++, конечно, создаёт объект, но о кодировке она ничего не знает. И в результате из непустой char* получаем пустую wxString. Исправление, на первый взгляд, кажется тривиальным (прикладываю) — но только, если забыть о том, что кроме UTF-8 существуют и другие кодировки. P.S. Завожу ошибку в p10, поскольку проверял на нём. Но похоже, что эта проблема должна быть и в Сизифе, и на wxGTK3.1. Потому что везде один и тот же код. Хотя, возможно, отличаются конструкторы.
Created attachment 10260 [details] Программа для проверки
Прикладываю прогу, которой проверял: [builder@localhost ~]$ echo $LANG ru_RU.UTF-8 [builder@localhost ~]$ TESTVAR='Проверка' ./wxGetEnv_test Test string: "". [builder@localhost ~]$ LD_PRELOAD=./libwx_baseu-3.0.so TESTVAR='Проверка' ./wxGetEnv_test Test string: "Проверка". В последнем случае через LD_PRELOAD подгружается исправленная библиотека.
Результат проверки актуальности Состояние: p10: wxGTK3.0 3.0.5.1. Sisyphus: wxGTK3.0 3.0.5.1-alt8 и wxGTK3.2 3.2.11, wxGetEnv всё ещё *value = p без отдельного UTF-8 фикса. Рекомендация: ретест на Sisyphus (kicad и путь с кириллицей)
Sisyphus x86_64 (обновлён 2026-09-16), libwxGTK3.2-devel-3.2.11-alt1 / libwxBase3.2-3.2.11-alt1 (wxGTK3.0 в Sisyphus без -devel, собрать против него уже нельзя; kicad-10.0.6-alt2 собран с 3.2) — перевожу компонент на wxGTK3.2. Программа из вложения 10260 без изменений, g++ ... $(wx-config --cxxflags --libs base): $ env -i LANG=ru_RU.UTF-8 TESTVAR='Проверка' ./wxGetEnv_test Test string: "". $ env -i LANG=C.UTF-8 TESTVAR='Проверка' ./wxGetEnv_test Test string: "". Та же программа с setlocale(LC_ALL, "") в начале main() — или wxAppConsole + wxUILocale::UseDefault(): Test string: "Проверка". Причина та, что в отчёте: в 3.2.11 wxGetEnv() по-прежнему делает `*value = p` (src/unix/utilsunx.cpp:1431), т.е. конвертирует через wxConvLibc = mbsrtowcs() в текущей локали процесса; wx с 2.9.5 сам setlocale() не вызывает (docs/changes_30.txt), поэтому без wxLocale/wxApp::SetCLocale() процесс сидит в "C" и любая не-ASCII переменная превращается в пустую строку. В апстриме исправлено в wxWidgets 3.3.0: PR #25101 «Use UTF-8 for environment variables» (https://github.com/wxWidgets/wxWidgets/pull/25101, коммит 3ebcfe25c317, 2025-01-24) — wxGetEnv/wxSetEnv/wxGetenv перешли на wxConvWhateverWorks (UTF-8, затем локаль). В 3.2.x не бэкпортировано, wxGTK3.3 в Sisyphus нет. Перевешиваю на сопровождающего wxGTK3.2: кандидат на бэкпорт PR #25101 в wxGTK3.2 (3 файла, без изменения ABI).
wxGTK3.2-3.2.11-alt2 -> sisyphus: Wed Sep 16 2026 Anton Midyukov <antohami@altlinux> 3.2.11-alt2 - Add upstream fixes from 3.3 version (Closes: 41885): + Use UTF-8 for environment variables. + Use UTF-8 in wxGetenv() overload for wide strings too.