scons浅入浅出

    xiaoxiao2021-03-25  87

    --作者:燕十三(flyingcys)

    -- blog:http://blog.csdn.net/flyingcys

    --QQ:294102238

    Scons是一个开放源码、以Python语言编码的自动化构建工具,可用来替代make编写复杂的makefile。并且scons是跨平台的,只要scons脚本写的好,可以在LinuxWindows下随意编译。

    一、Scons安装

    在使用scons之前,必须先安装Pythonubuntu下默认已安装python。如为Windows系统可至https://www.python.org/downloads/release/python-2713/下载安装python2.7

    如使用的是Ubuntu系统,可直接通过sudo apt-get install scons命令安装已编译好的scons。也可以通过源码编译安装,至官网http://scons.org/pages/download.html下载源码,当前最新版本为scons 2.5.1,可下载的zip格式的“scons-2.5.1.zip”。

    解压后进入源文件目录,在命令行输入sudo python setup.py install进行编译,安装scons脚本至python目录/usr/local/bin,同事会安装scons编译引擎到python使用的库目录/usr/loacl/lib/scons

    Scons详细安装使用说明可在官网http://www.scons.org/doc/HTML/scons-user.html下查看,中文翻译版说明可在http://www.linuxidc.com/Linux/2013-02/79467.htm,看完就基本上就可以上手了。

    二、Scons入门

    1. scons 编译脚本:

    a) 编译顶层脚本文件名为SConstruct,输入scons命令后,自动调用该脚本

    b) scons的配置文件Sconscript,通过Sconscript()函数导入配置文件。

    2. scons -c:清除目标文件,对应make clean

    3. scons -Q:只显示编译信息,去处多余的打印信息

    4. 常用scons方法:

    a) Program():生成可执行文件。如:

    Program(hello.c):编译hello.c为可执行文件,文件名为第一个文件名

    Program(main,hello.c):编译hello.c为可执行文件,文件名mian

    b) Object():生成目标文件。如:

    Object(‘main’, ’hello.c’):编译hello.c为目标文件,文件名为main.o

    c) 生成库文件

    i. Library():生成库,默认为静态库。

    ii. StaticLibrary():生成静态库

    iii. ShareLibrary():生成动态库

    d) 编译多个文件

    i. Program([‘hello.c’, ‘func1.c’, ‘func2.c’])

    ii. Split(‘hello.c func1.c func2’)

    iii. Glob(‘*.c’)

    5. 常用scons关键字:

    i. source:指定源文件名

    ii. target:指定目标文件名。如:

    Program(source = Split(hello.c func1.c func2.c), target = main)

    iii. LIBS:指定库文件,不需要添加lib和后面的.a,直接输入名字。等同makefile里面的-l。如:

    LIBS=[m,pthread]

    iv. LIBPATH:指定库文件路径,等同于makefile里面的-L。如:

    LIBPATH = [/usr/lib,/usr/local/bin]

    v. CPPPATH:指定程序编译过程中需要查找的头文件路径。

    vi. CCFLAGS: 指定编译选项。如:

    Program(main,hello.c, CCFLAGS = [-g,-O2],CPPPATH = [./include,../include])

    vii. LINKFLAGS: 指定链接选项

    viii. CPPDEFINES:指定预编译选项

     

    三、Scons进阶

    scons脚本是用Python语言写的,所以熟悉Python很重要,但是没关系,可以一点点熟悉。个人感觉对于scons来说,环境变量(Environment)是异常重要的,只有会用Environment,才能写出真正可以实际使用的scons脚本。

    1. 构造环境变量:

    个人理解就是由自己创建的环境变量,这个环境变量可以用来控制整个目标文件编译过程。

    本人第一个用到构造环境变量的就是交叉编译器的设置,由于scons默认用的是gcc来编译系统,而嵌入式开发要使用指定的交叉编译器来编译目标文件,所以可通过构造环境变量来修改编译器。

    a) 创建

    env = Environment(CC = arm-linux-gcc)

    b) 使用:用arm-linux-gcc编译执行文件

    env.Program(hello.c)

    c) 从构造环境变量获取值:

    print CC is:, env[CC]

    d) 拷贝:我们想使用gcc编译2个不同版本的debug/realse版本的程序,就可以通过拷贝创建2个环境变量

    debug = env.Clone(CCFLAGS = -g)

    Realse = env.Clone(CCFLAGS = -O2)

    debug.Program(debug,hello.c)

    debug.Program(realse,hello.c)

     

    e) 追加到末尾:Append()

    env.Append(CCFLAGS = -DLAST)

    f) 追加到开始位置:Prepend()

    env.Prepend(CCLFAGS = -DFIRST)

    2. Pythonos模块使用:

    使用os模块,需要在每个脚本文件添加import os

    a) os.name:获取当前正在使用的平台,linux显示为‘posix,windows返回的是‘nt

    b) os.getcwd():获取当前工作目录

    c) os.getenv():读取环境变量

    d) os.putenv():设置环境变量

    e) os.listdir():返回指定目录下的所有文件和目录

    f) os.remove():删除一个文件

    g) os.system():运行shell命令

    scons 要用好,需要学习的东西还是很多的,只能一边用一边学了!

    转载请注明原文地址: https://ju.6miu.com/read-20981.html

    最新回复(0)