scons 简单入门

摘自:https://www.jianshu.com/p/e4bd3ab9e5d6

0.2042019.01.20 12:58:44字数 1201阅读 3021

简单入门

hello world

scons由Sconstruct 作为入口,控制如何进行编译操作。Sconstruct 本身是一个python文件,故需要遵循python的语法,以及能使用一些python的方法。(如我们可以用print 来debug)

这有一段很简单的hello.cpp

#include <iostream>

int main() {
std::cout << "hello world" << std::endl;
}

以及一个很简单的Sconstruct

Program("hello.cpp")

Program是Scons中的一个编译方法(builder_method), 告诉Scons 我们想要把hello.cpp 编译成一个可执行文件。

保证Sconstruct 和hello.cpp 在同一个文件夹下,执行scons,就可以完成编译,生成可执行文件hello。

scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
g++ -o hello.o -c hello.cpp
g++ -o hello hello.o
scons: done building targets.

可以看到,我们只指定了一个cpp文件,scons会默认给可执行文件一个名字,以及完成.o文件的生成,非常智能。当然,我们也能指定输出文件的名字,Program("target_name", hello.cpp")

另外,除了Program ,还有其他很多builder_method, 如ObjectSharedLibraryStaticLibraryLoadableModuleStaticObjectCFile

编译多个文件

编译多个文件非常简单

  • 直接使用list Program(["a.cpp", "b.cpp", "c.cpp"])即可。

  • 也可以使用Glob方法

    source = Glob("src/*.cpp")
    print source # python语法,可以打印出来debug
    Program(["hello.cpp"] + source)

    用这种方式把src下的文件都加进来

  • Program(Split("a.cpp, b.cpp c.cpp") Split 也是SCons提供的一个方法,顾名思义了。

编译一个库

把Program改为 Library (或者StaticLibrary,这两者是一样的)即可。

Library("t", Glob("src/*.cpp"))

这样就能得到一个静态库了。 如果如要一个动态库,则可以使用SharedLibrary。

链接一个库

上边我们学会如何编译一个库了,那么如何链接呢?也很简单,加个参数即可

source = Glob("src/*.cpp")
SharedLibrary("t", source)
Program(["hello.cpp"], LIBS=["t"], LIBPATH=".")

Program 可以理解为python 的一个方法,很多参数都有默认值,我们要做的只用覆盖其默认值即可。如上,我们指定引入LIBS。同样的,LIBS参数也可以是个str,LIBPATH也可以是个list,放上所有要查找的路径,如['/usr/lib', '/usr/local/lib'],这里就不赘述了。

略微高级一点的功能

判断是否需要重新编译

SCons很智能,只会编译需要编译的内容。比如我刚执行完scons,再次执行,则会提示scons: . is up to date.。 那么他是如何做到的呢?也不复杂,依赖一个Decider的方法,以及一个.sconsign.dblite文件。

默认情况下,如果文件的md5值改变了,才会重新编译。每次编译,SCons都会把md5存起来,再次执行时,如果md5没变,则不需要rebuild。

如果我们不希望使用md5,而是使用文件修改时间呢?很简单,增加Decider('timestamp-newer')(默认情况下为md5)。也可以使用'MD5-timestamp,则他们一起变了才会rebuild。

我们前面也说到,Decider是一个方法,那很显然,我们也可以自己写个decider方法,详细的可以看scons-user.pdf 6.1.5,这里不细写了。。

env

env分为三种

  • external enviroment 保存在os.environ 中,和scons其实没太大关系,保存着一些系统定义的环境变量,如PATH之类

  • construction environment

    这个比较重要,我们可能希望不同的源文件使用不同的编译参数,这时候我们就能设置不同的编译环境,指定哪个文件用哪种编译。construction environment 中保存了构建相关的一些参数。

    使用方式如下

    env1 = Environment(CXX = 'gcc') # 创建一个env
    print env1["CXX"] # 获取参数
    env2 = env1.Clone(CXX = 'g++') # 复制一个env
    env1.Replace(CXX = 'g++') # 修改参数
    env1["CXX"] = "clang++" #再修改参数 env1.MergeFlags("-g") #增加一个flag

    就可以构建出一个env,除了CXX 被修改以外,其他参数均不变。另外,我们也可以像一个dict一样,去获取env中的内容。

  • execution enviroment

    这其实就是construction environment 中的一个变量ENV

    env = Environment()
    print env["ENV"] env2 = Environment(ENV=os.environ)
    env3 = Environment(ENV = {"PATH" : os.environ["PATH"]})

    几个简单的例子,一看就明白了

命令行输入的参数

比如我们想通过一个debug字段来控制是否开启debug模式,怎么做呢?可以通过ARGUMENTS

env = Environment()
debug = ARGUMENTS.get("debug", 0)
if int(debug):
print "in debug mode"

scons debug=1就可以了。

小结

上面只是我在看的时候做的一个小结,详细的可以看(文档)[https://scons.org/doc/production/PDF/scons-user.pdf],很多东西都没写,在日常工作中可以一点一点去体会。

scons 简单入门的更多相关文章

  1. 用IntelliJ IDEA创建Gradle项目简单入门

    Gradle和Maven一样,是Java用得最多的构建工具之一,在Maven之前,解决jar包引用的问题真是令人抓狂,有了Maven后日子就好过起来了,而现在又有了Gradle,Maven有的功能它都 ...

  2. [原创]MYSQL的简单入门

    MYSQL简单入门: 查询库名称:show databases; information_schema mysql test 2:创建库 create database 库名 DEFAULT CHAR ...

  3. Okio 1.9简单入门

    Okio 1.9简单入门 Okio库是由square公司开发的,补充了java.io和java.nio的不足,更加方便,快速的访问.存储和处理你的数据.而OkHttp的底层也使用该库作为支持. 该库极 ...

  4. emacs最简单入门,只要10分钟

    macs最简单入门,只要10分钟  windwiny @2013    无聊的时候又看到鼓吹emacs的文章,以前也有几次想尝试,结果都是玩不到10分钟就退出删除了. 这次硬着头皮,打开几篇文章都看完 ...

  5. 【java开发系列】—— spring简单入门示例

    1 JDK安装 2 Struts2简单入门示例 前言 作为入门级的记录帖,没有过多的技术含量,简单的搭建配置框架而已.这次讲到spring,这个应该是SSH中的重量级框架,它主要包含两个内容:控制反转 ...

  6. Docker 简单入门

    Docker 简单入门 http://blog.csdn.net/samxx8/article/details/38946737

  7. Springmvc整合tiles框架简单入门示例(maven)

    Springmvc整合tiles框架简单入门示例(maven) 本教程基于Springmvc,spring mvc和maven怎么弄就不具体说了,这边就只简单说tiles框架的整合. 先贴上源码(免积 ...

  8. git简单入门

    git简单入门 标签(空格分隔): git git是作为程序员必备的技能.在这里就不去介绍版本控制和git产生的历史了. 首先看看常用的git命令: git init git add git comm ...

  9. 程序员,一起玩转GitHub版本控制,超简单入门教程 干货2

    本GitHub教程旨在能够帮助大家快速入门学习使用GitHub,进行版本控制.帮助大家摆脱命令行工具,简单快速的使用GitHub. 做全栈攻城狮-写代码也要读书,爱全栈,更爱生活. 更多原创教程请关注 ...

随机推荐

  1. Gvim打造python编辑器,附自己的配置文件

    一. Gvim简介 Gvim的G指的是GUI,也就是图形化界面.相当于在vim包了一层图形化界面,相比之下gvim拥有更丰富的颜色和字体,还有菜单和滚动条,以及更友好的鼠标操作等,除此之外和vim并无 ...

  2. python3文本读取与写入常用代码

    创建文件夹: import os import shutil def buildfile(echkeyfile): if os.path.exists(echkeyfile): #创建前先判断是否存在 ...

  3. learning java Calendar类

    //Calendar.MONTH ,这是一个特殊于日历的值. //在格里高利历和罗马儒略历中一年中的第一个月是 JANUARY,它为 0:最后一个月取决于一年中的月份数. // //所以这个值的初始值 ...

  4. c语言冒泡排序算法

    案例一: #include <stdio.h> int main(void){ int a[5]; printf("please input sort number:" ...

  5. pyy整队 线段树

    pyy整队 线段树 问题描述: 众所周知pyy当了班长,服务于民.一天体育课,趁体育老师还没来,pyy让班里n个同学先排好 队.老师不在,同学们开始玩起了手机.站在队伍前端玩手机,前面的人少了,谁都顶 ...

  6. 洛谷P1288取数游戏2

    题目 博弈论. 考虑先手和后手的关系.然后可以通过统计数值不是0的数的个数来得出答案. \(Code\) #include <bits/stdc++.h> using namespace ...

  7. SpringMVC+Spring+Mybatis简单总结

    SpringMVC+Spring+Mybatis总结 第一部分:分析 web.xml中的配置 SSM框架的整合其实是Spring和SpringMVC的整合以及Spring和Mybatis进行整合. 当 ...

  8. ubuntu之路——day11.3 不匹配数据划分的偏差和方差

    在11.2中,我们提到了一种数据划分的方法,那么怎么衡量这种数据划分方法中的误差呢? 来看一个例子:有20w条各种领域的语音识别数据,2w条汽车语音定位数据 train+dev+test,其中trai ...

  9. 生成模型 VS 判别模型 (含义、区别、对应经典算法)

      从概率分布的角度考虑,对于一堆样本数据,每个均有特征Xi对应分类标记yi. 生成模型:学习得到联合概率分布P(x,y),即特征x和标记y共同出现的概率,然后求条件概率分布.能够学习到数据生成的机制 ...

  10. SpringBoot访问不了JSP但却能进入后台

    博主在使用sring-boot跳转HTML页面后,由于好奇心就想跳转到JSP页面,就在网上搜相关信息,结果不是跳转500错误就是下载JSP文件.各种坑啊,在博主跳了N多坑后,终于跳转JSP页面成功.故 ...