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

python3实现版本

Preface

GNU Make 太麻烦?Makefile 写起来太臃肿?头文件依赖生成搞不定?多核同时编译太麻烦?Emake 帮你解决这些问题:

使用简单:设定源文件,设定编译参数和输出目标就行了,emake为你打点好一切。

依赖分析:快速分析源代码所依赖的头文件,决定是否需要重新编译。

输出模式:可执行、静态库(.a)、动态库(.so/.dll)。

多核编译:轻松实现并行编译,加速项目构建。

精简紧凑:只有唯一的一个 emake.py 文件。

交叉编译:构建 iOS 项目 ,安卓项目,等等。

语言支持 C / C++ / ObjC / ObjC++ / ASM

工具支持 gcc / mingw / clang

运行系统 Windows / Linux / Mac OS X / FreeBSD

方便的交叉编译,轻松构建 Android NDK / iOS / asm.js 项目

你见过最简单的构建系统,比 Gnu Make / CMake 都简单很多

只有两三个源代码,那 makefile 随便写,文件一多,搞依赖都可以搞死人。emake 就是简单中的简单,不但比 GNU Make 简单,还要比 cmake 简单很多。

Emake 是为快速开发而生的,最初版本在 2009年发布,多年间团队在不同操作系统下用它构建过:服务端项目、客户端项目、iOS项目、安卓项目 和 Flash项目,这些项目都稳健的跑在生产环境中,为海量用户提供服务。

多年的开发中,emake 提高了各种大小项目的开发效率,自身也随着时间增加不断被完善和稳定。

Install

Linux / Mac OS X:

wget http://skywind3000.github.io/emake/emake.py

sudo python2 emake.py -i

运行上面两条指令,十秒内完成安装。emake 会拷贝自己到 /usr/local/bin 下面,后面直接使用 emake 指令操作。

Windows:

下载 emake.py,放到你的 mingw 根目录下(便于 emake 定位 gcc),并且添加到 PATH 环境变量,同级目录新建立一个 emake.cmd 文件,内容如下:

@echo off

d:\dev\python27\python.exe d:\dev\mingw\emake.py %*

修改一下对应路径即可,建立这个 emake.cmd 的批处理文件是为了方便每次敲 emake 就可以工作,避免敲 "python emake.py" 一长串。

Tutorial

假设你有三个文件:foo.c, bar.c, main.c 共同编译成名字为 main(.exe) 的可执行文件,我们创建 “main.mak” 文件:

; 指明目标格式:exe, lib, dll 三选一

mode: exe

; 加入源文件

src: foo.c

src: bar.c

src: main.c

是不是比 makefile, cmake 之类的步骤简单多了?编译项目:

emake main.mak

好了,工程顺利编译成功,每次任何一个文件发生变动,相关对其依赖的源文件都会重新编译,而无依赖的代码则不需要再次编译。

增加编译选项

如果需要增加编译选项的话:

; 指明目标格式:exe, lib, dll 三选一

mode: exe

; 编译选项

flag: -Wall, -O3, -g

; 加入源文件

src: foo.c

src: bar.c

src: main.c

如果项目中使用了数学库 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 文件污染当前目录的话:

int: objs

这样所有的临时文件就会跑到 objs 目录下面了,想要清理的话,删除 objs目录即可。

完整例子

; 指明目标格式:exe, lib, dll 三选一

mode: exe

; 编译选项

flag: -Wall, -O3, -g

; 设定链接

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 的工程文件里面支持下面几种设置:

src

用于声明项目里面的源文件,格式:

src: file1

src: file2

...

src: filen

或者:

src: file1, file2, file3

src: file4, file5, file6

inc

声明项目中的 include 文件夹,相当于 gcc 的 -I 命令:

inc: dir1

inc: dir2

或者:

inc: dir1, dir2

和 src 一样可以使用逗号分隔。

lib

设置库文件目录,格式同上

link

添加需要链接的库,相当于 gcc 的 -l 指令:

link: m, pthread, stdc++

或者:

link: m

link: pthread

link: stdc++

同时支持单行和多行模式,编译 C++ 项目别忘记链接 stdc++。

mode

目标文件的输出格式:

mode: [exe|lib|dll|win]

exe: 生成可执行文件

lib: 生成静态链接库

dll: 生成动态链接库

win: windows下特有,生成无 console窗口的 windows程序。

out

指定目标文件的文件名:

out: target_file_name

int

指定中间临时文件目录,一般设置为:

int: objs

或者:

int: objs/$(target)

flag

指定编译参数,会被直接传递给 gcc.

flag: -Wall, -g, -pg

诸如此类

Settings

Emake 可以指定一个 ini 文件来进行配置:

原来是:

emake

手动指定配置文件名:

emake --ini=xxx.ini

如果不指明的话,会首先在当前文件夹寻找 emake.ini 文件,同时 Linux 下面的话,还会相继在下面三个位置:

/etc/emake.ini

/usr/local/etc/emake.ini

~/.config/emake.ini

进行寻找。该配置文件确定了一些编译的默认配置,在该配置文件中,可以:

更改默认编译器的可执行文件名

