Construyendo con CMake, Ninja y Clang en Windows

Estimados compañeros codificadores de C ++,

Después de usar la cadena de herramientas de Visual Studio para construir en Windows por un tiempo, decidí darle una oportunidad a Clang 5.

Instalé los binarios LLVM 5.0.0, el entorno de compilación Ninja, las herramientas VS 2017 y CMake 3.9.3. El objetivo final es poder compilar aplicaciones C y C ++ para Windows usando VS Code con la integración CMake como "IDE" y Clang con LLD como compilador y enlazador.

La compilación y ejecución de un programa simple funcionó perfectamente bien (captura de pantalla del historial del terminal respectivo) Clang detectó automáticamente la lib estándar para Windows dentro de los directorios de VS Tools y produjo una salida ejecutable.

El siguiente paso fue configurar una compilación simple con Ninja (captura de pantalla del archivo ninja.build y del historial del terminal) El proceso de compilación funcionó como se esperaba y produjo un ejecutable funcional, como antes.

Los problemas comenzaron cuando comencé a integrar CMake en el proceso. Mi expectativa es que CMake produce un archivo de compilación ninja y lo ejecuta, ¿correcto? Intenté el siguiente archivo CMakeLists

cmake_minimum_required(VERSION 3.9)

project(Test)

add_executable(Test main.c)

y llamó a CMake concmake -G Ninja. El resultado resultante fue decepcionante y no entiendo lo suficiente como para resolver, respectivamente, resolver el problema yo mismo.

-- 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".

Supongo que el problema está relacionado con CMake llamando a clang con opciones de estilo VS usando una barra diagonal en lugar de precedido por menos, como requiere clang.

Gracias por ayudarme chicos, lo aprecio :-)

Solo déjame un comentario si necesitas más información.

Respuesta a la publicación de Florians

Intenté con el comando Florians pero omití el camino hacia ninja para una notación más corta y resultó funcionar bien.

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 produjo un archivo de compilación ninja.

corríninja all para construir el ejecutable comoTest. Lo renombré aTest.exe y el programa se ejecutó felizmente. Hasta ahora ... éxito !!! Pero mucho más complicado de lo que esperaba.

Respuestas a la pregunta(3)

Su respuesta a la pregunta