code: def processDefines(defs):
      
      if SCons.Util.is_List(defs):
          l = []
          for d in defs:
              if d is None:
                  continue
              elif SCons.Util.is_List(d) or isinstance(d, tuple):
                  if len(d) >= 2:
                      l.append(str(d[0]) + '=' + str(d[1]))
                  else:
                      l.append(str(d[0]))
              elif SCons.Util.is_Dict(d):
                  for macro,value in d.items():
                      if value is not None:
                          l.append(str(macro) + '=' + str(value))
                      else:
                          l.append(str(macro))
              elif SCons.Util.is_String(d):
                  l.append(str(d))
              else:
                  raise SCons.Errors.UserError("DEFINE %s is not a list, dict, string or None."%repr(d))
      elif SCons.Util.is_Dict(defs):
          # The items in a dictionary are stored in random order, but
          # if the order of the command-line options changes from
          # invocation to invocation, then the signature of the command
          # line will change and we'll get random unnecessary rebuilds.
          # Consequently, we have to sort the keys to ensure a
          # consistent order...
          l = []
          for k,v in sorted(defs.items()):
              if v is None:
                  l.append(str(k))
              else:
                  l.append(str(k) + '=' + str(v))
      else:
          l = [str(defs)]
      return l
docs: process defines, resolving strings, lists, dictionaries, into a list of
      strings