SCons

Why SCons?

让我引用一段官网的说法

SCons is an Open Source software construction tool—that is, a next-generation build tool. Think of SCons as an improved, cross-platform substitute for the classic Make utility with integrated functionality similar to autoconf/automake and compiler caches such as ccache. In short, SCons is an easier, more reliable and faster way to build software.

SCons是新一代的开源程序构建工具。相对于传统的Make构建工具,SCons具有优越的跨平台特性(得益于采用Python为开发语言)和更加易于使用(集成了自动配置和自动生成)的特性😘从下面的例子中就会知道SCons真的太香了!

SCons具体好在哪?

  • 配置文件就是py脚本
  • 自动分析依赖文件
  • 内置支持语言有:C, C++, D, Java, Fortran, Yacc, Lex, Qt和SWIG
  • 你也可以很容易得自行开发对其他语言的支持(毕竟是Python对象)
  • 内置支持从SCCS, RCS, CVS, BitKeeper和Perforce获取源文件
  • 内置对Microsoft Visual Studio .Net和过去的Visual Studio版本的支持,包括生成。dsp、。dsw、。sln和。vcproj文件。(笔者在Windows平台下超爱VS的😘)
  • 改进了对并行构建的支持——比如make -j,但不管目录层次结构如何,都会使N个作业同时运行
  • 集成了类似autoconf的查找#include文件、库、函数和类型定义的支持(这真的太香了!🎈)
  • 所有依赖项的全局视图——不再需要多次构建或重新排序目标来构建所有内容
  • 能够在缓存中共享构建文件以加速多个构建——比如ccache,但适用于任何类型的目标文件,而不仅仅是C/ c++编译
  • 从一开始就为跨平台构建而设计,并且已知可以在Linux、其他POSIX系统(包括AIX、BSD系统、HP/UX、IRIX和Solaris)、Windows NT、Mac OS X和OS/2上工作

安装SCons

官网传送门:SCons Download

截至目前(2020年12月24号),官网最新版本为4.0.1,官方提供的安装方式有两种:方便的pip和完整的工程(python源码)压缩包

  1. 首推使用pip安装

    1
    $ pip install scons

    这个法子是最棒的了,无视任何平台小九九,一步到位。

  2. 也可以在官网下载工程包手动安装

    1
    $ wget https://udomain.dl.sourceforge.net/project/scons/scons/4.0.1/scons-4.0.1.tar.gz

    是的🙃官网不提供直接下载服务,而是托管到了sourceforge这个网站上

    不一定要用wget下载,笔者亲测在windows上用迅雷下更香❤(迅雷下载的时候可以加速到3M/s,而wget只有几十k/s)

    然后解压

    1
    $ tar -zxvf scons-4.0.1.tar.gz

    进入目录后,允许安装脚本就行了

    1
    2
    3
    $ cd SCons-4.0.1
    $ python3 setup.py build
    $ sudo python3 setup.py install

开始爱上SCons

在此之前先试试看你的SCons装好了没

1
$ scons --version

让我们编写一套最简单的C艹,创建一个“main.cpp”文件,内容如下:

1
2
3
4
5
6
7
8
#include <iostream>

int main()
{
std::cout<<"www.singularity-blog.top"<<std::endl;

return 0;
}

想要编译它,我们需要在目录下创建一个“Makefile”文件,内容为:

1
2
buildMain : main.cpp
g++ -o main main.cpp

那么如果用SCons呢?创建“Sconstruct”文件,内容为:

1
Program("main.cpp")

对!只有一句话并且非常好理解!看看构建时的输出是啥

1
2
3
4
5
6
7
8
9
10
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
cl /Fomain.obj /c main.cpp /TP /nologo
main.cpp
E:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.28.29333\include\ostream(746): warning C4530: 使用了 C++ 异常处理程序,但未启用展开语义。请指定 /EHsc
main.cpp(5): note: 查看对正在编译的函数 模板 实例化“std::basic_ostream<char,std::char_traits<char>> &std::operator <<<std::char_traits<char>>(std::basic_ostream<char,std::char_traits<char>> &,const char *)”的
引用
link /nologo /OUT:main.exe main.obj
scons: done building targets.

因为笔者是在Windows上跑的,所以SCons很聪明地自动找到了VS的编译器!而不是g++

也许上面的例子还不能够非常体现出SCons强大的优势,你可以试着给这个工程多加一些头文件和源文件

SCons语法

先来一条比较长的例子

