介绍,scons用的是python语法。需要安装python和scons后才能运行,能够跨平台。比较automake自动生成makefile文件,scons可以认为直接是make的功能,因为只需要执行scons命令就等于执行了make的功能。
现在有一个hello.c的文件。
新建一个SConstruct文件,是一个python脚本文件。
Program('hello.c') 编译hello.c并生成.o文件和可执行文件
Object('hello.c') 编译hello.c但只生成生成.o文件
这两个方法都是python的method。
如果想执行clean操作,我们不需要再象makefile那样指名make clean语句,而是直接执行scons -c 或者scons -clean就可以。程序会根据SConstruct文件内容自动清除。
SConstruct的读取和执行顺序是彼此独立的,直接看以下例子。
SConstruct文件内容:
print "Calling Program('hello.c')" Program('hello.c') print "Calling Program('goodbye.c')" Program('goodbye.c') print "Finished calling Program()"
执行结果:
% scons scons: Reading SConscript files ... Calling Program('hello.c') (1) Calling Program('goodbye.c') (2) Finished calling Program() scons: done reading SConscript files. scons: Building targets ... cc -o goodbye.o -c goodbye.c (2) cc -o goodbye goodbye.o (1) cc -o hello.o -c hello.c cc -o hello hello.o scons: done building targets.
由于在执行scons时一些输出信息反而会混淆我们,所以可以加参数 -Q来关闭一些输出提示。
Program('new_hello', 'hello.c') #第一个参数可以指定目标文件名字,默认为hello,第二个参数就是source files。
多源文件编译指定:
Program('program', ['prog.c', 'file1.c', 'file2.c']) #如果没有第一个参数,则以第二个参数(这是一个python list,用【】表示)的第一个元素为program的名字。
如果你觉得列表里面每个文件都需要带一个引号太麻烦,可以利用
Program('program', Split('main.c file1.c file2.c')) #这里的split函数是返回一个列表
也可以这么用来提高可读性
src_files = Split('main.c file1.c file2.c') #中间多少个空格无所谓
Program('program', src_files)
也可利用Glob函数获得名字列表,Golb('*.c')返回规则匹配的string列表,就是类似上面的'prog.c', 'file1.c', 'file2.c'。
Program('program', Glob('*.c'))
两个关键字可以直接指明target和source,所以在Program
src_files = Split('main.c file1.c file2.c') Program(target = 'program', source = src_files)
src_files = Split('main.c file1.c file2.c')
Program(source = src_files, target = 'program') #可以调换参数顺序
多工程共享source files的话:
common = ['common1.c', 'common2.c'] #把共同的文件列表单独提取出来,以便维护 foo_files = ['foo.c'] + common bar_files = ['bar1.c', 'bar2.c'] + common Program('foo', foo_files) Program('bar', bar_files)
building library:
Library('foo', ['f1.c', 'f2.c', 'f3.c']) #文件列表 #静态库
Library('foo', ['f1.c', 'f2.o', 'f3.c', 'f4.o']) #文件列表喝object文件
StaticLibrary('foo', ['f1.c', 'f2.c', 'f3.c']) #静态library,其实跟Library调用没区别,只是显示强调是静态库
SharedLibrary('foo', ['f1.c', 'f2.c', 'f3.c']) #共享库,类似dll
The output on POSIX:
% scons -Q cc -o f1.os -c f1.c cc -o f2.os -c f2.c cc -o f3.os -c f3.c cc -o libfoo.so -shared f1.os f2.os f3.os
link library:
Library('foo', ['f1.c', 'f2.c', 'f3.c'])
Program('prog.c', LIBS=['foo', 'bar'], LIBPATH='.') #指定库,指定库的路径。
注意-l,-L,-i,-I的用法。
LIBPATH变量:
LIBPATH = '/usr/lib:/usr/local/lib' #unix用:分开
LIBPATH = 'C:\\lib;D:\\lib' #windows用;分开
CPPPATH变量:类似 -I指定,指定编译目录 #声明了这个选项是用于隐式依赖,比如某些cpp文件包含了h文件,当这些h文件更改时,就会重编这些cpp对应的对象。每次编译的时候,会去搜索这些隐式依赖,所以会消耗一些时间
Program('hello.c', CPPPATH = '.') #这里会让编译器同时关注hello.c里面include的h文件
Program('hello.c', CPPPATH = ['include', '/home/project/inc'])
编译结果:
% scons -Q hello
cc -o hello.o -c -Iinclude -I/home/project/inc hello.c
cc -o hello hello.o
--implicit-cache参数可让scons高速缓存哪些隐式依赖关系,这样能减少搜索隐私依赖的时间。如:
% scons -Q --implicit-cache hello
cc -o hello.o -c hello.c
cc -o hello hello.o
% scons -Q hello
scons: `hello' is up to date.
当你不想每次都输入这个参数时,可以在SConstruct文件中加入这个语句:SetOption('implicit_cache', 1)
有时scons扫描器检查不出一些文件的依赖性,可以利用Depends函数显示地的指明依赖性:
hello = Program('hello.c')
Depends(hello, 'other_file')
如果想让某个依赖文件改变时不重编,可以用Ignore函数设置忽略这些依赖性:
hello_obj=Object('hello.c')
hello = Program(hello_obj)
Ignore(hello_obj, 'hello.h')
每次都想重编一个目标,可用AlwaysBuild函数设置:
hello = Program('hello.c') AlwaysBuild(hello)
环境变量:有三种,外部环境变量(外部环境信息),scons环境变量(控制scons行为的变量),执行环境变量。变量是很多变量的集合,包括变量名和变量值。
env = Environment() #创建默认的环境变量,默认scons会按编译器的默认选项来进行编译
import os
env = Environment(CC = 'gcc',CCFLAGS = '-O2') #创建并设置环境 变量
env.Program('foo.c')
% scons -Q gcc -o foo.o -c -O2 foo.c gcc -o foo foo.o
环境变量访问:env = Environment()
print "CC is:", env['CC']
另一种访问环境变量的方法,试用环境变量的subst方法,而且它还对下面的变量不断展开直到无法继续展开,例如下面两个例子:
env = Environment(CCFLAGS = '-DFOO') print "CCCOM is:", env['CCCOM'] #输出 CCCOM is: $CC $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINC FLAGS -c -o $TARGET $SOURCES
print "CCCOM is:", env.subst('$CCCOM') #输出 CCCOM is: gcc -DFOO -c -o #这里将上面的变量值展开了
默认环境DefaultEnvironment(); 试用方法跟上面的环境变量一样,不过控制范围是默认的所有配置。在默认环境中设置好一些变量,可以提高编译速度,比如在默认环境变量中制定了编译器的位置,这样的话可以省去搜索 默认编译器位置的 消耗。如:
env = DefaultEnvironment(tools = ['gcc', 'gnulink'], CC = '/usr/local/bin/gcc') #显式指定编译器位置
多环境变量: opt = Environment(CCFLAGS = '-O2')
dbg = Environment(CCFLAGS = '-g') opt.Program('foo', 'foo.c') dbg.Program('bar', 'bar.c')
复制环境变量:env = Environment(CC = 'gcc')
opt = env.Clone(CCFLAGS = '-O2') dbg = env.Clone(CCFLAGS = '-g') env.Program('foo', 'foo.c') o = opt.Object('foo-opt', 'foo.c') opt.Program(o) d = dbg.Object('foo-dbg', 'foo.c') dbg.Program(d)
替换环境变量值:env = Environment(CCFLAGS = '-DDEFINE1')
env.Replace(CCFLAGS = '-DDEFINE2') env.Program('foo.c')
替换注意事项: env = Environment(CCFLAGS = '-DDEFINE1') #-DDEFINE1
print "CCFLAGS =", env['CCFLAGS'] env.Program('foo.c') env.Replace(CCFLAGS = '-DDEFINE2') #-DDEFINE2 print "CCFLAGS =", env['CCFLAGS'] env.Program('bar.c')
#上面设置了两次,但当程序开始编译的时候,只会以最后一次配置的值为准,所以请看下面的结果:
% scons scons: Reading SConscript files ... CCFLAGS = -DDEFINE1 CCFLAGS = -DDEFINE2 scons: done reading SConscript files. scons: Building targets ... cc -o bar.o -c -DDEFINE2 bar.c cc -o bar bar.o cc -o foo.o -c -DDEFINE2 foo.c cc -o foo foo.o scons: done building targets.
env.SetDefault(SPECIAL_FLAG = '-extra-option') #默认变量不存在时设置
添加新的变量: env = Environment() env.Append(NEW_VARIABLE = 'added') #不存在时自动创建并赋值;存在时变量的值是append上去而不是assign的
env.AppendUnique(CCFLAGS=['-g']) #该变量不存在时才添加
env.Prepend(CCFLAGS = ['-DFIRST']) #在变量值前面插入,不存在则自动创建并赋值,跟append相似
env.PrependUnique(CCFLAGS=['-g']) #该变量不存在才前插
相关推荐
2. **构建自动化**:构建工具如Make、CMake或SCons可以帮助自动化编译和链接过程。它们读取构建脚本(如Makefile或CMakeLists.txt),根据配置生成可执行文件或库。 3. **依赖管理**:CMake可以用于管理项目依赖,...
近做了一系列的单元测试相关的工作,除了各种规范及... 在Linux上的c/c++开发一般都使用gcc/g++作为主要的编译器,如果需要产生覆盖率数据需要在Makefile或者Scons文件中做下面的编译链接设置, 编译的时候,增加
8. **C/C++编程与Makefile**:在C或C++项目中,Makefile通常用于管理编译过程,包括预处理、编译、链接等步骤。通过设置编译标志,可以控制优化级别、调试信息和警告等级。 9. **Linux面试中的Makefile**:在Linux...
总的来说,SCons是面向现代软件开发需求的构建系统,它通过提供强大的灵活性、自动化和跨平台能力,解决了Make在某些场景下的局限性,成为C/C++等项目构建的理想选择。对于大型项目或需要在多平台间频繁迁移的团队来...
《GNU Makefile中文手册V3.80》是学习和理解GNU Make工具的重要参考资料,尤其对于C/C++程序员来说,掌握Makefile的编写技巧是构建高效自动化编译环境的关键。在本文中,我们将深入探讨GNU Makefile的核心概念、规则...
3. **配置文件**:可能包括`.scons`或Makefile,用于构建过程,指示编译器如何编译和链接源代码。 4. **库文件**:如果LPC922的驱动程序或特定功能库包含在内,可能会有`.a` 或 `.lib` 文件。 5. **文档**:可能有`....
在实际应用中,Makefile的灵活性使得它不仅限于编译C/C++项目,还可以用于处理文档生成、测试运行等各种任务。通过合理的规则定义,开发者可以创建出适应各种需求的构建流程。对于大型项目,Makefile的管理可能变得...
Makefile在IT行业中扮演着重要的角色,它是构建、编译和管理C/C++等编程项目的关键工具,帮助开发者高效地自动化重复的编译过程。通过学习此资料,你可以深入了解如何利用Makefile提升开发效率。 1. **Makefile基础...
"解决间接编译依赖的makefile"这个主题旨在介绍如何通过优化Makefile来处理复杂的编译依赖关系,特别是在C++项目中,间接依赖可能导致不必要的重复编译,浪费时间和资源。下面将深入探讨这个话题。 首先,理解编译...
1. **简单的C/C++程序构建**:只需要编写一个简单的SConstruct文件,并定义构建规则即可。 2. **构建对象文件**:SCons支持直接构建单个或多个源文件的对象文件。 3. **简单的Java构建**:同样可以通过SCons轻松地...
在这个场景中,它是为Python 2.7和SCons提供编译环境的,使得可以在Windows上编译和链接C/C++扩展模块或其他依赖本地编译的Python项目。 知识点详细说明: - **Python环境**: Python 2.7的安装包括解释器、标准库...
首先,SCons的设计理念是替代传统的Makefile系统,它旨在简化编译和构建过程,尤其是对于大型、多模块的项目。SCons基于Python,这意味着它拥有Python的灵活性和可读性,同时也能够利用Python的生态系统,如第三方库...
7. **编译脚本**:如Makefile或cmake文件,用于自动化编译过程,确保正确地编译和链接所有源文件。 8. **工具链支持**:可能包含针对不同开发环境(如Keil MDK, IAR EWARM, GCC等)的工具链设置和配置文件。 9. **...
SCons是一款跨平台的编译脚本工具,它允许用户无需编写makefile即可实现项目的编译构建。SCons使用Python语言编写,它具有极高的灵活性和可配置性,并且能够支持多种编程语言构建。 首先,SCons用户手册开篇介绍了...
简单构建方面,SCons提供了构建简单C/C++程序的规则,对象文件的构建,简单Java构建,构建后清理工作以及SConstruct文件的使用和编写方法。SCons通过Python函数来执行这些构建规则,而且这些函数的调用顺序不影响...
例如,在SCons脚本中,可以通过Python函数来定义如何编译一个C++源文件,并指定源文件与目标文件之间的依赖关系。SCons会根据这些定义自动调用合适的编译器来完成构建任务。 SCons支持多种编程语言和工具链,用户...
在编程世界中,`Makefile` 是一个至关重要的工具,特别是在C/C++等编译型语言的项目中,它用于自动化构建过程,如编译、链接、清理等任务。`Makefile` 的编写通常需要手动指定编译规则,这对于大型项目来说可能会...
简单构建是SCons的基本操作,包括构建C/C++程序、生成目标文件、处理Java项目以及清理构建过程中的临时文件。SConstruct文件作为SCons的配置脚本,实际上是一个Python脚本,允许用户以Python的灵活性来定义构建规则...
特别是在C/C++项目中,makefile能够有效地管理编译过程,避免了因依赖关系混乱导致的编译错误。 #### 六、makefile的常见问题与解决方案 在使用makefile的过程中,常见的问题包括依赖关系不正确、命令执行失败、...
6. **内置对常见编译器和工具的支持**:SCons内建了对C、C++、Java等语言的编译器和链接器的支持,同时也可以轻松扩展到其他语言和工具。 7. **一致性**:SCons保证在所有平台上构建的结果一致,提高了软件的可移植...