在上两篇文章中已经简单介绍了用scons编译库文件,可执行程序的方法,本篇中将主要介绍scons的其他一些常用参数以及变量。
scons不带参数执行的时候会执行编译动作,对于内容改变过的源文件它会自动重新编译,scons对文件状态的改变靠的是内容的md5而不是时间戳,这是scons和makefile不同的一点。它对文件信息和状态的记录保存在当前目录下的.sconsign.dblite文件中。
scons最常用的参数有两个,-c和-Q。
scons -c可以清除生成的临时文件和目标文件,相当于执行make clean。
scons -Q将产生更少的输出信息。
在编译和链接的过程中经常会附加一些参数,例如定义头文件包含路径,链接库的路径或者宏定义等,这些参数当然都是可以定制的,常用的变量有如下一些:
LIBS:指定链接的库文件,比如要链接 libpthread.so,则写为 LIBS=['pthread']
LIBPATH:库文件搜索路径,例如 LIBPATH=['/usr/local/lib/','.']
CPPPATH:include文件包含路径,例如CPPPATH = ['/home/project/inc']
CPPDEFINES:宏定义,例如CPPDEFINES=’DEBUG’
CC:编译器,默认情况下scons会根据源文件后缀自动判断。
CFLAGS:编译参数,例如CFLAGS = ‘-g -W’
LDFLAG:链接参数,例如LDFLAG = ‘-g’
可以看到,上述变量的值可以为字符串’-g’。当指定多个值时候,采用python中的list类型。
这些变量的使用地点很灵活,一般可以在两个地方使用。
第一种,直接使用在Program,Library等指令中,例如
Program("demo","main.c",CC='gcc',CFLAGS=['-g','-W'],CPPDEFINES=['DEBUG','OK'],CPPPATH='/usr/local/include',LIBS=["demo"],LIBPATH=["."]);
执行scons -Q后的输出如下
[leconte@localhost demolib]$ scons -Q
gcc -o a.os -c -fPIC a.c
gcc -o b.os -c -fPIC b.c
gcc -o main.o -c -g -W -DDEBUG -DOK -I/usr/local/include main.c
gcc -o libdemo.so -shared a.os b.os
gcc -o demo main.o -L. -ldemo
可以看到我们定义的宏都起作用了。
另外一种方式,也是实际项目中会用到的方法,则是预先用Environment设置编译环境
env = Environment(CC = 'gcc', CFLAGS = ['-g','-W'], CPPDEFINES=['DEBUG','OK'],CPPPATH='/usr/local/include',LIBS=["demo"], LIBPATH=["."])
env.Program("demo","main.c")
这种方式将环境和动作分开,更有条理一些。
阅读(1574) | 评论(0) | 转发(0) |