SCons - 简单而强大的项目编译脚本

N年前学的makefile,当时还勉强能写一些简单的工程编译,现在已经基本忘了。makefile确实编写复杂,而且平时也不是经常使用,容易忘记。偶识了scons,一切都变的简单了。最近研究了下scons,原来需要上百行的makefile编译过程,现在只需要十行不到,而且没有makefile那些繁杂的结构语法,完全使用python语言就可以进行编译脚本编写,非常好记忆和编译一些大的工程。 直接使用apt-get install scons命令就可以完成安装,需要python环境。

Scons命令 scons:进行代码文件编译 scons -Q:进行代码文件编译,不显示Scons内部操作打印的信息,只显示编译信息 scons -c:清除编译中间文件和可执行文件

Scons编译脚本 Scons对应的编译脚本名称为SConstruct,就如同make对应的编译脚本为makefile

SConstruct脚本编写 编译函数 Program():执行编译操作,生成可执行文件 Library():执行编译操作,生成静态库 StaticLibrary():执行编译操作,生成静态库 SharedLibrary():执行编译操作,生成动态库 Environment():编译环境

编译参数 target,生成的执行文件名字 source,编译文件 LIBS,依赖库 LIBPATH,依赖库路径,有环境变量的可不添加,针对用户库或第三方库 CPPPATH,头文件路径 CCFLAGS,编译参数

其他函数 Split():将字符串分隔为列表 Glob('*.cpp'):加入所有文件

编译参数可以以任意顺序加入编译函数,编译函数依据编译参数对代码文件进行编译。

一个简单例子 将文件放在当前目录,头文件放在上级目录。

str = Split('main.cpp display.cpp') 2 Program('main',str,CPPPATH = '../'i,LIBS = 'pthread')

一个复杂项目的例子 大多项目都可以套用的格式,Program内参数多个文件需要以python列表形式作为入参,这里可以用Split对文件字符串分隔为列表输入。直接用Glob('*.cpp')包含当前目录所有需要编译的cpp文件。

TARGETNAME = 'server'
  
LIB = Split('jsoncpp logger ACE basetool tinyxml pthread dl rt')

FILELIST = Glob('*.cpp')
 
HEADFILEPATH = Split('../../common/include ../../3rd/ACE_wrappers ../../3rd/include/')
 
LIB_DIR = Split('../../3rd/lib ../../common/lib')
 
Program(target = TARGETNAME,source = FILELIST,LIBS = LIB,CPPPATH = HEADFILEPATH,LIBPATH = LIB_DIR)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏IT笔记

Spring Quartz任务案例源码实现

写在开始 上一篇有讲到 springTask任务案例源码实现 此篇,spring整合Quartz实现更强大的定时任务。 任务介绍 Quartz存储job方式就...

2894
来自专栏铭毅天下

上线必备 | 高性能ES5.X部署配置清单

| 题记 | 网上当前(截止20170914)流传的各种配置文件普通存在以下问题: 1)版本低,不能和当前版本5.X匹配。 2)5.X的配置本身较1.X,2...

39311
来自专栏技术小讲堂

ASP.NET AJAX(11)__ScriptManagerUpdatePanel的支持成员功能控制成员脚本控件支持成员ScriptMode和ScriptPathLoadScriptsBeforeU

ScriptManager的作用,这个不言而喻,它是整个的ASP.NET AJAX的核心 UpdatePanel的支持成员 static void Regist...

3106
来自专栏james大数据架构

android 项目中出现红色感叹号的解决方法

【问题原因】:工程中classpath中指向的包路径错误 【解决办法】:右键项目名称 BuildPath ---> Configure Build Paht.....

20310
来自专栏黑泽君的专栏

day67_Redis学习笔记_03

  上边的配置说明当前该【从redis服务器】所对应的【主redis服务器】的IP是192.168.5.128,端口是6379。

1103
来自专栏Java帮帮-微信公众号-技术文章全总结

Quartz调度源码分析【面试+工作】

Quartz内部提供的调度类是QuartzScheduler,而QuartzScheduler会委托QuartzSchedulerThread去实时调度;当调度...

1112
来自专栏编程

单点登录系统实现

单点登录系统实现基于SpringBoot 今天的干货有点湿,里面夹杂着我的泪水。可能也只有代码才能让我暂时的平静。通过本章内容你将学到单点登录系统和传统登录系统...

5347
来自专栏Albert陈凯

Zookeeper安装部署调试命令

下载地址: http://www.apache.org/dyn/closer.cgi/zookeeper/ 我选用清华的镜像 https://mirrors...

2965
来自专栏bluesummer

StackExchange.Redis学习笔记(四) 事务控制和Batch批量操作

Redis事物 Redis命令实现事务 Redis的事物包含在multi和exec(执行)或者discard(回滚)命令中 和sql事务不同的是,Redis调用...

32912
来自专栏搜云库

CentOs7.3 搭建 Redis-4.0.1 单机服务

CentOs7.3 搭建 Redis-4.0.1 单机服务 Redis 简介 Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据...

2555

扫码关注云+社区

领取腾讯云代金券