New source layout.

Sebastian Huber sebastian.huber at embedded-brains.de
Fri Mar 13 12:57:49 UTC 2015



On 13/03/15 13:38, Amar Takhar wrote:
> On 2015-03-13 09:45 +0100, Sebastian Huber wrote:
>>> #include <bsp.h>
>>> -Iinclude/cpu/sparc/sis/
>> This is exactly what we need.
> I agree we need this right now but it's not a requirement for the future.

For me this is a requirement for the future. A lot of applications use 
<bsp.h> to create for example the network configuration. Unless we have 
a better alternative we should not break this.

>
>
>>> The whole purpose of explicit paths it to avoid picking up the wrong header
>>> file which has already happened to me more than once.
>> I never had the problem that the wrong header files were picked up and I
>> don't remember that a RTEMS users had such a problem in the past. To use
>> an installed BSP was actually quite easy. You only need one -B switch,
>> the right -m flags and the evil spec file.
> https://git.rtems.org/amar/waf.git/commit/?h=fix&id=08e5b8cce3a140135f11f9498de371637e4ec7af

This change is wrong. The first include must be <pthread.h> to get the 
prototype for |pthread_cleanup_pop() for example and ensure that 
<pthread.h> is self-contained.

|
>
> Since the right -I dir wasn't added it picked up pthread.h from the compiler.

It picked up the right file.

>   
> It failed in a very strange way that was really annoying to debug at first it
> wasn't clear that it was picking up the wrong header file since the only error
> was "pthread.h:..."  versus "rtems/posix/pthread.h:...".
>
> This isn't the first time this has happened to me over the last 4 years it's
> wasted hours of my time because I didn't have the right -I lines.  Since I've
> changed the behaviour I've been able to expose API bleeding and have not had
> this issue.
>
> -B is a GCC-only switch.  spec files are also gcc-only both of these have been
> eliminated in the waf build -- the spec files still exist actually but are
> generated as part of the build process so we can support any compiler.

The spec files have nothing to do with the includes. You can replace the 
-B with a -Iinclude for the includes.

>
>
>> Trading a -I switch for a -D switch is a bad choice. With a -I switch
>> you get access to an arbitrary amount of header files. With the -D
>> switch you need additional pre-processor stuff in an arbitrary amount of
>> header files with copy and paste involved. There is also no such thing
>> as "that architecture". We have sub-architectures as well, e.g. ARMv7-M
>> is completely different to ARMv4 in terms of the exception model. A
>> central header file including everything for one architecture prevents
>> information hiding and leads to unnecessary dependencies.
> We would have exactly 1 ifchain in 1 file (rtems.h).  This would include the
> correct file per-arch.  What copy and paste are you referring to?  I'm trying to
> understand.

I don't want one header file per architecture. For example <rtems.h> has 
no reason to see the interrupt stack frame structure and other 
implementation details.

>
> Information hiding is exactly what I'm trying to avoid and is a large part of
> the reason why we're in the situation we have right now.  It's far too easy to
> 'modify the build' to get code working.

The pre-installed header files are not that bad. What is bad is that all 
the header files are scattered in the source tree. We have to get rid of 
the pre-install step.

Information hiding is a key principle in software engineering.

>
> To be clear: I agree with you that complicating the user experience is bad.  I
> also agree that complicating the RTEMS build is bad.  I don't believe we should
> compromise on the user experience we can still keep it simple.  The RTEMS build
> itself will have to be more exposed to avoid API bleeding and hiding complexity
> with no added benefit.  If it's complex then we need to figure out how to make
> it less complex by design of the source not the build.
>
>
>> We should try to reduce the size of the installed RTEMS tree, and this
>> will also lead to three include paths, one for the cpukit, one for the
>> CPU and one for the BSP.
> With the way things are now that's impossible because noone has any idea what
> headers are required on a per-bsp basis.  We need all of them, period.  I'm
> really trying to solve that issue by 'flattening' what we've done in order to
> get all of this cleaned up.
>
> Once it's flattened I'll be able to add builds in BuildBot to test for API
> bleeding from installed BSPs.  The test would be:
>
>   waf build --bsp=sparc/sis --prefix=/tmp/path
>   waf install
>   rm -rf build
>   gcc -c sometest.c --cflags `rtems-config --cflags --bsp=sparc/sis`
>   ld .. `rtems-config --ldflags -bsp=sparc/sis`
>
> We can't even do this right now as it's impossible to know what bsps require
> which files.  We've also found examples of BSPs being depending on headers from
> other BSPs.  This happened when I was trying to convert the BSPs to waf I believe
> Chris fixed several of these years ago.

In case a file is used by more than one BSP it must move to a shared 
include directory.

-- 
Sebastian Huber, embedded brains GmbH

Address : Dornierstr. 4, D-82178 Puchheim, Germany
Phone   : +49 89 189 47 41-16
Fax     : +49 89 189 47 41-09
E-Mail  : sebastian.huber at embedded-brains.de
PGP     : Public key available on request.

Diese Nachricht ist keine geschäftliche Mitteilung im Sinne des EHUG.



More information about the devel mailing list