On 15/9/20 4:31 pm, Sebastian Huber wrote:
> On 15/09/2020 00:46, Chris Johns wrote:
> 
>> On 15/9/20 1:18 am, Sebastian Huber wrote:
>>> Hello Christian,
>>>
>>> On 14/09/2020 14:23, Christian Mauderer wrote:
>>>> Hello Sebastian,
>>>>
>>>> I get a linker error when I try to build libbsd for BBB (with a buildset 
>>>> that
>>>> builds everything but netipsec):
>>>>
>>>> -----
>>>> /home/EB/christian_m/Projekte/rtems-bbb/install/rtems/6/lib/gcc/arm-rtems6/10.2.1/../../../../arm-rtems6/bin/ld:
>>>>
>>>> ./libbsd.a(uipc_mbuf.c.20.o): in function `m_unmappedtouio':
>>>> /home/EB/christian_m/Projekte/rtems-bbb/libs/rtems-libbsd/build/arm-rtems6-beagleboneblack-noIPSec/../../freebsd/sys/kern/uipc_mbuf.c:1813:
>>>>
>>>> undefined reference to `PHYS_TO_VM_PAGE'
>>>> /home/EB/christian_m/Projekte/rtems-bbb/install/rtems/6/lib/gcc/arm-rtems6/10.2.1/../../../../arm-rtems6/bin/ld:
>>>>
>>>> /home/EB/christian_m/Projekte/rtems-bbb/libs/rtems-libbsd/build/arm-rtems6-beagleboneblack-noIPSec/../../freebsd/sys/kern/uipc_mbuf.c:1814:
>>>>
>>>> undefined reference to `uiomove_fromphys'
>>>> collect2: error: ld returned 1 exit status
>>>> -----
>>>>
>>>> Configure line for libbsd is:
>>>>
>>>> ./waf configure \
>>>>           
>>>> --prefix=/home/EB/christian_m/Projekte/rtems-bbb//install/rtems/6 \
>>>>           --rtems-bsps=arm/beagleboneblack \
>>>>         
>>>> --buildset=/home/EB/christian_m/Projekte/rtems-bbb//build/src/noipsec.ini \
>>>>           --enable-warnings \
>>>>           --optimization=2 \
>>>>           --rtems-version=6
>>>>
>>>> Adding your patch from ages ago to libbsd works to solve that:
>>>>
>>>>     
>>>> https://gitlab.com/c-mauderer/rtems-libbsd/-/commit/c9474c0b228d91dff098d617234842d56af3c4d7.patch
>>>>
>>>>
>>>>
>>>> But you haven't applied it to the libbsd master. So I assume that there is 
>>>> a
>>>> better workaround for that problem? What's the correct solution?
>>> thanks for testing. Apparently, I tested with this patch applied. This is an
>>> open issue. Chris was not happy with this patch.
>> Yes that is correct. Patching libbsd this way solves the issue for us, the 
>> RTEMS
>> developers, however the same problem remains for applications linking to 
>> libbsd.
> 
> No, we have two different kind of flags which play a role here:
> 
> 1. Flags for the compiler: -fdata-sections -ffunction-sections
> 
> 2. A flag for the linker: -Wl,--gc-sections
> 
> I linker flag is required by the application if it links to -lbsd. The 
> compiler
> flags are required to build libbsd itself, but they are NOT required to build
> the application objects or other libraries.

Thanks, this makes sense. We still need to address the exporting of the link 
flag.

waf_libbsd.py is not the place for the flags. This should be added to libbsd.py
in the defaults. waf_libbsd.py is part of build engine and should not have any
settings.

I can have a look after my posted changes are pushed. The self.data in
waf_libbsd.py is a bit of a beast these days.

> The linker flag part of the patch could be removed. It just makes libbsd
> requirements a bit more explicit.

Let me have a look at this. Thinking about this now we also need to indicate if
the "flag" is to be exported. The section compilers do not but the link option 
does.

>> Requiring users copy these flags into application specific build systems is
>> fragile. Just look at the issues EPICS has updating to RTEMS 5. We need to 
>> do a
>> better of job of handling these settings. As a result I do not support the
>> easy fix.
>>
>>> I think the -fdata-sections and -ffunction-sections flags should not be 
>>> exported
>>> by the pkg-config file of the build system since these are optimization 
>>> flags
>>> which affect the code generation. However, for libbsd these flags are 
>>> mandatory
>>> and should be enforced by a library-specific rule.
>> I am not sure what you mean when you say .. enforcing a library specific 
>> rule?
>> We can only lead by providing robust interfaces that do not change with each
>> version of RTEMS yet let us evolve RTEMS.
>>
>> I believe rtems.git needs to export flags for libraries we use via pkgconfig.
>> For example we could use variables for this:
>>
>> pkgconfig /somewhere/i386-rtems6-pc686.pc --variable libbsd-cflags
> To use a library, you don't need CFLAGS. You need LDFLAGS and maybe CPPFLAGS 
> if
> it has special include paths.

Depends on the include paths used and this means the prefix. If there are no
special flags pkg-config will return an empty string.

>> The variable name `libbsd-cflags` could be something less specific to libbsd
>> like `sections-cflags` or something better. We can have other variables like 
>> a
>> base address, a u-boot mkimage set of flags, etc. I would like to see these 
>> grow
>> over time to address the difficult area of exporting architecture and BSP
>> specific settings.
> Yes, I also think that pkg-config should be the interface for applications to
> get these values.

Great.

>>
>> LibBSD can then create and install it's own .pc file:
>>
>> $ cat /opt/rtems/6/lib/pkgconfig/bsd.pc
>> prefix=/opt/rtems/6
>> exec_prefix=/opt/rtems/6
>> libdir=/opt/tems/6/lib
>> includedir=/opt/rtems/6/include
>>
>> Name: libbsd
>> Version: 5.1.0
>> Description: RTEMS LibBSD
>> URL: httpis:/git.rtems.org/rtems-libbsd.git
>> Libs: -lbsd
>> Cflags: -fdata-sections -ffunction-sections
>>
>> An application can then:
>>
>> $ pkg-config /opt/rtems/6/lib/pkgconfig/i386-rtems6-pc686.pc --cflags --libs 
>> bsd
>> -qrtems -B/opt/rtems/6/i386-rtems6/lib/ -B/opt/rtems/6/i386-rtems6/pc686/lib/
>> --specs bsp_specs -mtune=pentiumpro -march=pentium -O2 -g -ffunction-sections
>> -Wnested-externs -fdata-sections -ffunction-sections -lbsd
>>
>> I am sure the .pc files could be better than the quick hack shown here. I 
>> think
>> a suitable design and model could be established that can be used for all 3rd
>> party libraries.
>>
>> Note, rtems_waf has been using .pc files for years waiting for the RTEMS .pc
>> support to evolve into a copmlete interface ...
>>
>> https://git.rtems.org/rtems_waf/tree/rtems.py#n794
> 
> Yes, the libbsd could install its own pkg-config file although using an
> installed libbsd is pretty simple. You just have to add -lbsd and
> -Wl,--gc-sections. The -Wl,--gc-sections is already provided by the BSP
> pkg-config file.

Pretty simple is relative. A pkg-config file removes the needs to update these
flags if something changes. I would rather see us have files for all libraries
even if they are simple. This way the simple and hard are all handled the same 
way.

Chris
_______________________________________________
devel mailing list
devel@rtems.org
http://lists.rtems.org/mailman/listinfo/devel

Reply via email to