[Toybox] _GNU_SOURCE definition problem

Rob Landley rob at landley.net
Thu Mar 8 04:59:55 PST 2012


On 03/08/2012 06:34 AM, Georgi Chorbadzhiyski wrote:
> Around 03/08/2012 03:05 AM, Rob Landley scribbled:
>> On 03/07/2012 09:44 AM, Georgi Chorbadzhiyski wrote:
>>> toys/netcat.c: In function ‘netcat_main’:
>>> toys/netcat.c:125:4: warning: passing argument 2 of ‘bind’ from incompatible pointer type [enabled by default]
>>> /usr/local/musl/include/sys/socket.h:236:5: note: expected ‘const struct sockaddr *’ but argument is of type ‘struct sockaddr_in *’
>>> toys/netcat.c:146:5: warning: passing argument 2 of ‘getsockname’ from incompatible pointer type [enabled by default]
>>> /usr/local/musl/include/sys/socket.h:241:5: note: expected ‘struct sockaddr *’ but argument is of type ‘struct sockaddr_in *’
>>
>> The compiler's being a bit fastidious in netcat there.  Oh well, I
>> suppose shutting it up with a typecast isn't actually _incorrect_...
> 
> Should I add the casts, so the compiler would shut up?

I already did: http://landley.net/hg/toybox/rev/532

>> And now the only thing it's complaining about is strndupa(), which
>> actually _is_ a gnu extension it seems.  Easy short-term fix: mdev.c can
>> default n for now.
> 
> strndupa is easily replaced by strndup + free. mdev is not *that* performance
> critical :)

I see your patch for that in my queue, but probably won't be able to
catch up until the weekend.

>>> It is defined in lib/portability.h but since it is included in
>>> toys.h and toys.h is included after system headers, the definitions
>>> do not exist.
>>
>> It shouldn't be after. It shouldn't be separate: toys.h should be
>> _doing_ the inclusion of most system headers.
>>
>> Part of the idea here is if you're using something like ccache, toys.h
>> turns into a single giant preprocessed blob, and compilation goes
>> faster.  Also it means we're not repeating the same #includes in a
>> gazillion files and then tweaking "no, on this variant it's string.h not
>> strings.h" and having to patch it in 12 places.
>>
>> I've let a few headers go if they're not general purpose, and shoved a
>> couple others into special purpose files like lib/xregcomp.* and
>> lib/getmountlist.c where I've previously hit build environments that
>> didn't have support for that, and thus want them to be able to be
>> configured out (at the cost of dropping some commands).
>>
>> But in general, a command should be able to just #include "toys.h" and
>> no other headers.
>>
>>> Two possible fixes:
>>>  1. Define _GNU_SOURCE above system headers in id.c and ls.c
>>>  2. Move #include "toys.h" above system headers.
>>
>> 3. suck inclusion of other headers into the giant block of headers
>> toys.h already #includes.
>>
>> Let's see, grep the #includes in toys/* and filter out toys.h...
>>
>> All three of the headers included by id.c are already #included by
>> toys.h, I have no idea why it's separately #including them.  Same with
>> ls, and the 64 bit file offset thing should probably be in
>> portability.h.  (A 32 bit offset is actually _2_ gigs since it's signed,
>> hard drives ahve been larger than that for 20 years. I have a USB
>> keychain twice that size on my car key, and it's so old all the
>> writing's worn off...)  In dirname.c, libgen.h is posix-2008 so that
>> should be in toys.h.  In sort.c math.h is standard...
>>
>> Ok, what _is_ justifiably separate?
>>
>> dmesg: sys/klog.h is linux-specific.
>> insmod.c, rmmod.c: sys/syscall.h is not in posix-2008.
>> oneit.c: sys/reboot.h is not in posix-2008.
> 
> After the cleanup patch (see bellow) here are the includes in toys/

I did this and checked it in yesterday as well:

  http://landley.net/hg/toybox/rev/533

> dirname.c:#include <libgen.h>

It's posix 2008, I consolidated it.

> dmesg.c:#include <sys/klog.h>
> insmod.c:#include <sys/syscall.h>
> oneit.c:#include <sys/reboot.h>
> rmmod.c:#include <sys/syscall.h>
> sort.c:#include <math.h>

math.h is also posix 2008.

The header list is under "base definitions":

http://pubs.opengroup.org/onlinepubs/9699919799/idx/head.html

> uname.c:#include <sys/utsname.h>
> unshare.c:#include <sched.h>
> who.c:#include <utmpx.h>

All three also posix standard, and merged in yesterday's patch.

>> I think that's about it, actually...
>>
>>> Both are ugly, help!
>>
>> This needs cleanup.  Thanks for bringing it to my attention.
>>
>> How do I get a musl test environment, by the way?
> 
> get musl from : http://www.etalabs.net/musl/download.html
> untar, make and make install
> compile toybox with make CC=musl-gcc

Compiler wrapper.  Got it.

>>> Anyway, with 1 from above and the two patches that I've already posted
>>> I can successfully build allyesconfig with musl 0.8.6 on 32 bit x86
>>> machine.
>>
>> Woot!  I still haven't made it through your macosx cleanups yet. :)
> 
> Ok, the attached patch cleans up includes in toys/ directory. With this
> and the other two patches (replace index with strchr and stop using
> strndupa) the compilation with musl is possible.

I applied the cleanups I was talking about to the repository at the same
time I sent the above message.  Did my cleanups (based on posix) do what
you needed?

Rob


More information about the Toybox mailing list