更改默认连接器的可执行文件名

设定编译条件

设定默认编译的参数:include / lib 等文件夹等

设定编译器启动的一些环境变量

设定多核编译时的 cpu 数量。

预先设定一些 section,工程文件可以 import 特定的 section。

由上面这些设定,emake 可以灵活的调用各种工具链,方便的进行项目构建和交叉编译。比如我在 Windows 下面的 emake.ini 部分内容:

[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

默认区(default)作用于每一个工程文件,其中 cpu字段只能出现在默认区,它规定了编译时最多使用多少个核进行编译,其他区的话,需要在工程里使用 import 来导入:

import: qt, ffmpeg

那么在你的工程里,上面 qt 和 ffmpeg 的相关配置就会被导入了。

Cross Compilation

交叉编译的话,需要单独一个 ini文件来规定工具链,比如我的 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 规定了 ndk工具链 gcc环境所在的可执行路径,后面同时定义了:gcc, ar, as 三个必须的可执行文件名,使用的时候:

emake --ini=d://android-toolchain/android-9/emake.ini xxx

在 default 区中定义了很多 name ,这些 name 可以用来做工程文件的条件判断,比如:

android/flag: -mfloat-abi=softfp

posix/link: pthread

win32/link: winmm, wsock32, ws2_32

不同的 ini 文件中定义的 name 不同,在工程文件中会判断是否定义过某个 name ,定义过的话,执行后面的话,如此在同一个工程文件中,可以针对不同平台定义源文件,设置编译参数。

Rapid Development

不管时 GNU Make 还是 cmake,亦或时其他构建系统,都需要你写一个专门的工程文件来描述该工程。对于大项目很正常,但是对于中小项目,特别时一些测试类项目,这真的太麻烦了。

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自己外),以及项目模式为生成可执行文件。

这样写起来,比所有构建系统都简单很多。

Credits

本项目旧地址:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/563460.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

18135usm_佳能PZ-E1+EF-S 18-135mm f/3.5-5.6 IS USM镜头 小型工作室的利器

EF-S 18-135mm f/3.5-5.6 IS USM 在大神眼里据对是属于狗头系列的 哈哈哈 但是这货如果搭配佳能的 PZ-E1 在配合佳能80D 那绝对是小型视频工作室的首选 !!!mxcpTB2rqUOg80kpuFjSsppXXcGTXXa_!!104284319.jpg (156.5 KB, 下载次数: 1)2017-3-…

开启php缩略图,PHP生成缩略图

//参数1 文件名 参数2 缩放比例function _thumb($_filename,$_percent){ob_clean();//生成png标头文件header(Content-type:image/png);$_nexplode(., $_filename);//获取文件的信息,宽和高list($_width,$_height)getimagesize($_filename);//生成缩略后的大小$_new_wid…

php项目中sql,php – 大括号{}在SQL查询中做了什么?

有关双引号字符串语法,请参见http://www.php.net/manual/de/language.types.string.php#language.types.string.parsing.花括号用于复杂的变量表达式.它们由PHP解释,而不是由SQL接口解释.$query "SELECT * FROM users WHERE user$_POST[username] AND password$_POST[pas…

php获取本机ip外网地址,php获取本机ip(远程IP地址)

例子,php获取用户IP地址。复制代码 代码示例:// 111111111111echo $_SERVER[REMOTE_ADDR];// 2222222222222function get_local_ip() {$preg "/\A((([0-9]?[0-9])|(1[0-9]{2})|(2[0-4][0-9])|(25[0-5]))\.){3}(([0-9]?[0-9])|(1[0-9]{2})|(2[0-4][0-9])|(25…

php打png图片水印颜色失真,ThinkPHP水印功能实现修复PNG透明水印并增加JPEG图片质量可调整...

