[CMake] CMake incorrectly passes linker flags to ar

Alan Burlison Alan.Burlison at oracle.com
Mon Jan 11 10:49:13 EST 2016


On 11/01/2016 15:26, Brad King wrote:

> What is adding -m64 to CMAKE_STATIC_LINKER_FLAGS?  That value is indeed
> meant to be used to pass flags to "ar" because CMake (for historical
> reasons) abuses the term "linker" to refer to the archiver used for a
> static library.

That's been added by in a CMakeLists.txt via an include of a common 
cmake script for setting up the per-platform compilation flags.

https://github.com/apache/hadoop/blob/trunk/hadoop-common-project/hadoop-common/HadoopCommon.cmake

elseif(CMAKE_SYSTEM_NAME STREQUAL "SunOS")
     # Solaris flags. 64-bit compilation is mandatory, and is checked 
earlier.
     hadoop_add_compiler_flags("-m64 -D__EXTENSIONS__ 
-D_POSIX_PTHREAD_SEMANTICS -D_XOPEN_SOURCE=500")
     hadoop_add_linker_flags("-m64")

which calls:

# Add flags to all the CMake compiler variables
macro(hadoop_add_compiler_flags FLAGS)
     set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${FLAGS}")
     set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${FLAGS}")
endmacro()

# Add flags to all the CMake linker variables
macro(hadoop_add_linker_flags FLAGS)
     set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${FLAGS}")
     set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${FLAGS}")
     set(CMAKE_STATIC_LINKER_FLAGS "${CMAKE_STATIC_LINKER_FLAGS} ${FLAGS}")
endmacro()

So is the answer here to add -m64 just to CMAKE_EXE_LINKER_FLAGS and 
CMAKE_SHARED_LINKER_FLAGS and not to CMAKE_STATIC_LINKER_FLAGS? Are 
CMAKE_STATIC_LINKER_FLAGS only ever used with ar?

>> But I'm struggling to understand when passing in linker flags to ar
>> *ever* makes sense, at least on *nix platforms.
>
> The name "LINK_FLAGS" is used as a placeholder there to share the
> implementation with similar substitutions done in actual link line
> generation.  See above about the naming.
>
> The question here is what changed between 2.8.6 and 3.3.2 that causes
> -m64 to start showing up in CMAKE_STATIC_LINKER_FLAGS.

Yes indeed, if I'd been able to figure that out I think I'd have been 
able to figure out how to change the CMake macros to get round the problem.

It's not the only problem I have hit with CMake's Solaris support, see 
for example 
https://github.com/apache/hadoop/blob/trunk/hadoop-common-project/hadoop-common/HadoopCommon.cmake#L194

# CMAKE_SYSTEM_PROCESSOR is set to the output of 'uname -p', which on 
Solaris is
# the 'lowest' ISA supported, i.e. 'i386' or 'sparc'. However in order 
for the
# standard CMake modules to look in the right places it needs to reflect 
the required
# compilation mode, i.e. 64 bit. We therefore force it to either 'amd64' 
or 'sparcv9'.

There seems to be an assumption baked into CMake that if the underlying 
OS is *nix and is 32-bit then all executables that run on it are 32 bit 
and if it is 64-bit then all the executables are 64-bit as well, so 
looking at 'uname -p' is sufficient to determine the type of executables 
that should be produced. Unfortunately that's not correct for either 
Solaris or Linux.

Thanks,

-- 
Alan Burlison
--


More information about the CMake mailing list