如何从命令行调用父SConstruct构建SConscript指定的目标库
How to Build Only One Specific Library with SCons (No Custom Options Needed)
其实你完全不用依赖自定义AddOption来控制构建目标——SCons本身就提供了原生的方式,直接在命令行指定你想要的目标文件即可,简单又高效。
先回顾下你的现有构建脚本:
D:\tony\SConstruct
# Define environmental/project constants TOOLS = ['gcc', 'g++', 'gnulink', 'ar'] PATH = ['C:/cygwin/bin'] CYGWIN = ['nodosfilewarning'] DECIDER = 'MD5-timestamp' # Use a combination of timestamps and checksums to decide if dependencies have changed. # Initialize the Default Environment and update values. env = DefaultEnvironment(tools=TOOLS) env['ENV']['PATH'] = PATH env['ENV']['CYGWIN'] = CYGWIN env.Decider(DECIDER) # Call subsidiary SConscript files with defined environment variables. SConscript('libraries/SConscript', exports = 'env', duplicate = 0) # do not copy src files to build directory.
D:\tony\libraries\SConscript
# Define environmental/project constants CPPPATH = ['../headers'] SOURCES = ['greeter.cxx'] # Inherit the parent environment and update values if necessary. Import('env') # Build targets using defined environment variables. print "Building libraries" env.StaticLibrary(target = 'lib_greeter.a', source = SOURCES, CPPPATH = CPPPATH) env.SharedLibrary(target = 'greeter.dll', source = SOURCES, CPPPATH = CPPPATH)
方法1:直接指定目标文件路径(推荐)
SCons允许你在命令行中直接传入目标文件的相对路径(相对于SConstruct所在的根目录D:\tony\),这样它只会构建这个目标及其依赖,不会碰其他目标。
比如:
- 要只构建共享库
greeter.dll,运行:scons libraries/greeter.dll - 要只构建静态库
lib_greeter.a,运行:scons libraries/lib_greeter.a
这个方法完全不需要修改现有脚本,是最直接的解决方案。
方法2:用别名简化命令(可选)
如果觉得输入完整路径太繁琐,你可以给目标添加别名,用更短的名称来调用。
修改D:\tony\libraries\SConscript,在文件末尾添加:
# 添加别名,方便命令行快速调用 env.Alias('shared_lib', 'greeter.dll') env.Alias('static_lib', 'lib_greeter.a') # 返回别名,让顶层SConstruct能识别它们 Return('shared_lib', 'static_lib')
之后你就可以用更简洁的命令构建:
# 构建共享库 scons shared_lib # 构建静态库 scons static_lib
这种方式同样不需要自定义命令行选项,利用SCons原生的Alias功能就能实现,比AddOption更轻量。
内容的提问来源于stack exchange,提问作者LongTP5
相关产品推荐
相关产品推荐

