При очередном обновлении не собрался xorg-server-1.13.1, выдавая при билде следующую ошибку:
/mnt/storage/portage_tmp/portage/x11-base/xorg-server-1.13.1/work/xorg-server-1.13.1/glx/createcontext.c: In function ‘__glXDisp_CreateContextAttribsARB’: /mnt/storage/portage_tmp/portage/x11-base/xorg-server-1.13.1/work/xorg-server-1.13.1/glx/createcontext.c:190:29: error: ‘GLX_LOSE_CONTEXT_ON_RESET_ARB’ undeclared (first use in this function) /mnt/storage/portage_tmp/portage/x11-base/xorg-server-1.13.1/work/xorg-server-1.13.1/glx/createcontext.c:190:29: note: each undeclared identifier is reported only once for each function it appears in /mnt/storage/portage_tmp/portage/x11-base/xorg-server-1.13.1/work/xorg-server-1.13.1/glx/createcontext.c:248:10: error: ‘GLX_CONTEXT_ES2_PROFILE_BIT_EXT’ undeclared (first use in this function) make[1]: *** [createcontext.lo] Error 1
Погуглив ошибку, наткнулся на обсуждение, но решения не нашел.
Итак, не собирается файл xorg-server-1.13.1/glx/createcontext.c. Не находятся два макроса-константы: GLX_LOSE_CONTEXT_ON_RESET_ARB и GLX_CONTEXT_ES2_PROFILE_BIT_EXT.
Поиск
Идем в createcontext.c. Для этого вытаскиваем из /usr/portage/distfiles/ архив с исходниками и распаковываем его в удобное место. Смотрим начало файла, где находятся все инклуды
#ifdef HAVE_DIX_CONFIG_H #include <dix-config.h> #endif #include <GL/glxtokens.h> #include "glxserver.h" #include "glxext.h" #include "indirect_dispatch.h"Хочу проверить, а соберется ли он просто так из исходников при помощи autotools. Захожу в директорию с распакованным xorg'ом и делаю:
$ ./configure $ make
и обнаруживаю, что он спокойно себе собирается, не выдавая никаких ошибок. Значит ebuild так формирует параметры сборки, что подключаются не те заголовочные файлы.
Лезу в ebuild
Лезу в ebuild
less /usr/portage/x11-base/xorg-server/xorg-server-1.13.1.ebuildи нахожу там:
# Xorg-server requires includes from OS mesa which are not visible for # users of binary drivers. mkdir -p "${T}/mesa-symlinks/GL" for i in gl glx glxmd glxproto glxtokens; do ln -s "${EROOT}usr/$(get_libdir)/opengl/xorg-x11/include/$i.h" "${T}/mesa-symlinks/GL/$i.h" || die done for i in glext glxext; do ln -s "${EROOT}usr/$(get_libdir)/opengl/global/include/$i.h" "${T}/mesa-symlinks/GL/$i.h" || die done append-cppflags "-I${T}/mesa-symlinks" xorg-2_src_configure
Т.е. специально подсовываются заголовочные файлы из /usr/lib64/opengl/xorg-x11/include/. Подозрение падает на glxtokens.h из-за названия и того, что он есть в сишном файле. Необходимых макросов-констант в нем не оказывается. Этот файл /usr/lib64/opengl/xorg-x11/include/glxtokens.h оказывается сиротой, т.е. о его принадлежности к конкретному пакету portage не знает. Это проверено следующей командой:
equery belongs usr/lib64/opengl/xorg-x11/include/glxtokens.h
Пытаюсь найти в системе файлы с таким названием, делая
locate glxtokens.hи нахожу такой же заголовочный файл принадлежащий x11-proto/glproto:
equery belongs /usr/include/GL/glxtokens.h * Searching for /usr/include/GL/glxtokens.h ... x11-proto/glproto-1.4.16 (/usr/lib64/opengl/xorg-x11/include/GL/glxtokens.h)
В этом glxtokens.h все необходимые-макросы константы есть:
# cat /usr/include/GL/glxtokens.h | grep GLX_LOSE_CONTEXT_ON_RESET_ARB #define GLX_LOSE_CONTEXT_ON_RESET_ARB 0x8252 # cat /usr/include/GL/glxtokens.h | grep GLX_CONTEXT_ES2_PROFILE_BIT_EXT #define GLX_CONTEXT_ES2_PROFILE_BIT_EXT 0x0004
Решение
Удаляю usr/lib64/opengl/xorg-x11/include/glxtokens.h и заменяю его на симликом на /usr/include/GL/glxtokens.h
# rm /usr/lib64/opengl/xorg-x11/include/glxtokens.h # ln -s /usr/include/GL/glxtokens.h /usr/lib64/opengl/xorg-x11/include/glxtokens.h