web-dev-qa-db-fra.com

Construire avec CMake, Ninja et Clang sous Windows

Chers collègues codeurs C++,

après avoir utilisé la chaîne d'outils Visual Studio pour la construction de fenêtres pendant un certain temps, j'ai décidé d'essayer Clang 5.

J'ai installé les fichiers binaires de LLVM 5.0.0, l'environnement de construction Ninja, les outils VS 2017 et CMake 3.9.3. L'objectif final est de pouvoir compiler des applications C et C++ pour Windows en utilisant VS Code avec l'intégration de CMake en tant qu '"IDE" et Clang avec LLD en tant que compilateur et éditeur de liens.

La compilation et l'exécution d'un programme simple ont parfaitement fonctionné ( capture d'écran de l'historique du terminal respectif ). Clang a automatiquement détecté la bibliothèque standard pour Windows dans les répertoires de VS Tools et a généré une sortie exécutable.

L'étape suivante consistait à configurer une construction simple avec Ninja ( capture d'écran du fichier ninja.build et de l'historique du terminal ). Le processus de construction a fonctionné comme prévu et a généré un exécutable fonctionnel, comme avant.

Les problèmes ont commencé lorsque j'ai commencé à intégrer CMake au processus. Mon attente est que CMake produise un fichier de construction ninja et l'exécute, exact? J'ai essayé le fichier CMakeLists suivant

cmake_minimum_required(VERSION 3.9)

project(Test)

add_executable(Test main.c)

et appelé CMake avec cmake -G Ninja. La sortie résultante a été décevante et je ne comprends pas assez pour résoudre le problème moi-même.

-- The C compiler identification is Clang 5.0.0
-- The CXX compiler identification is Clang 5.0.0
-- Check for working C compiler: C:/Meine_Programme/LLVM/bin/clang.exe
-- Check for working C compiler: C:/Meine_Programme/LLVM/bin/clang.exe -- broken
CMake Error at C:/Meine_Programme/CMake/share/cmake-3.9/Modules/CMakeTestCCompiler.cmake:51 (message):
  The C compiler "C:/Meine_Programme/LLVM/bin/clang.exe" is not able to
  compile a simple test program.

  It fails with the following output:

   Change Dir: D:/Dateien/Downloads/Test/CMakeFiles/CMakeTmp



  Run Build Command:"C:/Meine_Programme/Ninja_Build/ninja.exe" "cmTC_eeb5c"

  [1/2] Building C object CMakeFiles\cmTC_eeb5c.dir\testCCompiler.c.obj

  FAILED: CMakeFiles/cmTC_eeb5c.dir/testCCompiler.c.obj 

  C:\Meine_Programme\LLVM\bin\clang.exe /nologo /DWIN32 /D_WINDOWS /W3 /MDd
  /Zi /Ob0 /Od /RTC1 /showIncludes
  /FoCMakeFiles\cmTC_eeb5c.dir\testCCompiler.c.obj
  /FdCMakeFiles\cmTC_eeb5c.dir\ -c testCCompiler.c

  clang.exe: error: no such file or directory: '/nologo'

  clang.exe: error: no such file or directory: '/DWIN32'

  clang.exe: error: no such file or directory: '/D_WINDOWS'

  clang.exe: error: no such file or directory: '/W3'

  clang.exe: error: no such file or directory: '/MDd'

  clang.exe: error: no such file or directory: '/Zi'

  clang.exe: error: no such file or directory: '/Ob0'

  clang.exe: error: no such file or directory: '/Od'

  clang.exe: error: no such file or directory: '/RTC1'

  clang.exe: error: no such file or directory: '/showIncludes'

  clang.exe: error: no such file or directory:
  '/FoCMakeFiles\cmTC_eeb5c.dir\testCCompiler.c.obj'

  clang.exe: error: no such file or directory:
  '/FdCMakeFiles\cmTC_eeb5c.dir\'

  ninja: build stopped: subcommand failed.





  CMake will not be able to correctly generate this project.
Call Stack (most recent call first):
  CMakeLists.txt:3 (project)


-- Configuring incomplete, errors occurred!
See also "D:/Dateien/Downloads/Test/CMakeFiles/CMakeOutput.log".
See also "D:/Dateien/Downloads/Test/CMakeFiles/CMakeError.log".

Je suppose que le problème est lié au clang d’appel de CMake avec les options de style VS utilisant une barre oblique au lieu de précédé de moins, comme le requiert Clang.

Merci de m'avoir aidé les gars, je l'apprécie :-)

