AMBuild
什么是AMBuild?
AMBuild是构建软件项目和创建发布包的工具.它是针对C++项目的,当然也可以用于其它任何语言的项目,它主要针对解决大多数构建工具所解决不了的三个大问题:
1.准确性:不需要清理构建.大部分构建工具都是要先清理之前的项目生成残留,然后再重新生成项目工程,这样是非常不必要,也很浪费时间的.而AMBuild总是会以最小的计算然后精确地重建项目,当然,任何一下生成失败都将会使整个构建工作终止.
2.速度:大部分构建工具都会在生成之前遍历所有的依赖项,看是否有改变.而AMBuild只需要查看改变过的文件.
3.灵活性:构建脚本是用Python编写的,所以很容易写,并且能够提供全面的编程控制.
准备工作:
AMBuild需要使用Python,版本控制在2.6或以上,如果使用的是Python 3,那么则需要3.1或以上.当然,我个人是在Windows下的,这里我们可以不太在意此问题,因为等会为大家介绍一个合成工具,已经集合了Python的.我在Windows系统下的是使用名为MozillaBuild的,可以直接从这里下载:https://wiki.mozilla.org/MozillaBuild,我目前用的是最新版本1.10.0,建议下载安装到C盘,或是系统的安装盘.
另外AMBuild已在以下运行平台中做过测试,运行正常:
Windows (7 x86 and x64, XP x86)
Linux (x86 and x64)
OS X (10.7-10.9)
FreeBSD (9.2-x64)
OpenBSD (5.4 amd64, i386)
Solaris (11, x64)
Cygwin (x64)
测试过的编译器分别有:
Visual Studio 2010+
GCC 4+
Clang 3+
Emscripten 1.25+
接着输入以下两行,命,这个工具就不贴链接了,自己搜一下就OK了,通过git下载https://github.com/alliedmodders/ambuild.现在所有需要的东西都有了.
现在我们在目录C:\mozilla-build中打开start-shell-msvc2010.bat,这个批处理会先检测一下是否已经安装了编译器,如果顺利的话,你可以看到类似以下的内容:
"Mozilla tools directory: C:\mozilla-build\"
Visual C++ 10 directory: c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\
Visual C++ 11 directory: C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\
Windows SDK directory: C:\Program Files (x86)\Windows Kits\8.0\
Windows SDK version: 8.0
Setting environment for using Microsoft Visual Studio 2010 x86 tools.
Using the installed Windows 8.0 SDK
Mozilla build environment: MSVC version 10.LittleKu@LITTLEKU-PC ~
$
紧接着我们要CD到AMBuild的主目录,比如我的AMBuild的目录是:
~/Desktop/Source Engine/alliedmodders/ambuild
然后输入以下命令:
python setup.py install
注意:如果提示python为无效的命令,那么就在C:\mozilla-build找python的子目录,再把这个python的目录填入系统环境中就可以了
顺利的话,你会看到以下内容
running install
running buildrunning build_py
creating build
creating build\lib
creating build\lib\ambuild
copying ambuild\cache.py -> build\lib\ambuild
copying ambuild\command.py -> build\lib\ambuild
copying ambuild\cpp.py -> build\lib\ambuild
copying ambuild\job.py -> build\lib\ambuild
copying ambuild\osutil.py -> build\lib\ambuild
copying ambuild\runner.py -> build\lib\ambuild
copying ambuild\worker.py -> build\lib\ambuild
copying ambuild\__init__.py -> build\lib\ambuild
creating build\lib\ambuild2
copying ambuild2\builder.py -> build\lib\ambuild2
copying ambuild2\context.py -> build\lib\ambuild2
copying ambuild2\damage.py -> build\lib\ambuild2
copying ambuild2\database.py -> build\lib\ambuild2
copying ambuild2\graph.py -> build\lib\ambuild2
copying ambuild2\nodetypes.py -> build\lib\ambuild2
copying ambuild2\run.py -> build\lib\ambuild2
copying ambuild2\task.py -> build\lib\ambuild2
copying ambuild2\util.py -> build\lib\ambuild2
copying ambuild2\__init__.py -> build\lib\ambuild2
creating build\lib\ambuild2\frontend
copying ambuild2\frontend\paths.py -> build\lib\ambuild2\frontend
copying ambuild2\frontend\prep.py -> build\lib\ambuild2\frontend
copying ambuild2\frontend\version.py -> build\lib\ambuild2\frontend
copying ambuild2\frontend\__init__.py -> build\lib\ambuild2\frontend
creating build\lib\ambuild2\ipc
copying ambuild2\ipc\bsd.py -> build\lib\ambuild2\ipc
copying ambuild2\ipc\generic_poll.py -> build\lib\ambuild2\ipc
copying ambuild2\ipc\impl.py -> build\lib\ambuild2\ipc
copying ambuild2\ipc\linux.py -> build\lib\ambuild2\ipc
copying ambuild2\ipc\posix_proc.py -> build\lib\ambuild2\ipc
copying ambuild2\ipc\process.py -> build\lib\ambuild2\ipc
copying ambuild2\ipc\winapi.py -> build\lib\ambuild2\ipc
copying ambuild2\ipc\windows.py -> build\lib\ambuild2\ipc
copying ambuild2\ipc\__init__.py -> build\lib\ambuild2\ipc
creating build\lib\ambuild2\frontend\amb2
copying ambuild2\frontend\amb2\gen.py -> build\lib\ambuild2\frontend\amb2
copying ambuild2\frontend\amb2\__init__.py -> build\lib\ambuild2\frontend\amb2
creating build\lib\ambuild2\frontend\base
copying ambuild2\frontend\base\gen.py -> build\lib\ambuild2\frontend\base
copying ambuild2\frontend\base\__init__.py -> build\lib\ambuild2\frontend\base
creating build\lib\ambuild2\frontend\cpp
copying ambuild2\frontend\cpp\builders.py -> build\lib\ambuild2\frontend\cpp
copying ambuild2\frontend\cpp\compilers.py -> build\lib\ambuild2\frontend\cpp
copying ambuild2\frontend\cpp\detect.py -> build\lib\ambuild2\frontend\cpp
copying ambuild2\frontend\cpp\vendors.py -> build\lib\ambuild2\frontend\cpp
copying ambuild2\frontend\cpp\__init__.py -> build\lib\ambuild2\frontend\cpp
creating build\lib\ambuild2\frontend\vs
copying ambuild2\frontend\vs\cxx.py -> build\lib\ambuild2\frontend\vs
copying ambuild2\frontend\vs\export_vcxproj.py -> build\lib\ambuild2\frontend\vs
copying ambuild2\frontend\vs\gen.py -> build\lib\ambuild2\frontend\vs
copying ambuild2\frontend\vs\graph.py -> build\lib\ambuild2\frontend\vs
copying ambuild2\frontend\vs\nodes.py -> build\lib\ambuild2\frontend\vs
copying ambuild2\frontend\vs\xmlbuilder.py -> build\lib\ambuild2\frontend\vs
copying ambuild2\frontend\vs\__init__.py -> build\lib\ambuild2\frontend\vs
running build_scripts
creating build\scripts-2.7
copying and adjusting scripts\ambuild -> build\scripts-2.7
copying scripts\ambuild.bat -> build\scripts-2.7
running install_lib
running install_scripts
copying build\scripts-2.7\ambuild -> c:\mozilla-build\python\Scripts
running install_egg_info
Removing c:\mozilla-build\python\Lib\site-packages\AMBuild-2.0-py2.7.egg-info
Writing c:\mozilla-build\python\Lib\site-packages\AMBuild-2.0-py2.7.egg-info
那么到此步我们的AMBuild已经安装完成了.可以在控制台中输入"ambuild"正常情况下会提示"Error: folder was not configured for AMBuild.",因为我们还没有创建AMBuild的构建工程.
如何使用AMBuild?
我们依旧拿最为经典的Hello World来做示例,我们可以在桌面创建一下空的文件夹,命名为Demo的文件夹,然后CD到Demo这个目录下,并输入以下命令:
ambuild --new-project
构建工程创建成功后,我们可以在Demo的目录下看到AMBuildScript与configure.py这两个文件,我们只需要打开AMBuildScript,内容如下:
# vim: set sts=2 ts=8 sw=2 tw=99 et ft=python:
builder.DetectCompilers()builder.compiler.cflags += [
'-Wall',
'-Werror'
]
program = builder.compiler.Program('sample')
program.sources += ['main.cpp',
]
builder.Add(program)
暂时先把AMBuildScript改成这样:
# vim: set sts=2 ts=8 sw=2 tw=99 et ft=python:
builder.DetectCompilers()if builder.target_platform == 'linux':
builder.compiler.cflags += [
'-Wall',
'-Werror'
]
program = builder.compiler.Program('sample')
program.sources += ['main.cpp',
]
builder.Add(program)
注:关于AMbuild 的API,今天暂时先不详细说明.但是我们可以从AMBuildScript看出来难度不是很大,只要把API记住了,就可以写出很好的编译脚本了^^
修改完AMBuildScript后,别忘了在Demo目录下创建main.cpp文件,并在里面写入以下代码并保存
#include <stdio.h>
int main(int argc, char *argv[])
{printf("Hello World\n");
getchar();
return 0;
}
接下来的工作还是在命令符操作中完成,有一点要记住的是,要使用AMBuild,命令行必需要从C:\mozilla-build目录下使用start-shell-msvc2010.bat或start-shell-msvc2012.bat等,我试过用其它的系统命令符,不可用,还有一个别打开x64的命令符.依旧把路径CD到我们的Demo目录下,依次执行
mkdir build
cd buildpython ../configure.py
ambuild
正常的情况如下
LittleKu@LITTLEKU-PC ~/Desktop/demo
$ mkdir buildLittleKu@LITTLEKU-PC ~/Desktop/demo
$ cd buildLittleKu@LITTLEKU-PC ~/Desktop/demo/build
$ python ../configure.pyChecking CC compiler (vendor test msvc)... ['cl', 'test.c', '-o', 'test.exe', '-nologo', '-showIncludes']
found msvc version 1600
Checking CXX compiler (vendor test msvc)... ['cl', 'test.cpp', '-o', 'testp.exe', '-nologo', '-showIncludes']
found msvc version 1600
LittleKu@LITTLEKU-PC ~/Desktop/demo/build
$ ambuild[create] mkdir -p sample
Spawned taskmaster (pid: 6820)
Spawned worker (pid: 5876)
[5876] cl /Zi /showIncludes /nologo /c c:\Users\LittleKu\Desktop\demo\main.cpp /Fomain.obj
main.cpp
[5876] cl main.obj /link /nologo /OUT:sample.exe /nologo /DEBUG /PDB:"sample.pdb"
Build succeeded.LittleKu@LITTLEKU-PC ~/Desktop/demo/build
$
到此,demo就已经创建成功了,去你的build目录下看下吧.
本文章目前只限配置AMBuild与如果通过AMBuild生成目标文件.再次说明,AMbuild的API会在往后中加入解释,如有不便之处,敬请谅解哈^^
email:kklvzl@gamil.com
QQ:116268742
AMBuild的更多相关文章
- PG CREATEINDEX CONCURRENTLY
PG CREATEINDEX CONCURRENTLY [TOC] 官方说法 根据9.1的文档 Creating an index can interfere with regular operati ...
随机推荐
- -1>1?! unsigned int的世界不简单
编程语言提供了很多的基本数据类型,比如char,int,float,double等等.在C和C++的世界中,还有一种类型,叫做无符号数据,修饰符位unsigned,比如今天要说的unsigned in ...
- sql server 2008 merge matched判定条件
SQL Server 2008 开始支持 MERGE语句 -- 源表 CREATE TABLE test_from (id INT, val VARCHAR(20)); -- 目标表 CRE ...
- shell小技巧(6)修改一批文件后缀
当前目录下后缀为sh的文件,改为后缀shell. 这里列出两种方法,先看第一种.方法1:#!/bin/bash str=`find ./ -name \*.sh` # 会产生一个列表 file=&q ...
- shell 设置进程数运行
问题描述 在服务器上提交任务时,需要限制运行的核的数目.程序本身是单线程的,但是不同的输入参数需要跑很多组,粗暴的方法是开多个终端,不断地去提交任务.但这比较麻烦,可以用 shell 实现. 基础 首 ...
- MYSQL中的where ‘1=1‘ 探讨
在学习MySQL时候,关于MySQL注入的例子 首先针对以下代码,实现的是关于sql注入时,一个普通登录所产生的的问题 package com.java.lesson02; import com.ja ...
- Bootstrap学习第二天轮播插件
Bootstrap不仅提供了整套的样式,还提供了一系列插件,帮助开发者构建更受欢迎的网站. Bootstrap的轮播插件用起来很简单,代码如下. <!DOCTYPE html> <h ...
- Thread、ThreadLocal源码解析
今天来看一下Thread和ThreadLocal类的源码. 一.Thread (1)首先看一下线程的构造方法,之后会说每种参数的用法,而所有的构造函数都会指向init方法 //空构造创建一个线程 Th ...
- 必须了解的mysql三大日志-binlog、redo log和undo log
日志是 mysql 数据库的重要组成部分,记录着数据库运行期间各种状态信息.mysql日志主要包括错误日志.查询日志.慢查询日志.事务日志.二进制日志几大类.作为开发,我们重点需要关注的是二进制日志( ...
- java学习(九) —— java中的File文件操作及IO流概述
前言 流是干什么的:为了永久性的保存数据. IO流用来处理设备之间的数据传输(上传和下载文件) java对数据的操作是通过流的方式. java用于操作流的对象都在IO包中. java IO系统的学习, ...
- 6.Kafka消息流处理