воскресенье, 7 апреля 2013 г.

Gentoo. Не собирается xorg-server-1.13.1



При очередном обновлении не собрался 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
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

После чего xorg-server успешно собирается.