def add_tests(env, source, type, expensive_source=[]): # Since all of the test scripts involve "import IMP.test", ensure this # is a source so that any Python dependencies of IMP.test (e.g. IMP.base) # are automatically picked up by pyscanner #testpy = "#/build/lib/IMP/test/__init__.py" dta= data.get(env) test=UnitTest(env, target="fast-test.results", source=["#/tools/imppy.sh"]+source+[env.Value(type)]) # bring in kernel and test to make sure kernel python support is there # and since examples don't tend to import test directly. test will pull # in kernel etest=UnitTest(env, target="test.results", source=["#/tools/imppy.sh"]+source \ +expensive_source+[env.Value(type)]) if "test" in dta.modules.keys(): env.Depends(test, [dta.modules["test"].alias]) env.Depends(etest, [dta.modules["test"].alias]) env.AlwaysBuild("test.results") #env.Requires(test, env.Alias(environment.get_current_name(env))) #env.Requires(test, "tools/imppy.sh") if type.endswith('unit test'): dta.add_to_alias(environment.get_current_name(env)+"-test-fast", test) data.get(env).add_to_alias(environment.get_current_name(env)+"-test", etest) elif type=='example': data.get(env).add_to_alias(environment.get_current_name(env)+"-test-examples", test) elif type=="system": data.get(env).add_to_alias(environment.get_current_name(env)+"-test", test) env.Alias(env.Alias('test'), etest) env.Alias(env.Alias('test-fast'), test) return test, etest
def _get_path(env, target, prefix): ret = "/".join([prefix] + str(target).split("/")[1:]) cd = environment.get_current_name(env) if cd == "kernel": cd = "." cf = environment.get_current_name(env) # if cf=='kernel': # cf='IMP' return ret.replace("currentdir", cd).replace("currentfile", cf)
def IMPApplicationTest(env, python_tests=[]): if env["IMP_PASS"] != "RUN": return files = [File(x).abspath for x in python_tests] tests = test.add_tests(env, source=files, type="application unit test") for t in tests: env.Requires(t, env.Alias(environment.get_current_name(env)))
def install(env, target, source, **keys): """Like the standard Install builder, but using symlinks if available.""" # print str(target), str(source) varname = str(target).split("/")[0] prefix = _get_prefix(env, varname) installpath = _get_path(env, target, prefix) ret = [] internal_installpath = installpath if Dir(installpath).get_abspath() != Dir("/".join(str(source).split("/")[:-1])).get_abspath(): inst = _link_install(env, installpath, source, **keys) data.get(env).add_to_alias(environment.get_current_name(env), inst) ret.append(inst[0]) else: inst = [] data.get(env).add_to_alias(environment.get_current_name(env), source) # ick, need a better mechanism for installed vs not if ( varname == "swigdir" or varname == "srcdir" or varname == "moduledir" or varname == "#" or varname == "biological_systems" or varname == "." or varname == "modules" ): return ret installpath = _get_path(env, target, env.subst(env[varname])) # print Dir(installpath).get_abspath(), internal_installpath # handle hacks involving setting the datapath to "./data" if Dir(installpath) == Dir(internal_installpath): return ret destdir = env.subst(env["destdir"]) if destdir != "" and not os.path.isabs(destdir): destdir = Dir("#/" + destdir).abspath inst = env.Install(destdir + installpath, source, **keys) ret.append(inst[0]) data.get(env).add_to_alias(environment.get_current_name(env) + "-install", inst) data.get(env).add_to_alias("install", inst) return ret
def install_as(env, target, source, **keys): # print "in", target, source varname = str(target).split("/")[0] prefix = _get_prefix(env, varname) installpath = _get_path(env, target, prefix) # print File(installpath).get_abspath(), File(str(source)).get_abspath() ret = [] if File(installpath).get_abspath() != File(str(source)).get_abspath(): inst = _link_install_as(env, installpath, source, **keys) ret.append(inst[0]) data.get(env).add_to_alias(environment.get_current_name(env), inst) else: data.get(env).add_to_alias(environment.get_current_name(env), source) if varname == "swigdir" or varname == "srcdir": return installpath = _get_path(env, target, env.subst(env[varname])) destdir = env.subst(env["destdir"]) if destdir != "" and not os.path.isabs(destdir): destdir = Dir("#/" + destdir).abspath inst = env.InstallAs(File(destdir + installpath), source, **keys) ret.append(inst[0]) data.get(env).add_to_alias(environment.get_current_name(env) + "-install", inst) data.get(env).add_to_alias("install", inst) return ret
def _get_prefix(env, varname): if varname == "datadir": prefix = "#/build/data" elif varname == "bindir": prefix = "#/build/bin" elif varname == "docdir": prefix = "#/build/doc" elif varname == "libdir": prefix = "#/build/lib" elif varname == "includedir": prefix = "#/build/include" elif varname == "pythondir": prefix = "#/build/lib" elif varname == "pyextdir": prefix = "#/build/lib" elif varname == "swigdir": prefix = "#/build/swig" elif varname == "srcdir": prefix = "#/build/src" elif varname == "moduledir": prefix = "#/modules/" + environment.get_current_name(env) else: prefix = varname return prefix
def __init__(self, env, coverage, test_type, output_file): self._env = env self._test_type = None self._sources = [] self._headers = [] self._header_callcounts = {} self._output_file = output_file self._coverage = coverage self._html_coverage = env.get('html_coverage', 'no') self._coverage_dir = Dir("#/build/coverage").abspath self._name = name = environment.get_current_name(env) if test_type.startswith('module'): self._test_type = 'module' moddir = self.get_module_dir(name) self.add_source('modules/%s/src' % moddir, '*.cpp', report=True) self.add_source('modules/%s/src/internal' % moddir, '*.cpp', report=True) self.add_source('build/src', self.get_wrap(name) + '.cpp', report=False) if name == 'kernel': h = 'IMP' elif name == 'RMF': h = name else: h = 'IMP/' + name self.add_header('build/include/%s' % h, '*.h', report=True) self.add_header('build/include/%s/internal' % h, '*.h', report=True) elif test_type.startswith('application'): self._test_type = 'application' m = re.search('(applications/(.+?/)?%s)' % name, output_file) if m: self.add_source(m.group(1), '*.cpp', report=True, recurse=True) self.add_header(m.group(1), '*.h', report=True, recurse=True) else: raise ValueError("Cannot determine path for %s" % name)
def _get_name(env): return environment.get_current_name(env)