1
2
3
4
5
6
Program('helloscons2', 
['helloscons2.c', 'file1.c', 'file2.c'],
LIBS = 'm',
LIBPATH = ['/usr/lib', '/usr/local/lib'],
CPPPATH = ['./include'],
CCFLAGS = '-DHELLOSCONS')
  • Program : 表示编译
  • helloscons2 : 目标文件
  • [‘helloscons2.c’, ‘file1.c’, ‘file2.c’] : 当有多个源文件时,采用(python的)列表形式
  • LIBS = ‘m’ : 使用的库文件
  • LIBPATH = [‘/usr/lib’, ‘/usr/local/lib’] :使用的库文件路径
  • CPPPATH : 头文件路径
  • CCFLAGS = ‘-DHELLOSCONS’ : 其他编译时的选项。这边是宏定义

所以SCons其实就是python的写法,非常优美

具体可见官网帮助文档

编译类型命令

  • Program : 编译可执行文件
  • Object : 编译目标文件
  • Library : 编译库文件(默认静态)
  • StaticLibrary : 编译成静态库文件
  • SharedLibrary : 编译成动态库文件

指定编译器

1
2
3
4
import os
env = Environment(ENV={'PATH': os.environ['PATH'],
'ANDROID_HOME': os.environ['ANDROID_HOME'],
'ANDROID_NDK_HOME': os.environ['ANDROID_NDK_HOME']})

Scons命令

  • 多线程并行编译

    1
    $ scons -j 4
  • 调试信息
    将有关派生文件缓存的调试信息写入指定文件。如果file是一个连字符(-),则将调试信息打印到标准输出。打印的消息描述了在由CacheDir指定的派生文件缓存中查找、检索或写入的签名文件名

    1
    $ --cache-debug = file
  • 不使用缓存

    1
    --cache-disable,--no-cache
  • 更新方案策略

    1
    --config = [auto,force,cache]
    • auto : scons将使用其正常的依赖机制来决定测试是否必须重新构建。这样就不必在每次调用scons时都运行相同的配置测试,从而节省了时间,但如果不显式指定这些依赖项,则会忽略系统头文件或外部命令(如编译器)中的更改。这是默认行为。
    • force : 如果指定此选项,则将重新运行所有配置测试,而不管缓存的结果是否过期。这可用于显式地强制更新配置测试,以响应系统头文件或编译器中未配置的更改。
    • cache :如果指定此选项,将不重新运行配置测试,并从缓存获取所有结果。如果指定了——config=cache并且一个必要的测试在缓存中没有任何结果,则scons将报告一个错误。
  • 尽量编译

    就算遇到了error也会尽量继续编译下去

    1
    -k,--keep-going
  • 打印SCons的版本

    1
    -v,--version

深入体验SCons

上面的HelloWorld例子也许没啥意义,所以在本文的最后。笔者决定给出一个比较有价值的DEMO——在windows上开发openCV!

很多小伙伴本来就觉得在Windows上做开发很麻烦,配OpenCV更是劝退💢希望这个例子对你有所帮助

程序实现的就是不断读取本地摄像头的数据,并且显示出来,更新触发条件为用户敲击键盘。上个代码,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
#include "opencv.hpp" //OpenCV(主)头文件

using namespace std; //引入命名空间
using namespace cv;

int main()
{
Mat cap; //像素矩阵变量
VideoCapture cam; //视频流对象(可以理解为相机)
cam.open(0); //打开相机,笔记本电脑前置摄像头默认号:0

if(!cam.isOpened()) //检查是否成功打开相机
{
std::cout<<"Open Failed!"<<std::endl;
return -1;
}
std::cout<<"open Success!"<<std::endl;

while(1)
{
cam >> cap; //读取视频流
imshow("camera",cap); //显示图像
waitKey(0); //按键更新
}

return 0;
}

想要编译这个程序,需要的SConstruct内容为:

1
2
3
4
5
6
Program('main',
['main.cpp'],
LIBS = ['opencv_world420'],
LIBPATH = ['E:/opencv/build/x64/vc15/lib'],
CPPPATH = ['E:/opencv/build/include/opencv2/',
'E:/opencv/build/include/'])

简单解释一下上面路径的由来,在OpenCV官网下载最新版(or你喜欢的版本)开发包,解压到你电脑上喜欢的位置(比如笔者显然直接放在了E盘下)就行。然后把相应库、头文件对应的路径代入就搞定了

这样就完成了在windows上配置OpenCV和允许Demo的所有配置了🍻是不是非常简单呢?完全不需要配置环境变量以及其他IDE参数

Donate
  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
  • Copyrights © 2022-2023 RY.J
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信