Ninja使用Visual Studio(cl.exe)構建

Ninja基本步驟

Ninja的做用是加速構建,最初目的是替代make,如今Windows系統上也能夠用,也就是用Ninja替代nmake或者MSBuild來生成target。android

本人不作Chromium等大型程序構建,jenkins也沒怎麼用過。平時接觸到用Ninja的地方只有一個:android ndk開發時,編一個arm android console application可執行程序時(或者編庫)時用到。固然,這個能夠丟給自動構建。shell

此次在caffe-builder的腳本中看到willyd調用的是Ninja,換成Visual Studio會提示報錯,「和先前的Ninja不一致」。VS是集成開發環境,它的編譯器是cl.exe。windows

網絡上搜到的用cl.exe編譯、用Ninja構建的例子,是Windows下編譯clang源碼中的 官方步驟 中給出的:
api

沒錯,只須要這幾個步驟:bash

  1. 進入cmd,而且正確的設定須要用到的編譯器(VS)環境,例如vs2015的就用vs2015的,以及注意x64仍是x86等
  2. 確保CMakeLists.txt存在,編寫正確
  3. 到build目錄去調用cmake,指定generator爲Ninja
  4. Ninja xxx

Ninja在VS2015下的問題和解決

基於上述步驟,嘗試了VS2017下的調用:網絡

cd /d d:/toy/rr
call "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvars64.bat" amd64
md build-vs2017
cd build-vs2017
cmake .. -G Ninja
ninja rr

一樣的方式,調用VS2015,出現了幺蛾子:app

cd /d d:/toy/rr
call "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" amd64
md build-vs2015
cd build-vs2015
cmake .. -G Ninja
ninja rr

翻看D:\toy\rr\build-vs2015\CMakeFiles\CMakeError.log,提示:工具

Determining if the C compiler works failed with the following output:
Change Dir: D:/toy/rr/build-vs2015/CMakeFiles/CMakeTmp

Run Build Command(s):D:/soft/ninja/ninja.exe cmTC_f3ef3 && [1/2] Building C object CMakeFiles\cmTC_f3ef3.dir\testCCompiler.c.obj

[2/2] Linking C executable cmTC_f3ef3.exe

FAILED: cmTC_f3ef3.exe 

cmd.exe /C "cd . && D:\soft\cmake-3.15.3-win64-x64\bin\cmake.exe -E vs_link_exe --intdir=CMakeFiles\cmTC_f3ef3.dir --rc=rc --mt=CMAKE_MT-NOTFOUND --manifests  -- C:\PROGRA~2\MICROS~3.0\VC\bin\amd64\link.exe /nologo CMakeFiles\cmTC_f3ef3.dir\testCCompiler.c.obj  /out:cmTC_f3ef3.exe /implib:cmTC_f3ef3.lib /pdb:cmTC_f3ef3.pdb /version:0.0  /machine:x64  /debug /INCREMENTAL /subsystem:console  kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib && cd ."

RC Pass 1: command "rc /fo CMakeFiles\cmTC_f3ef3.dir/manifest.res CMakeFiles\cmTC_f3ef3.dir/manifest.rc" failed (exit code 0) with the following output:
系統找不到指定的文件。

ninja: build stopped: subcommand failed.


其實這句話是說,rc這個命令找不到。開發工具

StackOverFlow上有網友提到和回答了這個問題:rc.exe no longer found in VS 2015 Command Prompt

很奇怪,爲何這位網友的報錯提示那麼的友好??

LINK : fatal error LNK1158: cannot run 'rc.exe' [D:\dev\cmaketest\build\CMakeFiles\3.8.1\CompilerIdC\CompilerIdC.vcxproj]

若是早些看出是rc.exe命令不存在,或許早就找到這篇回答,而不是用"visual studio 2015 ninja broken"這樣的關鍵字作低效檢索。

問題的緣由是:VS2015 update3安裝的時候,若是沒有勾選「Windows和Web開發->通用Windows應用開發工具->Tools(1.4.1)和Windows 10 SDK(10.0.14393)」,則不會安裝rc.exe到C:\Program Files (x86)\Windows Kits\10\bin\x64\rc.exe,而這就致使Ninja調用cl.exe的時候失敗

解決辦法:修復一下,安裝"Tools(1.4.1)和Windows 10 SDK"便可:

修復後,編譯輸出截圖:

Ninja命令行參數

詳細的Ninja參數能夠翻看在線文檔:https://ninja-build.org/manual.html

我的以爲最有必要的一條是,ninja -t targets,查看有哪些targets。由於是Windows下的cmd操做,沒有Ubuntu下的bash的自動補全,無法用Tab補全,因此,這個命令須要記住。

Ninja錯誤的調用了gcc

我在Windows下也想用gcc/g++,倒不是開發大型程序,而是寫很簡短的單個文件時用來驗證方便一些。安裝的是TDM-GCC,會添加d:\soft\TDM-GCC-64\bin路徑到系統PATH中最前面:

這就致使一個問題:即便調用了vcvarsall.bat來設定VS的環境,CMake調用的倒是gcc:

解決辦法:其實在前面windows下編譯clang的例子中已經給出了,須要設定CC和CXX環境變量的值,實際上熟悉CMake的都知道,CMake會讀取CC和CXX環境變量,以及CMAKE_C_COMPILERCMAKE_CXX_COMPILER變量的值,從而使用非默認的C/C++編譯器。正確設定後輸出是對的:

相關文章
相關標籤/搜索