3.1. Specifying the Name of the Target (Output) File
當你呼叫Program()時,Scons會build出跟source file一樣檔名的程式,如果要build不同檔名的程式,可以Program()左邊參數放檔名,右邊放source filebrook@vista:~/scons/03.1$ cat SConstruct Program('new_hello', 'hello.c') brook@vista:~/scons/03.1$ scons -Q gcc -o hello.o -c hello.c gcc -o new_hello hello.o brook@vista:~/scons/03.1$ scons -c -Q Removed hello.o Removed new_hello
3.2. Compiling Multiple Source Files
如果要從多個source file建立程式,只需在Program()放置python list,則會建立以第一個source file為檔名的程式檔brook@vista:~/scons/03.1$ cat SConstruct Program(['hello.c', 'a.c']) brook@vista:~/scons/03.1$ scons -Q gcc -o a.o -c a.c gcc -o hello.o -c hello.c gcc -o hello hello.o a.o
如果要建立不同程式名稱,只需在Program()左邊參數放檔名,右邊放source file list即可
brook@vista:~/scons/03.1$ cat SConstruct Program('new_hello', ['hello.c', 'a.c']) brook@vista:~/scons/03.1$ scons -Q gcc -o a.o -c a.c gcc -o hello.o -c hello.c gcc -o new_hello hello.o a.o
3.3. Making a list of files with Glob
你可以適用Glob()來找尋matching的檔案,其語法可以使用*, ? and [abc]等shell的regular expressionbrook@vista:~/scons/03.02$ cat SConstruct Program('new_hello', Glob("*.c")) brook@vista:~/scons/03.02$ scons -Q gcc -o a.o -c a.c gcc -o hello.o -c hello.c gcc -o new_hello a.o hello.o
3.4. Specifying Single Files Vs. Lists of Files
SCons將所有source file視為list,只要符合list即可# The following two calls both work correctly: Program('program1', 'program1.c') Program('program2', ['program2.c'])
common_sources = ['file1.c', 'file2.c'] # THE FOLLOWING IS INCORRECT AND GENERATES A PYTHON ERROR # BECAUSE IT TRIES TO ADD A STRING TO A LIST: Program('program1', common_sources + 'program1.c') # The following works correctly, because it's adding two # lists together to make another list. Program('program2', common_sources + ['program2.c'])
3.5. Making Lists of Files Easier to Read
SCons中的Split()可以將字串內的檔案換成list,讓developer寫一個容易閱讀的listbrook@vista:~/scons/03.4$ cat SConstruct print('a.c b.c c.c') print(Split('a.c b.c c.c')) src_files = Split('a.c b.c c.c') print(src_files) brook@vista:~/scons/03.4$ scons -Q a.c b.c c.c ['a.c', 'b.c', 'c.c'] ['a.c', 'b.c', 'c.c'] scons: `.' is up to date.
3.6. Keyword Arguments
Python預設是positional argument(位置參數),是按順序傳入function。關鍵字參數(keyword argument),顧名思義是以關鍵字方式傳入,使用keyword argument時,對順序沒有要求。Program(target, source)src_files = Split('main.c file1.c file2.c') Program(target = 'program', source = src_files) src_files = Split('main.c file1.c file2.c') Program(source = src_files, target = 'program')
3.7. Compiling Multiple Programs
如果要編譯多個程式,只需多描述幾行Program()即可brook@vista:~/scons/03.7$ cat SConstruct Program('a.c') Program('b.c') brook@vista:~/scons/03.7$ scons -Q gcc -o a.o -c a.c gcc -o a a.o gcc -o b.o -c b.c gcc -o b b.o
3.8. Sharing Source Files Between Multiple Programs
SCons會自行判斷build的dependence,所以你只需照實描述各個program所需的source file即可brook@vista:~/scons/03.7$ cat SConstruct Program('a', ['a.c', 'comm.c']) Program('b', ['b.c', 'comm.c']) brook@vista:~/scons/03.7$ scons -Q gcc -o a.o -c a.c gcc -o comm.o -c comm.c gcc -o a a.o comm.o gcc -o b.o -c b.c gcc -o b b.o comm.o
3.9. Overriding construction variables when calling a Builder
當你在呼叫這些builder時,Scons允許你帶入一些參數或覆蓋原本的參數,如 adds 'include' to $CPPPATH, 'EBUG' to $CPPDEFINES, and 'm' to $LIBS.Program('hello', 'hello.c', parse_flags = '-Iinclude -DEBUG -lm')
-
參考資料:
- SCons 3.0.1 User Guide