Laissez-moi juste un commentaire si vous souhaitez des informations complémentaires.

Réponse au message de Florians

J'ai essayé la commande Florians mais omis le chemin vers ninja pour une notation plus courte et cela s'est avéré très bien fonctionner.

cmake -E env LDFLAGS="-Fuse-ld=lld"  cmake -H. -G Ninja -Bbuild -DCMAKE_C_COMPILER:PATH="C:\MeineProgramme\LLVM\bin\clang.exe" -DCMAKE_CXX_COMPILER:PATH="C:\MeineProgramme\LLVM\bin\clang++.exe" -DCMAKE_C_COMPILER_ID="Clang" -DCMAKE_CXX_COMPILER_ID="Clang" -DCMAKE_SYSTEM_NAME="Generic"

CMake a créé un fichier de construction ninja.

J'ai exécuté ninja all pour construire l'exécutable sous la forme Test. Je l'ai renommé en Test.exe et le programme a été exécuté avec bonheur. Jusqu'ici ... succès !!! Mais beaucoup plus compliqué que prévu.

16
Simon

J'ai enfin trouvé le moyen d'utiliser mes outils préférés d'une manière qui me plaise. Ce n'est pas parfait, mais cela fonctionne mieux que l'approche de Florians en définissant le nom du système sur Generic (que j'utilise depuis quelque temps déjà)

J'ai d'abord configuré VS Code pour utiliser le terminal de développeur VS comme terminal standard. Je l'ai fait en ajoutant la ligne suivante aux préférences du code VS

"terminal.integrated.Shell.windows": "C:\\MeineProgramme\\Visual_Studio\\2017\\BuildTools\\Common7\\Tools\\LaunchDevCmd.bat"

Après avoir démarré le terminal dans VS Code, je dois appeler le fichier de traitement correspondant qui définit les variables d’environnement requises (dans mon cas, vcvars64.bat). Ceux-ci peuvent être trouvés dans

C:\MeineProgramme\Visual_Studio\2017\BuildTools\VC\Auxiliary\Build

Après avoir accédé à mon répertoire de construction, je lance CMake avec les options suivantes

cmake .. -G Ninja -DCMAKE_CXX_COMPILER:PATH="C:\MeineProgramme\LLVM\bin\clang-cl.exe" -DCMAKE_LINKER:PATH="C:\MeineProgramme\LLVM\bin\lld-link.exe"

cela encourage CMake à utiliser tous mes outils LLVM installés. Non seulement clang et lld (assurez-vous d'utiliser lld-link qui supporte les options précédées d'un /), mais également llvm-ar et llvm-ranlib. Le seul outil de compilation utilisé par MS est le compilateur de ressources que je n’utilise pas pour le moment.

Jusqu'ici le succès je pense.

N'hésitez pas à me contacter ou à commenter ci-dessous si vous avez d'autres questions.

3
Simon

Inspiré par le "Méthodes de compilation avec Clang sous Windows" billet de blog de @Unspongeful et après quelques tests étendus, la ligne de commande suivante a fonctionné pour moi (et oui, c’est une grosse commande que je viens de séparer en plusieurs lignes pour une meilleure lisibilité):

> cmake -E env LDFLAGS="-Fuse-ld=lld-link" PATH="<path\to\ninja>" 
      cmake -H. -G Ninja -Bbuild 
         -DCMAKE_C_COMPILER:PATH="%ProgramFiles(x86)%\LLVM\bin\clang.exe" 
         -DCMAKE_CXX_COMPILER:PATH="%ProgramFiles(x86)%\LLVM\bin\clang.exe" 
         -DCMAKE_C_COMPILER_ID="Clang" 
         -DCMAKE_CXX_COMPILER_ID="Clang" 
         -DCMAKE_SYSTEM_NAME="Generic"

Voici quelques informations de base:

Il semble pour le moment que vous deviez éviter beaucoup de contrôles automatiques de CMake pour que tout fonctionne correctement. Donc, vérifiez probablement avec l’équipe de CMake ou soulevez un problème pour que ce scénario soit officiellement supporté.

Et la dernière partie avec un système Generic n'est probablement pas le meilleur choix, car elle ignorera les paramètres spécifiques à Windows tels que le suffixe .exe.

Mais c'était la seule constellation qui fonctionnait réellement:

