分享

使用scons替代makefile(3)

 心不留意外尘 2016-04-21
from http://andylin02./blog/894908
在上两篇文章中已经简单介绍了用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")

这种方式将环境和动作分开,更有条理一些。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多