scons是一個Python寫的自動化構建工具,從構建這個角度說,它跟GNU make是同一類的工具。
scons就是這樣一個構建工具:你告訴它要做的任務,以及完成這個任務需要的輸入,以及這個任務產生的輸出,怎麼做這個任務(當然其中就包括依賴性分析),就交給工具本身完成。
scons主要的命令有:
1. 只有一個 test.c文件,需要編譯成可執行文件。
創建SConstruct,內容爲:
Program('test.c')
2. 只有一個文件,想編譯成object文件。
Object('test.c')
3. 有多個.c文件,並想指定生成的程序名:
Program('program', ['prog.c', 'file1.c', 'file2.c']) 或 Program('program', Glob["*.c"])
4. SCons還對output file和source file有關鍵字,可以用來指定
src_files = Split('main.c file1.c file2.c')
Program(target = 'program', source = src_files)
因爲有關鍵字指定,多以可以換前後:
Program(source = src_files, target = 'program')
5. 創建庫:
Library('foo', ['f1.c', 'f2.o', 'f3.c', 'f4.o'])
6. 建立靜態和動態庫:
靜態庫:其實使用Library也是建立靜態庫。
StaticLibrary('foo', ['f1.c', 'f2.c', 'f3.c'])
動態庫:
SharedLibrary('foo', ['f1.c', 'f2.c', 'f3.c'])
7. 使用靜態和動態庫:
使用$LIBS 來指定庫,使用$LIBPATH 指定庫位置。
Library('foo', ['f1.c', 'f2.c', 'f3.c'])
Program('prog.c', LIBS=['foo', 'bar'], LIBPATH='.')
下面舉例來說明:
假設我有一個工程,工程目錄如下:
sconsTest
include
hello.h
src
hello.cpp
main
test.cpp
在根目錄sconsTest下創建名爲"Sconstruct"的文件,內容如下:
SConscript(['src/SConstruct','main/SConstruct'])
obj_files=['main/test.obj','src/hello.obj']
Program('hello', obj_files)
在src和main目錄下分別創建"Sconstruct"文件,內容分別爲:
Object('hello.cpp', CPPPATH=['../include'])
Object('test.cpp', CPPPATH=['../include'])
我們只需要在根目錄"sconsTest"下執行"scons",即可生成一個名爲"hello.exe"的可執行文件.
在Scons中,還提供了環境變量,共分爲3種環境變量:
1. External Environment
2. Construction Environment
3. Execution Environment