[ 
https://issues.apache.org/jira/browse/HADOOP-11997?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14563734#comment-14563734
 ] 

Alan Burlison commented on HADOOP-11997:
----------------------------------------

Whilst I agree that macro fiddling can't on its own ensure portability, 
deliberately defining a macro that enables all the platform-specific extensions 
for just one platform is completely toxic to cross-platform portability. If I 
suggested doing the same for Solaris, or OSX, or Windows would you +1 the patch?

Yes we need nightly builds but if people submit patches that are, through no 
fault of their own, not cross-platform because _GNU_SOURCE is globally defined 
you are going to get unnecessary build failures. Then you are going to have to 
get the patch submitters, or even worse, someone else, to rework the patches. 
That's a recipe for general frustration and unnecessary work.

I agree with Allen here, the emphasis should be on using POSIX functionality 
wherever possible and only dropping down to the platform-specific versions when 
there's either no alternative or there's a performance/functionality benefit to 
be had.

If you need to use platform-specific features to get the best performance out 
of Linux then that's what they are - platform-specific, and they should be 
bracketed with the appropriate #define/#undef blocks. Hopefully we'll be using 
Solaris-specific features to get the best performance out of Solaris, but 
that's exactly what they will be - Solaris-specific, and they'll have to be 
conditionally compiled as a result. I don't see why Linux is any different.

> CMake CMAKE_C_FLAGS are non-portable
> ------------------------------------
>
>                 Key: HADOOP-11997
>                 URL: https://issues.apache.org/jira/browse/HADOOP-11997
>             Project: Hadoop Common
>          Issue Type: Sub-task
>          Components: build
>    Affects Versions: 2.7.0
>         Environment: All
>            Reporter: Alan Burlison
>            Assignee: Alan Burlison
>            Priority: Critical
>
> hadoop-common-project/hadoop-common/src/CMakeLists.txt 
> (https://github.com/apache/hadoop/blob/trunk/hadoop-common-project/hadoop-common/src/CMakeLists.txt#L110)
>  contains the following unconditional assignments to CMAKE_C_FLAGS:
> set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -Wall -O2")
> set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_REENTRANT -D_GNU_SOURCE")
> set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_LARGEFILE_SOURCE 
> -D_FILE_OFFSET_BITS=64")
> There are several issues here:
> 1. "-D_GNU_SOURCE" globally enables the use of all Linux-only extensions in 
> hadoop-common native source. This is probably a major contributor to the poor 
> cross-platform portability of Hadoop native code to non-Linux platforms as it 
> makes it easy for developers to use non-portable Linux features without 
> realising. Use of Linux-specific features should be correctly bracketed with 
> conditional macro blocks that provide an alternative for non-Linux platforms.
> 2. "-g -Wall -O2" turns on debugging for all builds, I believe the correct 
> mechanism is to set the CMAKE_BUILD_TYPE CMake variable. If it is still 
> necessary to override CFLAGS it should probably be done conditionally 
> dependent on the value of CMAKE_BUILD_TYPE.
> 3. "-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64" On Solaris these flags are 
> only needed for largefile support in ILP32 applications, LP64 applications 
> are largefile by default. I believe the same is true on Linux, so these flags 
> are harmless but redundant for 64-bit compilation.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to