python 项目构建工具_GitHub - shjlone/emake: 你见过的最简单的 GCC/CLANG 项目构建工具(python3版本)...
python3實現(xiàn)版本
Preface
GNU Make 太麻煩?Makefile 寫起來太臃腫?頭文件依賴生成搞不定?多核同時編譯太麻煩?Emake 幫你解決這些問題:
使用簡單:設(shè)定源文件,設(shè)定編譯參數(shù)和輸出目標(biāo)就行了,emake為你打點好一切。
依賴分析:快速分析源代碼所依賴的頭文件,決定是否需要重新編譯。
輸出模式:可執(zhí)行、靜態(tài)庫(.a)、動態(tài)庫(.so/.dll)。
多核編譯:輕松實現(xiàn)并行編譯,加速項目構(gòu)建。
精簡緊湊:只有唯一的一個 emake.py 文件。
交叉編譯:構(gòu)建 iOS 項目 ,安卓項目,等等。
語言支持 C / C++ / ObjC / ObjC++ / ASM
工具支持 gcc / mingw / clang
運(yùn)行系統(tǒng) Windows / Linux / Mac OS X / FreeBSD
方便的交叉編譯,輕松構(gòu)建 Android NDK / iOS / asm.js 項目
你見過最簡單的構(gòu)建系統(tǒng),比 Gnu Make / CMake 都簡單很多
只有兩三個源代碼,那 makefile 隨便寫,文件一多,搞依賴都可以搞死人。emake 就是簡單中的簡單,不但比 GNU Make 簡單,還要比 cmake 簡單很多。
Emake 是為快速開發(fā)而生的,最初版本在 2009年發(fā)布,多年間團(tuán)隊在不同操作系統(tǒng)下用它構(gòu)建過:服務(wù)端項目、客戶端項目、iOS項目、安卓項目 和 Flash項目,這些項目都穩(wěn)健的跑在生產(chǎn)環(huán)境中,為海量用戶提供服務(wù)。
多年的開發(fā)中,emake 提高了各種大小項目的開發(fā)效率,自身也隨著時間增加不斷被完善和穩(wěn)定。
Install
Linux / Mac OS X:
wget http://skywind3000.github.io/emake/emake.py
sudo python2 emake.py -i
運(yùn)行上面兩條指令,十秒內(nèi)完成安裝。emake 會拷貝自己到 /usr/local/bin 下面,后面直接使用 emake 指令操作。
Windows:
下載 emake.py,放到你的 mingw 根目錄下(便于 emake 定位 gcc),并且添加到 PATH 環(huán)境變量,同級目錄新建立一個 emake.cmd 文件,內(nèi)容如下:
@echo off
d:\dev\python27\python.exe d:\dev\mingw\emake.py %*
修改一下對應(yīng)路徑即可,建立這個 emake.cmd 的批處理文件是為了方便每次敲 emake 就可以工作,避免敲 "python emake.py" 一長串。
Tutorial
假設(shè)你有三個文件:foo.c, bar.c, main.c 共同編譯成名字為 main(.exe) 的可執(zhí)行文件,我們創(chuàng)建 “main.mak” 文件:
; 指明目標(biāo)格式:exe, lib, dll 三選一
mode: exe
; 加入源文件
src: foo.c
src: bar.c
src: main.c
是不是比 makefile, cmake 之類的步驟簡單多了?編譯項目:
emake main.mak
好了,工程順利編譯成功,每次任何一個文件發(fā)生變動,相關(guān)對其依賴的源文件都會重新編譯,而無依賴的代碼則不需要再次編譯。
增加編譯選項
如果需要增加編譯選項的話:
; 指明目標(biāo)格式:exe, lib, dll 三選一
mode: exe
; 編譯選項
flag: -Wall, -O3, -g
; 加入源文件
src: foo.c
src: bar.c
src: main.c
如果項目中使用了數(shù)學(xué)庫 libm.a的話:
link: m
如果還是用了 libstdc++.a 的話:
link: m, stdc++
或者:
link: m
link: stdc++
link 可以直接寫 .a 庫的文件名:
link: ./lib/libmylib.a
如果需要添加額外的 include 目錄 和 lib 目錄的話:
inc: /usr/local/opt/jdk/include
lib: /usr/local/opt/jdk/lib
還可以手動指定輸出的文件名:
out: main
手動指定臨時文件夾,避免臨時 .o 文件污染當(dāng)前目錄的話:
int: objs
這樣所有的臨時文件就會跑到 objs 目錄下面了,想要清理的話,刪除 objs目錄即可。
完整例子
; 指明目標(biāo)格式:exe, lib, dll 三選一
mode: exe
; 編譯選項
flag: -Wall, -O3, -g
; 設(shè)定鏈接
link: m, pthread, stdc++
; 額外頭文件路徑
inc: /usr/local/opt/jdk/include
inc: /usr/local/opt/jdk/include/linux
; 額外庫文件路徑
lib: /usr/local/opt/jdk/lib
; 加入源文件
src: foo.c
src: bar.c
src: main.c
Document
emake 的工程文件里面支持下面幾種設(shè)置:
src
用于聲明項目里面的源文件,格式:
src: file1
src: file2
...
src: filen
或者:
src: file1, file2, file3
src: file4, file5, file6
inc
聲明項目中的 include 文件夾,相當(dāng)于 gcc 的 -I 命令:
inc: dir1
inc: dir2
或者:
inc: dir1, dir2
和 src 一樣可以使用逗號分隔。
lib
設(shè)置庫文件目錄,格式同上
link
添加需要鏈接的庫,相當(dāng)于 gcc 的 -l 指令:
link: m, pthread, stdc++
或者:
link: m
link: pthread
link: stdc++
同時支持單行和多行模式,編譯 C++ 項目別忘記鏈接 stdc++。
mode
目標(biāo)文件的輸出格式:
mode: [exe|lib|dll|win]
exe: 生成可執(zhí)行文件
lib: 生成靜態(tài)鏈接庫
dll: 生成動態(tài)鏈接庫
win: windows下特有,生成無 console窗口的 windows程序。
out
指定目標(biāo)文件的文件名:
out: target_file_name
int
指定中間臨時文件目錄,一般設(shè)置為:
int: objs
或者:
int: objs/$(target)
flag
指定編譯參數(shù),會被直接傳遞給 gcc.
flag: -Wall, -g, -pg
諸如此類
Settings
Emake 可以指定一個 ini 文件來進(jìn)行配置:
原來是:
emake
手動指定配置文件名:
emake --ini=xxx.ini
如果不指明的話,會首先在當(dāng)前文件夾尋找 emake.ini 文件,同時 Linux 下面的話,還會相繼在下面三個位置:
/etc/emake.ini
/usr/local/etc/emake.ini
~/.config/emake.ini
進(jìn)行尋找。該配置文件確定了一些編譯的默認(rèn)配置,在該配置文件中,可以:
更改默認(rèn)編譯器的可執(zhí)行文件名
更改默認(rèn)連接器的可執(zhí)行文件名
設(shè)定編譯條件
設(shè)定默認(rèn)編譯的參數(shù):include / lib 等文件夾等
設(shè)定編譯器啟動的一些環(huán)境變量
設(shè)定多核編譯時的 cpu 數(shù)量。
預(yù)先設(shè)定一些 section,工程文件可以 import 特定的 section。
由上面這些設(shè)定,emake 可以靈活的調(diào)用各種工具鏈,方便的進(jìn)行項目構(gòu)建和交叉編譯。比如我在 Windows 下面的 emake.ini 部分內(nèi)容:
[default]
flag=-Wall, -I$(inihome)/../mylibs
link=stdc++, winmm, wsock32, opengl32, gdi32, glu32, ws2_32, user32
include=d:/dev/local/include
lib=d:/dev/local/lib
cpu=6
[ffmpeg]
include=d:/dev/local/opt/ffmpeg/include
lib=d:/dev/local/opt/ffmpeg/lib
link=avcodec, avdevice, avfilter, avformat, avutil, postproc, swscale
[qt]
include=D:/Dev/Qt/sdk/4.8.3-mingw/include;D:/Dev/Qt/sdk/4.8.3-mingw/include/QtGui
lib=D:/Dev/Qt/sdk/4.8.3-mingw/lib
link=stdc++, ole32, gdi32, wsock32, opengl32, gdi32, glu32, ws2_32, uuid, oleaut32, winmm, imm32, winspool, QtCore4, QtGui4, QtGuid4
[qt45]
include=D:/Dev/Qt/4.5.0-mingw-static/include;D:/Dev/Qt/4.5.0-mingw-static/include/QtGui
lib=D:/Dev/Qt/4.5.0-mingw-static/lib
link=stdc++, ole32, gdi32, wsock32, opengl32, gdi32, glu32, ws2_32, uuid, oleaut32, winmm, imm32, winspool, QtCore, QtGui
默認(rèn)區(qū)(default)作用于每一個工程文件,其中 cpu字段只能出現(xiàn)在默認(rèn)區(qū),它規(guī)定了編譯時最多使用多少個核進(jìn)行編譯,其他區(qū)的話,需要在工程里使用 import 來導(dǎo)入:
import: qt, ffmpeg
那么在你的工程里,上面 qt 和 ffmpeg 的相關(guān)配置就會被導(dǎo)入了。
Cross Compilation
交叉編譯的話,需要單獨一個 ini文件來規(guī)定工具鏈,比如我的 android交叉編譯配置:
[default]
flag=-Wall
home=bin
gcc=arm-linux-androideabi-gcc
ar=arm-linux-androideabi-ar
as=arm-linux-androideabi-as
name=android,posix,arm
cpu=4
其中 home 規(guī)定了 ndk工具鏈 gcc環(huán)境所在的可執(zhí)行路徑,后面同時定義了:gcc, ar, as 三個必須的可執(zhí)行文件名,使用的時候:
emake --ini=d://android-toolchain/android-9/emake.ini xxx
在 default 區(qū)中定義了很多 name ,這些 name 可以用來做工程文件的條件判斷,比如:
android/flag: -mfloat-abi=softfp
posix/link: pthread
win32/link: winmm, wsock32, ws2_32
不同的 ini 文件中定義的 name 不同,在工程文件中會判斷是否定義過某個 name ,定義過的話,執(zhí)行后面的話,如此在同一個工程文件中,可以針對不同平臺定義源文件,設(shè)置編譯參數(shù)。
Rapid Development
不管時 GNU Make 還是 cmake,亦或時其他構(gòu)建系統(tǒng),都需要你寫一個專門的工程文件來描述該工程。對于大項目很正常,但是對于中小項目,特別時一些測試類項目,這真的太麻煩了。
Emake 可以不用工程文件,而將工程配置信息嵌入到源代碼的注釋中:
#include
#include
#include "foobar.h"
//! mode: exe
//! src: foo.cpp, bar.cpp, utils.cpp
int main(void)
{
printf("Hello, World !!\n");
foo();
bar();
return 0;
}
這樣在你的源文件里面增添兩行以后,即可使用:
emake main.cpp
來進(jìn)行編譯,emake 會自動提取 //! 開頭的注釋,解析為 emake的項目描述信息,上面的配置描述了該項目依賴的文件(除了 main.cpp自己外),以及項目模式為生成可執(zhí)行文件。
這樣寫起來,比所有構(gòu)建系統(tǒng)都簡單很多。
Credits
本項目舊地址:
總結(jié)
以上是生活随笔為你收集整理的python 项目构建工具_GitHub - shjlone/emake: 你见过的最简单的 GCC/CLANG 项目构建工具(python3版本)...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 指数随机变量 泊松过程跳_如何深刻的理解
- 下一篇: win+mysql自动备份吗_Windo