scons是一个Python写的自动化构建工具,从构建这个角度说,它跟GNU make是同一类的工具。
scons就是这样一个构建工具:你告诉它要做的任务,以及完成这个任务需要的输入,以及这个任务产生的输出,怎么做这个任务(当然其中就包括依赖性分析),就交给工具本身完成。
scons主要的命令有:
1. 只有一个 test.c文件,需要编译成可执行文件。
创建SConstruct,内容为:
Program('test.c')
2. 只有一个文件,想编译成object文件。
Object('test.c')
3. 有多个.c文件,并想指定生成的程序名:
Program('program', ['prog.c', 'file1.c', 'file2.c']) 或 Program('program', Glob["*.c"])
4. SCons还对output file和source file有关键字,可以用来指定
src_files = Split('main.c file1.c file2.c')
Program(target = 'program', source = src_files)
因为有关键字指定,多以可以换前后:
Program(source = src_files, target = 'program')
5. 创建库:
Library('foo', ['f1.c', 'f2.o', 'f3.c', 'f4.o'])
6. 建立静态和动态库:
静态库:其实使用Library也是建立静态库。
StaticLibrary('foo', ['f1.c', 'f2.c', 'f3.c'])
动态库:
SharedLibrary('foo', ['f1.c', 'f2.c', 'f3.c'])
7. 使用静态和动态库:
使用$LIBS 来指定库,使用$LIBPATH 指定库位置。
Library('foo', ['f1.c', 'f2.c', 'f3.c'])
Program('prog.c', LIBS=['foo', 'bar'], LIBPATH='.')
下面举例来说明:
假设我有一个工程,工程目录如下:
sconsTest
include
hello.h
src
hello.cpp
main
test.cpp
在根目录sconsTest下创建名为"Sconstruct"的文件,内容如下:
SConscript(['src/SConstruct','main/SConstruct'])
obj_files=['main/test.obj','src/hello.obj']
Program('hello', obj_files)
在src和main目录下分别创建"Sconstruct"文件,内容分别为:
Object('hello.cpp', CPPPATH=['../include'])
Object('test.cpp', CPPPATH=['../include'])
我们只需要在根目录"sconsTest"下执行"scons",即可生成一个名为"hello.exe"的可执行文件.
在Scons中,还提供了环境变量,共分为3种环境变量:
1. External Environment
2. Construction Environment
3. Execution Environment