什么是Ninja在Unix/Linux下通常使用Makefile來控制代碼的編譯,,但是Makefile對(duì)于比較大的項(xiàng)目有時(shí)候會(huì)比較慢,看看上面那副漫畫,,代碼在編譯都變成了程序員放松的借口了,。所以這個(gè)Google的程序員在開發(fā)Chrome的時(shí)候因?yàn)槿淌懿涣薓akefile的速度,自己重新開發(fā)出來一套新的控制編譯的工具叫作Ninja,,Ninja相對(duì)于Makefile這套工具更注重于編譯速度,。除了Chrome現(xiàn)在還有一些其他的比較大的項(xiàng)目也在開始使用Ninja,比如LLVM,。我試用了一下感覺還是不錯(cuò),,比如編譯Cmake時(shí)間大概是原來的1/4。Ninja試用C++實(shí)現(xiàn),,其支持的語法非常簡(jiǎn)單,,作者在這里說明了為了控制復(fù)雜度。 代碼如何編譯其實(shí)對(duì)于C/C++和很多其他程序的編譯都是一個(gè)道理,,就是把一些源代碼文件編譯成目標(biāo)文件,,或者有的目標(biāo)文件再編譯到一個(gè)庫里,然后再鏈接起來,。所以Ninja的配置文件分為兩個(gè)部分,,rule和文件依賴關(guān)系??磦€(gè)簡(jiǎn)單的例子: cc=gcc cflags= -g -c rule cc command = $cc $cflags $in -o $out rule link command = $cc $in -o $out rule cleanup command = rm -rf *.exe *.o build func.o : cc func.c build main.o : cc main.c build app.exe : link main.o func.o build all: phony || app.exe build clean: cleanup 非常易懂,,編譯的可執(zhí)行未見叫做app.exe, 其中有三條rule: cc, link, cleanup??纯催@個(gè)官方的試用手冊(cè),,還有一些附加參數(shù)可以加在rule的下面,比如description用來在編譯的時(shí)候顯示出來,。Ninja還有個(gè)比較好玩的功能就是Ninja -t graph all命令,,這可以用來生成編譯時(shí)候的依賴關(guān)系,可以用dot來生成圖片等,。Ninja的實(shí)現(xiàn)也可以大概推測(cè)到,,根據(jù)用戶給的依賴關(guān)系圖,并行 地編譯各個(gè)文件。 使用Ninja的一個(gè)問題就是需要生成這個(gè)build.ninja文件,,對(duì)于大型項(xiàng)目來說這樣一條一條地寫配置文件是不可能的,。幸好我們可以使用Cmake來生成這個(gè)配置文件,Cmake對(duì)應(yīng)的是automake這樣的東西,。在Cmake的最新版本中已經(jīng)支持參數(shù)Camke -G Ninja,,Cmake會(huì)根據(jù)用戶給定的CMakeLists.txt來生成build.ninja文件。而CmakeLists文件相對(duì)來說要簡(jiǎn)單一些,,只要寫清楚編譯的可執(zhí)行文件的名字,,和其依賴的包含main函數(shù)的源文件。把我的迷宮小項(xiàng)目來舉個(gè)例子,在項(xiàng)目文件夾下寫配置文件CMakeLists.txt: cmake_minimum_required(VERSION 2.8) project (Maze) add_library(maze A_star.cpp Algorithm.cpp DFS_L.cpp DFS_R.cpp DisjSets.cpp Maze.cpp) add_executable(Maze.exe main.cpp) target_link_libraries(Maze.exe maze) add_library寫明了生成一個(gè)叫做maze.a的庫文件,,然后和main.cpp編譯出來的main.o生成可執(zhí)行文件,,寫好CmakeList.txt后運(yùn)行Cmake -G Ninja, 然后運(yùn)行ninja all就能編譯這個(gè)工程。具體的Cmake語法參考這里,,對(duì)于不少項(xiàng)目來說Cmake已經(jīng)足夠使用,,只是我覺得Cmake還是稍微復(fù)雜了一點(diǎn)。 我這樣來使用整個(gè)Ninja是使用C++寫的開源項(xiàng)目,,如果我們想增加一些自己的feature可以hack一下,,不過作者估計(jì)不會(huì)接受增加語法支持的patch。我準(zhǔn)備做一個(gè)小的hack來自動(dòng)分析我當(dāng)前的源碼,,自動(dòng)生成build.ninja文件,,不要求處理所有的復(fù)雜情況,只是分析.cc和.c,,自動(dòng)檢測(cè)main函數(shù)文件,。最后用戶只用配置鏈接參數(shù)就可以了。我覺得這樣用起來就非常方便了,,待完成中,,順便看看Ninja的內(nèi)部實(shí)現(xiàn)。 |
|