33

Is it possible to check the minor version number of GCC in cmake?

I want to do something like this:

If (GCC_MAJOR >= 4 && GCC_MINOR >= 3)
Ilmari Karonen
  • 49,047
  • 9
  • 93
  • 153
Karl von Moor
  • 8,484
  • 4
  • 40
  • 52
  • possible duplicate of [How can I add a minimum compiler version requisite?](http://stackoverflow.com/questions/14933172/how-can-i-add-a-minimum-compiler-version-requisite) – sleske Sep 24 '13 at 10:42
  • If I am guessing your intentions correctly, this will mis-detect GCC 5.0, 5.1, 6.0, 6.1, etc. – jww Jul 04 '16 at 21:58

4 Answers4

40

Use if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 4.2) as mentioned by onqtam. This obsolete answer was back from the 2.6 CMake days.

You could run gcc -dumpversion and parse the output. Here is one way to do that:

if (CMAKE_COMPILER_IS_GNUCC)
    execute_process(COMMAND ${CMAKE_C_COMPILER} -dumpversion
                    OUTPUT_VARIABLE GCC_VERSION)
    string(REGEX MATCHALL "[0-9]+" GCC_VERSION_COMPONENTS ${GCC_VERSION})
    list(GET GCC_VERSION_COMPONENTS 0 GCC_MAJOR)
    list(GET GCC_VERSION_COMPONENTS 1 GCC_MINOR)

    message(STATUS ${GCC_MAJOR})
    message(STATUS ${GCC_MINOR})
endif()

That would print "4" and "3" for gcc version 4.3.1. However you can use CMake's version checking syntax to make life a bit easier and skip the regex stuff:

execute_process(COMMAND ${CMAKE_C_COMPILER} -dumpversion
                OUTPUT_VARIABLE GCC_VERSION)
if (GCC_VERSION VERSION_GREATER 4.3 OR GCC_VERSION VERSION_EQUAL 4.3)
        message(STATUS "Version >= 4.3")
endif()

richq
  • 55,548
  • 20
  • 150
  • 144
24

Since CMake 2.8.10 there are the CMAKE_C_COMPILER_VERSION and CMAKE_CXX_COMPILER_VERSION variables exactly for this purpose so you can do this:

if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 4.2)
onqtam
  • 4,356
  • 2
  • 28
  • 50
  • 1
    This should be the accepted answer: shorter, simpler, well-defined for all current and future compiler versions. The answer accepted right now (by richq) has a problem: `-dumpversion` now returns `7` in gcc 7, so it's a broken solution. – Jose Luis Blanco Aug 03 '17 at 23:27
24

Combining the 2 other answers, you can check the specific gcc version as follows:

if (CMAKE_COMPILER_IS_GNUCC AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 5.1)
    ...
endif()
Steve Lorimer
  • 27,059
  • 17
  • 118
  • 213
1

However, there is an argument, -dumpfullversion that provides the full version string.

gcc -dumpfullversion

should get what you want. Still backward compatibility is broken in gcc 7.

mx0
  • 6,445
  • 12
  • 49
  • 54
Basu
  • 11
  • 1