Barabash v0.5.0 documentation

Source code for barabash.ops

from . import core
###########################################
# Operations
LinkStaticLib = core.define_reduce_op("{AR} cru {out} {in}")
Link = core.define_reduce_op("{CC} -o {out} {in}")

[docs]class Compile(core.MapOp): """Compile input files.""" def __init__(self, name, sources): super(Compile, self).__init__(name, sources, "%.o:%.c", "{CC} -c {in} -o {out}") def indirect_deps(self, vars): cmd = "{CC} -MM {in}".format(**vars) out = subprocess.check_output(cmd, stderr=subprocess.STDOUT, shell=True) deps = [] ll = False for l in out.split("\n"): if not l: continue if not ll: l = l.split(":")[1] if l.endswith(" \\"): ll = True deps.append(l[:-2].strip()) else: deps.append(l.strip()) else: ll = False deps.append(l.strip()) return deps
[docs]class BuildSharedLib(core.ReduceOp): def __init__(self, name, sources): objs = Compile(name+"_compile", sources) # gcc -Wall -fPIC -c *.c # gcc -shared -Wl,-soname,libctest.so.1 -o libctest.so.1.0 *.o super(BuildSharedLib, self).__init__(name, objs, """ {CC} -shared -Wl,-soname,{out.dropext} -o {out} {in} ln -f -s {out} {out.dropext} ln -f -s {out} {out.dropext2} """)
[docs]class BuildStaticLib(core.ReduceOp): def __init__(self, name, sources): objs = Compile(name+"_compile", sources) super(BuildStaticLib, self).__init__(name, objs, "{AR} cru {out} {in}\n{RANLIB} {out}")
[docs]class BuildProgram(core.ReduceOp): def __init__(self, name, sources, static_libs=[], shared_libs=[], external_libs=[], compile_flags=[], link_flags=[]): self.objs = Compile(name+"_compile", sources) if not isinstance(static_libs, list): static_libs = [static_libs] self.static_libs = static_libs if not isinstance(shared_libs, list): shared_libs = [shared_libs] self.shared_libs = shared_libs self.external_libs = external_libs self.compile_flags = compile_flags self.link_flags = link_flags super(BuildProgram, self).__init__(name, [self.objs] + self.static_libs + self.shared_libs) def action(self, vars): shared_libs = [ os.path.basename(sl.outputs[0])[3:].split(".so")[0] for sl in self.shared_libs ] shared_libs_dirs = [ os.path.dirname(sl.outputs[0]) for sl in self.shared_libs ] script = "{CC} -o %s %s %s %s %s" % (self.outputs[0], " ".join(self.objs.outputs), " ".join([ sl.outputs[0] for sl in self.static_libs ]), " ".join([ "-L%s" % ld for ld in shared_libs_dirs ]), " ".join([ "-l%s" % l for l in shared_libs + self.external_libs ])) self.run_script(script, vars)