编译工具——scons

make编译工具

通过检查文件的修改时间,make 工具可以知道编译目标文件所要依赖的其他文件。在复杂的项目中,如果只有少数几个文件修改过,make 工具知道仅仅需要对哪些文件重新编译就可以确保目标程序被正确的编译链接。这样做的好处就是在编译中,不仅可以节省大量的重复输入,还可以确保程序可以被正确的链接,缩短编译的时间。
虽然如此,但是为 make 工具编写建造规则却不是一件容易的事。它复杂的配置规则,即使是有经验的开发者也望而生畏。

make工具的不完美之处:
编写makefile的过程,并没有写makefile要控制的C++源文件时那么爽,后者让我们感觉是在主动的在编程实现我们的思想,而makefile编写过程却让人觉得这是在配置和使用一个规则严格堪比语言语法的软件。
简单的说:编写makefile带给我们编程的痛苦,却没有让我们享受编程的快乐

scons编译工具

scons是什么

Scons是一个开放源码、以Python语言编码的自动化构建工具,可用来替代make编写复杂的makefile。并且scons是跨平台的,只要scons脚本写的好,可以在Linux和Windows下随意编译。
SCons 的设计目标就是让开发人员更容易、更可靠和更快速的建造软件。

scons的优点

与传统的 make 工具比较,SCons 具有以下优点:

  • 使用 Python 脚本做为配置文件
  • 对于 C,C++ 和 Fortran, 内建支持可靠自动依赖分析 . 不用像 make 工具那样需要 执行"make depends"和"make clean"就可以获得所有的依赖关系。
  • 内建支持 C, C++, D, Java, Fortran, Yacc, Lex, Qt,SWIG 以及 Tex/Latex。 用户还可以根据自己的需要进行扩展以获得对需要编程语言的支持。
  • 支持 make -j 风格的并行建造。相比 make -j, SCons 可以同时运行 N 个工作,而 不用担心代码的层次结构。
  • 使用 Autoconf 风格查找头文件,函数库,函数和类型定义。
  • 良好的夸平台性。SCons 可以运行在 Linux, AIX, BSD, HP/UX, IRIX, Solaris, Windows, Mac OS X 和 OS/2 上。

scons安装

对于 Linux 来说,scons 会默认安装到 /usr/loca/bin 目录下

tar -zxf scons-2.0.1.tar.gz
cd scons-2.0.1 
sudo python setup.py install

scons的简单使用

一个hello.c源文件,一个SConstruct文件

% ls
hello.c  SConstruct

% cat hello.c
#include <stdio.h>

int main(void)
{
	printf("hello, world!\n");

	return 0;
}

运行scons,得到如下:

% scons
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
gcc -o hello.o -c hello.c
gcc -o hello hello.o
scons: done building targets.

% ls
hello  hello.c  hello.o  SConstruct

% ./hello 
hello, world!

就是这样,程序编译完成了。到这里Scons似乎与make没有什么两样,同样的操作,不同的地方就在于,下面的展示:

% cat SConstruct 
Program("hello.c")

你没看错,就这一行,编译就完成了!!!
事实确实如此,它比传统的 Makefile 简单很多。SConstruct 以 Python 脚本的语法编写,你可以像编写 Python 脚本一样来编写它。
其中的 Program 是编译的类型,说明你准备想要建造一个可执行的二进制程序,它由 hello.c 文件来生成。
在这里,没有指定生成的可执行程序的名字,SCons 会把源代码文件名字的后缀去掉,用来作为可执行文件的名字。
我们甚至不需要像 Makefile 那样指定清理的动作,就可以执行清理任务。在 SCons 中,执行清理任务由参数 -c 指定,如下 :

扫描二维码关注公众号,回复: 12649039 查看本文章
% scons -c
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Cleaning targets ...
Removed hello.o
Removed hello
scons: done cleaning targets.

% ls
hello.c  SConstruct

scons相关命令

