diff mbox

[libdrm,1/2] xf86drm: add missing include <sys/sysmacros.h>

Message ID 20170316135642.20405-1-eric.engestrom@imgtec.com (mailing list archive)
State New, archived
Headers show

Commit Message

Eric Engestrom March 16, 2017, 1:56 p.m. UTC
GCC 7 complains about major(), minor() and makedev():
    warning: In the GNU C Library, "major" is defined by <sys/sysmacros.h>.
    For historical compatibility, it is currently defined by <sys/types.h> as
    well, but we plan to remove this soon. To use "major", include
    <sys/sysmacros.h> directly. If you did not intend to use a system-defined
    macro "major", you should undefine it after including <sys/types.h>.

Signed-off-by: Eric Engestrom <eric.engestrom@imgtec.com>
---
 xf86drm.c | 1 +
 1 file changed, 1 insertion(+)

Comments

Emil Velikov March 16, 2017, 3:09 p.m. UTC | #1
On 16 March 2017 at 13:56, Eric Engestrom <eric.engestrom@imgtec.com> wrote:
> GCC 7 complains about major(), minor() and makedev():
>     warning: In the GNU C Library, "major" is defined by <sys/sysmacros.h>.
>     For historical compatibility, it is currently defined by <sys/types.h> as
>     well, but we plan to remove this soon. To use "major", include
>     <sys/sysmacros.h> directly. If you did not intend to use a system-defined
>     macro "major", you should undefine it after including <sys/types.h>.
>
This (and 2/2) should be handled by the
MAJOR_IN_MKDEV/MAJOR_IN_SYSMACROS blocks.

Any ideas why those are not kicking it ?
-Emil
Eric Engestrom March 16, 2017, 5 p.m. UTC | #2
On Thursday, 2017-03-16 15:09:15 +0000, Emil Velikov wrote:
> On 16 March 2017 at 13:56, Eric Engestrom <eric.engestrom@imgtec.com> wrote:
> > GCC 7 complains about major(), minor() and makedev():
> >     warning: In the GNU C Library, "major" is defined by <sys/sysmacros.h>.
> >     For historical compatibility, it is currently defined by <sys/types.h> as
> >     well, but we plan to remove this soon. To use "major", include
> >     <sys/sysmacros.h> directly. If you did not intend to use a system-defined
> >     macro "major", you should undefine it after including <sys/types.h>.
> >
> This (and 2/2) should be handled by the
> MAJOR_IN_MKDEV/MAJOR_IN_SYSMACROS blocks.
> 
> Any ideas why those are not kicking it ?

Didn't know about those, and didn't look closely enough to see them the
first time around.

From the AC_HEADER_MAJOR doc:
  If ‘sys/types.h’ does not define major, minor, and makedev, but
  ‘sys/mkdev.h’ does, define MAJOR_IN_MKDEV; otherwise, if
  ‘sys/sysmacros.h’ does, define MAJOR_IN_SYSMACROS.

The issue is that <sys/types.h> *does* define it for now, but prints
a warning if <sys/sysmacros.h> isn't also included.

Given the autoconf macro and #ifdef, it will always work, even once GCC
does drop the macros from <sys/types.h>, but the current method will
always result in a warning until then. (And there's no flag to turn the
warning off either.)

I guess "don't change the code and learn to ignore the wall of warnings"
is the only course of action?

Cheers,
  Eric
Emil Velikov March 16, 2017, 7:05 p.m. UTC | #3
On 16 March 2017 at 17:00, Eric Engestrom <eric.engestrom@imgtec.com> wrote:
> On Thursday, 2017-03-16 15:09:15 +0000, Emil Velikov wrote:
>> On 16 March 2017 at 13:56, Eric Engestrom <eric.engestrom@imgtec.com> wrote:
>> > GCC 7 complains about major(), minor() and makedev():
>> >     warning: In the GNU C Library, "major" is defined by <sys/sysmacros.h>.
>> >     For historical compatibility, it is currently defined by <sys/types.h> as
>> >     well, but we plan to remove this soon. To use "major", include
>> >     <sys/sysmacros.h> directly. If you did not intend to use a system-defined
>> >     macro "major", you should undefine it after including <sys/types.h>.
>> >
>> This (and 2/2) should be handled by the
>> MAJOR_IN_MKDEV/MAJOR_IN_SYSMACROS blocks.
>>
>> Any ideas why those are not kicking it ?
>
> Didn't know about those, and didn't look closely enough to see them the
> first time around.
>
> From the AC_HEADER_MAJOR doc:
>   If ‘sys/types.h’ does not define major, minor, and makedev, but
>   ‘sys/mkdev.h’ does, define MAJOR_IN_MKDEV; otherwise, if
>   ‘sys/sysmacros.h’ does, define MAJOR_IN_SYSMACROS.
>
> The issue is that <sys/types.h> *does* define it for now, but prints
> a warning if <sys/sysmacros.h> isn't also included.
>
> Given the autoconf macro and #ifdef, it will always work, even once GCC
> does drop the macros from <sys/types.h>, but the current method will
> always result in a warning until then. (And there's no flag to turn the
> warning off either.)
>
> I guess "don't change the code and learn to ignore the wall of warnings"
> is the only course of action?
>
Sigh, I wonder if GCC devs considered the annoyance this will bring
and that some people actually do the "correct" thing :-\

As an alternative we can replace the AC_HEADER_MAJOR + MAJOR_IN_FOO
with AC_CHECK_HEADERS + HAVE....  It [hopefully] will work everywhere
and will squash the annoying warning(s).

-Emil
diff mbox

Patch

diff --git a/xf86drm.c b/xf86drm.c
index 88f86ed5..8f8dfb6e 100644
--- a/xf86drm.c
+++ b/xf86drm.c
@@ -48,6 +48,7 @@ 
 #include <limits.h>
 #include <signal.h>
 #include <time.h>
+#include <sys/sysmacros.h>
 #include <sys/types.h>
 #include <sys/stat.h>
 #define stat_t struct stat