<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 TRANSITIONAL//EN">
<HTML>
<HEAD>
  <META HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=UTF-8">
  <META NAME="GENERATOR" CONTENT="GtkHTML/3.26.0">
</HEAD>
<BODY>
On Mon, 2010-06-14 at 21:03 -0700, Dan Nicholson wrote:
<BLOCKQUOTE TYPE=CITE>
<PRE>
On Mon, Jun 14, 2010 at 6:59 PM, Gaetan Nadon &lt;<A HREF="mailto:memsize@videotron.ca">memsize@videotron.ca</A>&gt; wrote:
&gt; On Mon, 2010-06-14 at 15:07 -0700, Dan Nicholson wrote:
&gt;
&gt; On Sun, Jun 13, 2010 at 1:49 PM, Gaetan Nadon &lt;<A HREF="mailto:memsize@videotron.ca">memsize@videotron.ca</A>&gt; wrote:
&gt;&gt; Any module (drivers) depending on xserver also depends on some of the
&gt;&gt; server private dependencies. Any driver including xf86.h depends on
&gt;&gt; xext, kbproto, inputproto and randr.
&gt;&gt;
&gt;&gt; These dependencies are in separate packages, so anything can happen,
&gt;&gt; removal, wrong version, etc... and the driver fails during compilation.
&gt;&gt; Having the private dependencies declared will ensure all packages the
&gt;&gt; server depends on are present and at the correct version.
&gt;&gt;
&gt;&gt; Currently each module attempts to check for server dependencies with
&gt;&gt; various degrees of accuracy. With this patch, the driver will only need
&gt;&gt; to check for its own explicit dependencies.
&gt;&gt;
&gt;&gt; Signed-off-by: Gaetan Nadon &lt;<A HREF="mailto:memsize@videotron.ca">memsize@videotron.ca</A>&gt;
&gt;&gt; ---
&gt;&gt; &nbsp;configure.ac &nbsp; &nbsp; &nbsp;| &nbsp; &nbsp;9 ++++++++-
&gt;&gt; &nbsp;xorg-server.pc.in | &nbsp; &nbsp;1 +
&gt;&gt; &nbsp;2 files changed, 9 insertions(+), 1 deletions(-)
&gt;&gt;
&gt;&gt; diff --git a/configure.ac b/configure.ac
&gt;&gt; index 4ada8f5..cb33637 100644
&gt;&gt; --- a/configure.ac
&gt;&gt; +++ b/configure.ac
&gt;&gt; @@ -793,9 +793,13 @@ WINDOWSWMPROTO=&quot;windowswmproto&quot;
&gt;&gt; &nbsp;APPLEWMPROTO=&quot;applewmproto &gt;= 1.4&quot;
&gt;&gt;
&gt;&gt; &nbsp;dnl Core modules for most extensions, et al.
&gt;&gt; -REQUIRED_MODULES=&quot;[randrproto &gt;= 1.2.99.3] [renderproto &gt;= 0.11]
&gt;&gt; [fixesproto &gt;= 4.1] [damageproto &gt;= 1.1] [xcmiscproto &gt;= 1.2.0] [xextproto
&gt;&gt; &gt;= 7.0.99.3] [xproto &gt;= 7.0.17] [xtrans &gt;= 1.2.2] [bigreqsproto &gt;= 1.1.0]
&gt;&gt; fontsproto [inputproto &gt;= 1.9.99.902] [kbproto &gt;= 1.0.3]&quot;
&gt;&gt; +SDK_REQUIRED_MODULES=&quot;[randrproto &gt;= 1.2.99.3] [renderproto &gt;= 0.11]
&gt;&gt; [xextproto &gt;= 7.0.99.3] [inputproto &gt;= 1.9.99.902] [kbproto &gt;= 1.0.3]&quot;
&gt;&gt; +REQUIRED_MODULES=&quot;[fixesproto &gt;= 4.1] [damageproto &gt;= 1.1] [xcmiscproto
&gt;&gt; &gt;= 1.2.0] [xproto &gt;= 7.0.17] [xtrans &gt;= 1.2.2] [bigreqsproto &gt;= 1.1.0]
&gt;&gt; fontsproto $SDK_REQUIRED_MODULES&quot;
&gt;&gt; &nbsp;REQUIRED_LIBS=&quot;xfont xau&quot;
&gt;&gt;
&gt;&gt; +# Make SDK_REQUIRED_MODULES available for inclusion in xorg-server.pc
&gt;&gt; +AC_SUBST(SDK_REQUIRED_MODULES)
&gt;&gt; +
&gt;&gt; &nbsp;dnl List of libraries that require a specific version
&gt;&gt; &nbsp;LIBAPPLEWM=&quot;applewm &gt;= 1.4&quot;
&gt;&gt; &nbsp;LIBDMX=&quot;dmx &gt;= 1.0.99.1&quot;
&gt;&gt; @@ -947,6 +951,7 @@ if test &quot;x$XV&quot; = xyes; then
&gt;&gt; &nbsp; &nbsp; &nbsp; &nbsp;AC_DEFINE(XV, 1, [Support Xv extension])
&gt;&gt; &nbsp; &nbsp; &nbsp; &nbsp;AC_DEFINE(XvExtension, 1, [Build Xv extension])
&gt;&gt; &nbsp; &nbsp; &nbsp; &nbsp;REQUIRED_MODULES=&quot;$REQUIRED_MODULES $VIDEOPROTO&quot;
&gt;&gt; + &nbsp; &nbsp; &nbsp; SDK_REQUIRED_MODULES=&quot;$SDK_REQUIRED_MODULES $VIDEOPROTO&quot;
&gt;&gt; &nbsp;else
&gt;&gt; &nbsp; &nbsp; &nbsp; &nbsp;XVMC=no
&gt;&gt; &nbsp;fi
&gt;&gt; @@ -1036,6 +1041,7 @@ case &quot;$DRI2,$HAVE_DRI2PROTO&quot; in
&gt;&gt; &nbsp; &nbsp; &nbsp; &nbsp;yes,yes | auto,yes)
&gt;&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;AC_DEFINE(DRI2, 1, [Build DRI2 extension])
&gt;&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;DRI2=yes
&gt;&gt; + &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SDK_REQUIRED_MODULES=&quot;$SDK_REQUIRED_MODULES $DRI2PROTO&quot;
&gt;&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;;;
&gt;&gt; &nbsp;esac
&gt;&gt; &nbsp;AM_CONDITIONAL(DRI2, test &quot;x$DRI2&quot; = xyes)
&gt;&gt; @@ -1074,6 +1080,7 @@ if test &quot;x$XINERAMA&quot; = xyes; then
&gt;&gt; &nbsp; &nbsp; &nbsp; &nbsp;AC_DEFINE(XINERAMA, 1, [Support Xinerama extension])
&gt;&gt; &nbsp; &nbsp; &nbsp; &nbsp;AC_DEFINE(PANORAMIX, 1, [Internal define for Xinerama])
&gt;&gt; &nbsp; &nbsp; &nbsp; &nbsp;REQUIRED_MODULES=&quot;$REQUIRED_MODULES $XINERAMAPROTO&quot;
&gt;&gt; + &nbsp; &nbsp; &nbsp; SDK_REQUIRED_MODULES=&quot;$SDK_REQUIRED_MODULES $XINERAMAPROTO&quot;
&gt;&gt; &nbsp;fi
&gt;&gt;
&gt;&gt; &nbsp;AM_CONDITIONAL(XACE, [test &quot;x$XACE&quot; = xyes])
&gt;&gt; diff --git a/xorg-server.pc.in b/xorg-server.pc.in
&gt;&gt; index 44f886a..1fa4fb5 100644
&gt;&gt; --- a/xorg-server.pc.in
&gt;&gt; +++ b/xorg-server.pc.in
&gt;&gt; @@ -16,5 +16,6 @@ Name: xorg-server
&gt;&gt; &nbsp;Description: Modular X.Org X Server
&gt;&gt; &nbsp;Version: @PACKAGE_VERSION@
&gt;&gt; &nbsp;Requires: pixman-1 pciaccess xproto &gt;= 7.0.17
&gt;&gt; +Requires.private: @SDK_REQUIRED_MODULES@
&gt;
&gt; Could you also move the xproto requirement from REQUIRED_MODULES to
&gt; SDK_REQUIRED_MODULES so it's always populated from configure.ac? Maybe
&gt; that can go in another commit. Probably all the modules should be in
&gt; Requires.private, but that's probably another commit, too.
&gt;
&gt; I originally put all modules (save for xproto) in Requires.private. Julien
&gt; suggested to put only the modules exposed in the sdk.