/**———————————————————-* 为图片添加水印———————————————————-* static public———————————————————-* param string $source 原文件名* param string $water 水印图片* param string $$savename 添加水印后的图片名…

java服务器要二次编译,ecology项目二次开发环境搭建

ecology项目二次开发环境搭建Submitted By Weaver文档版本控制文档简要信息:文档主题(Title)ecology项目二次开发环境搭建作者(Author)审批者 (To Be Approved By)说明 (Comments)ecology项目二次开发环境搭建文件名称 (File Name)文档版本历史:序号日期…

matlab基础试题,MATLAB基础试题题目及答案,课程2020最新期末考试题库,章节测验答案...

【判断题】手指第一关节应该始终保持支撑。【单选题】如果陈先生购买了一套 200 万的住房(家庭首套住房),房屋面积为 105 平方米,容积率为 3.0, 房价低于当地平均价格,则他要缴纳的契税为( )万元。在做高抬指练习时注意下键速度要…

乘法口诀表编程php视频,PHP学习之制作乘法口诀表

进入学习php语言状态。昨日看了一天视频。才能够把这个小口诀表实现。好难啊。里面有个口诀表的函数、echo "";for ($a1;$a<9;$a){ //循环输出a a默认值是1 a的值不会大于9 且不断加一for ($b1;$b<$a;$b){//{b默认值是1 且b值不能大于a值 也就是九 加一运算/*一…

列车matlab模型,【国家级精品课程】-中南大学-数学建模-lingo-matlab-优化建模-数模培训-全国赛论文-京沪线列车调度模型(B题)...

【国家级精品课程】-中南大学-数学建模-lingo-matlab-优化建模-数模培训-全国赛论文-京沪线列车调度模型(B题) 答卷编号&#xff1a; 答卷编号&#xff1a; 论文题目&#xff1a; 京沪线列车调度模型(B题) 参赛队员&#xff1a; 1. 唐欢 电话&#xff1a;13100251389 2. 任礼秋…

如何学习matlab 知乎,知乎日报

利用记忆软件 Anki 进行复习&#xff1a;先看一下效果&#xff1a;通过编程(Matlab 程序 main.m)把一集美剧中的每一句话的中英文和语音都分离出来&#xff0c;输入 Anki 进行复习。制作每一集的学习包的大概流程如下&#xff1a;下面是详细步骤&#xff1a;* 流程只适用于装了…

php javascript对象,JavaScript 对象

JavaScript 对象JavaScript 对象是拥有属性和方法的数据。真实生活中的对象&#xff0c;属性和方法真实生活中&#xff0c;一辆汽车是一个对象。对象有它的属性&#xff0c;如重量和颜色等&#xff0c;方法有启动停止等:对象属性方法car.name Fiatcar.model 500car.weight 8…

oracle12c 删除pdb用户,oracle 12c pdb测试:创建、开关、删除

pdb测试&#xff1a;创建、开关、删除-----------------------ORACLE12C中提出来CDB和PDB的概念他们可以分别理解为容器和插件(PDB插入在CDB中)CDB的管理和传统数据库区别不大--确认当前cdbSQL> select name,cdb from v$database;NAME CDB--------- ---ZARADB YES--…

oracle 备份批处理,windows下oracle自动备份批处理

上一篇日志中&#xff0c;我将windows下的备份流程分成了五步走。本日志就结合上篇的理论来个实例。该实例是来自于我现网的中的一个备份示例(不要想着弄我密码啊&#xff0c;内容改过的&#xff0c;呵呵)。费话少说&#xff0c;直接上脚本&#xff1a;eche off//下面一部分是设…

getlasterror返回57怎么解决_王者荣耀:用时最短职业比赛?3分57秒结束,解说都看呆了!...

原标题&#xff1a;王者荣耀&#xff1a;用时最短职业比赛&#xff1f;3分57秒结束&#xff0c;解说都看呆了&#xff01;相信很多人都知道&#xff0c;王者荣耀作为一款手机游戏&#xff0c;虽然节奏比英雄联盟这种端游快得多&#xff0c;但一局比赛也要十分钟左右&#xff0c…

oracle约束 关闭,Oracle约束管理脚本

正在看的ORACLE教程是:Oracle约束管理脚本。作为一个Oracle数据库管理员&#xff0c;会碰到这样的数据库管理需求&#xff0c;停止或者打开当前用户(模式)下所有表的约束条件和触发器。这在数据库的合并以及对数据库系统的代码表中某些代码的修改时需要做的工作之一。我们来看这…

35岁学嵌入式合适吗_什么是嵌入式技术?

物联网应用技术中&#xff0c;嵌入式技术是至关重要的。但是&#xff0c;至少有60%的人不了解什么是嵌入式技术。物联网时代的到来&#xff0c;不管是从行业应用&#xff0c;还是智能硬件的爆发&#xff0c;亦或是大数据等等嵌入式技术都得到了史无前例的发展。简单来说&#x…

cvpr2020 人脸检测与识别_投石科技温度检测人脸识别设备装置

投石科技温度检测人脸识别设备装置内容共分为五大块&#xff0c;包括&#xff1a;行业概况、产品简介、核心功能、产品优势、应用场景。行业概况&#xff1a;人工智能安防即“人工智能安防”&#xff0c;以人工智能技术为核心&#xff0c;形成一系列产品和系统解决方案。近两年…

oracle clearing,ORACLE DBA常用命令集锦(2)

ORACLE DBA常用命令集锦(2)[more]接上篇 ORACLE DBA常用命令集锦(1):sql> revoke create session from scott;7.grant object privilegesql> grant execute on dbms_pipe to public;sql> grant update(first_name,salary) on employee to karen with grant option;8.d…

arrays合并两个数组_每天一道力扣题: 88. 合并两个有序数组

题目给你两个有序整数数组 nums1和nums2&#xff0c;请你将nums2合并到 nums1 中&#xff0c;使nums1成为一个有序数组。说明:初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。你可以假设 nums1 有足够的空间&#xff08;空间大小大于或等于 m n&#xff09;来保存 nums2 中…

dbsync for oracle ms sql,DBSync for Firebird and MSSQL

DBSync for Firebird and MSSQL简介DBSync for Firebird and MSSQL简介一&#xff1a;DBSync for Firebird and MSSQL是款专业的数据库同步软件。能够将MS SQL版完美的迁移到Firebird&#xff0c;支持从Firebird到MSSQL数据库的双向同步以及相反方向的精确同步&#xff0c;支持…