[Mesa-dev] [PATCH 4/4] autoconf, scons: Move fallback HAVE_* definitions to headers.
Jose Fonseca
jfonseca at vmware.com
Tue Apr 7 10:25:40 PDT 2015
On 07/04/15 17:16, Matt Turner wrote:
> On Tue, Apr 7, 2015 at 5:14 AM, Jose Fonseca <jfonseca at vmware.com> wrote:
>> Sorry for the delay. I've been away during the Easter.
>>
>> On 02/04/15 19:02, Matt Turner wrote:
>>>
>>> On Thu, Apr 2, 2015 at 7:32 AM, Jose Fonseca <jfonseca at vmware.com> wrote:
>>>>
>>>> These were being defined in SCons, but it's not practical -- we actually
>>>> need to include Gallium headers from external source trees, with
>>>> completely disjoint build infrastructure, and it's unsustainable to
>>>> replicate the HAVE_xxx checks or even hard-coded defines across
>>>> everywhere.
>>>
>>>
>>> To confirm, you're building external sources with gcc? I don't think
>>> these macros are useful for MSVC.
>>
>>
>> Correct.
>>
>>
>>>>
>>>> No actual change in behavior for autoconf.
>>>> ---
>>>> configure.ac | 2 +-
>>>> include/c99_compat.h | 45 +++++++++++++++++++++++++++++++++++++++++++++
>>>> scons/gallium.py | 27 ---------------------------
>>>> src/util/macros.h | 2 ++
>>>> 4 files changed, 48 insertions(+), 28 deletions(-)
>>>>
>>>> diff --git a/configure.ac b/configure.ac
>>>> index 520cc22..1485bba 100644
>>>> --- a/configure.ac
>>>> +++ b/configure.ac
>>>> @@ -230,7 +230,7 @@ _SAVE_LDFLAGS="$LDFLAGS"
>>>> _SAVE_CPPFLAGS="$CPPFLAGS"
>>>>
>>>> dnl Compiler macros
>>>> -DEFINES=""
>>>> +DEFINES="-DHAVE_AUTOCONF"
>>>> AC_SUBST([DEFINES])
>>>> case "$host_os" in
>>>> linux*|*-gnu*|gnu*)
>>>> diff --git a/include/c99_compat.h b/include/c99_compat.h
>>>> index 4fc91bc..62ccd46 100644
>>>> --- a/include/c99_compat.h
>>>> +++ b/include/c99_compat.h
>>>
>>>
>>> c99_compat.h doesn't seem like the right location. I know it seems
>>> like a nice place to add this since it's included everywhere, but I
>>> worry that in a few years we're going to be cleaning it up like we've
>>> been doing with compiler.h and friends.
>>>
>>> I might make a separate header to define these? Not sure.
>>
>>
>> I can move the defines out of c99_compat.h , e.g.,
>> mesa/include/fallbackconfig.h.
>>
>> But I'd prefer to include fallbackconfig.h out of c99_compat.h , as
>> c99_compat.h is pretty much guaranteed to be included all the time.
>>
>>
>>> Since
>>> probably all cases of #ifdef HAVE___* have a fallback, that runs the
>>> risk of never noticing that you weren't including the right header.
>>
>> Precisely, this is all the more reason why it must be included from a header
>> that's included all the time. If it depends on people to add the include on
>> a case-by-case it is bound to fail, as nobody else but us cares, and it will
>> easily go unnoticed.
>>
>>
>>>> @@ -141,4 +141,49 @@ test_c99_compat_h(const void * restrict a,
>>>> #endif
>>>>
>>>>
>>>> +
>>>> +/* Fallback definitions, for when these headers are used by build
>>>> systems which
>>>> + * don't auto-detect these things.*/
>>>> +#ifndef HAVE_AUTOCONF
>>>
>>>
>>> I'd rather flip this condition around and not modify configure.ac. But
>>> maybe you can't do that because you're not actually building
>>> everything with scons?
>>
>>
>> No biggie either way.
>>
>>> I don't know. This seems nuts. I really don't like adding stuff to the
>>> autotools build system like this.
>>
>>
>> Sure.
>>
>>
>>> I really don't know how to deal with this. What I'm hearing is that
>>> even the custom scons build system you guys use isn't sufficient for
>>> your own needs. You're not building the external source trees with the
>>> same build system...?
>>
>>
>> I think you might be getting the wrong idea.
>>
>> We don't build the .C files from external source trees. But we do need to
>> include .h files, so we can interface with components in Mesa tree.
>>
>> That is, I only need the .h files to make sense on their own (with Mesa
>> components, namely mesa/src/gallium/include, and gallium auxiliary
>> libraries). But we have so many inlines functions, so many #ifdef HAVE_foo,
>> that unless all the defines match precisely, the whole hell breaks loose.
>>
>>
>> Gallium has from the start been integrated (ie. embedded) on a myriad of
>> places. It was always meant as a framework to write any sort of 3d driver,
>> not just OpenGL drivers. Things were much worse when Gallium was used on
>> Windows XP kernel land or Windows CE. I'm glad that I or anybody else has
>> to deal with the quirkiness of keeping code portable across these platforms.
>> Things are still much more uniform nowadays.
>>
>>
>>> I mean, in all the build system work I've done I've tried to make sure
>>> scons continues working -- doing things like adding these HAVE_*
>>> definitions to it and such. It's kind of frustrating, and it's even
>>> more frustrating when even that isn't sufficient.
>>
>>
>>
>> All I'm doing here is basically move your defines out of scons's python
>> files into C headers. Conceptually it's doing pretty much the same thing as
>> before, but being in a header that means that it's there for all build
>> systems to take.
>>
>>
>> Rembember that Mesa itself is not just autoconf and Scons, there's also
>> Android build system.
>>
>> I don't like it any more you do, but this is the world we live in: the fact
>> is that many platforms constraint how software must be built to a point
>> which is impracticable/impossible to build. Even if a build system that
>> meets everybody needs existed, we'd still face the legacy of existing
>> software using other build systems.
>>
>>
>>
>> To be honest, IMHO, Mesa source tree and build systems are a failure if they
>> can't even sustain external interfaces.
>>
>>
>> For many drivers, the external interface headers are Khronos OpenGL / GLES
>> headers. But for gallium drivers, the interface is mesa/src/gallium/include
>> (plus some .h from helper modules in src/gallium/auxiliary as it is
>> impractical to interface with gallium drivers without them.)
>>
>>
>> What would you say in a parallel reality, Khronos demanded that in order to
>> build OpenGL drivers for Linux one would need to use the Khronos own build
>> system? Because that's basically what's at stake here: if I want to
>> interface with gallium and llvmpipe driver should I be forced to build my
>> code with Mesa build system?
>>
>>
>> So I only see three ways of dealing with this:
>>
>> a) have fallback HAVE_* foo from the headers (so that all inline functions
>> compile the same way) as I propose in this patch
>>
>> b) move all inline functions to separate headers (so that external code can
>> opt-out from including them), and provide alternative non-inline
>> implementations (so that external code can still call them)
>>
>> c) stop using inline functions altogether
>>
>>
>>
>> One way or the other, we'll need the headers to make sense on their own,
>> without having to duplicate the whole Mesa build-systems. But b) and c) can
>> have performance impact. (Particularly because we really want to inline
>> atomic reference counting.)
>>
>>
>>
>> Jose
>
> Thanks Jose.
>
> Thanks for explaining the reality of the situation. It makes sense to me.
>
> I'm fine with these being added to c99_compat.h or another header
> included by it. I think my only real change request is to invert the
> macro to not have to modify configure.ac.
Sure. I'll update that patch then.
I'll submit the other 1-3 patches of these series as before that, as
they are minor cleanups and not controversial.
> In your follow-up email you mention autoconf generating config.h. I've
> thought about that as well, but I didn't consider that it might allow
> us to solve this problem (I'm not entirely sure it would, since it
> seems like you'd have to run configure to generate config.h and *then*
> run scons and your out-of-tree build system).
What I had in mind was that SCons config.h would be hand-written (ie,
basically contain everything that I added to c99_compat.h in the first
version.)
So autoconf would generate its own config somewhere, and add
`-Ipath/to/where/generated/config_h/goes`, while scons would have
`-Ipath/to/where/handwritten/fake/config_h/lives`
> In any case, that might be a nice solution. I'll think about that some more.
>
> Thanks,
> Matt
>
Thanks.
Jose
More information about the mesa-dev
mailing list