-- The C compiler identification is Clang
-- The CXX compiler identification is Clang
-- Check for working C compiler: C:/Program Files (x86)/LLVM/bin/clang.exe
-- Check for working C compiler: C:/Program Files (x86)/LLVM/bin/clang.exe -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: C:/Program Files (x86)/LLVM/bin/clang.exe
-- Check for working CXX compiler: C:/Program Files (x86)/LLVM/bin/clang.exe -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: build
10
Florian

Je rencontrais des problèmes similaires lorsque j'essayais d'utiliser clang cmake et msvc 2017 ensemble. Au moins pour un projet de test très simple, j’ai pu tout faire fonctionner, mais je suis assez novice dans ce domaine, alors peut-être que ma solution ne résoudra pas vos problèmes. 

En tous cas. Autant que je sache, vous devriez utiliser clang-cl.exe plutôt que clang.exe avec VS. Cependant, la construction échouait toujours pour moi dans les configurations x86 en raison de problèmes de lieur liés aux incompatibilités de librairies x86 et x64.

Alors voici ma solution pour obtenir les deux configurations, x64 et x86, construites dans VS 2017.

  1. Téléchargez et installez LES DEUX INSTALLATEURS windows clang/llvm à partir de http://releases.llvm.org/download.html . Vous n'avez pas besoin de les ajouter au chemin, car nous spécifierons explicitement le chemin ultérieurement.
  2. Créez un dossier avec CMakeLists.txt et ouvrez-le dans VS via la boîte de dialogue Open Folder.
  3. Dans le menu CMake, sélectionnez Change CMake Settings > CMakeLists.txt. Cela générera un CMakeSettings.json contenant les paramètres pour toutes les configurations de construction.
  4. Spécifiez les chemins des compilateurs x64/x86 cmake dans la variable cmakeCommandArgs pour toutes les configurations. Le mien ressemble à ceci:

    {    // See https://go.Microsoft.com//fwlink//?linkid=834763 for more information about this file.
    
    "configurations": [
        {
            "name": "x86-Debug",
            "generator": "Ninja",
            "configurationType": "Debug",
            "inheritEnvironments": [ "msvc_x86" ],
            "buildRoot": "${env.USERPROFILE}\\CMakeBuilds\\${workspaceHash}\\build\\${name}",
            "installRoot": "${env.USERPROFILE}\\CMakeBuilds\\${workspaceHash}\\install\\${name}",
            "cmakeCommandArgs": "-D CMAKE_CXX_COMPILER=D:/windows/LLVM5_x86/bin/clang-cl.exe",
            "buildCommandArgs": "-v",
            "ctestCommandArgs": ""
        },
        {
            "name": "x86-Release",
            "generator": "Ninja",
            "configurationType": "RelWithDebInfo",
            "inheritEnvironments": [ "msvc_x86" ],
            "buildRoot": "${env.USERPROFILE}\\CMakeBuilds\\${workspaceHash}\\build\\${name}",
            "installRoot": "${env.USERPROFILE}\\CMakeBuilds\\${workspaceHash}\\install\\${name}",
            "cmakeCommandArgs": "-D CMAKE_CXX_COMPILER=D:/windows/LLVM5_x86/bin/clang-cl.exe",
            "buildCommandArgs": "-v",
            "ctestCommandArgs": ""
        },
        {
            "name": "x64-Debug",
            "generator": "Ninja",
            "configurationType": "Debug",
            "inheritEnvironments": [ "msvc_x64" ],
            "buildRoot": "${env.USERPROFILE}\\CMakeBuilds\\${workspaceHash}\\build\\${name}",
            "installRoot": "${env.USERPROFILE}\\CMakeBuilds\\${workspaceHash}\\install\\${name}",
            "cmakeCommandArgs": "-D CMAKE_CXX_COMPILER=D:/windows/LLVM5/bin/clang-cl.exe",
            "buildCommandArgs": "-v",
            "ctestCommandArgs": ""
        },
        {
            "name": "x64-Release",
            "generator": "Ninja",
            "configurationType": "RelWithDebInfo",
            "inheritEnvironments": [ "msvc_x64" ],
            "buildRoot": "${env.USERPROFILE}\\CMakeBuilds\\${workspaceHash}\\build\\${name}",
            "installRoot": "${env.USERPROFILE}\\CMakeBuilds\\${workspaceHash}\\install\\${name}",
            "cmakeCommandArgs": "-D CMAKE_CXX_COMPILER=D:/windows/LLVM5/bin/clang-cl.exe",
            "buildCommandArgs": "-v",
            "ctestCommandArgs": ""
        }
    ]
    

    }

Vous devriez maintenant pouvoir créer des configurations x64 et x86 sans erreurs.

1
florestan