当前位置: 首页 > 工具软件 > SCons > 使用案例 >

scons的使用

陶唯
2023-12-01

1、支持多目录编译(类似于CmakeLists.txt),将多个目录的串起来

Sconconstruct在最顶层
SConscript文件可以层层包含
Sconscript([‘common/SConscript’,‘plugins/Sconscript’])
在common下:
Sconscript([‘src/SConscript’,‘include/SConscript’])
在plugins下:
Sconscript([‘display/SConscript’,‘system/SConscript’])

CmakeLists:

	PROJECT(main)
	CMAKE_MINIMUM_REQUIRED(VERSION 2.6) 
	AUX_SOURCE_DIRECTORY(. DIR_SRCS)
	ADD_EXECUTABLE(main ${DIR_SRCS}  )
	TARGET_LINK_LIBRARIES( main Test )
	FIND_LIBRARY(COMM_LIB comm ../../thirdparty/comm/lib NO_DEFAULT_PATH)
    FIND_LIBRARY(RUNTIME_LIB rt /usr/lib  /usr/local/lib NO_DEFAULT_PATH)
	link_libraries(${COMM_LIB} ${RUNTIME_LIB})
	ADD_SUBDIRECTORY( src )	

2、基本使用

SConstruct文件就功能而言,相当于Makefile文件,就内容而言则是Python脚本。scons执行时会读取该脚本,把脚本命令都执行一遍,但具体编译过程则有scons而定。
Program(‘hello.c’) //源文件
Program(‘new_hello’,‘hello.c’) //前为目标,后为源文件
Program([‘file1.c’,‘file2.c’,‘file3.c’])
Program(‘program’,[‘file1.c’,‘file2.c’,‘file3.c’]) //指定目标文件,多个源文件
Program(‘program’,Glob(’*.c’))
Program(‘program’,Split(‘file1.c file2.c file3.c’))//多个源文件分开
Src_files=Split(""“file1.c file2.c file3.c”"")
Program(target=‘Program’,source=Src_file)

3、多个程序共享源文件

3.1
Program(Split(‘file1.c file2.c file3.c’))
Program(‘bar’,Split(‘file1.c file2.c file3.c’))
3.2
common=[‘file1.c’,‘file2.c’]
foo_files=[‘foo.c’] + common
bar_files=[‘bar1.c’,‘bar2.c’] + common
Program(‘foo’,foo_files)
Program(‘foo’,bar_files)

4、库编译和链接

4.1 库编译
Library(‘foo’,[‘file1.c’,‘file2.c’,‘file3.c’])
4.1.1 也可以混用源文件和编译文件
Library(‘foo’,[‘file1.c’,‘file2.o’,‘file3.c’])
4.1.2 编译静态库
StaticLibrary(‘foo’,[‘file1.c’,‘file2.o’,‘file3.c’]) -> Makefile: ar r libhello.a hello.o 使用链接静态库gcc test.c -lhello -L. -static -o hello.static
4.1.3 编译动态库
SharedLibrary(‘foo’,[‘file1.c’,‘file2.o’,‘file3.c’]) ->Makefile: gcc hello.c -fPIC --shared -o libtest.so 使用动态库gcc test.c -L . -l hello -o test
4.2 库链接
Library(‘foo’,[‘file1.c’,‘file2.o’,‘file3.c’])
Progrom(‘prog.c’,LIBS=[‘foo’,‘bar’],LIBPATH=’.’)

5、依赖关系

5.1 Decider函数-》检测文件是否被修改
Decider(‘MD5’)——>md5值
Decider(‘timestamp-newer’)——>时间戳
Decider(‘MD5-timestamp’)——>两者同时使用
5.2 缓冲隐式依赖关系
Scons -Q -implicit-cache hello 运行选项
SetOption(‘implict_cache’,1) 写在脚本中
这样下次就不需要从头开始找依赖关系
5.3显示依赖关系:Depends函数
当Scons没有找到关系时:
hello=Program(‘hello.c’)
Depends(hello,‘file1.c’)
5.4 总是编译
hello=Program(‘hello.c’)
AlwayBuild(hello)

6、使用环境变量,env=Environmemt()进行初始化

6.1 编译的时候想添加上-g -Wall参数
env=Environment(CCFLAGS = [’-g’,-Wall’])
6.2 使用目录的头文件以及动态库文件或者静态库等
LIBS=[‘m’,‘m2’],LIBPATH=[’/usr/lib/’,’/usr/local/lib’],CPPPATH=[‘include’,’/usr/include’],CCFLAGS=[’-Dhello’,’-Wall -g’],直接用env方式链接
参数
CCFLAGS——C 源文件编译参数
CPPPATH——头文件路径
CPPDEFINES——C源文件编译时额外的宏定义;
LINKFLAGS——连接时应该添加的参数。
LIBRARY——包含此参数,则会将组件生成的目标文件打包成库文件
6.3 添加不同编译参数
flags = env.ParseFlags([’-pthread -I/usr/include/stlport ‘,’ -L .’])
env.MergeFlags(class_flags)//增加一个flags
6.4 基于scons扩展的方法
DefineGroup(name, src, depend,**parameters)
DefineGroup 用于定义一个组件。组件可以是一个目录(下的文件或子目录),也是后续一些 IDE 工程文件中的一个 Group 或文件夹。

7、安装

scons中的实现(scons 直接安装):
env.Install('/bin', source = ['desmon'])  
env.Clean('/bin', ['desmon]) ->cmake中->install(TARGETS exe RUNTIME DESTINATION bin)

以下是Scons和cmake的完整例子:

scons:
env=Environment()
c_flags="-Wall -g"
env.MergeFlags(c_flags)

#env.Append(CPPDEFINES=['MAX(x,y)=(x>y ? x:y)'])
#src=Object(Glob('*.c'))
src=Glob('src/*.c')
#BUILDTIME=string(TIMESTAMP,'%Y%m%d')
#print BUILDTIME
env.Append(CPPDEFINES='__BUILD__=1')  #可转换成程序中的__DATA__进行转换.scons中暂未找到直接获取时间接口
env.Append(LIBS=Split('-lpci -lpthread'))
env.Program('pro',source=src,CPPPATH='include/')

#安装
env.Install('bin/',['pro'])
env.Clean('bin/',['pro'])

cmake:
cmake_minimum_required (VERSION 2.8)
#add_definitions(-std=c11)

PROJECT(pro)
set(CMAKE_INSTALL_PREFIX ./)
# 查找当前目录下的所有源文件
# 并将名称保存到 DIR_SRCS 变量
aux_source_directory(./src DIR_SRCS)
include_directories(./include)
#申明参数外围参数
#时间参数
string(TIMESTAMP TIME "%Y%m%d")
add_definitions(-D__BUILD__=${TIME}) #可转换成程序中的__DATA__进行转换
message("BUILDTIME is ${BUILDTIME}")

set(CMAKE_C_FLAGS "${CFLAGS} -Wall -g")

#申明动态库的名字
LINK_LIBRARIES(-lpci -lpthread)

#link_directories(./lib)#这种主要是链接静态库
# 指定生成目标
add_executable(hdtest ${DIR_SRCS})
#target_link_libraries(hdtest pci)
#set(EXECUTABLE_OUTPUT_PATH ./src)

#安装目录destination
install(TARGETS pro RUNTIME DESTINATION bin)

以下是新的个人博客的地址:http://106.53.224.102:8080/wordpress-zh/feng_8071/linux设备驱动:usb设备驱动/

 类似资料: