Forcer l’usage du standard c++11 avec CMake

Depuis CMake 3.2, il est possible de forcer l’usage du standard c++11 (cf. Craig Scott’s blog post pour plus de détails). Jusqu’à présent, dans dtk, nous étions obligés de tester l’architecture (Apple, Unix or Windows), puis de vérifier si le compilateur supportait le c++11 et enfin nous devions fixer les flags correspondants manuellement.

Ancienne méthode

Voici l’extrait de code cmake utilisé jusqu’ici dans dtk:

if(APPLE)
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -I/usr/lib/c++/v1")
endif(APPLE)

if(NOT APPLE AND NOT MSVC)

  include(CheckCXXCompilerFlag)
  CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11)
  CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X)

  if(COMPILER_SUPPORTS_CXX11)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

  elseif(COMPILER_SUPPORTS_CXX0X)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")

  else()
    message(STATUS "The compiler ${CMAKE_CXX_COMPILER} has no C++11 support. Please use a different C++ compiler.")
  endif()

else(NOT APPLE AND NOT MSVC)

  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")

endif(NOT APPLE AND NOT MSVC)

On s’aperçoit aisément combien ce code est pénible et peu lisible.

Nouvelle approche

Désormais, il suffit de fixer deux variables CMake pour forcer l’usage du c++11:

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

Bien plus simple n’est-ce pas?

CMake fournit d’autres commandes pour utiliser plus finement les différentes fonctionalités du compilateur. Craig Scott les détaille très clairement dans son blog post.

A propos Thibaud Kloczko

Graduated in CFD, Thibaud Kloczko is a software engineer at Inria. He is involved in the development of the meta platform dtk that aims at speeding up life cycle of business codes into research teams and at sharing software components between teams from different scientific fields (such as medical and biological imaging, numerical simulation, geometry, linear algebra, computational neurology).

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.