web-dev-qa-db-fra.com

Forcer C99 dans CMake (utiliser 'pour' déclaration initiale de boucle)

J'ai recherché une méthode portable pour forcer CMake à activer les fonctionnalités C99 du compilateur afin d'éviter l'erreur gcc suivante, par exemple:

error: ‘for’ loop initial declarations are only allowed in C99 mode
for (int s = 1; s <= in_para->StepNumber; s++){
^

Je ne voudrais pas non plus vérifier pour quel compilateur et ajouter quelque chose comme:

set(CMAKE_C_FLAGS "-std=c99") # that would be bad

J'ai donc trouvé ce message: Activer C99 dans CMake et la demande de fonctionnalité associée: 0012300: CMake n'a pas de moyen multiplateforme de demander C99 . Dans ce bogue Mantis, j'ai appris sur target_compiler_features et ensuite j'ai trouvé ces réponses SOF: Comment activer C++ 11 dans CMake? et Comment détecter le support C++ 11 d'un compilateur avec CMake .

Mes questions sont donc les suivantes: ce target_compiler_features permettra-t-il d'exiger une fonctionnalité C ainsi qu'une fonctionnalité C++? Quel est le moyen le plus portable pour y parvenir maintenant? J'utilise actuellement CMake 2.8.12.2. Le target_compiler_features n'est pas dans la version la plus récente de CMake (3.0.0). Savez-vous quand il est publié?

19
Tarc

Après avoir créé une cible telle qu'une bibliothèque ou un exécutable, insérez une ligne comme celle-ci dans votre fichier CMakeLists.txt:

set_property(TARGET tgt PROPERTY C_STANDARD 99)

tgt est le nom de votre cible.

Je pense que cela a été ajouté dans CMake 3.1, et la documentation est ici:

http://www.cmake.org/cmake/help/v3.1/prop_tgt/C_STANDARD.html

Si vous devez prendre en charge des versions de CMake antérieures à 3.1, vous pouvez utiliser cette macro:

macro(use_c99)
  if (CMAKE_VERSION VERSION_LESS "3.1")
    if (CMAKE_C_COMPILER_ID STREQUAL "GNU")
      set (CMAKE_C_FLAGS "-std=gnu99 ${CMAKE_C_FLAGS}")
    endif ()
  else ()
    set (CMAKE_C_STANDARD 99)
  endif ()
endmacro(use_c99)

Après avoir placé cette macro dans votre fichier de niveau supérieur afin qu’elle soit visible partout, vous pouvez simplement écrire use_c99() en haut de tout fichier CMakeLists qui définit une cible avec du code C99.

CMake numéro 15943 pour les utilisateurs clangs ciblant macOS

Si vous utilisez CMake et clang pour cibler MacOS, il existe un bug qui peut tout simplement empêcher la fonctionnalité CMAKE_C_STANDARD de ne pas fonctionner (vous n’ajoutez aucun indicateur de compilation). Assurez-vous de faire l'une des choses suivantes:

  • Utilisez cmake_minimum_required pour demander CMake 3.0 ou une version ultérieure, ou
  • Définissez la stratégie CMP0025 sur NEW avec le code suivant en haut de votre fichier CMakeLists.txt avant la commande project:

    # Fix behavior of CMAKE_C_STANDARD when targeting macOS.
    if (POLICY CMP0025)
      cmake_policy(SET CMP0025 NEW)
    endif ()
    
21
David Grayson

Ajoutez ce qui suit à votre fichier CMakeLists.txt et relancez cmake

set(CMAKE_C_FLAGS "std=c99")
0