Import for manually building X
authordavshao <davshao@web>
Thu, 27 May 2010 01:46:16 +0000 (18:46 -0700)
committerCharlie <root@leaf.dragonflybsd.org>
Thu, 27 May 2010 01:46:16 +0000 (18:46 -0700)
docs/developer/manually_build_x_and_beyond/index.mdwn [new file with mode: 0644]

diff --git a/docs/developer/manually_build_x_and_beyond/index.mdwn b/docs/developer/manually_build_x_and_beyond/index.mdwn
new file mode 100644 (file)
index 0000000..0fb3835
--- /dev/null
@@ -0,0 +1,370 @@
+# Manually Building X and Beyond
+
+We try something **ill-advised**, we build a separate version of X.org in another directory, say */opt/xbeta*,
+on the same machine where we have installed the latext pkgsrc.  We do this because we have no choice but to
+use the graphics hardware on this machine, but the risk is that it is very easy to link the wrong libraries
+from pkgsrc.
+
+## Disclaimer
+
+The following notes describe alterations to one's system that may leave the graphical user interface based
+on X.org unusable.  Use at one's own risk.  Because the risk of damaging one's system is so great, I refuse
+to provide ready-to-run scripts.
+
+## Installing from pkgsrc
+
+### GNU m4 1.4.14 and bison 2.4.2
+
+Patch both *devel/m4* and *devel/bison* using the patch idea from:
+<http://www.netbsd.org/cgi-bin/query-pr-single.pl?number=43098>
+
+Unfortunately the problems are in the *work* directories so that one needs the knowledge from
+<http://www.netbsd.org/docs/pkgsrc/components.html>
+to even get the patches to be applied.
+
+Install *pkgtools/pkgdiff*.
+
+### gstreamer 0.10
+
+As of 2010-05-09, I find it necessary on x86_64 to use the following patch for
+pkgsrc gstreamer0.10, an eventual dependency of the full xfce desktop:
+
+    --- pkgsrc/multimedia/gstreamer0.10/Makefile.orig       2010-03-29 16:04:23 -0700
+    +++ pkgsrc/multimedia/gstreamer0.10/Makefile    2010-03-29 16:09:04 -0700
+    @@ -44,6 +44,11 @@
+     .include "../../mk/bsd.prefs.mk"
+    +# __udivti3 error otherwise
+    +.if ${OPSYS} == "DragonFly" && ${MACHINE_ARCH} == "x86_64"
+    +MAKEFLAGS+=    CCVER=gcc44
+    +.endif
+    +
+     .if ${OPSYS} == "NetBSD"
+     # We must have a glib2 compiled with the RTLD_GLOBAL fix; if not, plugins
+     # won't work at all.
+
+See for example the following bug report for more details:
+<http://mail-index.netbsd.org/pkgsrc-bugs/2010/03/30/msg037304.html>
+
+### expat and gettext
+
+We start with installing into */opt/xbeta* [expat 2.0.1](http://sourceforge.net/projects/expat/)
+and [gettext 0.17](http://www.gnu.org/software/gettext/).
+
+### Git repository for most of X.org
+
+We use the following listing:
+
+[freedesktop.org git repository browser](http://cgit.freedesktop.org/)
+
+One can easily script getting, updating, and building the projects listed on that page.
+
+### Example of using ldd
+
+    $ ldd ./libXau.so.6          
+    ./libXau.so.6:
+       libc.so.7 => /usr/lib/libc.so.7 (0x800640000)
+    $ ldd ./libXdmcp.so.6        
+    ./libXdmcp.so.6:
+        libc.so.7 => /usr/lib/libc.so.7 (0x800640000)
+
+### libxcb problem with Python 2.6 cElementTree
+
+Library *xcb/libxcb* unfortunately needs to be built early and there is a catch for
+using pkgsrc Python 2.6.  Unfortunately at the current time not all of
+*cElementTree* appears to be functional; therefore, one needs a patch similar to
+
+    diff --git a/src/c_client.py b/src/c_client.py
+    index d86d05e..36a7039 100755
+    --- a/src/c_client.py
+    +++ b/src/c_client.py
+    @@ -1,5 +1,5 @@
+     #!/usr/bin/env python
+    -from xml.etree.cElementTree import *
+    +from xml.etree.ElementTree import *
+     from os.path import basename
+     import getopt
+     import sys
+
+As of May 20, 2010, the situation for libxcb seems to be more complicated.  The latest *xcb/proto* needs
+to be installed.  If one does not wish to install on top of one's current Python modules,
+define
+
+    export PYTHONPATH=${PREFIX}/lib/python2.6/site-packages
+
+and apply a patch similar to below to change from using Python 2.6's *cElementTree* to *ElementTree*
+
+    diff --git a/xcbgen/matcher.py b/xcbgen/matcher.py
+    index e7958fa..16e8273 100644
+    --- a/xcbgen/matcher.py
+    +++ b/xcbgen/matcher.py
+    @@ -7,7 +7,7 @@ we do not create a new type object, we just record the existing one under a new
+     '''
+
+     from os.path import join
+    -from xml.etree.cElementTree import parse
+    +from xml.etree.ElementTree import parse
+
+     import state
+     from xtypes import *
+    diff --git a/xcbgen/state.py b/xcbgen/state.py
+    index 51efc94..e72dc3e 100644
+    --- a/xcbgen/state.py
+    +++ b/xcbgen/state.py
+    @@ -2,7 +2,7 @@
+     This module contains the namespace class and the singleton module class.
+     '''
+     from os.path import dirname, basename
+    -from xml.etree.cElementTree import parse
+    +from xml.etree.ElementTree import parse
+
+     import matcher
+     from error import *
+
+### libXext
+
+      CCLD   libXext.la
+    /usr/libexec/binutils217/elf/ld: .libs/extutil.o: relocation R_X86_64_PC32 against `xgeExtRegister' can not be used when making a shared   object; recompile with -fPIC
+    /usr/libexec/binutils217/elf/ld: final link failed: Bad value
+
+Use the following patch from <http://lists.x.org/archives/xorg-devel/2009-November/003724.html>
+
+    diff --git a/src/Xge.c b/src/Xge.c
+    index 7a583e5..2ea5d27 100644
+    --- a/src/Xge.c
+    +++ b/src/Xge.c
+    @@ -294,7 +294,7 @@ _xgeEventToWire(Display* dpy, XEvent* re, xEvent* event)
+     /*
+      * Extensions need to register callbacks for their events.
+      */
+    -Bool
+    +_X_HIDDEN Bool
+     xgeExtRegister(Display* dpy, int offset, XExtensionHooks* callbacks)
+     {
+         XGEExtNode* newExt;
+
+### FreeType 2
+
+We install [FreeType 2.3.12](http://www.freetype.org/).  It appears that *GNUMAKE=gmake* is required.
+Most of the X.org projects use *autogen.sh*, but here we use a standard call to *configure* somewhat
+similar to:
+
+        export ACLOCAL="aclocal -I ${PREFIX}/share/aclocal"
+        export PKG_CONFIG_PATH="${PREFIX}/lib/pkgconfig"
+        GNUMAKE=gmake ./configure --prefix=${PREFIX} CPPFLAGS="-I${PREFIX}/include -I${PREFIX}/X11/include" LDFLAGS="-L${PREFIX}/lib -Wl,-rpath -Wl,${PREFIX}/lib -L${PREFIX}/X11/lib -Wl,-rpath -Wl,${PREFIX}/lib/X11"
+
+where *$PREFIX* is where we install X.org, say */opt/xbeta*,
+the first two exports of *ACLOCAL* and *PKG_CONFIG_PATH* occur for most X.org projects,
+*CPPFLAGS* and *LDFLAGS* ensure that the *$PREFIX* include directories and library paths
+are used, and *-Wl,-rpath ...* is an incantation that ensures that previous built
+*libtool* libraries can be used.
+
+### libXfont
+
+*autogen.sh* script seems to build easier with
+    --without-xmlto
+option.
+
+### Mesa
+
+As of 2010-05-09, known problem with GNU m4 pkgsrc on DragonFly
+
+    /usr/pkg/bin/gm4: m4_esyscmd subprocess failed: Operation not permitted
+    /usr/pkg/bin/gm4:configure.ac:8: cannot run command `${MAKE-make} -s -f bin/version.mk version | tr -d '\n'': Operation not permitted
+    configure.ac:8: error: Failed to get the Mesa version from `make -f bin/version.mk version`
+
+For now just manually run command
+    $ make -f bin/version.mk version
+    7.9.0
+and substitute it using a patch similar to
+
+    diff --git a/configure.ac b/configure.ac
+    index c40c842..224a858 100644
+    --- a/configure.ac
+    +++ b/configure.ac
+    @@ -4,7 +4,7 @@ AC_PREREQ([2.59])
+     dnl Versioning - scrape the version from configs/default
+     m4_define([mesa_version],
+    -    [m4_esyscmd([${MAKE-make} -s -f bin/version.mk version | tr -d '\n'])])
+    +    [7.9.0])])
+     m4_ifval(mesa_version,,
+         [m4_fatal([Failed to get the Mesa version from `make -f bin/version.mk version`])])
+
+#### C99 fpclassify()
+
+    diff --git a/src/mesa/main/querymatrix.c b/src/mesa/main/querymatrix.c
+    index ca292aa..a0969f6 100644
+    --- a/src/mesa/main/querymatrix.c
+    +++ b/src/mesa/main/querymatrix.c
+    @@ -71,7 +71,7 @@ fpclassify(double x)
+     }
+
+     #elif defined(__APPLE__) || defined(__CYGWIN__) || defined(__FreeBSD__) || \
+    -     (defined(__sun) && defined(__C99FEATURES__))
+    +     defined(__DragonFly__) || (defined(__sun) && defined(__C99FEATURES__))
+
+     /* fpclassify is available. */
+
+### xserver
+
+If one uses the patches alluded to in the pkgsrc section, one can avoid the following build error:
+
+      YACC   parser.c
+    bison: m4 subprocess failed: Operation not permitted
+    gmake[3]: *** [parser.c] Error 1
+
+Developer documentation appears to now be enabled by default; therefore, if one is bootstrapping
+a new tree, one might want to use the option to *autogen.sh* to not build developer documentation:
+
+I experienced the following build error:
+
+      GEN    Xserver-spec.txt
+    No way to convert HTML to text found.
+
+Corrected using the *autogen.sh* flag:
+
+    --disable-devel-docs
+
+### xinit
+
+    diff --git a/xinit.c b/xinit.c
+    index 313806e..0d31637 100644
+    --- a/xinit.c
+    +++ b/xinit.c
+    @@ -48,6 +48,12 @@ in this Software without prior written authorization from The Open Group.
+     #endif
+     #endif
+    +/* For PRIO_PROCESS and setpriority() */
+    +#ifdef __DragonFly__
+    +#include <sys/time.h>
+    +#include <sys/resource.h>
+    +#endif /* __DragonFly__ */
+    +
+     #include <stdlib.h>
+
+     #ifndef SHELL
+
+## Building a Separate Version of GNOME
+
+### glib
+
+See the bug report at <https://bugzilla.gnome.org/show_bug.cgi?id=618754> for an error similar to
+
+    /usr/libexec/binutils217/elf/ld: .libs/gthread.o: relocation R_X86_64_PC32
+    against `_g_mem_thread_init_noprivate_nomessage' can not be used when making a
+    shared object; recompile with -fPIC
+    /usr/libexec/binutils217/elf/ld: final link failed: Bad value
+
+This bug is especially a problem because it may be related to some interaction with gcc 4.1.2 only on DragonFly.
+
+The following patch is a complete hack:
+
+    diff --git a/configure.in b/configure.in
+    index 38288c3..51a1c07 100644
+    --- a/configure.in
+    +++ b/configure.in
+    @@ -3033,7 +3033,7 @@ _______EOF
+     #define G_GNUC_INTERNAL __attribute__((visibility("hidden")))
+     #elif defined(__SUNPRO_C) && (__SUNPRO_C >= 0x550)
+     #define G_GNUC_INTERNAL __hidden
+    -#elif defined (__GNUC__) && defined (G_HAVE_GNUC_VISIBILITY)
+    +#elif defined (__GNUC__) && defined (G_HAVE_GNUC_VISIBILITY) && !defined(__DragonFly__)
+     #define G_GNUC_INTERNAL __attribute__((visibility("hidden")))
+     #else
+     #define G_GNUC_INTERNAL
+
+### Graphics Image Formats
+
+*libpng* <http://www.libpng.org/pub/png/libpng.html> version *1.4.2*
+can be installed using *autogen.sh* and then *configure*, in contrast to
+the X.org projects that pass parameters from *autogen.sh* to run *configure* automatically.
+
+Independent JPEG Group's library <http://www.ijg.org/> version *8b* can be installed
+using *configure* alone (there is no autogen.sh).
+
+LibTIFF <http://www.remotesensing.org/libtiff/> has a recommended dependency on jpeg.
+LibTIFF version 3.9.2 can be installed using *autogen.sh* and then *configure*.
+
+Running
+    gmake check
+after building any of the above three projects appears to produce passes tests.
+
+### XML
+
+#### libxml2
+
+*autogen.sh* calls *configure*
+
+11 tests fail after *gmake check*
+
+### Cairo
+
+Seems to require
+
+    export LDFLAGS="-L${PREFIX}/lib -Wl,-rpath -Wl,${PREFIX}/lib -L${PREFIX}/lib/X11 -Wl,-rpath -Wl,${PREFIX}/lib/X11"
+    export CPPFLAGS="-I${PREFIX}/include -I${PREFIX}/X11/include"
+
+When using gcc 4.1.2, *gmake check* gives:
+
+      LINK  check-link
+    ./.libs/libcairo.so: undefined reference to `__umodti3'
+    ./.libs/libcairo.so: undefined reference to `__udivti3'
+
+When using *CCVER=gcc44* to force gcc 4.4, one obtains the worse:
+
+      CHECK cairo.h
+    cc1: error: unrecognized command line option "-Wlogical-op"
+      CHECK cairo-deprecated.h
+    cc1: error: unrecognized command line option "-Wlogical-op"
+    ...
+
+The problem is 128-bit division using gcc 4.1.2 as discussed earlier.  One can examine
+*src/cairo-wideint.c* and see the telltale code enclosed in an if test for *HAVE_UINT128_T*
+with 128-bit division if defined.
+
+### Pango
+
+Install *gnome-common* first, required.
+
+If Cairo is not built with *CCVER=gcc44*, obtain build error similar to
+
+      CCLD   pango-view
+    /opt/xcatch/lib/libcairo.so: undefined reference to `__umodti3'
+    /opt/xcatch/lib/libcairo.so: undefined reference to `__udivti3'
+    gmake[3]: *** [pango-view] Error 1
+
+Following patch corrects an API change not propagated to the test for *gmake check*
+<https://bugzilla.gnome.org/show_bug.cgi?id=619456>
+
+Not including patch itself because there are tabs.  But edit file *pango/pangoft2.def*
+and change
+    pango_fc_font_create_metrics_for_context
+to
+    pango_fc_font_create_base_metrics_for_context
+
+### GObject Introspection
+
+*cElementTree* is changed to *ElementTree* in files
+*giscanner/girparser.py*, *giscanner/glibtransformer.py*, and *giscanner/scannermain.py*.
+
+Using *pkg_alternatives* for a python wrapper fails as a script is generated with
+
+    #! /usr/pkg/bin/python
+
+    import os
+    import sys
+
+A shell script cannot use another shell script as its interpreter.
+What works for now is to manually create */usr/pkg/bin/python* as a symlink to */usr/pkg/bin/python2.6*.
+
+### gtk+
+
+*gobject-introspection* is listed as a dependency but can be avoided.
+Use option *--disable-introspection* to avoid an error
+
+    checking for gobject-introspection... yes
+    ./configure: ${INTROSPECTION_GIRDIR/...}: Bad substitution
+