[CMake] CMAKE_COMPILER_IS_GNUC vs. CMAKE_COMPILER_IS_GNUCC

Todd Gamblin tgamblin at llnl.gov
Mon Jul 5 14:06:01 EDT 2010


On Jul 5, 2010, at 4:25 AM, Michael Wild wrote:

> 
> On 5. Jul, 2010, at 12:00 , Todd Gamblin wrote:
> 
>> 
>> On Jul 5, 2010, at 1:23 AM, Michael Wild wrote:
>> 
>>> 
>>> On 5. Jul, 2010, at 7:46 , Todd Gamblin wrote:
>>> 
>>>> The documentation here:
>>>> 
>>>> 	http://**www.**cmake.org/cmake/help/cmake2.6docs.html#variable:CMAKE_COMPILER_IS_GNULANG
>>>> 
>>>> is in conflict with the documentation here:
>>>> 
>>>> 	http://**www.**cmake.org/Wiki/CMake_Useful_Variables
>>>> 
>>>> And this thread (though it's from 2008) seems to imply that the second link above is right, even though the first is more current:
>>>> 
>>>> 	http://**www.**mail-archive.com/cmake@cmake.org/msg16863.html
>>>> 
>>>> 
>>>> I'm using CMake 2.8.2, and I'm noticing that CMAKE_COMPILER_IS_GNUC is empty, which conflicts with the latest documentation on the wiki.  This makes it hard to do things like this:
>>>> 
>>>>> 	for (lang C CXX Fortran)
>>>>> 		if (CMAKE_COMPILER_IS_GNU${lang})
>>>>> 			...
>>>>> 		endif()
>>>>> 	endfor()
>>>> 
>>>> Looking through the CMake source, it doesn't look like CMAKE_COMPILER_IS_GNUFortran is used anywhere.  I tested it, and it looks like it's empty too.  Would it be possible to add CMAKE_COMPILER_IS_GNUC and CMAKE_COMPILER_IS_GNUFortran so that they actually work?  I think this would be more consistent than the current setup.
>>>> 
>>>> These issues are coming up in the platform files I'm making for BlueGeneP.  I think writing things like this would be easier if this were more consistent.
>>>> 
>>>> -Todd
>>> 
>>> The variables are called CMAKE_COMPILER_IS_GNUC, CMAKE_COMPILER_IS_GNUCXX and CMAKE_COMPILER_IS_GNUG77 (the latter is admittedly weird)
>> 
>> I don't think this is correct, at least not in the platform files in CMake 2.8.2.  If I look at the value of CMAKE_COMPILER_IS_GNUC, it's empty.  If I look at CMAKE_COMPILER_IS_GNUCC, it's getting set to what I'd expect.  Is CMAKE_COMPILER_IS_GNUC set somewhere else, after the platform file gets included?
>> 
>> G77 is weird, since as far as I can tell it's "Fortran" for all the other variables.  Like I said, that really precludes you from doing something like this, especially if you try to set something inside the loop:
>> 
>> 	for (lang C CXX Fortran)
>> 		if (CMAKE_COMPILER_IS_GNU${lang})
>> 			set(CMAKE_SHARED_LIBRARY_CREATE_${lang}_FLAGS "-shared")
>> 		endif()
>> 	endfor()
>> 
>> Since now ${lang} needs to be something different in all those places.
> 
> Well, I got this information by simply grepping through the sources:
> 
> $ egrep -roh 'CMAKE_COMPILER_IS_GNU[A-Z0-9]*' Modules | sort -u
> CMAKE_COMPILER_IS_GNUCC
> CMAKE_COMPILER_IS_GNUCXX
> CMAKE_COMPILER_IS_GNUG77
> 
> And you're right, it is CMAKE_COMPILER_IS_GNUCC and not CMAKE_COMPILER_IS_GNUC. But that is kind of consistent with the variable names used in GNU Makefiles to refer to the C, C++ and G77 compilers. If you are not happy with the names (for the reason you posted above),

Yeah, still not happy.  "Kind of consistent" is not kind of not the same as consistent :-).

> you can use CMAKE_<LANG>_COMPILER_ID which should be set to GNU if it is a GNU compiler:
> 
> for(lang C CXX Fortran)
>  if(CMAKE_${lang}_COMPILER_ID STREQUAL GNU)
>    set(CMAKE_SHARED_LIBRARY_CREATE_${lang}_FLAGS "-shared")
>   endif()
> endforeach()

But this is lovely.  Thanks!  This is probably a better way to do it anyway, since what I really wanted to do was detect XL and default to GNU anyway.

-Todd




> 
> 
> HTH
> 
> Michael



More information about the CMake mailing list