Exemple #1
0
    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
Exemple #2
0
  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
Exemple #3
0
        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)
Exemple #4
0
    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)
Exemple #5
0
  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
Exemple #6
0
    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
Exemple #7
0
 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
Exemple #8
0
 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
Exemple #9
0
    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
Exemple #10
0
    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
Exemple #11
0
  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
Exemple #12
0
        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
Exemple #13
0
    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
Exemple #14
0
    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
Exemple #15
0
  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 
Exemple #16
0
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)
Exemple #17
0
  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
Exemple #18
0
  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 
Exemple #19
0
    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