SCons - 简单而强大的项目编译脚本(原文https://www.cnblogs.com/binchen-china/p/5646791.html)
N年前学的makefile,当时还勉强能写一些简单的工程编译,现在已经基本忘了。makefile确实编写复杂,而且平时也不是经常使用,容易忘记。偶识了scons,一切都变的简单了。最近研究了下scons,原来需要上百行的makefile编译过程,现在只需要十行不到,而且没有makefile那些繁杂的结构语法,完全使用python语言就可以进行编译脚本编写,非常好记忆和编译一些大的工程。
直接使用apt-get install scons命令就可以完成安装,需要python环境。
Scons命令
scons:进行代码文件编译
scons -Q:进行代码文件编译,不显示Scons内部操作打印的信息,只显示编译信息
scons -c:清除编译中间文件和可执行文件
Scons编译脚本
Scons对应的编译脚本名称为SConstruct,就如同make对应的编译脚本为makefile
SConstruct脚本编写
编译函数
Program():执行编译操作,生成可执行文件
Library():执行编译操作,生成静态库
StaticLibrary():执行编译操作,生成静态库
SharedLibrary():执行编译操作,生成动态库
Environment():编译环境
编译参数
target,生成的执行文件名字
source,编译文件
LIBS,依赖库
LIBPATH,依赖库路径,有环境变量的可不添加,针对用户库或第三方库
CPPPATH,头文件路径
CCFLAGS,编译参数
其他函数
Split():将字符串分隔为列表
Glob('*.cpp'):加入所有文件
编译参数可以以任意顺序加入编译函数,编译函数依据编译参数对代码文件进行编译。
一个简单例子
将文件放在当前目录,头文件放在上级目录。
1 str = Split('main.cpp display.cpp')
2 Program('main',str,CPPPATH = '../'i,LIBS = 'pthread')一个复杂项目的例子
大多项目都可以套用的格式,Program内参数多个文件需要以python列表形式作为入参,这里可以用Split对文件字符串分隔为列表输入。直接用Glob('*.cpp')包含当前目录所有需要编译的cpp文件。
1 TARGETNAME = 'server'
2
3 LIB = Split('jsoncpp logger ACE basetool tinyxml pthread dl rt')
4
5 FILELIST = Glob('*.cpp')
6
7 HEADFILEPATH = Split('../../common/include ../../3rd/ACE_wrappers ../../3rd/include/')
8
9 LIB_DIR = Split('../../3rd/lib ../../common/lib')
10
11 Program(target = TARGETNAME,source = FILELIST,LIBS = LIB,CPPPATH = HEADFILEPATH,LIBPATH = LIB_DIR)
SCons - 简单而强大的项目编译脚本(原文https://www.cnblogs.com/binchen-china/p/5646791.html)的更多相关文章
- SCons - 简单而强大的项目编译脚本
N年前学的makefile,当时还勉强能写一些简单的工程编译,现在已经基本忘了.makefile确实编写复杂,而且平时也不是经常使用,容易忘记.偶识了scons,一切都变的简单了.最近研究了下scon ...
- Powershell极速教程-如何在三分钟内编写项目编译脚本
分析及思路 来看一下项目目录结构 炒鸡正常的三板斧src+docs+tests.咦,怎么会多出一个build的文件夹呢,这就是我们今天要研究的目录.今天我会带着大家在五分钟之内编写一个极简的编译脚本. ...
- 基于Jenkins + Git的PHP项目编译脚本
本文针对的是了解或已经在使用Jenkins和Git的开发者或团队. 本团队使用了Jenkins作为持续集成平台,Git作为版本管理工具,而本人负责的项目是PHP项目,所谓发布项目就是复制文件. 通常有 ...
- http://python.jobbole.com/85056/ 简单 12 步理解 Python 装饰器,https://www.cnblogs.com/deeper/p/7482958.html另一篇文章
好吧,我标题党了.作为 Python 教师,我发现理解装饰器是学生们从接触后就一直纠结的问题.那是因为装饰器确实难以理解!想弄明白装饰器,需要理解一些函数式编程概念,并且要对Python中函数定义和函 ...
- 简单的django登录项目---带views视图函数(脚本文件)---用Bootstrap
简单的django登录项目 1.首先建立工程,建立工程请参照:https://www.cnblogs.com/effortsing/p/10394511.html 2.在Firstdjango工程项目 ...
- [原]详解如何将cocos2dx项目编译到Android平台上的(方式一:Cywin+NDK)
链接地址:http://m.blog.csdn.net/blog/yhc13429826359/29357815 2014-6-8阅读578 评论0 前言:cocos2dx作为一个开源的移动2D游戏框 ...
- FFmpeg示例程序合集-批量编译脚本
此前做了一系列有关FFmpeg的示例程序,组成了<最简单的FFmpeg示例程序合集>,其中包含了如下项目:simplest ffmpeg player: ...
- 让AI简单且强大:深度学习引擎OneFlow技术实践
本文内容节选自由msup主办的第七届TOP100summit,北京一流科技有限公司首席科学家袁进辉(老师木)分享的<让AI简单且强大:深度学习引擎OneFlow背后的技术实践>实录. 北京 ...
- 使用ant优化android项目编译速度,提高工作效率
1.Android项目编译周期长,编译项目命令取消困难 2.在进行Android项目的编译的同时,Eclipse锁定工作区不能进行修改操作 3.在只进行资源文件的修改时,Eclipse对资源文件的修改 ...
随机推荐
- Scanner类、匿名对象、Random类、ArrayList集合、String类、static静态类、math类和Arrays工具类
一.Scanner类 1.除了八种基本数据类型,其他都是引用类型: 引用类型使用三步骤: 2.Scanner类 引用jdk提供的类,Scanner在java.util包下,不在java.lang包(S ...
- 排查dubbo接口重复注销问题,我发现了一个巧妙的设计
背景 我在公司内负责自研的dubbo注册中心相关工作,群里经常接到业务方反馈dubbo接口注销报错.经排查,确定是同一个接口调用了两次注销接口导致,由于我们的注册中心注销接口不能重复调用,调用第二次会 ...
- call、apply、bind三者比较
var obj={a:1}; var foo={ getA:function(item1,item2){ return this.a+item1+item2 } } // apply绑定参数为数组,一 ...
- 一文搞懂Python Unittest测试方法执行顺序
大家好~我是米洛! 欢迎关注我的公众号测试开发坑货,一起交流!点赞收藏关注,不迷路. Unittest unittest大家应该都不陌生.它作为一款博主在5-6年前最常用的单元测试框架,现在正被pyt ...
- go命令帮助
Go is a tool for managing Go source code. go-->管理go源码的工具-->管理工具,包含很多功能命令 Usage: go <command ...
- 离散化模板题 I ——重复元素离散化后的数字相同
离散化模板题 I --重复元素离散化后的数字相同 题目描述 现有数列A1, A2, ⋯, An,数列中可能有重复元素. 现在要求输出该数列的离散化数列,重复元素离散化后的数字相同. 输入 第一行,一 ...
- Android学习记录(二)——第一次hello world及遇到的gradle安装问题
开始一个简单的hello world项目,简单了解Android studio的使用方法 第一步,打开Android studio,点击Create New Project 第二步,选择需要的模板 T ...
- Linux系列(38) - 源码包安装(2)
安装前准备 安装C语言编译器"gcc" yum -y install gcc --c 源码包语言编译器 下载源码包 安装注意事项 源代码保存位置:/usr/local/src/ 软 ...
- python之jsonpath
json 官方文档:http://docs.python.org/library/json.html JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,它使 ...
- django使用restframework序列化查询集合(querryset)
第一: pip install djangorestframework 第二: 在setting.py文件中的app添加名为: 'rest_framework', 第三:再项目的APP下面新建名为(可 ...