New source layout.

Chris Johns chrisj at rtems.org
Fri Mar 13 00:19:58 UTC 2015


On 11/03/2015 12:42 pm, Amar Takhar wrote:
> On 2015-03-11 00:36 +0100, Pavel Pisa wrote:
>> Hello Amar,
>>
>> thanks for reply.
>>
>> On Tuesday 10 of March 2015 19:00:03 Amar Takhar wrote:
>>> On 2015-03-10 11:03 +0100, Pavel Pisa wrote:
>>>> I think that includes really belong near to the implementation and that
>>>> new architecture could be (in optimal case) introduced by adding single
>>>> directory in "arch" subtree.
>>>
>>> The includes are near the implementation when they're local headers.
>>> Anything that is consumable by another part of RTEMS is moved.
>>
>> OK, if you think about it from perspective of public API it has
>> sense. But it is at some flexibility lost price. May it be it worth
>> to be paid.
>
> That's all relative and depends on what your definition of flexibility is.  I
> believe the method you are proposing is *less* flexible -- that is my opinion
> though.
>
> We all have different workflows.  What we're trying to do is to have a layout
> that makes RTEMS easy to test and helps us keep our interface(s) clean
> design-wise by easily having an overview of what we're doing.
>

I am attempting to dig out a web available link to the 27th July 1998 
posts about the pre-installing of header files for RTEMS. In some 
respects RTEMS is coming full circle. There were many claims made about 
pre-installing headers and over the last 16 years of supporting 
pre-installing some have happened and others have not and that is not 
important any more however the lesson we have learned with hindsight are 
worth discussing:

1. The number of headers has increased to a point it is not 
maintainable. If you step back and look it is kind of silly to have 
every build of RTEMS taking files from one location on your disk and 
putting then in another location to make exactly the same tree of files 
for every user who builds RTEMS. Why not just check out that structure ? 
The concept of modularity that says you can have a custom kernel with 
various options and so a custom include tree should not be allowed in 
RTEMS and the reason is simple, who tests all those combinations ? The 
RTEMS Project does not have the resources to test the few configure 
options we have now yet the RTEMS Project signs off on saying it is 
tested and ready for release. Personally I am not comfortable with 
"might work". Ideally RTEMS as released should be built to be a single 
repeatable configuration and structure with no variation. Of course this 
is an ideal situation and we are not at that point but we should be 
moving to it. There is variation across architectures and BSPs but this 
should be the limit of supported configuration options. We also have BSP 
options which under the autotools build system is messy and clumsy. 
RTEMS has evolved to better manage how we configure the runtime and BSP 
components and we have a long way to go. Having a single include tree 
helps improve auditing RTEMS.

2. The complexity it added to the build system was much more than 
expected and it has never been robust and stable. There are a number of 
ways a change in a header file does not result in a pre-install update 
and a correct build. I am sure everyone who has played with RTEMS code 
has edited the installed header because a compile error brings it into 
the editor only to have it overwritten at a later stage when pre-install 
kicks in.

3. Finally a key issue is leaking APIs. The experience we have had with 
headers in a module's directory has resulted in leaking API headers and 
this is partially the reason we have so many header files being 
installed. When designing and building a module it is difficult to force 
yourself to create an API and stick to it and test you have done it 
cleanly. The simple method we have all used to overcome this is to add 
the needed headers to the pre-install list "hey it is only a couple of 
extra headers and it saves me having to re-factor the code". I feel 
RTEMS has too many internal header exposed and this is directly related 
to the localised module approach for development.

>
>> The native system one should be strictly avoided, Linux kernel
>> uses -nostdinc. Required cross-GCC headers and newlib can be reintroduced
>> by adding explicitly directories reported by GCC as right multiarch and base
>> includes.
>
> We have an entirely different scenario from the Linux kernel:
>
>   * Multiple compilers
>   * Multiple platforms
>
> The waf build system supports any compiler it has been 100% unhooked from GCC.
> Once a BSP compilers CLang can be dropped in and used to build some BSPs.
>
> This solution also removes the possibility of RTEMS compiling under several
> compilers native to Windows.
>

This is important in terms of the waf build system but any compiler 
should be able to work if we use a standard set up for driving it. 
Currently we need to use specs files and that is limiting us to gcc.

> The key difference between what is being done above and what I'm proposing is
> there is only one include on the compiler, ever -I/path/to/include and nothing
> more.  This is for *both* public API linkage and internal to RTEMS.  Software
> that links different whether it's building itself or being linked against is
> confusing.

This is the subject of another thread so we should discuss it there.

>
> Symlinks won't work on Windows.
>

I will not support the use of symlinks.

>>> Another benefit of having them all in the same place is it is far easier to
>>> see what is going on when working on RTEMS.  The preinclude step hides far
>>> too much, so do multiple -I lines.
>>
>> Yes, removing automake and preinclude for RTEMS is usesfull goal.
>> Automake does not play nice in RTEMS case, it takes horrible time
>> to bootsrap tree. Much longer then actual build in my case.
>
> Please see this page:
>
>    https://devel.rtems.org/wiki/waf/Timing
>
>  From 'git co' you can have RTEMS built in 12 seconds *including* all tests.  On
> the average machine it takes ~25s including all tests.  This is not an
> exaggeration please try it for yourself.
>

Performance is important but the overall architecture needs careful 
consideration.

Chris


More information about the devel mailing list