Makefile 和scons转换快速参考

Makefile和scons快速转换

makefile是传统C/C++开发项目中最常用的工程管理工具,而现在随着python的日益流行,基于python的代码编译工具scons使用越来越广泛。在一些比较大项目中,可能需要把makefile转换成scons,或者反过来把基于scons转换成makefile,本文结合了笔者碰到的一些项目,总结了一些常用的模式在两种不同工具中的实现。

1.
include 头文件

makefile中的实现:

通过-I指定,比如:-I./
-I/usr/include

scons中的实现:

通过CPPPATH来指定,比如:

cpppath
= Split(‘../include‘)

CPPPATH
= env[‘CPPPATH‘] + cpppath

env.CPPPATH=Split(‘../include‘)

2.修改编译选项

makefile中的实现:

直接跟编译选项:比如-Wall -O3

scons中的实现:

CCFLAGS
= env[‘CCFLAGS‘] + ccflags

env.CCFLAGS=Split(‘-Wall
-O3‘)

修改宏定义:

makefile中的实现:

-DDEBUG
-DRELEASE

scons中的实现:

CPPDEFINES=env[‘CPPDEFINES‘]
+ local_cppdefines

3.文件安装和删除

makefile中的实现,通过定义.PHONY
clean , .PHONY  install实现:

.PHONY:
clean

clean:

-rm
$(TARGET) $(TESTCASE)

.PHONY:
install

install:

-cp
desmon /bin/

-cp
libdes.a /lib/user64/

echo
"Install done!"

scons中的实现:

env.Install(‘/bin‘,
source = [‘desmon‘])

env.Clean(‘/bin‘,
[‘desmon])

4.链接静态库

makefile中的实现:

放在object文件依赖列表里面,depobj=target.o
libdep.a

scons中的实现:

放在.o文件依赖列表里面:例如depobj=Split(‘target.o
libdep.a‘)

5.链接动态库

makefile中的实现:

在链接的阶段指定库的名称,比如-lpthread,表示依赖libpthread.so

scons中的实现:

放在LIBS列表里面,比如指定动态链接libpthread.so:

env.LIBS=Split(‘pthread‘)

6.指定生成的.o文件

makefile中的实现:

gcc
-c -o name.o name.c

scons中的实现:

env.StaticObject()

7.指定生成静态库

makefile中的实现:

ar
rcs -o libtest.a  name1.o name2.o name3.o

scons中的实现:

env.StaticLibrary(target
= ‘libtest‘, source = [‘name1.o name2.o name3.o‘], CPPPATH =
env[‘CPPPATH‘] + cpppath, CCFLAGS = env[‘CCFLAGS‘] + ccflags)

8.指定生成动态库

makefile中的实现:

gcc
-shared -o libtest.so  name1.o name2.o name3.o

scons中的实现:

env.SharedLibrary(‘libtest‘,
[‘name1.o‘,
‘name2.o‘,
‘name3.c‘])

9.指定生成可程序文件:

makefile中的实现:

gcc
-o dest.o name1.o name2.o name3.o,再如:

$(TESTCASE):%:%.o

$(CC)
-o [email protected] $^ $(CFLAGS) $(LIBS) $(INCLUDEPATH)

scons中的实现:

env.Program(target
= item, source = [item + (".o")] + Split(‘libsms.a‘),
CPPPATH = env[‘CPPPATH‘] + cpppath, CCFLAGS = env[‘CCFLAGS‘] +
ccflags, LIBS = locallibs)

10.编译多个目录:

makefile中的实现:

SUBDIRS
= \

Sub1 \

Sub2

all:
    $(SUBDIRS)

for
i in $(SUBDIRS); do $(MAKE) -C $$i all; sleep 2; done

@echo

scons中的实现:

在每个子目录中实现对应的SConscript,在最顶层目录实现SConsctruct,在里面include各个子目录的SConscript

11.编译多个文件

Makefile中,利用makefile自多推导原则:

TESTCASE=a_test
b_test c_event

$(TESTCASE):%:%.o

$(CC)
-o [email protected] $^ $(CFLAGS) $(LIBS) $(INCLUDEPATH)

scons中,利用python
for语句:

testapps
= Split(‘a_test b_test c_event‘)

for
item in testapps:

itemsrc
= item + (".c")

env.StaticObject(itemsrc,
CPPDEFINES = ccflags)

env.Program(target
= item, source = [item + (".o")] + Split(‘libsms.a‘),
CPPPATH = env[‘CPPPATH‘] + cpppath, CCFLAGS = env[‘CCFLAGS‘] +
ccflags, LIBS = locallibs)

12.导入环境变量

makefile中的实现:

可以在shell下export一个环境变量如:
export WKDIR=`pwd`,在makefile里面export之后,之后的子目录的makefile里可通过$(WKDIR)来使用

