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
基于上述步骤,尝试了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参数能够翻看在线文档:https://ninja-build.org/manual.html
我的以为最有必要的一条是,ninja -t targets
,查看有哪些targets。由于是Windows下的cmd操做,没有Ubuntu下的bash的自动补全,无法用Tab补全,因此,这个命令须要记住。
我在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_COMPILER
和CMAKE_CXX_COMPILER
变量的值,从而使用非默认的C/C++编译器。正确设定后输出是对的: