C++軟體開發常用輔助軟體——SCons
阿新 • • 發佈:2020-07-21
SCons
scons是一個Python寫的自動化構建工具。每次構建時,會自動執行必要的命令以及重建必要的元件(即整個專案如果只修改了一份原始碼檔案,將僅重新構建跟這份原始碼相關的元件)。
預設構建時,將自動查詢當前目錄是否存在SConstruct、Sconstruct、sconstruct的檔案(依次查詢、找到就停),然後執行該檔案,也可以使用“-f”選項指定構建檔案。
示例
假設當前專案需要用到動態庫以及C/C++混編,目錄結構如下:
src/a.cpp src/a.h src/main.cpp src/mod0: b.cpp b.h src/mod1: c.c c.h
main.cpp
1 #include "a.h" 2 #include "b.h" 3 extern "C" 4 { 5 #include "c.h" 6 } 7 #include <stdio.h> 8 9 int main() 10 { 11 puts("Hello"); 12 A(); 13 B(); 14 C(); 15 return 0; 16 }View Code
a.h
1 #ifndef _a_H_ 2 #define _a_H_ 3 void A(); 4 #endifView Code
a.cpp
1 #include "a.h" 2 #include <stdio.h> 3 void A() 4 { 5 puts("A"); 6 }View Code
mod0/b.h
1 #ifndef _b_H_ 2 #define _b_H_ 3 void B(); 4 #endifView Code
mod0/b.cpp
1 #include "b.h" 2 #include <math.h> 3 #include <stdio.h> 4 void B() 5 { 6 printf("%f\n", log2(1024));View Code7 }
mod1/c.h
1 #ifndef _c_H_ 2 #define _c_H_ 3 void C(); 4 #endifView Code
mod1/c.c
1 #include "c.h" 2 #include <stdio.h> 3 void C() 4 { 5 puts("C"); 6 }View Code
只需要將SConstruct如下編寫即可
1 #! /usr/bin/env python 2 debug = ARGUMENTS.get('debug', '0') 3 4 cc = 'gcc' 5 ccflags = ['-D_REENTRANT', '-Wall', '-W', '-mavx2', '-O3'] 6 cpppath = ['src/mod1'] 7 CEnv = Environment(CC=cc, CCFLAGS=ccflags, CPPPATH=cpppath) 8 csrc = [] 9 for dirs in cpppath: 10 if int(debug) == 1: 11 obj_path = 'obj_debug/'+dirs 12 else: 13 obj_path = 'obj_release/'+dirs 14 VariantDir(obj_path, dirs, duplicate = 0) 15 now_obj = CEnv.Object(Glob(obj_path+'/*.c')) 16 csrc = csrc + now_obj 17 18 cc = 'g++' 19 ccflags = ['-D_REENTRANT', '-W', '-Werror', '-mavx2', '-std=c++11', '-O3'] 20 cpppath = ['src', 'src/mod0', 'src/mod1'] 21 libs = ['pthread', 'm'] 22 libpath = [] 23 ldflags = [] 24 25 target_name = 'outa-r' 26 if int(debug) == 1: 27 ccflags.append('-g') 28 target_name = 'outa-g' 29 30 env = Environment(CXX=cc, CCFLAGS=ccflags, CPPPATH=cpppath, LIBS=libs, LIBPATH=libpath, LINKFLAGS=ldflags) 31 cppsrc = [] 32 for dirs in cpppath: 33 if int(debug) == 1: 34 obj_path = 'obj_debug/'+dirs 35 else: 36 obj_path = 'obj_release/'+dirs 37 VariantDir(obj_path, dirs, duplicate = 0) 38 now_obj = env.Object(Glob(obj_path+'/*.cpp')) 39 cppsrc = cppsrc + now_obj 40 41 env.Program(target = target_name, source = cppsrc + csrc)View Code
當需要將靜態庫加入時,只需要修改“Program”函式的‘source“引數即可