[ https://issues.apache.org/jira/browse/MESOS-8724?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16409916#comment-16409916 ]
Benno Evers commented on MESOS-8724: ------------------------------------ One subtle thing to keep in mind, if we decide to "properly" fix it by getting protoc to add the correct #undef's for minor and major, we should take care to *not* backport the patch to older mesos versions, since that would remove the previously defined function `csi::Version::gnu_dev_major()`, causing ABI incompatibility for people upgrading libmesos.so. > G++ Warning about libc system macros `major` and `minor` prevents Mesos build > ----------------------------------------------------------------------------- > > Key: MESOS-8724 > URL: https://issues.apache.org/jira/browse/MESOS-8724 > Project: Mesos > Issue Type: Bug > Reporter: Benno Evers > Priority: Major > > On linux systems, the header `<sys/sysmacros.h>` defines three macros called > makedev(), major() and minor(). (See also > [http://man7.org/linux/man-pages/man3/makedev.3.html]) > Trying to compile Mesos using g++ 7.2.0 leads to the following warning: > {noformat} > ../include/csi/csi.pb.h:6042:13: error: In the GNU C Library, "minor" 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 "minor", include <sys/sysmacros.h> > directly. If you did not intend to use a system-defined macro > "minor", you should undefine it after including <sys/types.h>. [-Werror] > inline ::google::protobuf::uint32 Version::minor() const { > {noformat} > The root cause is that csi.proto defines the following protobuf message: > {noformat} > message Version { > uint32 major = 1; // This field is REQUIRED. > uint32 minor = 2; // This field is REQUIRED. > uint32 patch = 3; // This field is REQUIRED. > } > {noformat} > The generated C++ in `csi.pb.h` headers will contain, amongst others, the > following function: > {noformat} > #include <string> > // [6000 lines of code...] > inline ::google::protobuf::uint32 Version::major() const { > // @@protoc_insertion_point(field_get:csi.Version.major) > return major_; > } > {noformat} > And the recursive include structure of the header `<string>` leads to > `stdlib.h` as follows: > {noformat} > . /usr/include/c++/7/string > .. /usr/include/c++/7/bits/basic_string.h > ... /usr/include/c++/7/ext/string_conversions.h > .... /usr/include/c++/7/cstdlib > ..... /usr/include/stdlib.h > ...... /usr/include/x86_64-linux-gnu/sys/types.h > ....... /usr/include/x86_64-linux-gnu/sys/sysmacros.h{noformat} > -- This message was sent by Atlassian JIRA (v7.6.3#76005)