scons 简单入门

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了scons 简单入门相关的知识,希望对你有一定的参考价值。

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

这有一段很简单的hello.cpp

以及一个很简单的Sconstruct

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

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

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

另外,除了Program ,还有其他很多builder_method, 如 Object , SharedLibrary , StaticLibrary , LoadableModule , StaticObject , CFile

编译多个文件非常简单

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

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

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

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分为三种

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

scons debug=1 就可以了。

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

SCons — 程序构建工具

目录

SCons - a software construction tool

SCons 类似于 Make Tool,同样是一款自动化程序构建(Construction)工具,通过 Python 实现,可用来替代 Make 编写复杂的 makefile。并且 Scons 是跨平台的,只要 Scons 脚本写的好,就可以在 Linux 或 Windows 下随意编译。

  • github:https://github.com/SCons/scons

与传统的 Make Tool 比较,SCons 具有以下优点:

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

SCons 支持的编译类型有:

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

使用示例

  • 源码 hello.c
#include <stdio.h>

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

	return 0;
}
  • SConstruct,相当于 Makefile,以 Python 语言编写
Program("hello.c")
  • Building
$ 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 简单入门的主要内容,如果未能解决你的问题,请参考以下文章

码云简单使用入门

Azkaban 简单入门

junit5 入门系列教程-01-junit5 简单入门例子

简单入门echart方法

API Gateway——KONG简单入门

Maven入门指南 Maven 快速入门及简单使用