Hmm, not sure why that would be since it wouldn't make a difference
for the proto packages. pkg-config --cflags will return the settings
whether they're in Requires or Requires.private, even on the broken
pkg-config releases.
</PRE>
</BLOCKQUOTE>
<BR>
I thought private meant the cflags would not be returned.
<BLOCKQUOTE TYPE=CITE>
<PRE>

&gt; As for xproto, all drivers use it explicitly and need the include path. I
&gt; thought it was safer to leave it there as there might be an older driver
&gt; that did not list xproto on the PKG_CHECK_MODULES statement and could
&gt; potentially break. I am not sure I understand why you were suggesting that.

Right now we have xproto &gt;= 7.0.17 explicitly in both configure and
xorg-server.pc.in. If it's only in configure, then when you bump the
requirement for some reason, you don't risk the .pc file getting out
of sync.
</PRE>
</BLOCKQUOTE>
That's an xserver issue where xproto &gt;= 7.0.17 is hand-coded in 2 places, configure.ac and xorg-server.pc.<BR>
A variable should be used. 
<BLOCKQUOTE TYPE=CITE>
<PRE>

I don't know how it would break any drivers. The installed .pc file
will contain xproto &gt;= 7.0.17 whether you substitute it from configure
or not. Whether the drivers have listed xproto in their
PKG_CHECK_MODULES shouldn't make a difference on how the xserver
specifies its requirement.

