Example #1
0
def program(fs):
    ret = []
    fs = nodes(fs)
    mocs = moc(fs)
    ret.append(mocs)
    fs.extend(mocs.targets)
    ret.append(compile(fs))
Example #2
0
def compile(sources, use_default=True):
    ret = []
    for source in nodes(sources):
        if not isinstance(source, FileNode):
            continue
        target = source.to_file().to_builddir().append_extension('.o')
        if source.to_file().extension.lower() == 'c':
            task = CCompile(sources=source, targets=target, use_default=use_default)
            if use_default:
                task.use(':cpp/cc')
        else:
            # make sure we are a bit failsafe and we just compile unkown
            # file endings with a cxx compiler. There are a lot of
            # esoteric file extensions for cpp out there.
            task = CxxCompile(sources=source, targets=target, use_default=use_default)
            if use_default:
                task.use(':cpp/cxx')
        ret.append(task)
        dep_scan = DependencyScan(source)
        assert len(dep_scan.targets) >= 1
        header_dep_node = dep_scan.targets[0]
        task.use(header_dep_node)
        for header in header_dep_node.read().value('headers', []):
            task.depends(header)
        ret.append(dep_scan)
    return group(ret)
Example #3
0
def moc(fs):
    fs = nodes(fs)
    ret = []
    for f in fs:
        tgt = file(f).to_builddir().append_extension('moc.cpp')
        t = shell(cmd='{moc} -o {tgt} {src}', sources=f.to_file(), targets=tgt)
        t.require('moc', spawn=find_moc)
        ret.append(t)
    return group(ret)
Example #4
0
 def _run(self):
     headers = set()
     self._scan(headers, self._f, 1)
     headers = set(str(x) for x in headers)
     previous_headers = set(self._target_node.read().value('headers', []))
     new_headers = headers - previous_headers
     self.result['headers'] = list(headers)
     # make sure the new headers are included in the database
     self.targets.extend(nodes(new_headers))
     self.success = True
Example #5
0
def link(obj_files, target='main', use_default=True):
    t = _cpp.Link(sources=nodes(obj_files), targets=file(target).to_builddir())
    if use_default:
        ldnode = ':cpp/cxx'
        spawner = _cpp .find_cxx
        if osinfo.linux:
            libraries = ['stdc++', 'c']
        else:
            libraries = []
        t.use(ldnode, libraries=libraries).require('ld', spawn=spawner)
    return t
Example #6
0
 def _init(self):
     self._compilername = DEFAULT_COMPILER
     if self._compilername == 'msvc':
         self._printer = MsvcCompilerPrinter(self)
     for src in self.sources:
         if not isinstance(src, FileNode):
             continue
         is_csrc = [str(src).endswith(ext) for ext in self.extensions]
         if any(is_csrc):
             self.arguments['csource'] = str(src)
             headers = node(':cpp/{0}'.format(src)).read().value('headers', [])
             self.sources.extend(nodes(headers))
             return
Example #7
0
def link(obj_files, target='main', use_default=True, cpp=True, shared=False):
    t = Link(sources=nodes(obj_files), targets=file(target).to_builddir())
    if use_default:
        ldnode = ':cpp/cxx' if cpp else ':cpp/cc'
        spawner = find_cxx if cpp else find_cc
        if osinfo.linux:
            t.use(libraries=['stdc++', 'c', 'pthread'])
        t.use(ldnode).require('ld', spawn=spawner)
    if shared:
        if osinfo.windows:
            t.use(ldflags='/dll')
        else:
            t.use(ldflags='-shared')
    return t