scons中的实现:以WKDIR为例

在最上层定义env的时候,加入WKDIR到env列表里去,然后export
env。子目录需要用的时候,用Import
(‘env‘)后可以使用WKDIR

13.
scons中调用makefile混用

利用python中sys.Execute()系统命令,在里面执行makefile。

时间: 2024-12-25 06:13:35

Makefile 和scons转换快速参考的相关文章

SED单行脚本快速参考(Unix 流编辑器)

------------------------------------------------------------------------- SED单行脚本快速参考(Unix 流编辑器) 2005年12月29日 英文标题:USEFUL ONE-LINE SCRIPTS FOR SED (Unix stream editor) 原标题:HANDY ONE-LINERS FOR SED (Unix stream editor) 整理:Eric Pement - 电邮:pemente[at]no

Apple Swift 中文教程 快速参考 基本语法 更新中...

总的来说,语法有java的味道,也有python的味道,还有swift自己的味道. 有些语法还是挺不伦不类的,不太好理解,即使你有几年的java或python经验,也不见得有些语法你能很轻松的看明白. 有些语法特性很好,很个性,但有些语法个人感觉乱,特性多,注意点多,还不太好理解. 慢慢学习吧... ================================================================= 值类型 Int Double Bool String 用双引号"&

【翻译】C#和.NET核心快速参考

原文:[翻译]C#和.NET核心快速参考 PS:在网上看到的一篇C#总结,英文的,总结的还可以,都是基础知识,翻译给大家学习.文章结尾有英文原版.发布地址:http://www.cnblogs.com/zxlovenet/p/3745903.html 1.数据类型 类型名 大小 示例 String 2字节/字符 S="reference"; Bool b=true; char 2字节 ch='a'; byte 1字节 b=0x78; short 2字节 lval=54; int 4字节

Emacs常用命令快速参考

Emacs常用命令快速参考 Emacs常用命令的汇总,来自Emacs参考卡片 注意:以下命令中标注的按键,大写的C代表Control,在键盘上通常是Ctrl键,而M代表Meta,在键盘上通常是Alt键,S则代表Shift,在键盘上通常是Shift键,也就是 C Control M Alt S Shift 这三个键在Emacs里通常作为组合键的前导按键使用,也就是说,执行一条命令前可能需要按住这个键不放,比如搜索命令是C-s,要执行这个命令首先要按住Ctrl键不放,再按下字母s键:而打开文件命令是

Linux平台oracle 11g单实例 安装部署配置 快速参考

1.重建主机的Oracle用户 组 统一规范 uid gid 以保证共享存储挂接或其他需求的权限规范 userdel -r oracle groupadd -g 500 oinstall groupadd -g 501 dba useradd -g oinstall -G dba -u 500 oracle #id oracle uid=500(oracle) gid=500(oinstall) 组=500(oinstall),501(dba) 2.安装好Oracle 需要的rpm包.安装rpm

psql命令行快速参考

psql的命令语法是: psql [options] [dbname [username]] psql命令行选项以及它们的意思在表1-1中列出.使用以下命令可以看到psql完整的选项列表: $ psql --help 表1-1 psql命令行选项 选项 意义 -a 从脚本中响应所有输入 -A 取消表数据输出的对齐模式:功能与“-P format=unaligned”相同 -c <查询> 仅仅运行一个简单的查询(或者内部命令)然后退出 -d <数据库名> 指定连接到的数据库名(默认为

SQL 语句快速参考

来自 W3CSchool 的 SQL 快速参考 SQL 语句 语法 AND / OR SELECT column_name(s)FROM table_nameWHERE conditionAND|OR condition ALTER TABLE ALTER TABLE table_name ADD column_name datatype or ALTER TABLE table_name DROP COLUMN column_name AS (alias) SELECT column_name

SQL 快速参考

SQL 快速参考 SQL 语句 语法 AND / OR SELECT column_name(s)FROM table_nameWHERE conditionAND|OR condition ALTER TABLE ALTER TABLE table_name ADD column_name datatype or ALTER TABLE table_name DROP COLUMN column_name AS (alias) SELECT column_name AS column_alia

正则表达式语言 - 快速参考

正则表达式语言 - 快速参考 .NET Framework (current version) 正则表达式是正则表达式引擎尝试匹配输入文本的一种模式. 模式由一个或多个字符文本.运算符或构造组成. 有关简单介绍,请参阅 .NET Framework 正则表达式. 以 Word (.docx) 格式下载 以 PDF (.pdf) 格式下载 字符转义 正则表达式中的反斜杠字符 (\) 指示其后跟的字符是特殊字符(如下表所示),或应按原义解释该字符. 有关详细信息,请参阅正则表达式中的字符转义. 转义