</PRE>
</BLOCKQUOTE>
Correct, with my misunderstanding cleared. That leaves one question: what's the difference between Requires and Requires.private?<BR>
<BR>
<BLOCKQUOTE>
<PRE>
Requires.private:
           A list of packages required by this package. The difference from
           Requires is that the packages listed under Requires.private are
           not taken into account when a flag list is computed for
           dynamically linked executable (i.e., when --static was not
           specified).  In the situation where each .pc file corresponds to
           a library, Requires.private shall be used exclusively to specify
           the dependencies between the libraries.
</PRE>
</BLOCKQUOTE>
<BR>
Reading <A HREF="http://people.freedesktop.org/~dbn/pkg-config-guide.html:">http://people.freedesktop.org/~dbn/pkg-config-guide.html:</A><BR>
<BR>
<BLOCKQUOTE>
<PRE>
Finally, the <TT>Cflags</TT> contains the compiler flags for using the library. 
Unlike the <TT>Libs</TT> field, there is not a private variant of <TT>Cflags</TT>. 
This is because the data types and macro definitions are needed regardless of the linking scenario.
</PRE>
</BLOCKQUOTE>
<BR>
My conclusion is that all the proto packages the server depends on should be declared in Requires.private, including xproto. Any driver wishing to use a specific protocol should check for it in PKG_CHECK_MODULES. That is what they do today. In additional of working correctly, this code will also reflect and document the system design.<BR>
<BR>
This only leaves the question of &quot;other modules&quot; upon which the server depends but not the drivers. It is tempting to craft a shorter list as this patch did, but it is not future proof. One day, a header from, say, damageproto can find it's way through xf86.h and no one will think of updating SDK_REQUIRED_MODULES. I think it is both correct and less error prone for the future to use the current REQUIRED_MODULES list. This is also consistent with &quot;drivers are part of the server&quot; architecture statement.<BR>
<BR>
I'll post a new version.<BR>
<BR>
Thanks
<BLOCKQUOTE TYPE=CITE>
<PRE>
--
Dan
</PRE>
</BLOCKQUOTE>
</BODY>
</HTML>