def _getCommonCompileArgs(self, suffix, shared=False, pch=False): args = [self._clangExe, '-c', '-MD'] language = self._getLanguage(suffix) if language: args.extend(['-x', language]) if self.debugSymbols: args.append('-g') if language == 'c++': args.extend(self.cppFlags) elif language == 'c': args.extend(self.cFlags) for d in self.getDefines(): args.extend(['-D', d]) for p in getPaths(self.getIncludePaths()): args.extend(['-I', p]) for p in getPaths(self.getForcedIncludes()): args.extend(['-include', p]) return args
def spawnProcess(targets, sources, cwd): sourcePaths = getPaths(sources) configuration = self.configuration abspath = configuration.abspath if isinstance(args, basestring): argsString = args argsList = [args] executable = None else: argsString = " ".join(args) argsList = args executable = abspath(args[0]) if targets: # Check dependencies to see if they've changed buildArgs = argsList + sourcePaths + targets try: _, reasonToBuild = configuration.checkDependencyInfo( targets[0], buildArgs, ) if reasonToBuild is None: # Target is up to date, no work to do return except EnvironmentError: pass engine.logger.outputDebug( "reason", "Rebuilding '%s' because %s.\n" % (targets[0], reasonToBuild), ) # Create target directories first if targets: for t in targets: absT = abspath(t) try: cake.filesys.makeDirs(cake.path.dirName(absT)) except Exception, e: msg = "cake: Error creating target directory %s: %s\n" % ( cake.path.dirName(t), str(e)) engine.raiseError(msg, targets=targets) if removeTargets: try: cake.filesys.remove(absT) except Exception, e: msg = "cake: Error removing old target %s: %s\n" % ( t, str(e)) engine.raiseError(msg, targets=targets)
def getLibraryCommand(self, target, sources): args = list(self._getCommonLibraryArgs()) args.append(target) args.extend(getPaths(sources)) @makeCommand("lib-scan") def scan(): return [target], [args[0]] + sources @makeCommand(args) def archive(): cake.filesys.remove(self.configuration.abspath(target)) self._runProcess(args, target) return archive, scan
def _getCompileArgs(self): args = ['cc', '/c'] if self.debugSymbols: args.append('/debug') if self.optimisation != self.NO_OPTIMISATION: args.append('/O') if self.enableRtti: args.append('/rtti') if self.enableExceptions: args.append('/ex') if self.language: args.append('/lang:%s' % self.language) args.extend('/I%s' % p for p in self.getIncludePaths()) args.extend('/D%s' % d for d in self.getDefines()) args.extend('/FI%s' % p for p in getPaths(self.getForcedIncludes())) return args
def _getLinkCommands(self, target, sources, importLibrary=None, installName=None, dll=False): objects, libraries = self._resolveObjects() args = list(self._getCommonLinkArgs(dll)) for path in getPaths(self.getLibraryPaths()): args.append('-L' + path) args.extend(['-o', target]) args.extend(sources) args.extend(objects) for lib in libraries: if cake.path.baseName(lib) == lib: args.append('-l' + lib) else: args.append(lib) @makeCommand(args) def link(): self._runProcess(args, target) @makeCommand("link-scan") def scan(): targets = [target] if dll and importLibrary: targets.append(importLibrary) dependencies = [args[0]] dependencies += sources dependencies += objects dependencies += self._scanForLibraries(libraries) return targets, dependencies return link, scan
def _run(): sourcePaths = getPaths(sources) if targets: buildArgs = (args, sourcePaths) try: _, reason = configuration.checkDependencyInfo( targets[0], buildArgs, ) if reason is None: # Up to date return engine.logger.outputDebug( "reason", "Building '%s' because '%s'\n" % (targets[0], reason), ) except EnvironmentError: pass try: result = func() except Exception: if targets: append = engine.failedTargets.append for t in targets: append(t) raise if targets: newDependencyInfo = configuration.createDependencyInfo( targets=targets, args=buildArgs, dependencies=sourcePaths, ) configuration.storeDependencyInfo(newDependencyInfo) return result
def compile(): dependencies = [args[0], source] if deps is not None: dependencies.extend(deps) if self.language == 'c++/cli': dependencies.extend(getPaths(self.forcedUsings)) dependenciesSet = set() def processStdout(text): includePrefix = ('Note: including file:') includePrefixLen = len(includePrefix) sourceName = cake.path.baseName(source) outputLines = [] for line in text.splitlines(): if line == sourceName: continue if line.startswith(includePrefix): path = line[includePrefixLen:].lstrip() normPath = os.path.normcase(os.path.normpath(path)) if normPath not in dependenciesSet: dependenciesSet.add(normPath) dependencies.append(path) else: outputLines.append(line) if outputLines: self._outputStdout("\n".join(outputLines) + "\n") self._runProcess( args=args, target=target, processStdout=processStdout, ) return dependencies
def _getCompileCommonArgs(self, suffix): args = [ self.__clExe, "/nologo", "/showIncludes", "/c", ] if self.errorReport: args.append('/errorReport:' + self.errorReport) if self.outputFullPath: args.append("/FC") if self.useBigObjects: args.append("/bigobj") if self.memoryLimit is not None: args.append("/Zm%i" % self.memoryLimit) if self.runtimeLibraries == 'release-dll': args.append("/MD") elif self.runtimeLibraries == 'debug-dll': args.append("/MDd") elif self.runtimeLibraries == 'release-static': args.append("/MT") elif self.runtimeLibraries == 'debug-static': args.append("/MTd") if self.useFunctionLevelLinking: args.append('/Gy') # Enable function-level linking if self.useStringPooling: args.append('/GF') # Eliminate duplicate strings language = self._getLanguage(suffix) if language == 'c++': args.extend(self.cppFlags) elif language == 'c++/cli': args.extend(self.cppFlags) elif language == 'c': args.extend(self.cFlags) if self.enableRtti is not None: if self.enableRtti: args.append('/GR') # Enable RTTI else: args.append('/GR-') # Disable RTTI if self.enableExceptions is not None: if self.enableExceptions == "SEH": args.append('/EHa') # Enable SEH exceptions elif self.enableExceptions: args.append('/EHsc') # Enable exceptions else: args.append('/EHsc-') # Disable exceptions if self.language == 'c++/cli': if self.clrMode == 'safe': args.append('/clr:safe') # Compile to verifiable CLR code elif self.clrMode == 'pure': args.append('/clr:pure') # Compile to pure CLR code else: args.append('/clr') # Compile to mixed CLR/native code for assembly in getPaths(self.forcedUsings): args.append('/FU' + assembly) if self.optimisation == self.FULL_OPTIMISATION: args.append('/GL') # Global optimisation args.append('/O2') # Full optimisation elif self.optimisation == self.PARTIAL_OPTIMISATION: args.append('/O2') # Full optimisation elif self.optimisation == self.NO_OPTIMISATION: args.append('/Od') # No optimisation if self.warningLevel is not None: args.append('/W%s' % self.warningLevel) if self.warningsAsErrors: args.append('/WX') if self.useEditAndContinue: args.append("/ZI") # Output debug info to PDB (edit-and-continue) elif self._needPdbFile: args.append("/Zi") # Output debug info to PDB (no edit-and-continue) elif self.debugSymbols: args.append("/Z7") # Output debug info embedded in .obj if self.useMinimalRebuild: args.append("/Gm") # Enable minimal rebuild args.extend("/D" + define for define in self.getDefines()) args.extend("/I" + path for path in self.getIncludePaths()) args.extend("/FI" + path for path in self.getForcedIncludes()) return args
class UnitTestTool(Tool): enabled = True alwaysRun = None def __init__(self, configuration): Tool.__init__(self, configuration) self.dependencies = [] self.extraArgs = [] self.env = dict(os.environ) def run(self, program, results=None, cwd=None, extraArgs=[], dependencies=[]): tool = self.clone() if dependencies: tool.dependencies.extend(dependencies) if extraArgs: tool.extraArgs.extend(extraArgs) return tool._run(program, results, cwd) def _run(self, program, results, cwd): @waitForAsyncResult def _start(program, results, dependencies): if self.alwaysRun is False: return task = self.engine.createTask(lambda: self._launchTest( program, results, cwd, flatten(dependencies))) task.parent.completeAfter(task) task.startAfter(getTask([program, dependencies])) @waitForAsyncResult def _makeTarget(results): if self.enabled: task = self.engine.createTask( lambda: _start(program, results, self.dependencies)) task.lazyStart() else: task = None if results: target = FileTarget(path=results, task=task) else: target = Target(task=task) Script.getCurrent().getDefaultTarget().addTarget(target) Script.getCurrent().getTarget('testresults').addTarget(target) return target return _makeTarget(results) def _launchTest(self, program, results, cwd, dependencies): programPath = getPath(program) programArgs = [programPath] + self.extraArgs dependencyArgs = programArgs + dependencies if self.alwaysRun is None and results: try: _, reason = self.configuration.checkDependencyInfo( results, dependencyArgs) if reason is None: # Up to date return self.engine.logger.outputDebug( "reason", "Building '%s' because '%s'\n" % (results, reason), ) except EnvironmentError: pass self.engine.logger.outputInfo("Testing %s\n" % programPath) self.engine.logger.outputDebug("run", " ".join(programArgs)) if results: resultsAbsPath = self.configuration.abspath(results) cake.filesys.makeDirs(cake.path.dirName(resultsAbsPath)) stdout = open(resultsAbsPath, "w+t") else: stdout = tempfile.TemporaryFile(mode="w+t") try: p = subprocess.Popen( args=programArgs, executable=self.configuration.abspath(programPath), stdin=subprocess.PIPE, stdout=stdout, stderr=subprocess.STDOUT, cwd=cwd, env=self.env) except EnvironmentError, e: msg = "cake: failed to launch %s: %s\n" % (programPath, str(e)) self.engine.raiseError(msg, targets=targets) p.stdin.close() exitCode = p.wait() stdout.seek(0) testOutput = stdout.read() stdout.close() self.engine.logger.outputInfo(testOutput) if exitCode != 0: msg = "test %s failed with exit code %i (0x%08x)\n" % ( programPath, exitCode, exitCode) self.engine.raiseError(msg, targets=[results]) if results: newDependencyInfo = self.configuration.createDependencyInfo( targets=[results], args=dependencyArgs, dependencies=[programPath] + getPaths(dependencies), ) self.configuration.storeDependencyInfo(newDependencyInfo)
def _getCompileArgs(self, suffix, shared=False, pch=False): args = [self._gccExe, '-c', '-MD'] language = self._getLanguage(suffix, pch) if pch: # Pch requires '-header' so must use derived language. if language is not None: args.extend(['-x', language]) else: if self.language is not None: args.extend(['-x', self.language]) if self.warningsAsErrors: args.append('-Werror') # This test is req'd for Python 3.x or it barfs on 'self.warningLevel >= 4' # below when self.warningLevel is None. if self.warningLevel is not None: if self.warningLevel == 0: args.append('-w') elif self.warningLevel >= 4: args.append('-Wall') if self.debugSymbols: args.append('-g') if language in ['c++', 'c++-header', 'c++-cpp-output']: args.extend(self.cppFlags) elif language in ['c', 'c-header', 'cpp-output']: args.extend(self.cFlags) elif language in ['objective-c', 'objective-c-header', 'objc-cpp-output']: args.extend(self.mFlags) elif language in ['objective-c++', 'objective-c++-header', 'objective-c++-cpp-output']: args.extend(self.mmFlags) if self.enableRtti is not None: if self.enableRtti: args.append('-frtti') else: args.append('-fno-rtti') if self.enableExceptions is not None: if self.enableExceptions: args.append('-fexceptions') else: args.append('-fno-exceptions') if self.useFunctionLevelLinking: args.extend([ '-ffunction-sections', '-fdata-sections', ]) if self.optimisation == self.NO_OPTIMISATION: args.append('-O0') elif self.optimisation == self.PARTIAL_OPTIMISATION: args.append('-O2') elif self.optimisation == self.FULL_OPTIMISATION: args.append('-O3') if self.useSse: args.append('-msse') if shared and self.__version[0] >= 4: args.append('-fvisibility=hidden') args.append('-fPIC') for p in self.getIncludePaths(): args.extend(['-I', p]) args.extend('-D' + d for d in self.getDefines()) for p in getPaths(self.getForcedIncludes()): args.extend(['-include', p]) return args
def _getCompileArgs(self, suffix, shared=False, pch=False): args = [self._gccExe, '-c', '-MD'] language = self._getLanguage(suffix, pch) if pch: # Pch requires '-header' so must use derived language. if language is not None: args.extend(['-x', language]) else: if self.language is not None: args.extend(['-x', self.language]) if self.warningsAsErrors: args.append('-Werror') # This test is req'd for Python 3.x or it barfs on 'self.warningLevel >= 4' # below when self.warningLevel is None. if self.warningLevel is not None: if self.warningLevel == 0: args.append('-w') elif self.warningLevel >= 4: args.append('-Wall') if self.debugSymbols: args.append('-g') if language in ['c++', 'c++-header', 'c++-cpp-output']: args.extend(self.cppFlags) elif language in ['c', 'c-header', 'cpp-output']: args.extend(self.cFlags) elif language in [ 'objective-c', 'objective-c-header', 'objc-cpp-output' ]: args.extend(self.mFlags) elif language in [ 'objective-c++', 'objective-c++-header', 'objective-c++-cpp-output' ]: args.extend(self.mmFlags) if self.enableRtti is not None: if self.enableRtti: args.append('-frtti') else: args.append('-fno-rtti') if self.enableExceptions is not None: if self.enableExceptions: args.append('-fexceptions') else: args.append('-fno-exceptions') if self.useFunctionLevelLinking: args.extend([ '-ffunction-sections', '-fdata-sections', ]) if self.optimisation == self.NO_OPTIMISATION: args.append('-O0') elif self.optimisation == self.PARTIAL_OPTIMISATION: args.append('-O2') elif self.optimisation == self.FULL_OPTIMISATION: args.append('-O3') if self.useSse: args.append('-msse') if shared and self.__version[0] >= 4: args.append('-fvisibility=hidden') args.append('-fPIC') for p in self.getIncludePaths(): args.extend(['-I', p]) args.extend('-D' + d for d in self.getDefines()) for p in getPaths(self.getForcedIncludes()): args.extend(['-include', p]) return args