日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

python 项目构建工具_GitHub - shjlone/emake: 你见过的最简单的 GCC/CLANG 项目构建工具(python3版本)...

發(fā)布時間:2025/3/12 python 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python 项目构建工具_GitHub - shjlone/emake: 你见过的最简单的 GCC/CLANG 项目构建工具(python3版本)... 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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

運行系統(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ā)布,多年間團隊在不同操作系統(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

運行上面兩條指令,十秒內(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 文件來進行配置:

原來是:

emake

手動指定配置文件名:

emake --ini=xxx.ini

如果不指明的話,會首先在當(dāng)前文件夾尋找 emake.ini 文件,同時 Linux 下面的話,還會相繼在下面三個位置:

/etc/emake.ini

/usr/local/etc/emake.ini

~/.config/emake.ini

進行尋找。該配置文件確定了一些編譯的默認(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)用各種工具鏈,方便的進行項目構(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ī)定了編譯時最多使用多少個核進行編譯,其他區(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

來進行編譯,emake 會自動提取 //! 開頭的注釋,解析為 emake的項目描述信息,上面的配置描述了該項目依賴的文件(除了 main.cpp自己外),以及項目模式為生成可執(zhí)行文件。

這樣寫起來,比所有構(gòu)建系統(tǒng)都簡單很多。

Credits

本項目舊地址:

總結(jié)

以上是生活随笔為你收集整理的python 项目构建工具_GitHub - shjlone/emake: 你见过的最简单的 GCC/CLANG 项目构建工具(python3版本)...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。