scons学习笔记

常用的命令行选项:
  • 构建工程并输出所有的构建命令。(如果不使用Default方法设置默认目标,则构建所有目标,这点和makefile不一样)
scons
  • 构建工程不输出构建命令。
scons -Q
  • 构建名称为bar的目标。
scons bar
  • 显示目标被构建的原因。
scons –debug=explain
  • 输出依赖关系图。
scons –tree=all
  • 显示如何生成构建命令。
scons –debug=presub
  • 显示构建过程引用的库的路径。
scons –debug=findlibs
  • 显示各个目标是否需要更新。
scons –debug=prepare
scons构建过程的两个阶段:
  1. 建立依赖关系图,在此阶段不执行任何构建命令。(scons的设计思想是只存在一个依赖关系图,和makefile不同)
  2. 根据依赖关系图构建工程。
scons三种环境变量:
  1. 外部环境(External Environment)变量,执行scons命令的shell环境中的变量,可以使用os.environ(一个外部环境变量字典)来获取。
  2. 构建环境(Construction Environment)变量,构建环境在scons中表现为Environment对象,在scons中,可以很方便的创建或克隆出不同的构建环境,构建环境变量主要是一些编译过程中用到的配置选项($CPPPATH、$CPPFLAGS、$CPPDEFINES等)。可以使用Environment对象访问,例如env[‘CPPPATH’]。
  3. 执行环境(Execution Environment)变量,执行构建命令的环境中的变量,scons的执行环境和外部环境是隔离开的,从而确保不会因为外部环境的一些错误配置发生不好追踪的错误,最大限度保证正确性。(makefile中外部环境会影响执行环境)可以使用env[‘ENV’]访问,例如env[‘ENV’][‘PATH’]。
scons判断文件过期的方式:
  • Decider(‘MD5’),使用md5比较,优点是比较准确,缺点速度慢,适用于规模较小的项目。
  • Decider(‘timestamp-newer’),使用timestamp比较,优点是速度快,缺点是可能不准确,适用于规模较大的项目。
  • Decider(‘MD5-timestamp’),使用md5和timestamp比较,先使用timestamp检测出疑似过期的文件,然后使用md5进行比较,是上面两种方案的折中。
  • 自定义Decider的方式。
提高性能的方法–implicit-cache:
  • 使用该选项会使scons忽略对搜索路径的修改($CPPPATH、$LIBPATH等)。
  • 使用该选项会使scons忽略那些变更日期早于原文件的文件。
scons的两种构建脚本(SConstruct和SConscript):
根据构建过程使用一个依赖关系图的设计原则
  • SConstruct只能有一个,它是最顶层的构建脚本。
  • SConscript不能单独执行,只能由SConstruct或其他的SConscript调用执行。
使用VariantDir和SConscript设置构建目录:
  • 默认的情况下,scons会把编译的结果直接放在源码目录,也就是构建目录就是源码目录。
  • 使用VariantDir指定的构建目录只对SConscript所在目录之下的目录有效。
  • SConscript中的相对路径是相对于SConscript所在目录的,在设置VariantDir之后,相对路径自动变为相对于VariantDir,所以在SConscript中配置的源代码文件的路径最好是相对路径,这样VariantDir如果变更,不用修改SConscript。
常用scons函数和相关构造变量:
env.StaticObject()
  • 创建静态目标文件,主要用于生成静态库,它所生成的目标不能用于动态库的创建,scons内部有检查机制来确保这点。内置scanner会自动扫描依赖的头文件,但不能扫描宏定义的头文件引用,这种情况需要使用ParseDepends来添加依赖关系。
  • 相关的内置构建环境变量:
CPPDEFINES    宏定义
CPPPATH          头文件目录,scons内置的scanner会根据该变量中定义的目录自动扫描源码所依赖的头文件,所以不要将头文件目录用-I的形式手动写到CPPFLAGS中。
CPPFLAGS        编译选项
上述变量会应用于C、C++和汇编文件。
CFLAGS
只会影响C文件
CXXFLAGS
只会影响C++文件
ASFLAGS
只会影响汇编文件
CCFLAGS
会影响C和C++文件
CC              C编译器
CCCOM      C编译命令
CXX            C++编译器
CXXCOM     C++编译命令
AS               汇编器
ASCOM       汇编编译命令
env.StaticLibrary()
  • 创建静态库
  • 相关的内置构建环境变量:
ARFLAGS    打包命令选项
AR               打包程序
ARCOM       打包命令
RANLIBFLAGS
RANLIB
RANLIBCOM
env.Program()
  • 连接并创建可执行程序
  • 相关的内置构建环境变量:
LINKFLAGS   连接时用到的选项
LIBS               连接时用到的库,不要在LINKFLAGS中以-l的形式添加库,否则scons不能自动生成对库的依赖关系。
LIBPATH        库的搜索路径,不要在LINKFLAGS中以-L的形式添加库的搜索路径,否则scons不能自动生成对库的依赖关系。
LINK               连接器
LINKCOM       连接命令
此条目发表在操作系统分类目录,贴了标签。将固定链接加入收藏夹。