MantisBT - CMake
View Issue Details
0014099CMakeCMakepublic2013-04-19 07:052014-10-06 10:33
Andrey Kamaev 
Peter Kuemmel 
normalmajoralways
closedfixed 
Linux
CMake 2.8.10.2 
CMake 3.0 
0014099: Ninja: CMAKE_${LANG}_FLAGS passed to linker come from incorrect scope
Library/module linker is always called with same compiler flags. CMake embeds CMAKE_${LANG}_FLAGS from the scope of the first library met by generator into the generic link rule and uses it for all targets of the same type. But CMAKE_${LANG}_FLAGS variables are directory scoped and should be different.

Looking into the CMake code I found that any platform having <LANGUAGE_COMPILE_FLAGS> in link command is affected.
The minimal reproducer is attached. In short:

CMakeLists.txt from the topmost directory:

   cmake_minimum_required(VERSION 2.8.8)
   project(level0)
   set(CMAKE_CXX_FLAGS -msse2 ) # flag itself does not matter
   add_library(lelve0 SHARED level0.cpp)
   add_subdirectory(l1)

CMakeLists.txt from sub-directory:

   project(level1)
   set(CMAKE_CXX_FLAGS -mno-sse2 )
   add_library(lelve1 SHARED level1.cpp)

Resulting link commands from Ninja:

   /usr/bin/c++ -fPIC -msse2 -shared -Wl,-soname,liblelve0.so -o liblelve0.so CMakeFiles/lelve0.dir/level0.cpp.o
   /usr/bin/c++ -fPIC -msse2 -shared -Wl,-soname,liblelve1.so -o l1/liblelve1.so l1/CMakeFiles/lelve1.dir/level1.cpp.o

Link commands used by make:

   /usr/bin/c++ -fPIC -msse2 -shared -Wl,-soname,liblelve0.so -o liblelve0.so CMakeFiles/lelve0.dir/level0.cpp.o
   /usr/bin/c++ -fPIC -mno-sse2 -shared -Wl,-soname,liblelve1.so -o liblelve1.so CMakeFiles/lelve1.dir/level1.cpp.o
No tags attached.
bz2 repro.tar.bz2 (469) 2013-04-19 07:05
https://public.kitware.com/Bug/file/4747/repro.tar.bz2
Issue History
2013-04-19 07:05Andrey KamaevNew Issue
2013-04-19 07:05Andrey KamaevFile Added: repro.tar.bz2
2014-04-13 05:00Peter KuemmelSeverityminor => major
2014-04-13 08:49Peter KuemmelAssigned To => Peter Kuemmel
2014-04-13 08:49Peter KuemmelStatusnew => assigned
2014-04-13 08:50Peter KuemmelNote Added: 0035684
2014-04-13 08:50Peter KuemmelStatusassigned => resolved
2014-04-13 08:50Peter KuemmelFixed in Version => CMake 3.0
2014-04-13 08:50Peter KuemmelResolutionopen => fixed
2014-10-06 10:33Robert MaynardNote Added: 0036969
2014-10-06 10:33Robert MaynardStatusresolved => closed

Notes
(0035684)
Peter Kuemmel   
2014-04-13 08:50   
http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=77b7f1be4074843abf5156c9ff6aed5b91456afb [^]

BTW, there is also the CMAKE_SHARED_LINKER_FLAGS variable.
(0036969)
Robert Maynard   
2014-10-06 10:33   
Closing resolved issues that have not been updated in more than 4 months.