diff --git a/.gitignore b/.gitignore index cbbd7a7..51b13bc 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,5 @@ *.o build + +.scon* +__pycache__ diff --git a/hbox/cpp/SConscript b/hbox/cpp/SConscript new file mode 100644 index 0000000..a9abf4f --- /dev/null +++ b/hbox/cpp/SConscript @@ -0,0 +1,23 @@ +from building import * +import os +import sys + +if Env["Enable_HBox_CPP"] is None: + group = [] + Return('group') + +cwd = GetCurrentDir() +src = Glob('*.c') +src += Glob('*.cpp') +CPPPATH = [ +cwd +] + +group = DefineGroup('HBox_CPP', src, depend = [''], CPPPATH = CPPPATH) + +list = os.listdir(cwd) +for item in list: + if os.path.isfile(os.path.join(cwd, item, 'SConscript')): + group = group + SConscript(os.path.join(item, 'SConscript')) + +Return('group') diff --git a/hcppbox/SConscript b/hcppbox/SConscript new file mode 100644 index 0000000..c41e4fa --- /dev/null +++ b/hcppbox/SConscript @@ -0,0 +1,24 @@ +from building import * +import os +import sys + + +if Env["Enable_HCPPBox"] is None: + group = [] + Return('group') + +cwd = GetCurrentDir() +src = Glob('*.c') +src += Glob('*.cpp') +CPPPATH = [ +cwd, +] + +group = DefineGroup('HCPPBox', src, depend = [''], CPPPATH = CPPPATH) + +list = os.listdir(cwd) +for item in list: + if os.path.isfile(os.path.join(cwd, item, 'SConscript')): + group = group + SConscript(os.path.join(item, 'SConscript')) + +Return('group') diff --git a/test/HBoxTest/SConscript b/test/HBoxTest/SConscript new file mode 100644 index 0000000..8c7fdcc --- /dev/null +++ b/test/HBoxTest/SConscript @@ -0,0 +1,23 @@ +from building import * +import os +import sys + + +cwd = GetCurrentDir() + +src = Glob('*.c') +src += Glob('*.cpp') +CPPPATH = [cwd] + +group = DefineGroup('Applications', src, depend = [''], CPPPATH = CPPPATH) + +list = os.listdir(cwd) +for item in list: + if os.path.isfile(os.path.join(cwd, item, 'SConscript')): + group = group + SConscript(os.path.join(item, 'SConscript')) + + +if os.path.isfile(os.path.join(cwd+"/../../", 'SConscript')): + group = group + SConscript(os.path.join(cwd+"/../../", 'SConscript')) + +Return('group') diff --git a/test/HCPPObjectTest/SConscript b/test/HCPPObjectTest/SConscript new file mode 100644 index 0000000..8c7fdcc --- /dev/null +++ b/test/HCPPObjectTest/SConscript @@ -0,0 +1,23 @@ +from building import * +import os +import sys + + +cwd = GetCurrentDir() + +src = Glob('*.c') +src += Glob('*.cpp') +CPPPATH = [cwd] + +group = DefineGroup('Applications', src, depend = [''], CPPPATH = CPPPATH) + +list = os.listdir(cwd) +for item in list: + if os.path.isfile(os.path.join(cwd, item, 'SConscript')): + group = group + SConscript(os.path.join(item, 'SConscript')) + + +if os.path.isfile(os.path.join(cwd+"/../../", 'SConscript')): + group = group + SConscript(os.path.join(cwd+"/../../", 'SConscript')) + +Return('group') diff --git a/test/HRCTest/SConscript b/test/HRCTest/SConscript new file mode 100644 index 0000000..8c7fdcc --- /dev/null +++ b/test/HRCTest/SConscript @@ -0,0 +1,23 @@ +from building import * +import os +import sys + + +cwd = GetCurrentDir() + +src = Glob('*.c') +src += Glob('*.cpp') +CPPPATH = [cwd] + +group = DefineGroup('Applications', src, depend = [''], CPPPATH = CPPPATH) + +list = os.listdir(cwd) +for item in list: + if os.path.isfile(os.path.join(cwd, item, 'SConscript')): + group = group + SConscript(os.path.join(item, 'SConscript')) + + +if os.path.isfile(os.path.join(cwd+"/../../", 'SConscript')): + group = group + SConscript(os.path.join(cwd+"/../../", 'SConscript')) + +Return('group') diff --git a/test/ReadMe.md b/test/ReadMe.md index 1f1dc77..62e843e 100644 --- a/test/ReadMe.md +++ b/test/ReadMe.md @@ -22,3 +22,9 @@ cmake --build . #编译完成后即可在子目录中找到每个测试程序的可执行文件 ``` +# scons + +在当前目录执行`scons`可通过[scons](https://scons.org)编译。 + +注意:scons构建并非主要构建,一般是为了测试[RT-Thread](https://www.rt-thread.org/)的scons构建。 + diff --git a/test/SConstruct b/test/SConstruct new file mode 100644 index 0000000..be87b70 --- /dev/null +++ b/test/SConstruct @@ -0,0 +1,24 @@ +import os +import sys + +#采用默认环境,由于未设置相关C/C++参数,均采用编译器默认参数,因此请使用最新版编译器 +env = Environment() +#添加标志 +env["Enable_HBox_CPP"]=True +env["Enable_HCPPBox"]=True +cwd = str(Dir('#')) +objs = [] + +from building import * + +list = os.listdir(cwd) +for d in list: + path = os.path.join(cwd, d) + if os.path.isfile(os.path.join(path, 'SConscript')): + target_env=env.Clone() + SetEnv(target_env) + target_env["OBJPREFIX"]="build/"+d+"/" + target_env["SHOBJPREFIX"]="build/"+d+"/" + objs = SConscript(os.path.join(path, 'SConscript')) + target_env.Program(target="build/"+d,source=objs) + diff --git a/test/building.py b/test/building.py new file mode 100644 index 0000000..256319c --- /dev/null +++ b/test/building.py @@ -0,0 +1,80 @@ +#模拟环境 +Env = None + +from SCons.Script import * + +def SetEnv(target_env): + global Env + Env = target_env + +def GetCurrentDir(): + conscript = File('SConscript') + fn = conscript.rfile() + name = fn.name + path = os.path.dirname(fn.abspath) + return path + +def _PretreatListParameters(target_list): + while '' in target_list: # remove null strings + target_list.remove('') + while ' ' in target_list: # remove ' ' + target_list.remove(' ') + + if(len(target_list) == 0): + return False # ignore this list, don't add this list to the parameter + + return True # permit to add this list to the parameter + +def DefineGroup(name, src, depend, **parameters): + global Env + group = parameters + group['name'] = name + if type(src) == type([]): + # remove duplicate elements from list + src = list(set(src)) + group['src'] = File(src) + else: + group['src'] = src + + if 'CFLAGS' in group: + target = group['CFLAGS'] + if len(target) > 0: + Env.AppendUnique(CFLAGS = target) + if 'CCFLAGS' in group: + target = group['CCFLAGS'] + if len(target) > 0: + Env.AppendUnique(CCFLAGS = target) + if 'CXXFLAGS' in group: + target = group['CXXFLAGS'] + if len(target) > 0: + Env.AppendUnique(CXXFLAGS = target) + if 'CPPPATH' in group: + target = group['CPPPATH'] + if _PretreatListParameters(target) == True: + paths = [] + for item in target: + paths.append(os.path.abspath(item)) + target = paths + Env.AppendUnique(CPPPATH = target) + if 'CPPDEFINES' in group: + target = group['CPPDEFINES'] + if _PretreatListParameters(target) == True: + Env.AppendUnique(CPPDEFINES = target) + + if 'LIBS' in group: + target = group['LIBS'] + if _PretreatListParameters(target) == True: + Env.AppendUnique(LIBS = target) + if 'LIBPATH' in group: + target = group['LIBPATH'] + if _PretreatListParameters(target) == True: + Env.AppendUnique(LIBPATH = target) + + # check whether to build group library + if 'LIBRARY' in group: + objs = Env.Library(name, group['src']) + else: + # only add source + objs = group['src'] + + return objs