def program(fs): ret = [] fs = nodes(fs) mocs = moc(fs) ret.append(mocs) fs.extend(mocs.targets) ret.append(compile(fs))
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)
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)
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
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
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
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