如果你不想直接编译可执行的二进制文件,那也没有关系。SCons 支持多种编译类型,你可以根据自己的需要,任意选用其中的一种。
SCons 支持的编译类型有:

  • Program: 编译成可执行程序(在 Windows 平台上即是 exe 文件),这是最常用的一种编译类型。
  • Object: 只编译成目标文件。使用这种类型,编译结束后,只会产生目标文件。在 POSIX 系统中,目标文件以 .o 结尾,在 Windows 平台上以 .OBJ 结尾。
  • Library: 编译成库文件。SCons 默认编译的库是指静态链接库。
  • StaticLibrary: 显示的编译成静态链接库,与上面的 Library 效果一样。
  • SharedLibrary: 在 POSIX 系统(可移植操作系统接口,POSIX标准定义了操作系统应该为应用程序提供的接口标准)上编译动态链接库,在 Windows 平台上编译 DLL(动态链接库)。

scons的SConstruct文件

它相当于makefile
如果不想使用 SConstruct 为你设置的默认可执行文件的名字,而是选择你自己喜欢的名字,如 myhello,可以把 SConstruct 的内容修改为 :

Program('myhello', 'helloscons.c')

其中 myhello 就是你想要的可执行文件的名字.

% scons -Q
gcc -o hello.o -c hello.c
gcc -o myhello hello.o

其中,-Q 参数是减少编译时的由 scons 产生的冗余信息。
如果你的项目由多个源文件组成,而且你想指定一些编译的宏定义,以及显式的指定使用某些库,这些对于 SCons 来说,都是非常简单的事情。我们的另外一个例子 helloscons2 很好的说明这种情况。 helloscons2 由 3 个源文件组成 , 它们是 helloscon2.c, file1.c, file2.c,另外指定了编译的选项,同时还指定了使用哪些具体的库。让我们来看一下 helloscons2 的 SConstruct 文件 :

Program('helloscons2', ['helloscons2.c', 'file1.c', 'file2.c'], 
       LIBS = 'm', 
       LIBPATH = ['/usr/lib', '/usr/local/lib'], 
       CCFLAGS = '-DHELLOSCONS')

该 SConstruct 文件指出,它将生成一个名叫 helloscons2 的可执行程序,该可执行程序由 helloscons2.c, file1.c 和 file2.c 组成。注意,多个源文件需要放在一个 Python 列表中。如果你的源程序代码文件很多,有十几个甚至上百个,那不要一个个的将他们都列出来,你可以使用 glob(’*.c’) 来代替源代码列表。如下 :

Program('helloscons2', Glob('*.c'))

配置文件中 LIBS,LIBAPTH 和 CCFLAGS 是 SCons 内置的关键字,它们的作用如下:

  • LIBS: 显示的指明要在链接过程中使用的库,如果有多个库,应该把它们放在一个列表里面。这个例子里,我们使用一个称为 m 的库。
  • LIBPATH: 链接库的搜索路径,多个搜索路径放在一个列表中。这个例子里,库的搜索路径是 /usr/lib 和 /usr/local/lib。
  • CCFLAGS: 编译选项,可以指定需要的任意编译选项,如果有多个选项,应该放在一个列表中。这个例子里,编译选项是通过 -D 这个 gcc 的选项定义了一个宏 HELLOSCONS。
  • CPPPATH:指定头文件的路径
    运行 scons 命令的时候,可以看到这些变量如何被使用的,让我们执行一下 scons 命令 :
$ scons -Q 
gcc -o file1.o -c -DHELLOSCONS file1.c 
gcc -o file2.o -c -DHELLOSCONS file2.c 
gcc -o helloscons2.o -c -DHELLOSCONS helloscons2.c 
gcc -o helloscons2 helloscons2.o file1.o file2.o -L/usr/lib -L/usr/local/lib -lm

scons其他

上面只是简单介绍了scons的相关内容和与make工具的关系,详细内容可以看官方文档

猜你喜欢

转载自blog.csdn.net/Thorne_lu/article/details/113343425