[Olsr-dev] changing 'linux' macro to __linux__ or __gnu_linux__

Felix Fietkau (spam-protected)
Thu Feb 2 16:54:48 CET 2012

On 2012-02-02 4:49 PM, Hans-Christoph Steiner wrote:
> On 02/02/2012 10:22 AM, Felix Fietkau wrote:
>> On 2012-02-02 4:00 PM, Hans-Christoph Steiner wrote:
>>> On 02/02/2012 08:58 AM, Felix Fietkau wrote:
>>>> On 2012-02-01 8:56 PM, Hans-Christoph Steiner wrote:
>>>>> One thing that I've learned in my own porting work is: it is generally
>>>>> the least overall work to try to use the platform macros that are
>>>>> automatically defined by the compiler.  Android's NDK only recently
>>>>> added the __ANDROID__ macro, for example, and Android's gcc also defines
>>>>> __linux__, but NOT __gnu_linux__.
>>>>> Every GNU/Linux I've tried (which is mostly Debian and derivatives) has
>>>>> a compiler that sets __linux__ and __gnu_linux__.  So I propose changing
>>>>> olsrd's linux macro to be __linux__ when its kernel-related and
>>>>> __gnu_linux__ when its OS related.  This will allow the code to
>>>>> differentiate between GNU/Linux and Android/Linux (not GNU at all,
>>>>> besides the compiler).
>>>>> If people are amenable, I'll post a patch.  This isn't so much to fix a
>>>>> specific issue now, but rather to prevent issues from arising in the future.
>>>> I think it's better to explicitly check for android instead of relying
>>>> on __gnu_linux__. There are enough embedded distros out there (e.g.
>>>> OpenWrt) that are mostly GNU compatible, but do not use glibc, nor
>>>> define __gnu_linux__
>>> If we use the __gnu_linux__, __linux__, and __ANDROID__ macros right,
>>> chances are that the build system won't need to handle them at all.  The
>>> build system will still need specific checks for Android and other
>>> embedded systems to setup the build with the right cross-compiler.
>> Do you have any examples where you'd check for __gnu_linux__ explicitly?
> Not yet specific to the olsrd code, but when there are things that are
> from standard GNU libraries that are not always in other platforms, the
> __gnu_linux__ macro makes sense.  I think there are also macros for GNU
> libc, Android's Bionic libc, and others.  Those I know less well.
> One example function is ttyname(), which is a standard libc function
> that is not implemented (yet?) in Bionic libc.
I don't think you should use __gnu_linux__ to check for things that
aren't in bionic libc, using __ANDROID__ is more appropriate for that.
Many things that are not in bionic, are still implemented in uclibc, and
__gnu_linux__ is not set for that.

- Felix

More information about the Olsr-dev mailing list