diff options
31 files changed, 1658 insertions, 1659 deletions
diff --git a/BuildTools/CheckHeaders.py b/BuildTools/CheckHeaders.py index 274a760..b599099 100755 --- a/BuildTools/CheckHeaders.py +++ b/BuildTools/CheckHeaders.py @@ -3,18 +3,18 @@  import os, sys  FORBIDDEN_INCLUDES = [ -  ("iostream", ["Swiften/Base/format.h"]),  -  ("Base/Log.h", []),  -  ("Base/format.h", []), -  ("algorithm", ["Swiften/Base/Algorithm.h", "Swiften/Base/SafeAllocator.h", "Swiften/Base/Listenable.h"]),  -  ("boost/bind.hpp", ["Swiften/Base/Listenable.h"]),  -  ("boost/filesystem.hpp", []),  -  ("Base/foreach.h", []),  -  ("boost/date_time/date_time.hpp", []),  -  ("boost/filesystem/filesystem.hpp", []), - -  # To avoid -  ("Base/Algorithm.h", ["Swiften/StringCodecs/HMAC.h"]), +	("iostream", ["Swiften/Base/format.h"]),  +	("Base/Log.h", []),  +	("Base/format.h", []), +	("algorithm", ["Swiften/Base/Algorithm.h", "Swiften/Base/SafeAllocator.h", "Swiften/Base/Listenable.h"]),  +	("boost/bind.hpp", ["Swiften/Base/Listenable.h"]),  +	("boost/filesystem.hpp", []),  +	("Base/foreach.h", []),  +	("boost/date_time/date_time.hpp", []),  +	("boost/filesystem/filesystem.hpp", []), + +	# To avoid +	("Base/Algorithm.h", ["Swiften/StringCodecs/HMAC.h"]),  ]  foundBadHeaders = False @@ -22,21 +22,21 @@ foundBadHeaders = False  filename = sys.argv[1]  if "3rdParty" in filename or ".sconf" in filename or ".framework" in filename or not filename.endswith(".h") : -  sys.exit(0) +	sys.exit(0)  if not "Swiften" in filename : -  sys.exit(0) +	sys.exit(0)  if filename.endswith("Swiften.h") : -  sys.exit(0) +	sys.exit(0)  file = open(filename, "r")  for line in file.readlines() : -  if not "#include" in line : -    continue -  if "Base/Log.h" in filename : -    continue -  for forbiddenInclude, ignores in FORBIDDEN_INCLUDES : -    if forbiddenInclude in line and len([x for x in ignores if x in filename]) == 0 : -      print "Found " + forbiddenInclude + " include in " + filename -      foundBadHeaders = True +	if not "#include" in line : +		continue +	if "Base/Log.h" in filename : +		continue +	for forbiddenInclude, ignores in FORBIDDEN_INCLUDES : +		if forbiddenInclude in line and len([x for x in ignores if x in filename]) == 0 : +			print "Found " + forbiddenInclude + " include in " + filename +			foundBadHeaders = True  sys.exit(foundBadHeaders) diff --git a/BuildTools/CheckTranslations.py b/BuildTools/CheckTranslations.py index b39af08..a9b6afd 100755 --- a/BuildTools/CheckTranslations.py +++ b/BuildTools/CheckTranslations.py @@ -3,48 +3,48 @@  import os, sys, re, xml.dom.minidom  def getText(nodelist): -  text = "" -  for node in nodelist: -    if node.nodeType == node.TEXT_NODE: -      text += node.data -  return text +	text = "" +	for node in nodelist: +		if node.nodeType == node.TEXT_NODE: +			text += node.data +	return text  desktop_generic_names = set()  desktop_comments = set()  f = open("Swift/resources/swift.desktop", "r")  for l in f.readlines() : -  m = re.match("GenericName\[(\w+)\].*", l) -  if m : -    desktop_generic_names.add(m.group(1)) -  m = re.match("Comment\[(\w+)\].*", l) -  if m : -    desktop_comments.add(m.group(1)) +	m = re.match("GenericName\[(\w+)\].*", l) +	if m : +		desktop_generic_names.add(m.group(1)) +	m = re.match("Comment\[(\w+)\].*", l) +	if m : +		desktop_comments.add(m.group(1))  f.close()  for filename in os.listdir("Swift/Translations") : -  m = re.match("swift_(.*)\.ts", filename) -  if m : -    language = m.group(1) -    finished = True -    f = open("Swift/Translations/" + filename, "r") -    document = xml.dom.minidom.parse(f) -    f.close() +	m = re.match("swift_(.*)\.ts", filename) +	if m : +		language = m.group(1) +		finished = True +		f = open("Swift/Translations/" + filename, "r") +		document = xml.dom.minidom.parse(f) +		f.close() -    for message in document.getElementsByTagName("message") : -      source = message.getElementsByTagName("source")[0] -      sourceText = getText(source.childNodes) -      sourcePlaceholders = set(re.findall("%\d+%?", sourceText)) -      translation = message.getElementsByTagName("translation")[0] -      if "type" in translation.attributes.keys() and translation.attributes["type"]. value == "unfinished" : -        finished = False -      translationText = getText(translation.childNodes) -      translationPlaceholders = set(re.findall("%\d+%?", translationText)) -      if translationPlaceholders != sourcePlaceholders : -        print "[Error] " + filename + ": Placeholder mismatch in translation '" + sourceText + "'" -    if not finished : -        print "[Warning] " + filename + ": Unfinished" -    if language not in desktop_generic_names and language != "en" : -        print "[Warning] GenericName field missing in desktop entry for " + language -    if language not in desktop_comments and language != "en" : -        print "[Warning] Comment field missing in desktop entry for " + language +		for message in document.getElementsByTagName("message") : +			source = message.getElementsByTagName("source")[0] +			sourceText = getText(source.childNodes) +			sourcePlaceholders = set(re.findall("%\d+%?", sourceText)) +			translation = message.getElementsByTagName("translation")[0] +			if "type" in translation.attributes.keys() and translation.attributes["type"]. value == "unfinished" : +				finished = False +			translationText = getText(translation.childNodes) +			translationPlaceholders = set(re.findall("%\d+%?", translationText)) +			if translationPlaceholders != sourcePlaceholders : +				print "[Error] " + filename + ": Placeholder mismatch in translation '" + sourceText + "'" +		if not finished : +				print "[Warning] " + filename + ": Unfinished" +		if language not in desktop_generic_names and language != "en" : +				print "[Warning] GenericName field missing in desktop entry for " + language +		if language not in desktop_comments and language != "en" : +				print "[Warning] Comment field missing in desktop entry for " + language diff --git a/BuildTools/Copyrighter.py b/BuildTools/Copyrighter.py index ccb2019..56fcf01 100755 --- a/BuildTools/Copyrighter.py +++ b/BuildTools/Copyrighter.py @@ -8,135 +8,135 @@ CONTRIBUTOR_LICENSE = "mit"  LICENSE_DIR = "Documentation/Licenses"  class License : -  def __init__(self, name, file) : -    self.name = name -    self.file = file +	def __init__(self, name, file) : +		self.name = name +		self.file = file  licenses = { -    "gpl3" : License("GNU General Public License v3", "GPLv3.txt"), -    "mit" : License("MIT License", "MIT.txt"), -  } +		"gpl3" : License("GNU General Public License v3", "GPLv3.txt"), +		"mit" : License("MIT License", "MIT.txt"), +	}  class Copyright : -  def __init__(self, author, year, license) : -    self.author = author -    self.year = year -    self.license = license - -  def to_string(self, comment_chars) : -    return "\n".join([ -      comment_chars[0], -      comment_chars[1] + " Copyright (c) %(year)s %(name)s" % {"year" : self.year, "name" : self.author }, -      comment_chars[1] + " Licensed under the " + licenses[self.license].name + ".", -      comment_chars[1] + " See " + LICENSE_DIR + "/" + licenses[self.license].file + " for more information.", -      comment_chars[2], -      "\n"]) +	def __init__(self, author, year, license) : +		self.author = author +		self.year = year +		self.license = license + +	def to_string(self, comment_chars) : +		return "\n".join([ +			comment_chars[0], +			comment_chars[1] + " Copyright (c) %(year)s %(name)s" % {"year" : self.year, "name" : self.author }, +			comment_chars[1] + " Licensed under the " + licenses[self.license].name + ".", +			comment_chars[1] + " See " + LICENSE_DIR + "/" + licenses[self.license].file + " for more information.", +			comment_chars[2], +			"\n"])  def get_comment_chars_for_filename(filename) : -  return ("/*", " *", " */") +	return ("/*", " *", " */")  def get_comment_chars_re_for_filename(filename) : -  comment_chars = get_comment_chars_for_filename(filename) -  return "|".join(comment_chars).replace("*", "\\*") +	comment_chars = get_comment_chars_for_filename(filename) +	return "|".join(comment_chars).replace("*", "\\*")  def parse_file(filename) : -  file = open(filename) -  copyright_text = [] -  prolog = "" -  epilog = "" -  inProlog = True -  inCopyright = False -  inEpilog = False -  for line in file.readlines() : -    if inProlog : -      if line.startswith("#!") or len(line.strip()) == 0 : -        prolog += line -        continue -      else : -        inProlog = False -        inCopyright = True - -    if inCopyright : -      if re.match(get_comment_chars_re_for_filename(filename), line) != None : -        copyright_text.append(line.rstrip()) -        continue -      else : -        inCopyright = False -        inEpilog = True -        if len(line.strip()) == 0 : -          continue - -    if inEpilog : -      epilog += line -      continue - -  file.close() - -  # Parse the copyright -  copyright = None -  if len(copyright_text) == 5 : -    comment_chars = get_comment_chars_for_filename(filename) -    if copyright_text[0] == comment_chars[0] and copyright_text[4] == comment_chars[2] : -      matchstring = "(" + get_comment_chars_re_for_filename(filename) + ") Copyright \(c\) (?P<startYear>\d\d\d\d)(-(?P<endYear>\d\d\d\d))? (?P<author>.*)" -      m = re.match(matchstring, copyright_text[1]) -      if m != None : -        # FIXME: Do better copyright reconstruction here -        copyright = True -  if not copyright : -    epilog = "\n".join(copyright_text) + epilog -  return (prolog, copyright, epilog) +	file = open(filename) +	copyright_text = [] +	prolog = "" +	epilog = "" +	inProlog = True +	inCopyright = False +	inEpilog = False +	for line in file.readlines() : +		if inProlog : +			if line.startswith("#!") or len(line.strip()) == 0 : +				prolog += line +				continue +			else : +				inProlog = False +				inCopyright = True + +		if inCopyright : +			if re.match(get_comment_chars_re_for_filename(filename), line) != None : +				copyright_text.append(line.rstrip()) +				continue +			else : +				inCopyright = False +				inEpilog = True +				if len(line.strip()) == 0 : +					continue + +		if inEpilog : +			epilog += line +			continue + +	file.close() + +	# Parse the copyright +	copyright = None +	if len(copyright_text) == 5 : +		comment_chars = get_comment_chars_for_filename(filename) +		if copyright_text[0] == comment_chars[0] and copyright_text[4] == comment_chars[2] : +			matchstring = "(" + get_comment_chars_re_for_filename(filename) + ") Copyright \(c\) (?P<startYear>\d\d\d\d)(-(?P<endYear>\d\d\d\d))? (?P<author>.*)" +			m = re.match(matchstring, copyright_text[1]) +			if m != None : +				# FIXME: Do better copyright reconstruction here +				copyright = True +	if not copyright : +		epilog = "\n".join(copyright_text) + epilog +	return (prolog, copyright, epilog)  def get_userinfo() : -  p = subprocess.Popen("git config user.name", shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, close_fds=(os.name != "nt")) -  username = p.stdout.read().rstrip() -  p.stdin.close() -  if p.wait() != 0 : -    return None -  p = subprocess.Popen("git config user.email", shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, close_fds=(os.name != "nt")) -  email = p.stdout.read().rstrip() -  p.stdin.close() -  if p.wait() != 0 : -    return None -  return (username, email) +	p = subprocess.Popen("git config user.name", shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, close_fds=(os.name != "nt")) +	username = p.stdout.read().rstrip() +	p.stdin.close() +	if p.wait() != 0 : +		return None +	p = subprocess.Popen("git config user.email", shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, close_fds=(os.name != "nt")) +	email = p.stdout.read().rstrip() +	p.stdin.close() +	if p.wait() != 0 : +		return None +	return (username, email)  def get_copyright(username, email) : -  if email in ["git@el-tramo.be", "git@kismith.co.uk"] : -    license = DEFAULT_LICENSE -  else : -    license = CONTRIBUTOR_LICENSE -  return Copyright(username, datetime.date.today().strftime("%Y"), license) +	if email in ["git@el-tramo.be", "git@kismith.co.uk"] : +		license = DEFAULT_LICENSE +	else : +		license = CONTRIBUTOR_LICENSE +	return Copyright(username, datetime.date.today().strftime("%Y"), license)  def check_copyright(filename) : -  (prolog, copyright, epilog) = parse_file(filename) -  if copyright == None : -    print "No copyright found in: " + filename -    #print "Please run '" + sys.argv[0] + " set-copyright " + filename + "'" -    return False -  else : -    return True +	(prolog, copyright, epilog) = parse_file(filename) +	if copyright == None : +		print "No copyright found in: " + filename +		#print "Please run '" + sys.argv[0] + " set-copyright " + filename + "'" +		return False +	else : +		return True  def set_copyright(filename, copyright) : -  (prolog, c, epilog) = parse_file(filename) -  comment_chars = get_comment_chars_for_filename(filename) -  copyright_text = copyright.to_string(comment_chars) -  file = open(filename, "w") -  if prolog != "": -    file.write(prolog) -  file.write(copyright_text) -  if epilog != "" : -    file.write(epilog) -  file.close() +	(prolog, c, epilog) = parse_file(filename) +	comment_chars = get_comment_chars_for_filename(filename) +	copyright_text = copyright.to_string(comment_chars) +	file = open(filename, "w") +	if prolog != "": +		file.write(prolog) +	file.write(copyright_text) +	if epilog != "" : +		file.write(epilog) +	file.close()  if sys.argv[1] == "check-copyright" : -  file = sys.argv[2] -  if (file.endswith(".cpp") or file.endswith(".h")) and not "3rdParty" in file : -    if not check_copyright(file) : -      sys.exit(-1) +	file = sys.argv[2] +	if (file.endswith(".cpp") or file.endswith(".h")) and not "3rdParty" in file : +		if not check_copyright(file) : +			sys.exit(-1)  elif sys.argv[1] == "set-copyright" : -  (username, email) = get_userinfo() -  copyright = get_copyright(username, email) -  set_copyright(sys.argv[2], copyright) +	(username, email) = get_userinfo() +	copyright = get_copyright(username, email) +	set_copyright(sys.argv[2], copyright)  else : -  print "Unknown command: " + sys.argv[1] -  sys.exit(-1) +	print "Unknown command: " + sys.argv[1] +	sys.exit(-1) diff --git a/BuildTools/Coverage/FilterLCovData.py b/BuildTools/Coverage/FilterLCovData.py index a3a7ee5..33fd682 100755 --- a/BuildTools/Coverage/FilterLCovData.py +++ b/BuildTools/Coverage/FilterLCovData.py @@ -7,24 +7,23 @@ import sys, re, os.path  assert(len(sys.argv) == 2)  def isIgnored(file) : -  return (file.find("/Swiften/") == -1 and file.find("/Slimber/") == -1 and file.find("/Swift/") == -1) or (file.find("/UnitTest/") != -1 or file.find("/QA/") != -1) -   +	return (file.find("/Swiften/") == -1 and file.find("/Slimber/") == -1 and file.find("/Swift/") == -1) or (file.find("/UnitTest/") != -1 or file.find("/QA/") != -1)  output = []  inputFile = open(sys.argv[1])  inIgnoredFile = False  for line in inputFile.readlines() : -  if inIgnoredFile : -    if line == "end_of_record\n" : -      inIgnoredFile = False -  else : -    if line.startswith("SF:") and isIgnored(line) : -      inIgnoredFile = True -    else : -      m = re.match("SF:(.*)", line) -      if m : -        line = "SF:" + os.path.realpath(m.group(1)) + "\n" -      output.append(line) +	if inIgnoredFile : +		if line == "end_of_record\n" : +			inIgnoredFile = False +	else : +		if line.startswith("SF:") and isIgnored(line) : +			inIgnoredFile = True +		else : +			m = re.match("SF:(.*)", line) +			if m : +				line = "SF:" + os.path.realpath(m.group(1)) + "\n" +			output.append(line)  inputFile.close()  outputFile = open(sys.argv[1], 'w') diff --git a/BuildTools/Coverage/GenerateSummary.py b/BuildTools/Coverage/GenerateSummary.py index ec94a4f..e572082 100755 --- a/BuildTools/Coverage/GenerateSummary.py +++ b/BuildTools/Coverage/GenerateSummary.py @@ -8,27 +8,27 @@ inputFile = open(sys.argv[1])  currentFile = ""  coverage = {}  for line in inputFile.readlines() : -  line = line.strip() -  m = re.match("^SF:(.*)", line) -  if m : -    currentFile = m.group(1) -  else : -    m = re.match("^DA:(\d+),(\d+)", line) -    if m : -      currentFileCoverage = coverage.get(currentFile, {}) -      line = int(m.group(1)) -      count = int(m.group(2)) -      currentFileCoverage[line] = currentFileCoverage.get(line, 0) + count -      coverage[currentFile] = currentFileCoverage +	line = line.strip() +	m = re.match("^SF:(.*)", line) +	if m : +		currentFile = m.group(1) +	else : +		m = re.match("^DA:(\d+),(\d+)", line) +		if m : +			currentFileCoverage = coverage.get(currentFile, {}) +			line = int(m.group(1)) +			count = int(m.group(2)) +			currentFileCoverage[line] = currentFileCoverage.get(line, 0) + count +			coverage[currentFile] = currentFileCoverage  inputFile.close()  totalLines = 0  coveredLines = 0  for c in coverage.values() : -  totalLines += len(c) -  for l in c.values() : -    if l > 0 : -      coveredLines += 1 +	totalLines += len(c) +	for l in c.values() : +		if l > 0 : +			coveredLines += 1  outputFile = open(sys.argv[2], 'w')  outputFile.write(str(coveredLines) + "/" + str(totalLines)) diff --git a/BuildTools/DocBook/SCons/DocBook.py b/BuildTools/DocBook/SCons/DocBook.py index be3d4f6..7641b65 100644 --- a/BuildTools/DocBook/SCons/DocBook.py +++ b/BuildTools/DocBook/SCons/DocBook.py @@ -6,100 +6,100 @@ import SCons.Util, SCons.Action  import xml.dom.minidom, re, os.path, sys  def generate(env) : -  # Location of stylesheets and catalogs -  docbook_dir = "#/BuildTools/DocBook" -  docbook_xsl_style_dir = env.Dir(docbook_dir + "/Stylesheets").abspath -  docbook_xml_catalog = env.File("catalog.xml").abspath -  if "DOCBOOK_XML_DIR" in env : -    docbook_xml_dir = env.Dir("$DOCBOOK_XML_DIR").abspath -  else : -    docbook_xml_dir = env.Dir("#/3rdParty/DocBook/XML").abspath -  if "DOCBOOK_XSL_DIR" in env : -    docbook_xsl_dir = env.Dir("$DOCBOOK_XSL_DIR").abspath -  else : -    docbook_xsl_dir = env.Dir("#/3rdParty/DocBook/XSL").abspath -  fop_fonts_dir = env.Dir(docbook_dir + "/Fonts").abspath - -  # Generates a catalog from paths to external tools -  def buildCatalog(target, source, env) : -    catalog = """<?xml version='1.0'?> +	# Location of stylesheets and catalogs +	docbook_dir = "#/BuildTools/DocBook" +	docbook_xsl_style_dir = env.Dir(docbook_dir + "/Stylesheets").abspath +	docbook_xml_catalog = env.File("catalog.xml").abspath +	if "DOCBOOK_XML_DIR" in env : +		docbook_xml_dir = env.Dir("$DOCBOOK_XML_DIR").abspath +	else : +		docbook_xml_dir = env.Dir("#/3rdParty/DocBook/XML").abspath +	if "DOCBOOK_XSL_DIR" in env : +		docbook_xsl_dir = env.Dir("$DOCBOOK_XSL_DIR").abspath +	else : +		docbook_xsl_dir = env.Dir("#/3rdParty/DocBook/XSL").abspath +	fop_fonts_dir = env.Dir(docbook_dir + "/Fonts").abspath + +	# Generates a catalog from paths to external tools +	def buildCatalog(target, source, env) : +		catalog = """<?xml version='1.0'?>  <catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog" prefer="public"> -  <rewriteSystem  -      systemIdStartString="http://www.oasis-open.org/docbook/xml/4.5/"  -      rewritePrefix="%(docbook_xml_dir)s/" /> -  <rewriteSystem  -      systemIdStartString="docbook-xsl:/"  -      rewritePrefix="%(docbook_xsl_dir)s/" /> +	<rewriteSystem  +			systemIdStartString="http://www.oasis-open.org/docbook/xml/4.5/"  +			rewritePrefix="%(docbook_xml_dir)s/" /> +	<rewriteSystem  +			systemIdStartString="docbook-xsl:/"  +			rewritePrefix="%(docbook_xsl_dir)s/" />  </catalog>""" -     -    docbook_xml_dir = source[0].get_contents() -    docbook_xsl_dir = source[1].get_contents() -    if env["PLATFORM"] == "win32" : -      docbook_xml_dir = docbook_xml_dir.replace("\\","/") -      docbook_xsl_dir = docbook_xsl_dir.replace("\\","/") -    file = open(target[0].abspath, "w") -    file.write(catalog % { -        "docbook_xml_dir" : docbook_xml_dir, -        "docbook_xsl_dir" : docbook_xsl_dir, -      }) -    file.close() - -  # Generates a FOP config file -  def buildFopConfig(target, source, env) : -    fopcfg = """<fop version=\"1.0\"> -  <renderers> -    <renderer mime=\"application/pdf\"> -      <fonts> -        <directory recursive=\"true\">%(fonts_dir)s</directory> -      </fonts> -    </renderer> -  </renderers> + +		docbook_xml_dir = source[0].get_contents() +		docbook_xsl_dir = source[1].get_contents() +		if env["PLATFORM"] == "win32" : +			docbook_xml_dir = docbook_xml_dir.replace("\\","/") +			docbook_xsl_dir = docbook_xsl_dir.replace("\\","/") +		file = open(target[0].abspath, "w") +		file.write(catalog % { +				"docbook_xml_dir" : docbook_xml_dir, +				"docbook_xsl_dir" : docbook_xsl_dir, +			}) +		file.close() + +	# Generates a FOP config file +	def buildFopConfig(target, source, env) : +		fopcfg = """<fop version=\"1.0\"> +	<renderers> +		<renderer mime=\"application/pdf\"> +			<fonts> +				<directory recursive=\"true\">%(fonts_dir)s</directory> +			</fonts> +		</renderer> +	</renderers>  </fop>""" -    file = open(target[0].abspath, "w") -    file.write(fopcfg % { -        "fonts_dir" : source[0].get_contents() -      }) -    file.close() - -  # Builds a DocBook file -  def buildDocBook(env, source) : -    db_env = env.Clone() -    db_env["XMLCATALOGS"] = [docbook_xml_catalog] -    db_env["ENV"].update({"OS" : os.environ.get("OS", "")}) - -    db_env["XMLLINT"] = env.WhereIs("xmllint") -    db_env["XSLT"] = env.WhereIs("xsltproc") -    db_env["FO"] = env.WhereIs("fop") - -    if not db_env["XMLLINT"] or not db_env["XSLT"] : -      return - -    # PDF generation -    if db_env["FO"] : -      fo = db_env.XSLT(os.path.splitext(source)[0] + ".fo", source,  -          XSLTSTYLESHEET = db_env["DOCBOOK_XSL_FO"]) -      pdf = db_env.FO(fo) - -    # HTML generation -    db_env.XSLT(os.path.splitext(source)[0] + ".html", source,  -        XSLTSTYLESHEET = db_env["DOCBOOK_XSL_HTML"]) - -  # Import tools -  env.Tool("FO", toolpath = [docbook_dir + "/SCons"]) -  env.Tool("XSLT", toolpath = [docbook_dir + "/SCons"]) - -  # Catalog file generation -  env.Command("catalog.xml", [env.Value(docbook_xml_dir), env.Value(docbook_xsl_dir)], SCons.Action.Action(buildCatalog, cmdstr = "$GENCOMSTR")) - -  # FO config file generation -  env["FOCFG"] = env.File("fop.cfg").abspath -  env.Command("fop.cfg", [env.Value(fop_fonts_dir)], SCons.Action.Action(buildFopConfig, cmdstr = "$GENCOMSTR")) - -  # DocBook stylesheets -  env["DOCBOOK_XSL_FO"] = docbook_xsl_style_dir + "/fo/docbook.xsl" -  env["DOCBOOK_XSL_HTML"] = docbook_xsl_style_dir + "/html/docbook.xsl" -  env.AddMethod(buildDocBook, "DocBook") -       +		file = open(target[0].abspath, "w") +		file.write(fopcfg % { +				"fonts_dir" : source[0].get_contents() +			}) +		file.close() + +	# Builds a DocBook file +	def buildDocBook(env, source) : +		db_env = env.Clone() +		db_env["XMLCATALOGS"] = [docbook_xml_catalog] +		db_env["ENV"].update({"OS" : os.environ.get("OS", "")}) + +		db_env["XMLLINT"] = env.WhereIs("xmllint") +		db_env["XSLT"] = env.WhereIs("xsltproc") +		db_env["FO"] = env.WhereIs("fop") + +		if not db_env["XMLLINT"] or not db_env["XSLT"] : +			return + +		# PDF generation +		if db_env["FO"] : +			fo = db_env.XSLT(os.path.splitext(source)[0] + ".fo", source,  +					XSLTSTYLESHEET = db_env["DOCBOOK_XSL_FO"]) +			pdf = db_env.FO(fo) + +		# HTML generation +		db_env.XSLT(os.path.splitext(source)[0] + ".html", source,  +				XSLTSTYLESHEET = db_env["DOCBOOK_XSL_HTML"]) + +	# Import tools +	env.Tool("FO", toolpath = [docbook_dir + "/SCons"]) +	env.Tool("XSLT", toolpath = [docbook_dir + "/SCons"]) + +	# Catalog file generation +	env.Command("catalog.xml", [env.Value(docbook_xml_dir), env.Value(docbook_xsl_dir)], SCons.Action.Action(buildCatalog, cmdstr = "$GENCOMSTR")) + +	# FO config file generation +	env["FOCFG"] = env.File("fop.cfg").abspath +	env.Command("fop.cfg", [env.Value(fop_fonts_dir)], SCons.Action.Action(buildFopConfig, cmdstr = "$GENCOMSTR")) + +	# DocBook stylesheets +	env["DOCBOOK_XSL_FO"] = docbook_xsl_style_dir + "/fo/docbook.xsl" +	env["DOCBOOK_XSL_HTML"] = docbook_xsl_style_dir + "/html/docbook.xsl" +	env.AddMethod(buildDocBook, "DocBook") +  def exists(env) : -  return True +	return True diff --git a/BuildTools/DocBook/SCons/FO.py b/BuildTools/DocBook/SCons/FO.py index c7596d6..a4079d7 100644 --- a/BuildTools/DocBook/SCons/FO.py +++ b/BuildTools/DocBook/SCons/FO.py @@ -6,40 +6,40 @@ import xml.dom.minidom, re  ################################################################################  def generate(env) : -  def generate_actions(source, target, env, for_signature) : -    if len(env["FOCFG"]) > 0 : -      cmd = "$FO -c $FOCFG $FOFLAGS $SOURCE $TARGET" -    else : -      cmd = "$FO $FOFLAGS $SOURCE $TARGET" -    return SCons.Action.Action(cmd, cmdstr = "$FOCOMSTR") +	def generate_actions(source, target, env, for_signature) : +		if len(env["FOCFG"]) > 0 : +			cmd = "$FO -c $FOCFG $FOFLAGS $SOURCE $TARGET" +		else : +			cmd = "$FO $FOFLAGS $SOURCE $TARGET" +		return SCons.Action.Action(cmd, cmdstr = "$FOCOMSTR") -  def modify_sources(target, source, env) : -    if len(env["FOCFG"]) > 0 : -      source.append(env["FOCFG"]) -    return target, source +	def modify_sources(target, source, env) : +		if len(env["FOCFG"]) > 0 : +			source.append(env["FOCFG"]) +		return target, source -  def scan_fo(node, env, path) : -    dependencies = set() -    try : -      document = xml.dom.minidom.parseString(node.get_contents()) -    except xml.parsers.expat.ExpatError: -      return [] -    for include in document.getElementsByTagNameNS("http://www.w3.org/1999/XSL/Format", "external-graphic") : -      m = re.match("url\((.*)\)", include.getAttribute("src")) -      if m : -        dependencies.add(m.group(1)) -    return list(dependencies) +	def scan_fo(node, env, path) : +		dependencies = set() +		try : +			document = xml.dom.minidom.parseString(node.get_contents()) +		except xml.parsers.expat.ExpatError: +			return [] +		for include in document.getElementsByTagNameNS("http://www.w3.org/1999/XSL/Format", "external-graphic") : +			m = re.match("url\((.*)\)", include.getAttribute("src")) +			if m : +				dependencies.add(m.group(1)) +		return list(dependencies) -  env["FO"] = "fop" -  env["FOFLAGS"] = "" -  env["FOCFG"] = "" -  env["BUILDERS"]["FO"] = SCons.Builder.Builder( -        generator = generate_actions, -        emitter = modify_sources, -        source_scanner = SCons.Scanner.Scanner(function = scan_fo, skeys = [".fo"]), -        suffix = ".pdf", -        src_suffix = ".fo" -      ) +	env["FO"] = "fop" +	env["FOFLAGS"] = "" +	env["FOCFG"] = "" +	env["BUILDERS"]["FO"] = SCons.Builder.Builder( +				generator = generate_actions, +				emitter = modify_sources, +				source_scanner = SCons.Scanner.Scanner(function = scan_fo, skeys = [".fo"]), +				suffix = ".pdf", +				src_suffix = ".fo" +			)  def exists(env) : -  return True +	return True diff --git a/BuildTools/DocBook/SCons/XSLT.py b/BuildTools/DocBook/SCons/XSLT.py index 83b5ec2..825f129 100644 --- a/BuildTools/DocBook/SCons/XSLT.py +++ b/BuildTools/DocBook/SCons/XSLT.py @@ -6,58 +6,58 @@ import xml.dom.minidom, os, os.path  ################################################################################  def generate(env) : -  def generate_actions(source, target, env, for_signature) : -    if not env.has_key("XSLTSTYLESHEET") : -      raise SCons.Errors.UserError, "The XSLTSTYLESHEET construction variable must be defined" - -    # Process the XML catalog files -    # FIXME: It's probably not clean to do an ENV assignment globally -    env["ENV"]["XML_CATALOG_FILES"] = " ".join(env.get("XMLCATALOGS", "")) - -    # Build the XMLLint command -    xmllintcmd = ["$XMLLINT", "--nonet", "--xinclude", "--postvalid", "--noout", "$SOURCE"] - -    # Build the XSLT command -    xsltcmd = ["$XSLT", "--nonet", "--xinclude"] -    for (param, value) in env["XSLTPARAMS"] : -      xsltcmd += ["--stringparam", param, value] -    xsltcmd += ["-o", "$TARGET", "$XSLTSTYLESHEET", "$SOURCE"] - -    return [ -      SCons.Action.Action([xmllintcmd], cmdstr = "$XMLLINTCOMSTR"), -      SCons.Action.Action([xsltcmd], cmdstr = "$XSLTCOMSTR")] - -  def modify_sources(target, source, env) : -    if len(env["FOCFG"]) > 0 : -      source.append(env["FOCFG"]) -    source.append(env.get("XMLCATALOGS", [])) -    return target, source - -  def scan_xml(node, env, path) : -    dependencies = set() -    nodes = [node] -    while len(nodes) > 0 : -      node = nodes.pop() -      try : -        document = xml.dom.minidom.parseString(node.get_contents()) -      except xml.parsers.expat.ExpatError: -        continue -      for include in document.getElementsByTagNameNS("http://www.w3.org/2001/XInclude", "include") : -        include_file = include.getAttribute("href") -        dependencies.add(include_file) -        if include.getAttribute("parse") != "text" : -          nodes.append(env.File(include_file)) -    return list(dependencies) - -  env["XMLLINT"] = "xmllint" -  env["XSLT"] = "xsltproc" -  env["XSLTPARAMS"] = [] -  env["BUILDERS"]["XSLT"] = SCons.Builder.Builder( -        generator = generate_actions, -        emitter = modify_sources, -        source_scanner = SCons.Scanner.Scanner(function = scan_xml), -        src_suffix = ".xml" -      ) +	def generate_actions(source, target, env, for_signature) : +		if not env.has_key("XSLTSTYLESHEET") : +			raise SCons.Errors.UserError, "The XSLTSTYLESHEET construction variable must be defined" + +		# Process the XML catalog files +		# FIXME: It's probably not clean to do an ENV assignment globally +		env["ENV"]["XML_CATALOG_FILES"] = " ".join(env.get("XMLCATALOGS", "")) + +		# Build the XMLLint command +		xmllintcmd = ["$XMLLINT", "--nonet", "--xinclude", "--postvalid", "--noout", "$SOURCE"] + +		# Build the XSLT command +		xsltcmd = ["$XSLT", "--nonet", "--xinclude"] +		for (param, value) in env["XSLTPARAMS"] : +			xsltcmd += ["--stringparam", param, value] +		xsltcmd += ["-o", "$TARGET", "$XSLTSTYLESHEET", "$SOURCE"] + +		return [ +			SCons.Action.Action([xmllintcmd], cmdstr = "$XMLLINTCOMSTR"), +			SCons.Action.Action([xsltcmd], cmdstr = "$XSLTCOMSTR")] + +	def modify_sources(target, source, env) : +		if len(env["FOCFG"]) > 0 : +			source.append(env["FOCFG"]) +		source.append(env.get("XMLCATALOGS", [])) +		return target, source + +	def scan_xml(node, env, path) : +		dependencies = set() +		nodes = [node] +		while len(nodes) > 0 : +			node = nodes.pop() +			try : +				document = xml.dom.minidom.parseString(node.get_contents()) +			except xml.parsers.expat.ExpatError: +				continue +			for include in document.getElementsByTagNameNS("http://www.w3.org/2001/XInclude", "include") : +				include_file = include.getAttribute("href") +				dependencies.add(include_file) +				if include.getAttribute("parse") != "text" : +					nodes.append(env.File(include_file)) +		return list(dependencies) + +	env["XMLLINT"] = "xmllint" +	env["XSLT"] = "xsltproc" +	env["XSLTPARAMS"] = [] +	env["BUILDERS"]["XSLT"] = SCons.Builder.Builder( +				generator = generate_actions, +				emitter = modify_sources, +				source_scanner = SCons.Scanner.Scanner(function = scan_xml), +				src_suffix = ".xml" +			)  def exists(env) : -  return True +	return True diff --git a/BuildTools/FilterScanBuildResults.py b/BuildTools/FilterScanBuildResults.py index 53a345f..ed4a55f 100755 --- a/BuildTools/FilterScanBuildResults.py +++ b/BuildTools/FilterScanBuildResults.py @@ -6,23 +6,23 @@ resultsDir = sys.argv[1]  resultDirs = [ d for d in os.listdir(resultsDir) if os.path.isdir(os.path.join(resultsDir, d)) ]  resultDirs.sort()  if len(resultDirs) > 0 : -  resultDir = os.path.join(resultsDir, resultDirs[-1]) -  resultFileName = os.path.join(resultDir, "index.html") -  resultData = [] -  f = open(resultFileName, "r") -  skipLines = 0 -  for line in f.readlines() : -    if skipLines > 0 : -      skipLines -= 1 -    else : -      if ("3rdParty" in line or "SHA1.cpp" in line or "lua.c" in line) : -        m = re.match(".*(report-.*\.html)", line) -        os.remove(os.path.join(resultDir, m.group(1))) -        skipLines = 2 -      else : -        resultData.append(line) -  f.close() +	resultDir = os.path.join(resultsDir, resultDirs[-1]) +	resultFileName = os.path.join(resultDir, "index.html") +	resultData = [] +	f = open(resultFileName, "r") +	skipLines = 0 +	for line in f.readlines() : +		if skipLines > 0 : +			skipLines -= 1 +		else : +			if ("3rdParty" in line or "SHA1.cpp" in line or "lua.c" in line) : +				m = re.match(".*(report-.*\.html)", line) +				os.remove(os.path.join(resultDir, m.group(1))) +				skipLines = 2 +			else : +				resultData.append(line) +	f.close() -  f = open(resultFileName, "w") -  f.writelines(resultData) -  f.close() +	f = open(resultFileName, "w") +	f.writelines(resultData) +	f.close() diff --git a/BuildTools/FixIncludes.py b/BuildTools/FixIncludes.py index 0854e68..8ecbd4a 100755 --- a/BuildTools/FixIncludes.py +++ b/BuildTools/FixIncludes.py @@ -9,7 +9,7 @@ filename = sys.argv[1]  inPlace = False  if "-i" in sys.argv: -  inPlace = True +	inPlace = True  filename_base = os.path.basename(filename)  (filename_name, filename_ext) = os.path.splitext(filename_base) @@ -19,135 +19,135 @@ c_stdlib_headers = Set(["assert.h",  "limits.h",  "signal.h",  "stdlib.h", "ctyp  cpp_stdlib_headers = Set(["algorithm", "fstream", "list", "regex", "typeindex", "array", "functional", "locale", "set", "typeinfo", "atomic", "future", "map", "sstream", "type_traits", "bitset", "initializer_list", "memory", "stack", "unordered_map", "chrono", "iomanip", "mutex", "stdexcept", "unordered_set", "codecvt", "ios", "new", "streambuf", "utility", "complex", "iosfwd", "numeric", "string", "valarray", "condition_variable", "iostream", "ostream", "strstream", "vector", "deque", "istream", "queue", "system_error", "exception", "iterator", "random", "thread", "forward_list", "limits", "ratio", "tuple", "cassert", "ciso646", "csetjmp", "cstdio", "ctime", "cctype", "climits", "csignal", "cstdlib", "cwchar", "cerrno", "clocale", "cstdarg", "cstring", "cwctype", "cfloat", "cmath", "cstddef"])  class HeaderType: -    PRAGMA_ONCE, CORRESPONDING_HEADER, C_STDLIB, CPP_STDLIB, BOOST, QT, OTHER, SWIFTEN, SWIFT_CONTROLLERS, SWIFTOOLS, SWIFT = range(11) +		PRAGMA_ONCE, CORRESPONDING_HEADER, C_STDLIB, CPP_STDLIB, BOOST, QT, OTHER, SWIFTEN, SWIFT_CONTROLLERS, SWIFTOOLS, SWIFT = range(11)  def findHeaderBlock(lines): -  start = False -  end = False -  lastLine = None - -  for idx, line in enumerate(lines): -    if not start and line.startswith("#"): -      start = idx -    elif start and (not end) and (not line.startswith("#")) and line.strip(): -      end = idx-1 -      break -  if not end: -    end = len(lines) -  return (start, end) +	start = False +	end = False +	lastLine = None + +	for idx, line in enumerate(lines): +		if not start and line.startswith("#"): +			start = idx +		elif start and (not end) and (not line.startswith("#")) and line.strip(): +			end = idx-1 +			break +	if not end: +		end = len(lines) +	return (start, end)  def lineToFileName(line): -  match = re.match( r'#include "(.*)"', line) -  if match: -    return match.group(1) -  match = re.match( r'#include <(.*)>', line) -  if match: -    return match.group(1) -  return False +	match = re.match( r'#include "(.*)"', line) +	if match: +		return match.group(1) +	match = re.match( r'#include <(.*)>', line) +	if match: +		return match.group(1) +	return False  def fileNameToHeaderType(name): -  if name.endswith(filename_name + ".h"): -    return HeaderType.CORRESPONDING_HEADER +	if name.endswith(filename_name + ".h"): +		return HeaderType.CORRESPONDING_HEADER -  if name in c_stdlib_headers: -    return HeaderType.C_STDLIB -   -  if name in cpp_stdlib_headers: -    return HeaderType.CPP_STDLIB +	if name in c_stdlib_headers: +		return HeaderType.C_STDLIB -  if name.startswith("boost"): -    return HeaderType.BOOST +	if name in cpp_stdlib_headers: +		return HeaderType.CPP_STDLIB -  if name.startswith("Q"): -    return HeaderType.QT +	if name.startswith("boost"): +		return HeaderType.BOOST -  if name.startswith("Swiften"): -    return HeaderType.SWIFTEN +	if name.startswith("Q"): +		return HeaderType.QT -  if name.startswith("Swift/Controllers"): -    return HeaderType.SWIFT_CONTROLLERS +	if name.startswith("Swiften"): +		return HeaderType.SWIFTEN -  if name.startswith("SwifTools"): -    return HeaderType.SWIFTOOLS +	if name.startswith("Swift/Controllers"): +		return HeaderType.SWIFT_CONTROLLERS -  if name.startswith("Swift"): -    return HeaderType.SWIFT +	if name.startswith("SwifTools"): +		return HeaderType.SWIFTOOLS -  return HeaderType.OTHER +	if name.startswith("Swift"): +		return HeaderType.SWIFT + +	return HeaderType.OTHER  def serializeHeaderGroups(groups): -  headerList = [] -  for group in range(0, HeaderType.SWIFT + 1): -    if group in groups: -      # sorted and without duplicates -      headers = sorted(list(set(groups[group]))) -      headerList.extend(headers) -      headerList.extend(["\n"]) -  headerList.pop() -  return headerList +	headerList = [] +	for group in range(0, HeaderType.SWIFT + 1): +		if group in groups: +			# sorted and without duplicates +			headers = sorted(list(set(groups[group]))) +			headerList.extend(headers) +			headerList.extend(["\n"]) +	headerList.pop() +	return headerList  def overwriteFile(filename, content): -  with open(filename, 'w') as f: -    for line in content: -      f.write(line) +	with open(filename, 'w') as f: +		for line in content: +			f.write(line)  def cleanHeaderFile(content, headerStart, headerEnd, headerGroups): -  del content[headerStart:headerEnd] -  newHeaders = serializeHeaderGroups(headerGroups) -  content[headerStart:1] = newHeaders +	del content[headerStart:headerEnd] +	newHeaders = serializeHeaderGroups(headerGroups) +	content[headerStart:1] = newHeaders -  if inPlace : -    overwriteFile(filename, content) -  else : -    for line in content: -      print line, +	if inPlace : +		overwriteFile(filename, content) +	else : +		for line in content: +			print line,  def cleanImplementationFile(content, headerStart, headerEnd, headerGroups): -  del content[headerStart:headerEnd] -  newHeaders = serializeHeaderGroups(headerGroups) -  content[headerStart:1] = newHeaders +	del content[headerStart:headerEnd] +	newHeaders = serializeHeaderGroups(headerGroups) +	content[headerStart:1] = newHeaders -  if inPlace : -    overwriteFile(filename, content) -  else : -    for line in content: -      print line, +	if inPlace : +		overwriteFile(filename, content) +	else : +		for line in content: +			print line,  containsComplexPreprocessorDirectives = False  with open(filename) as f: -  content = f.readlines() +	content = f.readlines()  (headerStart, headerEnd) = findHeaderBlock(content)  headerGroups = {}  for line in content[headerStart:headerEnd]: -  if line.strip(): -    if line.strip().startswith("#pragma once"): -      headerType = HeaderType.PRAGMA_ONCE -    elif line.strip().startswith("#if") or line.strip().startswith("#def") or line.strip().startswith("#undef") or line.strip().startswith("#pragma "): -      containsComplexPreprocessorDirectives = True -      break -    else: -      #print line -      headerType = fileNameToHeaderType(lineToFileName(line)) -     -    #filename = lineToFileName(line) -    if headerType in headerGroups: -      headerGroups[headerType].append(line) -    else: -      headerGroups[headerType] = [line] +	if line.strip(): +		if line.strip().startswith("#pragma once"): +			headerType = HeaderType.PRAGMA_ONCE +		elif line.strip().startswith("#if") or line.strip().startswith("#def") or line.strip().startswith("#undef") or line.strip().startswith("#pragma "): +			containsComplexPreprocessorDirectives = True +			break +		else: +			#print line +			headerType = fileNameToHeaderType(lineToFileName(line)) + +		#filename = lineToFileName(line) +		if headerType in headerGroups: +			headerGroups[headerType].append(line) +		else: +			headerGroups[headerType] = [line]  if containsComplexPreprocessorDirectives: -  print "Cannot format headers containing preprocessor #if, #pragma, #define or #undef statements!" -  exit(1) +	print "Cannot format headers containing preprocessor #if, #pragma, #define or #undef statements!" +	exit(1)  if filename_base.endswith(".h"): -  if not HeaderType.PRAGMA_ONCE in headerGroups: -    print "Missing #pragma once!" -    exit(2) -  cleanHeaderFile(content, headerStart, headerEnd, headerGroups) +	if not HeaderType.PRAGMA_ONCE in headerGroups: +		print "Missing #pragma once!" +		exit(2) +	cleanHeaderFile(content, headerStart, headerEnd, headerGroups)  elif filename_base.endswith(".cpp"): -  cleanImplementationFile(content, headerStart, headerEnd, headerGroups) +	cleanImplementationFile(content, headerStart, headerEnd, headerGroups) diff --git a/BuildTools/Gource/GetGravatars.py b/BuildTools/Gource/GetGravatars.py index 8adb13c..47f8a68 100755 --- a/BuildTools/Gource/GetGravatars.py +++ b/BuildTools/Gource/GetGravatars.py @@ -5,8 +5,8 @@ import subprocess, os, sys, hashlib, urllib  GRAVATAR_URL = "http://www.gravatar.com/avatar/%(id)s?d=404"  if len(sys.argv) != 2 : -  print "Usage: " + sys.argv[0] + " <output-dir>" -  sys.exit(-1) +	print "Usage: " + sys.argv[0] + " <output-dir>" +	sys.exit(-1)  output_dir = sys.argv[1] @@ -14,36 +14,36 @@ output_dir = sys.argv[1]  authors = {}  p = subprocess.Popen("git log --pretty=format:'%ae|%an'", shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, close_fds=(os.name != "nt"))  for line in p.stdout.readlines() : -  author_components = line.rstrip().split("|") -  authors[author_components[0]] = author_components[1] +	author_components = line.rstrip().split("|") +	authors[author_components[0]] = author_components[1]  p.stdin.close()  if p.wait() != 0 : -  print "Error" -  sys.exit(-1) +	print "Error" +	sys.exit(-1)  # Get & save the avatars  if not os.path.isdir(output_dir) : -  os.makedirs(output_dir) +	os.makedirs(output_dir)  for email, name in authors.items() : -  print "Processing avatar for " + name + " <" + email + ">" -  filename = os.path.join(output_dir, name + ".png") -  if os.path.isfile(filename) : -    print "-> Already there. Skipping." -    continue +	print "Processing avatar for " + name + " <" + email + ">" +	filename = os.path.join(output_dir, name + ".png") +	if os.path.isfile(filename) : +		print "-> Already there. Skipping." +		continue -  m = hashlib.md5() -  m.update(email) -  url = GRAVATAR_URL % {"id" : m.hexdigest()} -  print "- Downloading " + url -  f = urllib.urlopen(url) -  input = None -  if f.getcode() == 200 : -    input = f.read() -  f.close() -  if input : -    print "- Saving file " + filename -    f = open(filename, "w") -    f.write(input) -    f.close() -  else : -    print "- No Gravatar found" +	m = hashlib.md5() +	m.update(email) +	url = GRAVATAR_URL % {"id" : m.hexdigest()} +	print "- Downloading " + url +	f = urllib.urlopen(url) +	input = None +	if f.getcode() == 200 : +		input = f.read() +	f.close() +	if input : +		print "- Saving file " + filename +		f = open(filename, "w") +		f.write(input) +		f.close() +	else : +		print "- No Gravatar found" diff --git a/BuildTools/SCons/SConscript.boot b/BuildTools/SCons/SConscript.boot index 60aebdc..8b50044 100644 --- a/BuildTools/SCons/SConscript.boot +++ b/BuildTools/SCons/SConscript.boot @@ -107,15 +107,15 @@ vars.Add(BoolVariable("install_git_hooks", "Install git hooks", "true"))  ################################################################################  env_ENV = { -  'PATH' : os.environ['PATH'], -  'LD_LIBRARY_PATH' : os.environ.get("LD_LIBRARY_PATH", ""), -  'TERM' : os.environ.get("TERM", ""), +	'PATH' : os.environ['PATH'], +	'LD_LIBRARY_PATH' : os.environ.get("LD_LIBRARY_PATH", ""), +	'TERM' : os.environ.get("TERM", ""),  }  if "MSVC_VERSION" in ARGUMENTS : -  env = Environment(ENV = env_ENV, variables = vars, MSVC_VERSION = ARGUMENTS["MSVC_VERSION"], platform = ARGUMENTS.get("PLATFORM", None)) +	env = Environment(ENV = env_ENV, variables = vars, MSVC_VERSION = ARGUMENTS["MSVC_VERSION"], platform = ARGUMENTS.get("PLATFORM", None))  else : -  env = Environment(ENV = env_ENV, variables = vars, platform = ARGUMENTS.get("PLATFORM", None)) +	env = Environment(ENV = env_ENV, variables = vars, platform = ARGUMENTS.get("PLATFORM", None))  Help(vars.GenerateHelpText(env)) diff --git a/BuildTools/SCons/SConstruct b/BuildTools/SCons/SConstruct index 9fba359..4ead554 100644 --- a/BuildTools/SCons/SConstruct +++ b/BuildTools/SCons/SConstruct @@ -73,7 +73,7 @@ def checkObjCHeader(context, header) :  ################################################################################  if ARGUMENTS.get("force-configure", 0) : -  SCons.SConf.SetCacheMode("force") +	SCons.SConf.SetCacheMode("force")  def CheckPKG(context, name):  	context.Message( 'Checking for package %s... ' % name ) @@ -99,9 +99,9 @@ int main(int argc, char* argv[]) {  }  """ % { "header" : header, "define": define }, extension)  	if ret[0] : -	  return int(ret[1]) +		return int(ret[1])  	else : -	  return -1 +		return -1  conf = Configure(conf_env) @@ -339,7 +339,7 @@ icu_env = conf_env.Clone()  use_icu = bool(env["icu"])  icu_prefix = ""  if isinstance(env["icu"], str) : -        icu_prefix = env["icu"] +				icu_prefix = env["icu"]  icu_flags = {}  if icu_prefix :  	icu_flags = { "CPPPATH": [os.path.join(icu_prefix, "include")] } @@ -381,11 +381,11 @@ if not env.get("HAVE_ICU", False) and not env.get("HAVE_LIBIDN", False) :  # Unbound  if env["unbound"] : -    env["LDNS_BUNDLED"] = 1 -    env["UNBOUND_BUNDLED"] = 1 +	env["LDNS_BUNDLED"] = 1 +	env["UNBOUND_BUNDLED"] = 1  else : -    env["LDNS_FLAGS"] = {} -    env["UNBOUND_FLAGS"] = {} +	env["LDNS_FLAGS"] = {} +	env["UNBOUND_FLAGS"] = {}  # LibMiniUPnPc  if env["experimental_ft"] : @@ -693,8 +693,8 @@ for stage in ["flags", "build"] :  # SLOCCount  if ARGUMENTS.get("sloccount", False) : -  for project in env["PROJECTS"] : -    env.SLOCCount("#/" + project) +	for project in env["PROJECTS"] : +		env.SLOCCount("#/" + project)  ################################################################################ diff --git a/BuildTools/SCons/Tools/AppBundle.py b/BuildTools/SCons/Tools/AppBundle.py index 6a343f6..f1072f5 100644 --- a/BuildTools/SCons/Tools/AppBundle.py +++ b/BuildTools/SCons/Tools/AppBundle.py @@ -1,64 +1,64 @@  import SCons.Util, os.path  def generate(env) : -  def createAppBundle(env, bundle, version = "1.0", resources = [], frameworks = [], info = {}, handlesXMPPURIs = False) : -    bundleDir = bundle + ".app" -    bundleContentsDir = bundleDir + "/Contents" -    resourcesDir = bundleContentsDir + "/Resources" -    frameworksDir = bundleContentsDir + "/Frameworks" -    env.Install(bundleContentsDir + "/MacOS", bundle) -    env.WriteVal(bundleContentsDir + "/PkgInfo", env.Value("APPL\77\77\77\77")) +	def createAppBundle(env, bundle, version = "1.0", resources = [], frameworks = [], info = {}, handlesXMPPURIs = False) : +		bundleDir = bundle + ".app" +		bundleContentsDir = bundleDir + "/Contents" +		resourcesDir = bundleContentsDir + "/Resources" +		frameworksDir = bundleContentsDir + "/Frameworks" +		env.Install(bundleContentsDir + "/MacOS", bundle) +		env.WriteVal(bundleContentsDir + "/PkgInfo", env.Value("APPL\77\77\77\77")) -    infoDict = { -        "CFBundleDevelopmentRegion" : "English", -        "CFBundleExecutable" : bundle, -        "CFBundleIdentifier" : "im.swift." + bundle, -        "CFBundleInfoDictionaryVersion" : "6.0", -        "CFBundleName" : bundle, -        "CFBundlePackageType" : "APPL", -        "CFBundleSignature": "\77\77\77\77", -        "CFBundleVersion" : version, -        "CFBundleIconFile" : bundle, -        "NSPrincipalClass" : "NSApplication", -        "NSHumanReadableCopyright" : unichr(0xA9) + " 2010 Swift Development Team.\nAll Rights Reserved." -      } -    infoDict.update(info) -     -    plist = """<?xml version="1.0" encoding="UTF-8"?> -  <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> -  <plist version="1.0"> -  <dict> -  """ -    for key, value in infoDict.items() : -      plist += "<key>" + key + "</key>\n" -      plist += "<string>" + value.encode("utf-8") + "</string>\n" -    if handlesXMPPURIs : -      plist += """<key>CFBundleURLTypes</key> +		infoDict = { +				"CFBundleDevelopmentRegion" : "English", +				"CFBundleExecutable" : bundle, +				"CFBundleIdentifier" : "im.swift." + bundle, +				"CFBundleInfoDictionaryVersion" : "6.0", +				"CFBundleName" : bundle, +				"CFBundlePackageType" : "APPL", +				"CFBundleSignature": "\77\77\77\77", +				"CFBundleVersion" : version, +				"CFBundleIconFile" : bundle, +				"NSPrincipalClass" : "NSApplication", +				"NSHumanReadableCopyright" : unichr(0xA9) + " 2010 Swift Development Team.\nAll Rights Reserved." +			} +		infoDict.update(info) + +		plist = """<?xml version="1.0" encoding="UTF-8"?> +	<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +	<plist version="1.0"> +	<dict> +	""" +		for key, value in infoDict.items() : +			plist += "<key>" + key + "</key>\n" +			plist += "<string>" + value.encode("utf-8") + "</string>\n" +		if handlesXMPPURIs : +			plist += """<key>CFBundleURLTypes</key>  <array> -    <dict> -        <key>CFBundleURLName</key> -        <string>XMPP URL</string> -        <key>CFBundleURLSchemes</key> -        <array> -            <string>xmpp</string> -        </array> -    </dict> +		<dict> +				<key>CFBundleURLName</key> +				<string>XMPP URL</string> +				<key>CFBundleURLSchemes</key> +				<array> +						<string>xmpp</string> +				</array> +		</dict>  </array>\n""" -    plist += """</dict> -  </plist> -  """ -    env.WriteVal(bundleContentsDir + "/Info.plist", env.Value(plist)) +		plist += """</dict> +	</plist> +	""" +		env.WriteVal(bundleContentsDir + "/Info.plist", env.Value(plist)) -    for (target, resource) in resources.items() : -      env.Install(os.path.join(resourcesDir, target), resource) +		for (target, resource) in resources.items() : +			env.Install(os.path.join(resourcesDir, target), resource) -    for framework in frameworks : -      env.Install(frameworksDir, framework) +		for framework in frameworks : +			env.Install(frameworksDir, framework) -    return env.Dir(bundleDir) +		return env.Dir(bundleDir) -  env.AddMethod(createAppBundle, "AppBundle") +	env.AddMethod(createAppBundle, "AppBundle")  def exists(env) : -  return env["PLATFORM"] == "darwin" +	return env["PLATFORM"] == "darwin" diff --git a/BuildTools/SCons/Tools/BuildVersion.py b/BuildTools/SCons/Tools/BuildVersion.py index 41e6d8d..b15448a 100644 --- a/BuildTools/SCons/Tools/BuildVersion.py +++ b/BuildTools/SCons/Tools/BuildVersion.py @@ -3,16 +3,16 @@ import SCons.Util  import Version  def generate(env) : -  def createBuildVersion(env, target, project) : -    buildVersion = """#pragma once +	def createBuildVersion(env, target, project) : +		buildVersion = """#pragma once  static const char* buildVersion = \"%(buildVersion)s\";\n  #define SWIFT_VERSION_STRING \"%(buildVersion)s\";\n  """ % { "buildVersion" : Version.getBuildVersion(env.Dir("#").abspath, project) } -    env.WriteVal(target, env.Value(buildVersion)) +		env.WriteVal(target, env.Value(buildVersion)) -  env.AddMethod(createBuildVersion, "BuildVersion") +	env.AddMethod(createBuildVersion, "BuildVersion")  def exists(env) : -  return true +	return true diff --git a/BuildTools/SCons/Tools/DoxyGen.py b/BuildTools/SCons/Tools/DoxyGen.py index 3fc53c4..79af1c9 100644 --- a/BuildTools/SCons/Tools/DoxyGen.py +++ b/BuildTools/SCons/Tools/DoxyGen.py @@ -1,26 +1,26 @@  import SCons.Util, os  def generate(env) : -  def modify_targets(target, source, env) : -    target = [env.File("html/index.html")] -    return target, source +	def modify_targets(target, source, env) : +		target = [env.File("html/index.html")] +		return target, source -  def generate_actions(source, target, env, for_signature) : -    if env.WhereIs("$DOXYGEN") and env.WhereIs("$DOT") : -      return [SCons.Action.Action("$DOXYGEN $SOURCE", cmdstr = "$DOXYCOMSTR")] -    else : -      return [] +	def generate_actions(source, target, env, for_signature) : +		if env.WhereIs("$DOXYGEN") and env.WhereIs("$DOT") : +			return [SCons.Action.Action("$DOXYGEN $SOURCE", cmdstr = "$DOXYCOMSTR")] +		else : +			return [] -  env["DOXYGEN"] = "doxygen" -  # FIXME: For some reason, things go incredibly slow (at least on OS X) -  # when not doing this. Some environment flag is having an effect on -  # this; find out which -  env["ENV"] = os.environ -  env["DOT"] = "dot" -  env["BUILDERS"]["DoxyGen"] = SCons.Builder.Builder( -    emitter = modify_targets, -    generator = generate_actions, -    single_source = True) +	env["DOXYGEN"] = "doxygen" +	# FIXME: For some reason, things go incredibly slow (at least on OS X) +	# when not doing this. Some environment flag is having an effect on +	# this; find out which +	env["ENV"] = os.environ +	env["DOT"] = "dot" +	env["BUILDERS"]["DoxyGen"] = SCons.Builder.Builder( +		emitter = modify_targets, +		generator = generate_actions, +		single_source = True)  def exists(env) : -  return True +	return True diff --git a/BuildTools/SCons/Tools/Flags.py b/BuildTools/SCons/Tools/Flags.py index c130faf..0768181 100644 --- a/BuildTools/SCons/Tools/Flags.py +++ b/BuildTools/SCons/Tools/Flags.py @@ -1,13 +1,13 @@  import SCons.Util  def generate(env) : -  def useFlags(env, flags) : -    for flag in flags : -      if flag in env : -        env[flag] = env[flag] + flags[flag] -      else : -        env[flag] = flags[flag] -  env.AddMethod(useFlags, "UseFlags") +	def useFlags(env, flags) : +		for flag in flags : +			if flag in env : +				env[flag] = env[flag] + flags[flag] +			else : +				env[flag] = flags[flag] +	env.AddMethod(useFlags, "UseFlags")  def exists(env) : -  return True +	return True diff --git a/BuildTools/SCons/Tools/Nib.py b/BuildTools/SCons/Tools/Nib.py index ccfd884..91eb064 100644 --- a/BuildTools/SCons/Tools/Nib.py +++ b/BuildTools/SCons/Tools/Nib.py @@ -1,12 +1,12 @@  import SCons.Util  def generate(env) : -  env["IBTOOL"] = "ibtool" -  env["BUILDERS"]["Nib"] = SCons.Builder.Builder( -      action = SCons.Action.Action("$IBTOOL --errors --warnings --notices --output-format human-readable-text --compile $TARGET $SOURCE", cmdstr = "$NIBCOMSTR"), -      suffix = ".nib", -      src_suffix = ".xib", -      single_source = True) +	env["IBTOOL"] = "ibtool" +	env["BUILDERS"]["Nib"] = SCons.Builder.Builder( +			action = SCons.Action.Action("$IBTOOL --errors --warnings --notices --output-format human-readable-text --compile $TARGET $SOURCE", cmdstr = "$NIBCOMSTR"), +			suffix = ".nib", +			src_suffix = ".xib", +			single_source = True)  def exists(env) : -  return env["PLATFORM"] == "darwin" +	return env["PLATFORM"] == "darwin" diff --git a/BuildTools/SCons/Tools/ReplacePragmaOnce.py b/BuildTools/SCons/Tools/ReplacePragmaOnce.py index 466c31e..3df0f41 100644 --- a/BuildTools/SCons/Tools/ReplacePragmaOnce.py +++ b/BuildTools/SCons/Tools/ReplacePragmaOnce.py @@ -1,25 +1,25 @@  import SCons.Util, os.path  def generate(env) : -  root = env.Dir("#").abspath -  def relpath(path, start) : -    i = len(os.path.commonprefix([path, start])) -    return path[i+1:] +	root = env.Dir("#").abspath +	def relpath(path, start) : +		i = len(os.path.commonprefix([path, start])) +		return path[i+1:] -  def replacePragmaOnce(env, target, source) : -    guard = relpath(source[0].abspath, root).replace("/", "_").replace(".", "_").upper() -    data = source[0].get_contents() -    f = open(str(target[0]), 'wb') -    if "#pragma once" in data : -      f.write(data.replace("#pragma once", "#ifndef %(guard)s\n#define %(guard)s" % {"guard": guard})) -      f.write("\n#endif\n") -    else : -      f.write(data) -    f.close() +	def replacePragmaOnce(env, target, source) : +		guard = relpath(source[0].abspath, root).replace("/", "_").replace(".", "_").upper() +		data = source[0].get_contents() +		f = open(str(target[0]), 'wb') +		if "#pragma once" in data : +			f.write(data.replace("#pragma once", "#ifndef %(guard)s\n#define %(guard)s" % {"guard": guard})) +			f.write("\n#endif\n") +		else : +			f.write(data) +		f.close() -  env["BUILDERS"]["ReplacePragmaOnce"] = SCons.Builder.Builder( -    action = SCons.Action.Action(replacePragmaOnce, cmdstr = "$GENCOMSTR"), -    single_source = True) +	env["BUILDERS"]["ReplacePragmaOnce"] = SCons.Builder.Builder( +		action = SCons.Action.Action(replacePragmaOnce, cmdstr = "$GENCOMSTR"), +		single_source = True)  def exists(env) : -  return True +	return True diff --git a/BuildTools/SCons/Tools/SLOCCount.py b/BuildTools/SCons/Tools/SLOCCount.py index abf4a3c..682a797 100644 --- a/BuildTools/SCons/Tools/SLOCCount.py +++ b/BuildTools/SCons/Tools/SLOCCount.py @@ -1,17 +1,17 @@  import SCons.Util, os.path, os  def generate(env) : -  def createSLOCCount(env, source) : -    myenv = env.Clone() -    myenv["ENV"]["HOME"] = os.environ["HOME"] -    source = myenv.Dir(source) -    target = myenv.File("#/" + source.path + ".sloccount") -    # FIXME: There's probably a better way to force building the .sc -    if os.path.exists(target.abspath) : -      os.unlink(target.abspath) -    return myenv.Command(target, source, [SCons.Action.Action("sloccount --duplicates --wide --details " + source.path + " | grep -v qrc_ > $TARGET", cmdstr = "$GENCOMSTR")]) +	def createSLOCCount(env, source) : +		myenv = env.Clone() +		myenv["ENV"]["HOME"] = os.environ["HOME"] +		source = myenv.Dir(source) +		target = myenv.File("#/" + source.path + ".sloccount") +		# FIXME: There's probably a better way to force building the .sc +		if os.path.exists(target.abspath) : +			os.unlink(target.abspath) +		return myenv.Command(target, source, [SCons.Action.Action("sloccount --duplicates --wide --details " + source.path + " | grep -v qrc_ > $TARGET", cmdstr = "$GENCOMSTR")]) -  env.AddMethod(createSLOCCount, "SLOCCount") +	env.AddMethod(createSLOCCount, "SLOCCount")  def exists(env) : -  return True +	return True diff --git a/BuildTools/SCons/Tools/WindowsBundle.py b/BuildTools/SCons/Tools/WindowsBundle.py index 744d5c8..5afb56e 100644 --- a/BuildTools/SCons/Tools/WindowsBundle.py +++ b/BuildTools/SCons/Tools/WindowsBundle.py @@ -4,119 +4,119 @@ import re  import shutil  def which(program_name): -  if hasattr(shutil, "which"): -    return shutil.which(program_name) -  else: -    path = os.getenv('PATH') -    for p in path.split(os.path.pathsep): -      p = os.path.join(p,program_name) -      if os.path.exists(p) and os.access(p,os.X_OK): -        return p +	if hasattr(shutil, "which"): +		return shutil.which(program_name) +	else: +		path = os.getenv('PATH') +		for p in path.split(os.path.pathsep): +			p = os.path.join(p,program_name) +			if os.path.exists(p) and os.access(p,os.X_OK): +				return p  def generate(env) : -  def captureWinDeployQtMapping(release = True): -    p = False - -    qt_bin_folder = "" -    if "QTDIR" in env: -      qt_bin_folder = env["QTDIR"] + "\\bin;" - -    environ = {"PATH": qt_bin_folder + os.getenv("PATH"), "TEMP": os.getenv("TEMP"), "TMP": os.getenv("TMP")} - -    if release: -      p = subprocess.Popen(['windeployqt', '--release', '--dry-run', '--list', 'mapping', 'Swift.exe'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=environ) -    else: -      p = subprocess.Popen(['windeployqt', '--debug', '--dry-run', '--list', 'mapping', 'Swift.exe'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=environ) - -    if p: -      stdout, stderr = p.communicate() - -      mappings = [] - -      p = re.compile(ur'"([^\"]*)" "([^\"]*)"') - -      matches = re.findall(p, stdout) -      for match in matches: -        mappings.append(match) -      return mappings -    else: -      return False - -  def createWindowsBundleManual(env, bundle, resources = {}, qtplugins = {}, qtlibs = [], qtversion = '4') : -    all_files = [] -    all_files += env.Install(bundle, bundle + ".exe") -    for lib in qtlibs : -      all_files += env.Install(bundle, os.path.join(env["QTDIR"], "bin", lib + ".dll")) -    plugins_suffix = '4' -    if qtversion == '5' : -      plugins_suffix = '' -    for plugin_type in qtplugins: -      all_files += env.Install(os.path.join(bundle, plugin_type), [os.path.join(env["QTDIR"], "plugins", plugin_type, "q" + plugin + plugins_suffix + ".dll") for plugin in qtplugins[plugin_type]]) -    for dir, resourceFiles in resources.items() : -      for resource in resourceFiles : -        e = env.Entry(resource) -        if e.isdir() : -          for subresource in env.Glob(str(e) + "/*") : -            all_files += env.Install(os.path.join(bundle, dir, e.name), subresource) -        else : -          all_files += env.Install(os.path.join(bundle, dir), resource) -    return all_files - -  # This version of uses windeployqt tool -  def createWindowsBundleWithWinDeployQt(env, bundle, resources = {}, qtplugins = {},  qtlibs = [],  qtversion = '4') : -    assert(qtversion == '5') -    all_files = [] - -    # add swift executable -    all_files += env.Install(bundle, bundle + ".exe") - -    # adding resources (swift sounds/images/translations) -    for dir, resourceFiles in resources.items() : -      for resource in resourceFiles : -        e = env.Entry(resource) -        if e.isdir() : -          for subresource in env.Glob(str(e) + "/*") : -            all_files += env.Install(os.path.join(bundle, dir, e.name), subresource) -        else : -          all_files += env.Install(os.path.join(bundle, dir), resource) - -    qtmappings = captureWinDeployQtMapping() -    assert(qtmappings) - -    # handle core DLLs -    qt_corelib_regex = re.compile(ur".*bin.*\\(.*)\.dll") - -    for qtlib in qtlibs: -      if qtlib.startswith("Qt5"): -        (src_path, target_path) = next(((src_path, target_path) for (src_path, target_path) in qtmappings if  qt_corelib_regex.match(src_path) and qt_corelib_regex.match(src_path).group(1) == qtlib), (None, None)) -        if src_path != None: -          all_files += env.Install(bundle, src_path) - -    # handle core dependencies -    for (src_path, target_path) in qtmappings: -      if qt_corelib_regex.match(src_path) and not qt_corelib_regex.match(src_path).group(1).startswith("Qt5"): -        all_files += env.Install(bundle, src_path) - -    # handle plugins -    qt_plugin_regex = re.compile(ur".*plugins.*\\(.*)\\(.*)\.dll") -    for (src_path, target_path) in qtmappings: -      if qt_plugin_regex.match(src_path): -        plugin_folder, filename = qt_plugin_regex.match(src_path).groups() -        try: -          if filename[1:] in qtplugins[plugin_folder]: -            all_files += env.Install(os.path.join(bundle, plugin_folder), src_path) -        except: -            pass -    return all_files - -  def createWindowsBundle(env, bundle, resources = {}, qtplugins = {}, qtlibs = [], qtversion = '4'): -    if which("windeployqt.exe"): -      return createWindowsBundleWithWinDeployQt(env, bundle, resources, qtplugins, qtlibs, qtversion) -    else: -      return createWindowsBundleManual(env, bundle, resources, qtplugins, qtlibs, qtversion) - -  env.AddMethod(createWindowsBundle, "WindowsBundle") +	def captureWinDeployQtMapping(release = True): +		p = False + +		qt_bin_folder = "" +		if "QTDIR" in env: +			qt_bin_folder = env["QTDIR"] + "\\bin;" + +		environ = {"PATH": qt_bin_folder + os.getenv("PATH"), "TEMP": os.getenv("TEMP"), "TMP": os.getenv("TMP")} + +		if release: +			p = subprocess.Popen(['windeployqt', '--release', '--dry-run', '--list', 'mapping', 'Swift.exe'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=environ) +		else: +			p = subprocess.Popen(['windeployqt', '--debug', '--dry-run', '--list', 'mapping', 'Swift.exe'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=environ) + +		if p: +			stdout, stderr = p.communicate() + +			mappings = [] + +			p = re.compile(ur'"([^\"]*)" "([^\"]*)"') + +			matches = re.findall(p, stdout) +			for match in matches: +				mappings.append(match) +			return mappings +		else: +			return False + +	def createWindowsBundleManual(env, bundle, resources = {}, qtplugins = {}, qtlibs = [], qtversion = '4') : +		all_files = [] +		all_files += env.Install(bundle, bundle + ".exe") +		for lib in qtlibs : +			all_files += env.Install(bundle, os.path.join(env["QTDIR"], "bin", lib + ".dll")) +		plugins_suffix = '4' +		if qtversion == '5' : +			plugins_suffix = '' +		for plugin_type in qtplugins: +			all_files += env.Install(os.path.join(bundle, plugin_type), [os.path.join(env["QTDIR"], "plugins", plugin_type, "q" + plugin + plugins_suffix + ".dll") for plugin in qtplugins[plugin_type]]) +		for dir, resourceFiles in resources.items() : +			for resource in resourceFiles : +				e = env.Entry(resource) +				if e.isdir() : +					for subresource in env.Glob(str(e) + "/*") : +						all_files += env.Install(os.path.join(bundle, dir, e.name), subresource) +				else : +					all_files += env.Install(os.path.join(bundle, dir), resource) +		return all_files + +	# This version of uses windeployqt tool +	def createWindowsBundleWithWinDeployQt(env, bundle, resources = {}, qtplugins = {},  qtlibs = [],  qtversion = '4') : +		assert(qtversion == '5') +		all_files = [] + +		# add swift executable +		all_files += env.Install(bundle, bundle + ".exe") + +		# adding resources (swift sounds/images/translations) +		for dir, resourceFiles in resources.items() : +			for resource in resourceFiles : +				e = env.Entry(resource) +				if e.isdir() : +					for subresource in env.Glob(str(e) + "/*") : +						all_files += env.Install(os.path.join(bundle, dir, e.name), subresource) +				else : +					all_files += env.Install(os.path.join(bundle, dir), resource) + +		qtmappings = captureWinDeployQtMapping() +		assert(qtmappings) + +		# handle core DLLs +		qt_corelib_regex = re.compile(ur".*bin.*\\(.*)\.dll") + +		for qtlib in qtlibs: +			if qtlib.startswith("Qt5"): +				(src_path, target_path) = next(((src_path, target_path) for (src_path, target_path) in qtmappings if  qt_corelib_regex.match(src_path) and qt_corelib_regex.match(src_path).group(1) == qtlib), (None, None)) +				if src_path != None: +					all_files += env.Install(bundle, src_path) + +		# handle core dependencies +		for (src_path, target_path) in qtmappings: +			if qt_corelib_regex.match(src_path) and not qt_corelib_regex.match(src_path).group(1).startswith("Qt5"): +				all_files += env.Install(bundle, src_path) + +		# handle plugins +		qt_plugin_regex = re.compile(ur".*plugins.*\\(.*)\\(.*)\.dll") +		for (src_path, target_path) in qtmappings: +			if qt_plugin_regex.match(src_path): +				plugin_folder, filename = qt_plugin_regex.match(src_path).groups() +				try: +					if filename[1:] in qtplugins[plugin_folder]: +						all_files += env.Install(os.path.join(bundle, plugin_folder), src_path) +				except: +						pass +		return all_files + +	def createWindowsBundle(env, bundle, resources = {}, qtplugins = {}, qtlibs = [], qtversion = '4'): +		if which("windeployqt.exe"): +			return createWindowsBundleWithWinDeployQt(env, bundle, resources, qtplugins, qtlibs, qtversion) +		else: +			return createWindowsBundleManual(env, bundle, resources, qtplugins, qtlibs, qtversion) + +	env.AddMethod(createWindowsBundle, "WindowsBundle")  def exists(env) : -  return env["PLATFORM"] == "win32" +	return env["PLATFORM"] == "win32" diff --git a/BuildTools/SCons/Tools/WriteVal.py b/BuildTools/SCons/Tools/WriteVal.py index 0a1e1ad..4e8d3bb 100644 --- a/BuildTools/SCons/Tools/WriteVal.py +++ b/BuildTools/SCons/Tools/WriteVal.py @@ -1,15 +1,15 @@  import SCons.Util  def generate(env) : -  def replacePragmaOnce(env, target, source) : -    f = open(str(target[0]), 'wb') -    f.write(source[0].get_contents()) -    f.close() +	def replacePragmaOnce(env, target, source) : +		f = open(str(target[0]), 'wb') +		f.write(source[0].get_contents()) +		f.close() -  env["BUILDERS"]["WriteVal"] = SCons.Builder.Builder( -    action = SCons.Action.Action(replacePragmaOnce, cmdstr = "$GENCOMSTR"), -    single_source = True) +	env["BUILDERS"]["WriteVal"] = SCons.Builder.Builder( +		action = SCons.Action.Action(replacePragmaOnce, cmdstr = "$GENCOMSTR"), +		single_source = True)  def exists(env) : -  return True +	return True diff --git a/BuildTools/SCons/Tools/textfile.py b/BuildTools/SCons/Tools/textfile.py index 89f8963..b290125 100644 --- a/BuildTools/SCons/Tools/textfile.py +++ b/BuildTools/SCons/Tools/textfile.py @@ -25,23 +25,23 @@  __doc__ = """  Textfile/Substfile builder for SCons. -    Create file 'target' which typically is a textfile.  The 'source' -    may be any combination of strings, Nodes, or lists of same.  A -    'linesep' will be put between any part written and defaults to -    os.linesep. - -    The only difference between the Textfile builder and the Substfile -    builder is that strings are converted to Value() nodes for the -    former and File() nodes for the latter.  To insert files in the -    former or strings in the latter, wrap them in a File() or Value(), -    respectively. - -    The values of SUBST_DICT first have any construction variables -    expanded (its keys are not expanded).  If a value of SUBST_DICT is -    a python callable function, it is called and the result is expanded -    as the value.  Values are substituted in a "random" order; if any -    substitution could be further expanded by another subsitition, it -    is unpredictible whether the expansion will occur. +	Create file 'target' which typically is a textfile.  The 'source' +	may be any combination of strings, Nodes, or lists of same.  A +	'linesep' will be put between any part written and defaults to +	os.linesep. + +	The only difference between the Textfile builder and the Substfile +	builder is that strings are converted to Value() nodes for the +	former and File() nodes for the latter.  To insert files in the +	former or strings in the latter, wrap them in a File() or Value(), +	respectively. + +	The values of SUBST_DICT first have any construction variables +	expanded (its keys are not expanded).  If a value of SUBST_DICT is +	a python callable function, it is called and the result is expanded +	as the value.  Values are substituted in a "random" order; if any +	substitution could be further expanded by another subsitition, it +	is unpredictible whether the expansion will occur.  """  __revision__ = "src/engine/SCons/Tool/textfile.py 5357 2011/09/09 21:31:03 bdeegan" @@ -56,117 +56,117 @@ from SCons.Node.Python import Value  from SCons.Util import is_String, is_Sequence, is_Dict  def _do_subst(node, subs): -    """ -    Fetch the node contents and replace all instances of the keys with -    their values.  For example, if subs is -        {'%VERSION%': '1.2345', '%BASE%': 'MyProg', '%prefix%': '/bin'}, -    then all instances of %VERSION% in the file will be replaced with -    1.2345 and so forth. -    """ -    contents = node.get_text_contents() -    if not subs: return contents -    for (k,v) in subs: -        contents = re.sub(k, v, contents) -    return contents +	""" +	Fetch the node contents and replace all instances of the keys with +	their values.  For example, if subs is +		{'%VERSION%': '1.2345', '%BASE%': 'MyProg', '%prefix%': '/bin'}, +	then all instances of %VERSION% in the file will be replaced with +	1.2345 and so forth. +	""" +	contents = node.get_text_contents() +	if not subs: return contents +	for (k,v) in subs: +		contents = re.sub(k, v, contents) +	return contents  def _action(target, source, env): -    # prepare the line separator -    linesep = env['LINESEPARATOR'] -    if linesep is None: -        linesep = os.linesep -    elif is_String(linesep): -        pass -    elif isinstance(linesep, Value): -        linesep = linesep.get_text_contents() -    else: -        raise SCons.Errors.UserError( -                           'unexpected type/class for LINESEPARATOR: %s' -                                         % repr(linesep), None) - -    # create a dictionary to use for the substitutions -    if 'SUBST_DICT' not in env: -        subs = None    # no substitutions -    else: -        d = env['SUBST_DICT'] -        if is_Dict(d): -            d = list(d.items()) -        elif is_Sequence(d): -            pass -        else: -            raise SCons.Errors.UserError('SUBST_DICT must be dict or sequence') -        subs = [] -        for (k,v) in d: -            if callable(v): -                v = v() -            if is_String(v): -                v = env.subst(v) -            else: -                v = str(v) -            subs.append((k,v)) - -    # write the file -    try: -        fd = open(target[0].get_path(), "wb") -    except (OSError,IOError), e: -        raise SCons.Errors.UserError("Can't write target file %s" % target[0]) -    # separate lines by 'linesep' only if linesep is not empty -    lsep = None -    for s in source: -        if lsep: fd.write(lsep) -        fd.write(_do_subst(s, subs)) -        lsep = linesep -    fd.close() +	# prepare the line separator +	linesep = env['LINESEPARATOR'] +	if linesep is None: +		linesep = os.linesep +	elif is_String(linesep): +		pass +	elif isinstance(linesep, Value): +		linesep = linesep.get_text_contents() +	else: +		raise SCons.Errors.UserError( +						   'unexpected type/class for LINESEPARATOR: %s' +										 % repr(linesep), None) + +	# create a dictionary to use for the substitutions +	if 'SUBST_DICT' not in env: +		subs = None    # no substitutions +	else: +		d = env['SUBST_DICT'] +		if is_Dict(d): +			d = list(d.items()) +		elif is_Sequence(d): +			pass +		else: +			raise SCons.Errors.UserError('SUBST_DICT must be dict or sequence') +		subs = [] +		for (k,v) in d: +			if callable(v): +				v = v() +			if is_String(v): +				v = env.subst(v) +			else: +				v = str(v) +			subs.append((k,v)) + +	# write the file +	try: +		fd = open(target[0].get_path(), "wb") +	except (OSError,IOError), e: +		raise SCons.Errors.UserError("Can't write target file %s" % target[0]) +	# separate lines by 'linesep' only if linesep is not empty +	lsep = None +	for s in source: +		if lsep: fd.write(lsep) +		fd.write(_do_subst(s, subs)) +		lsep = linesep +	fd.close()  def _strfunc(target, source, env): -    return "Creating '%s'" % target[0] +	return "Creating '%s'" % target[0]  def _convert_list_R(newlist, sources): -    for elem in sources: -        if is_Sequence(elem): -            _convert_list_R(newlist, elem) -        elif isinstance(elem, Node): -            newlist.append(elem) -        else: -            newlist.append(Value(elem)) +	for elem in sources: +		if is_Sequence(elem): +			_convert_list_R(newlist, elem) +		elif isinstance(elem, Node): +			newlist.append(elem) +		else: +			newlist.append(Value(elem))  def _convert_list(target, source, env): -    if len(target) != 1: -        raise SCons.Errors.UserError("Only one target file allowed") -    newlist = [] -    _convert_list_R(newlist, source) -    return target, newlist +	if len(target) != 1: +		raise SCons.Errors.UserError("Only one target file allowed") +	newlist = [] +	_convert_list_R(newlist, source) +	return target, newlist  _common_varlist = ['SUBST_DICT', 'LINESEPARATOR']  _text_varlist = _common_varlist + ['TEXTFILEPREFIX', 'TEXTFILESUFFIX']  _text_builder = SCons.Builder.Builder( -    action = SCons.Action.Action(_action, _strfunc, varlist = _text_varlist), -    source_factory = Value, -    emitter = _convert_list, -    prefix = '$TEXTFILEPREFIX', -    suffix = '$TEXTFILESUFFIX', -    ) +	action = SCons.Action.Action(_action, _strfunc, varlist = _text_varlist), +	source_factory = Value, +	emitter = _convert_list, +	prefix = '$TEXTFILEPREFIX', +	suffix = '$TEXTFILESUFFIX', +	)  _subst_varlist = _common_varlist + ['SUBSTFILEPREFIX', 'TEXTFILESUFFIX']  _subst_builder = SCons.Builder.Builder( -    action = SCons.Action.Action(_action, _strfunc, varlist = _subst_varlist), -    source_factory = SCons.Node.FS.File, -    emitter = _convert_list, -    prefix = '$SUBSTFILEPREFIX', -    suffix = '$SUBSTFILESUFFIX', -    src_suffix = ['.in'], -    ) +	action = SCons.Action.Action(_action, _strfunc, varlist = _subst_varlist), +	source_factory = SCons.Node.FS.File, +	emitter = _convert_list, +	prefix = '$SUBSTFILEPREFIX', +	suffix = '$SUBSTFILESUFFIX', +	src_suffix = ['.in'], +	)  def generate(env): -    env['LINESEPARATOR'] = os.linesep -    env['BUILDERS']['MyTextfile'] = _text_builder -    env['TEXTFILEPREFIX'] = '' -    env['TEXTFILESUFFIX'] = '.txt' -    env['BUILDERS']['MySubstfile'] = _subst_builder -    env['SUBSTFILEPREFIX'] = '' -    env['SUBSTFILESUFFIX'] = '' +	env['LINESEPARATOR'] = os.linesep +	env['BUILDERS']['MyTextfile'] = _text_builder +	env['TEXTFILEPREFIX'] = '' +	env['TEXTFILESUFFIX'] = '.txt' +	env['BUILDERS']['MySubstfile'] = _subst_builder +	env['SUBSTFILEPREFIX'] = '' +	env['SUBSTFILESUFFIX'] = ''  def exists(env): -    return 1 +	return 1  # Local Variables:  # tab-width:4 diff --git a/BuildTools/SCons/Version.py b/BuildTools/SCons/Version.py index 4fd9171..6482664 100644 --- a/BuildTools/SCons/Version.py +++ b/BuildTools/SCons/Version.py @@ -1,68 +1,68 @@  import subprocess, os, datetime, re, os.path  def getGitBuildVersion(root, project) : -  tag = git("describe --tags --exact --match \"" + project + "-*\"", root) -  if tag : -    return tag.rstrip()[len(project)+1:] -  tag = git("describe --tags --match \"" + project + "-*\"", root) -  if tag : -    m = re.match(project + "-(.*)-(.*)-(.*)", tag) -    if m : -      return m.group(1) + "-dev" + m.group(2) -  return None +	tag = git("describe --tags --exact --match \"" + project + "-*\"", root) +	if tag : +		return tag.rstrip()[len(project)+1:] +	tag = git("describe --tags --match \"" + project + "-*\"", root) +	if tag : +		m = re.match(project + "-(.*)-(.*)-(.*)", tag) +		if m : +			return m.group(1) + "-dev" + m.group(2) +	return None  def git(cmd, root) : -  full_cmd = "git " + cmd -  p = subprocess.Popen(full_cmd, cwd=root, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, close_fds=(os.name != "nt")) -  gitVersion = p.stdout.read() -  # error = p.stderr.read() -  # if error: -  #   print "Git error: " + error -  p.stdin.close() -  if p.wait() == 0 : -    return gitVersion -  return None +	full_cmd = "git " + cmd +	p = subprocess.Popen(full_cmd, cwd=root, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, close_fds=(os.name != "nt")) +	gitVersion = p.stdout.read() +	# error = p.stderr.read() +	# if error: +	#   print "Git error: " + error +	p.stdin.close() +	if p.wait() == 0 : +		return gitVersion +	return None  def getBuildVersion(root, project) : -  versionFilename = os.path.join(root, "VERSION." + project) -  if os.path.isfile(versionFilename) : -    f = open(versionFilename) -    version = f.read().strip() -    f.close() -    return version +	versionFilename = os.path.join(root, "VERSION." + project) +	if os.path.isfile(versionFilename) : +		f = open(versionFilename) +		version = f.read().strip() +		f.close() +		return version -  gitVersion = getGitBuildVersion(root, project) -  if gitVersion : -    return gitVersion +	gitVersion = getGitBuildVersion(root, project) +	if gitVersion : +		return gitVersion -  return datetime.date.today().strftime("%Y%m%d") +	return datetime.date.today().strftime("%Y%m%d")  def convertToWindowsVersion(version) : -  version_match = re.match("(\d+)\.(\d+)(.*)", version) -  major = version_match and int(version_match.group(1)) or 0 -  minor = version_match and int(version_match.group(2)) or 0 -  if version_match and len(version_match.group(3)) == 0 : -    patch = 60000 -  else : -    match = re.match("^beta(\d+)(.*)", version_match.group(3)) -    build_string = "" -    if match : -      patch = 1000*int(match.group(1)) -      build_string = match.group(2) -    else : -      rc_match = re.match("^rc(\d+)(.*)", version_match.group(3)) -      if rc_match : -        patch = 10000*int(rc_match.group(1)) -        build_string = rc_match.group(2) -      else : -        patch = 0 -        alpha_match = re.match("^alpha(.*)", version_match.group(3)) -        if alpha_match : -          build_string = alpha_match.group(1) +	version_match = re.match("(\d+)\.(\d+)(.*)", version) +	major = version_match and int(version_match.group(1)) or 0 +	minor = version_match and int(version_match.group(2)) or 0 +	if version_match and len(version_match.group(3)) == 0 : +		patch = 60000 +	else : +		match = re.match("^beta(\d+)(.*)", version_match.group(3)) +		build_string = "" +		if match : +			patch = 1000*int(match.group(1)) +			build_string = match.group(2) +		else : +			rc_match = re.match("^rc(\d+)(.*)", version_match.group(3)) +			if rc_match : +				patch = 10000*int(rc_match.group(1)) +				build_string = rc_match.group(2) +			else : +				patch = 0 +				alpha_match = re.match("^alpha(.*)", version_match.group(3)) +				if alpha_match : +					build_string = alpha_match.group(1) -    if len(build_string) > 0 : -      build_match = re.match("^-dev(\d+)", build_string) -      if build_match : -        patch += int(build_match.group(1)) +		if len(build_string) > 0 : +			build_match = re.match("^-dev(\d+)", build_string) +			if build_match : +				patch += int(build_match.group(1)) -  return (major, minor, patch) +	return (major, minor, patch) diff --git a/BuildTools/UpdateDebianChangelog.py b/BuildTools/UpdateDebianChangelog.py index 20e72da..0693461 100755 --- a/BuildTools/UpdateDebianChangelog.py +++ b/BuildTools/UpdateDebianChangelog.py @@ -14,28 +14,28 @@ project = ""  last_version = ""  m = re.match("([\w-]+) \((.*)-\d+\)", last_version_line)  if m : -  project = m.group(1) -  last_version = m.group(2) +	project = m.group(1) +	last_version = m.group(2)  if project == "" : -  project="swift-im" +	project="swift-im"  if "dev" in version : -  distribution = "development" +	distribution = "development"  elif "beta" in version or "rc" in version : -  distribution = "beta development" +	distribution = "beta development"  else : -  distribution = "release beta development" +	distribution = "release beta development"  if last_version != version : -  changelog = open(sys.argv[1]) -  changelog_data = changelog.read() -  changelog.close() -  changelog = open(sys.argv[1], "w") -  changelog.write(project + " (" + version + "-1)" + " " + distribution + "; urgency=low\n\n") -  changelog.write("  * Upstream development snapshot\n\n") -  changelog.write(" -- Swift Package Maintainer <packages@swift.im>  " + email.utils.formatdate() + "\n") -  changelog.write("\n") -  changelog.write(changelog_data) -  changelog.close() +	changelog = open(sys.argv[1]) +	changelog_data = changelog.read() +	changelog.close() +	changelog = open(sys.argv[1], "w") +	changelog.write(project + " (" + version + "-1)" + " " + distribution + "; urgency=low\n\n") +	changelog.write("  * Upstream development snapshot\n\n") +	changelog.write(" -- Swift Package Maintainer <packages@swift.im>  " + email.utils.formatdate() + "\n") +	changelog.write("\n") +	changelog.write(changelog_data) +	changelog.close() diff --git a/BuildTools/scons2ninja.py b/BuildTools/scons2ninja.py index c0eca0d..5d084cd 100755 --- a/BuildTools/scons2ninja.py +++ b/BuildTools/scons2ninja.py @@ -16,7 +16,7 @@ import re, os, os.path, subprocess, sys, fnmatch, shlex  ################################################################################  # Helper methods & variables  ################################################################################ -       +  SCRIPT = sys.argv[0]  SCONS_ARGS = ' '.join(sys.argv[1:]) @@ -24,203 +24,203 @@ SCONS_ARGS = ' '.join(sys.argv[1:])  BINARY_FLAGS = ["-framework", "-arch", "-x", "--output-format", "-isystem", "-include"]  if sys.platform == 'win32' : -  LIB_PREFIX = "" -  LIB_SUFFIX = "" -  EXE_SUFFIX = ".exe" +	LIB_PREFIX = "" +	LIB_SUFFIX = "" +	EXE_SUFFIX = ".exe"  else : -  LIB_PREFIX = "lib" -  LIB_SUFFIX = ".a" -  EXE_SUFFIX = "" +	LIB_PREFIX = "lib" +	LIB_SUFFIX = ".a" +	EXE_SUFFIX = ""  def is_regexp(x) : -  return 'match' in dir(x) +	return 'match' in dir(x)  def is_list(l) : -  return type(l) is list +	return type(l) is list  def escape(s) : -  return s.replace(' ', '$ ').replace(':', '$:') +	return s.replace(' ', '$ ').replace(':', '$:')  def quote_spaces(s) : -  if ' ' in s : -    return '"' + s + '"' -  else : -    return s -   +	if ' ' in s : +		return '"' + s + '"' +	else : +		return s +  def to_list(l) : -  if not l : -    return [] -  if is_list(l) : -    return l -  return [l] +	if not l : +		return [] +	if is_list(l) : +		return l +	return [l]  def partition(l, f) : -  x = [] -  y = [] -  for v in l : -    if f(v) : -      x.append(v) -    else : -      y.append(v) -  return (x, y) +	x = [] +	y = [] +	for v in l : +		if f(v) : +			x.append(v) +		else : +			y.append(v) +	return (x, y)  def get_unary_flags(prefix, flags) : -  return [x[len(prefix):] for x in flags if x.lower().startswith(prefix.lower())] +	return [x[len(prefix):] for x in flags if x.lower().startswith(prefix.lower())]  def extract_unary_flags(prefix, flags) : -  f1, f2 = partition(flags, lambda x : x.lower().startswith(prefix.lower())) -  return ([f[len(prefix):] for f in f1], f2) +	f1, f2 = partition(flags, lambda x : x.lower().startswith(prefix.lower())) +	return ([f[len(prefix):] for f in f1], f2)  def extract_unary_flag(prefix, flags) : -  flag, flags = extract_unary_flags(prefix, flags) -  return (flag[0], flags) +	flag, flags = extract_unary_flags(prefix, flags) +	return (flag[0], flags)  def extract_binary_flag(prefix, flags) : -  i = flags.index(prefix) -  flag = flags[i + 1] -  del flags[i] -  del flags[i] -  return (flag, flags) +	i = flags.index(prefix) +	flag = flags[i + 1] +	del flags[i] +	del flags[i] +	return (flag, flags)  def get_non_flags(flags) : -  skip = False -  result = [] -  for f in flags : -    if skip : -      skip = False -    elif f in BINARY_FLAGS : -      skip = True -    elif not f.startswith("/") and not f.startswith("-") : -      result.append(f) -  return result +	skip = False +	result = [] +	for f in flags : +		if skip : +			skip = False +		elif f in BINARY_FLAGS : +			skip = True +		elif not f.startswith("/") and not f.startswith("-") : +			result.append(f) +	return result  def extract_non_flags(flags) : -  non_flags = get_non_flags(flags) -  return (non_flags, filter(lambda x : x not in non_flags, flags)) +	non_flags = get_non_flags(flags) +	return (non_flags, filter(lambda x : x not in non_flags, flags))  def get_dependencies(target, build_targets) : -  result = [] -  queue = list(dependencies.get(target, [])) -  while len(queue) > 0 : -    n = queue.pop() -    # Filter out Value() results -    if n in build_targets or os.path.exists(n) : -      result.append(n) -      queue += list(dependencies.get(n, [])) -  return result +	result = [] +	queue = list(dependencies.get(target, [])) +	while len(queue) > 0 : +		n = queue.pop() +		# Filter out Value() results +		if n in build_targets or os.path.exists(n) : +			result.append(n) +			queue += list(dependencies.get(n, [])) +	return result  def get_built_libs(libs, libpaths, outputs) : -  canonical_outputs = [os.path.abspath(p) for p in outputs] -  result = [] -  for libpath in libpaths : -    for lib in libs : -      lib_libpath = os.path.join(libpath, LIB_PREFIX + lib + LIB_SUFFIX) -      if os.path.abspath(lib_libpath) in canonical_outputs : -        result.append(lib_libpath) -  return result +	canonical_outputs = [os.path.abspath(p) for p in outputs] +	result = [] +	for libpath in libpaths : +		for lib in libs : +			lib_libpath = os.path.join(libpath, LIB_PREFIX + lib + LIB_SUFFIX) +			if os.path.abspath(lib_libpath) in canonical_outputs : +				result.append(lib_libpath) +	return result  def parse_tool_command(line) : -  command = shlex.split(line, False, False if sys.platform == 'win32' else True) -  flags = command[1:] -  tool = os.path.splitext(os.path.basename(command[0]))[0] -  if tool.startswith('clang++') or tool.startswith('g++') : -    tool = "cxx" -  elif tool.startswith('clang') or tool.startswith('gcc') : -    tool = "cc" -  if tool in ["cc", "cxx"] and not "-c" in flags : -    tool = "glink" -  tool = tool.replace('-qt4', '') -  return tool, command, flags +	command = shlex.split(line, False, False if sys.platform == 'win32' else True) +	flags = command[1:] +	tool = os.path.splitext(os.path.basename(command[0]))[0] +	if tool.startswith('clang++') or tool.startswith('g++') : +		tool = "cxx" +	elif tool.startswith('clang') or tool.startswith('gcc') : +		tool = "cc" +	if tool in ["cc", "cxx"] and not "-c" in flags : +		tool = "glink" +	tool = tool.replace('-qt4', '') +	return tool, command, flags  def rglob(pattern, root = '.') : -  return [os.path.join(path, f) for path, dirs, files in os.walk(root) for f in fnmatch.filter(files, pattern)] +	return [os.path.join(path, f) for path, dirs, files in os.walk(root) for f in fnmatch.filter(files, pattern)]  ################################################################################  # Helper for building Ninja files  ################################################################################  class NinjaBuilder : -  def __init__(self) : -    self._header = "" -    self.variables = "" -    self.rules = "" -    self._build = "" -    self.pools = "" -    self._flags = {} -    self.targets = [] -   -  def header(self, text) : -    self._header += text + "\n" - -  def rule(self, name, **kwargs) : -    self.rules += "rule " + name + "\n" -    for k, v in kwargs.iteritems() : -      self.rules += "  " + str(k) + " = " + str(v) + "\n" -    self.rules += "\n" -   -  def pool(self, name, **kwargs) : -    self.pools += "pool " + name + "\n" -    for k, v in kwargs.iteritems() : -      self.pools += "  " + str(k) + " = " + str(v) + "\n" -    self.pools += "\n" - -  def variable(self, name, value) : -    self.variables += str(name) + " = " + str(value) + "\n" -   -  def build(self, target, rule, sources = None, **kwargs) : -    self._build += "build " + self.to_string(target) + ": " + rule -    if sources : -      self._build += " " + self.to_string(sources) -    if 'deps' in kwargs and kwargs['deps'] : -      self._build += " | " + self.to_string(kwargs["deps"]) -    if 'order_deps' in kwargs : -      self._build += " || " + self.to_string(kwargs['order_deps']) -    self._build += "\n" -    for var, value in kwargs.iteritems() : -      if var in ['deps', 'order_deps'] : -        continue -      value = self.to_string(value, quote = True) -      if var.endswith("flags") : -        value = self.get_flags_variable(var, value) -      self._build += "  " + var + " = " + value + "\n" -    self.targets += to_list(target) -   -  def header_targets(self) : -    return [x for x in self.targets if x.endswith('.h') or x.endswith('.hh')] -   -  def serialize(self) : -    result = "" -    result += self._header + "\n" -    result += self.variables + "\n" -    for prefix in self._flags.values() : -      for k, v in prefix.iteritems() : -        result += v + " = " + k + "\n" -    result += "\n" -    result += self.pools + "\n" -    result += self.rules + "\n" -    result += self._build + "\n" -    return result -   -  def to_string(self, lst, quote = False) : -    if is_list(lst) : -      if quote : -        return ' '.join([quote_spaces(x) for x in lst])  -      else : -        return ' '.join([escape(x) for x in lst])  -    if is_regexp(lst) : -      return ' '.join([escape(x) for x in self.targets if lst.match(x)]) -    return escape(lst) -   -  def get_flags_variable(self, flags_type, flags) : -    if len(flags) == 0 : -      return '' -    if flags_type not in self._flags : -      self._flags[flags_type] = {} -    type_flags = self._flags[flags_type] -    if flags not in type_flags : -      type_flags[flags] = flags_type + "_" + str(len(type_flags)) -    return "$" + type_flags[flags] -   +	def __init__(self) : +		self._header = "" +		self.variables = "" +		self.rules = "" +		self._build = "" +		self.pools = "" +		self._flags = {} +		self.targets = [] + +	def header(self, text) : +		self._header += text + "\n" + +	def rule(self, name, **kwargs) : +		self.rules += "rule " + name + "\n" +		for k, v in kwargs.iteritems() : +			self.rules += "  " + str(k) + " = " + str(v) + "\n" +		self.rules += "\n" + +	def pool(self, name, **kwargs) : +		self.pools += "pool " + name + "\n" +		for k, v in kwargs.iteritems() : +			self.pools += "  " + str(k) + " = " + str(v) + "\n" +		self.pools += "\n" + +	def variable(self, name, value) : +		self.variables += str(name) + " = " + str(value) + "\n" + +	def build(self, target, rule, sources = None, **kwargs) : +		self._build += "build " + self.to_string(target) + ": " + rule +		if sources : +			self._build += " " + self.to_string(sources) +		if 'deps' in kwargs and kwargs['deps'] : +			self._build += " | " + self.to_string(kwargs["deps"]) +		if 'order_deps' in kwargs : +			self._build += " || " + self.to_string(kwargs['order_deps']) +		self._build += "\n" +		for var, value in kwargs.iteritems() : +			if var in ['deps', 'order_deps'] : +				continue +			value = self.to_string(value, quote = True) +			if var.endswith("flags") : +				value = self.get_flags_variable(var, value) +			self._build += "  " + var + " = " + value + "\n" +		self.targets += to_list(target) + +	def header_targets(self) : +		return [x for x in self.targets if x.endswith('.h') or x.endswith('.hh')] + +	def serialize(self) : +		result = "" +		result += self._header + "\n" +		result += self.variables + "\n" +		for prefix in self._flags.values() : +			for k, v in prefix.iteritems() : +				result += v + " = " + k + "\n" +		result += "\n" +		result += self.pools + "\n" +		result += self.rules + "\n" +		result += self._build + "\n" +		return result + +	def to_string(self, lst, quote = False) : +		if is_list(lst) : +			if quote : +				return ' '.join([quote_spaces(x) for x in lst])  +			else : +				return ' '.join([escape(x) for x in lst])  +		if is_regexp(lst) : +			return ' '.join([escape(x) for x in self.targets if lst.match(x)]) +		return escape(lst) + +	def get_flags_variable(self, flags_type, flags) : +		if len(flags) == 0 : +			return '' +		if flags_type not in self._flags : +			self._flags[flags_type] = {} +		type_flags = self._flags[flags_type] +		if flags not in type_flags : +			type_flags[flags] = flags_type + "_" + str(len(type_flags)) +		return "$" + type_flags[flags] +  ################################################################################  # Configuration @@ -231,7 +231,7 @@ scons_cmd = "scons"  scons_dependencies = ['SConstruct'] + rglob('SConscript')  def ninja_custom_command(ninja, line) : -  return False +	return False  CONFIGURATION_FILE = '.scons2ninja.conf'  execfile(CONFIGURATION_FILE) @@ -248,104 +248,104 @@ ninja = NinjaBuilder()  ninja.pool('scons_pool', depth = 1)  if sys.platform == 'win32' : -  ninja.rule('cl',  -    deps = 'msvc',  -    command = '$cl /showIncludes $clflags -c $in /Fo$out', -    description = 'CXX $out') - -  ninja.rule('link', -    command = '$link $in $linkflags $libs /out:$out', -    description = 'LINK $out') - -  ninja.rule('link_mt', -    command = '$link $in $linkflags $libs /out:$out ; $mt $mtflags', -    description = 'LINK $out') - -  ninja.rule('lib', -    command = '$lib $libflags /out:$out $in', -    description = 'AR $out') - -  ninja.rule('rc', -    command = '$rc $rcflags /Fo$out $in', -    description = 'RC $out') - -  # SCons doesn't touch files if they didn't change, which makes -  # ninja rebuild the file over and over again. There's no touch on Windows :( -  # Could implement it with a script, but for now, delete the file if -  # this problem occurs. I'll fix it if it occurs too much. -  ninja.rule('scons', -    command = scons_cmd + " ${scons_args} $out", -    pool = 'scons_pool', -    description = 'GEN $out') - -  ninja.rule('install', command = 'cmd /c copy $in $out') -  ninja.rule('run', command = '$in') +	ninja.rule('cl',  +		deps = 'msvc',  +		command = '$cl /showIncludes $clflags -c $in /Fo$out', +		description = 'CXX $out') + +	ninja.rule('link', +		command = '$link $in $linkflags $libs /out:$out', +		description = 'LINK $out') + +	ninja.rule('link_mt', +		command = '$link $in $linkflags $libs /out:$out ; $mt $mtflags', +		description = 'LINK $out') + +	ninja.rule('lib', +		command = '$lib $libflags /out:$out $in', +		description = 'AR $out') + +	ninja.rule('rc', +		command = '$rc $rcflags /Fo$out $in', +		description = 'RC $out') + +	# SCons doesn't touch files if they didn't change, which makes +	# ninja rebuild the file over and over again. There's no touch on Windows :( +	# Could implement it with a script, but for now, delete the file if +	# this problem occurs. I'll fix it if it occurs too much. +	ninja.rule('scons', +		command = scons_cmd + " ${scons_args} $out", +		pool = 'scons_pool', +		description = 'GEN $out') + +	ninja.rule('install', command = 'cmd /c copy $in $out') +	ninja.rule('run', command = '$in')  else : -  ninja.rule('cxx', -    deps = 'gcc', -    depfile = '$out.d', -    command = '$cxx -MMD -MF $out.d $cxxflags -c $in -o $out', -    description = 'CXX $out') +	ninja.rule('cxx', +		deps = 'gcc', +		depfile = '$out.d', +		command = '$cxx -MMD -MF $out.d $cxxflags -c $in -o $out', +		description = 'CXX $out') -  ninja.rule('cc', -    deps = 'gcc', -    depfile = '$out.d', -    command = '$cc -MMD -MF $out.d $ccflags -c $in -o $out', -    description = 'CC $out') +	ninja.rule('cc', +		deps = 'gcc', +		depfile = '$out.d', +		command = '$cc -MMD -MF $out.d $ccflags -c $in -o $out', +		description = 'CC $out') -  ninja.rule('link', -    command = '$glink -o $out $in $linkflags', -    description = 'LINK $out') +	ninja.rule('link', +		command = '$glink -o $out $in $linkflags', +		description = 'LINK $out') -  ninja.rule('ar', -    command = 'ar $arflags $out $in && ranlib $out', -    description = 'AR $out') +	ninja.rule('ar', +		command = 'ar $arflags $out $in && ranlib $out', +		description = 'AR $out') -  # SCons doesn't touch files if they didn't change, which makes -  # ninja rebuild the file over and over again. Touching solves this. -  ninja.rule('scons', -    command = scons_cmd + " $out && touch $out", -    pool = 'scons_pool', -    description = 'GEN $out') +	# SCons doesn't touch files if they didn't change, which makes +	# ninja rebuild the file over and over again. Touching solves this. +	ninja.rule('scons', +		command = scons_cmd + " $out && touch $out", +		pool = 'scons_pool', +		description = 'GEN $out') -  ninja.rule('install', command = 'install $in $out') -  ninja.rule('run', command = './$in') +	ninja.rule('install', command = 'install $in $out') +	ninja.rule('run', command = './$in')  ninja.rule('moc', -  command = '$moc $mocflags -o $out $in', -  description = 'MOC $out') +	command = '$moc $mocflags -o $out $in', +	description = 'MOC $out')  ninja.rule('rcc', -  command = '$rcc $rccflags -name $name -o $out $in', -  description = 'RCC $out') +	command = '$rcc $rccflags -name $name -o $out $in', +	description = 'RCC $out')  ninja.rule('uic', -  command = '$uic $uicflags -o $out $in', -  description = 'UIC $out') +	command = '$uic $uicflags -o $out $in', +	description = 'UIC $out')  ninja.rule('lrelease', -  command = '$lrelease $lreleaseflags $in -qm $out', -  description = 'LRELEASE $out') +	command = '$lrelease $lreleaseflags $in -qm $out', +	description = 'LRELEASE $out')  ninja.rule('ibtool', -  command = '$ibtool $ibtoolflags --compile $out $in', -  description = 'IBTOOL $out') +	command = '$ibtool $ibtoolflags --compile $out $in', +	description = 'IBTOOL $out')  ninja.rule('dsymutil', -  command = '$dsymutil $dsymutilflags -o $out $in', -  description = 'DSYMUTIL $out') +	command = '$dsymutil $dsymutilflags -o $out $in', +	description = 'DSYMUTIL $out')  ninja.rule('generator', -  command = "python " + SCRIPT + " ${scons_args}", -  depfile = ".scons2ninja.deps", -  pool = 'scons_pool', -  generator = '1', -  description = 'Regenerating build.ninja') +	command = "python " + SCRIPT + " ${scons_args}", +	depfile = ".scons2ninja.deps", +	pool = 'scons_pool', +	generator = '1', +	description = 'Regenerating build.ninja')  ninja.rule('sdef', -  command = 'sdef $in | sdp -fh --basename $basename -o $outdir', -  description = 'SDEF $out') +	command = 'sdef $in | sdp -fh --basename $basename -o $outdir', +	description = 'SDEF $out')  ################################################################################  # Build Statements @@ -365,237 +365,237 @@ stage = 'preamble'  skip_nth_line = -1  stack = ['.']  for line in f.stdout : -  line = line.rstrip() - -  # Skip lines if requested from previous command -  if skip_nth_line >= 0 : -    skip_nth_line -= 1  -  if skip_nth_line == 0 : -    continue - -  if line.startswith('scons: done building targets') : -    break - -  if stage == "preamble" : -    # Pass all lines from the SCons configuration step to output -    if re.match("^scons: Building targets ...", line) : -      stage = "build" -    else : -      print line -     -  elif stage == "build" : -    if line.startswith('+-') : -      stage = "dependencies" -    elif re.match("^Using tempfile", line) : -      # Ignore response files from MSVS -      skip_nth_line = 2 -    else : -      build_lines.append(line) - -      # Already detect targets that will need 'mt' -      tool, _, flags = parse_tool_command(line) -      if tool == 'mt' : -        target = get_unary_flags("-outputresource:", flags)[0] -        target = target[0:target.index(';')] -        mtflags[target] = flags - -  elif stage == "dependencies" : -    if not re.match('^[\s|]+\+\-', line) : -      # Work around bug in SCons that splits output over multiple lines -      continue - -    level = line.index('+-') / 2 -    filename = line[level*2+2:] -    if filename.startswith('[') : -      filename = filename[1:-1]  - -    # Check if we use the 'fixed' format which escapes filenamenames -    if filename.startswith('\'') and filename.endswith('\'') : -      filename = eval(filename) - -    if level < len(stack) : -      stack = stack[0:level] -    elif level > len(stack) : -      if level != len(stack) + 1 : -        raise Exception("Internal Error" ) -      stack.append(previous_filename) -     -    # Skip absolute paths -    if not os.path.isabs(filename) : -      target = stack[-1] -      if target not in dependencies : -        dependencies[target] = [] -      dependencies[target].append(filename) -    previous_filename = filename +	line = line.rstrip() + +	# Skip lines if requested from previous command +	if skip_nth_line >= 0 : +		skip_nth_line -= 1  +	if skip_nth_line == 0 : +		continue + +	if line.startswith('scons: done building targets') : +		break + +	if stage == "preamble" : +		# Pass all lines from the SCons configuration step to output +		if re.match("^scons: Building targets ...", line) : +			stage = "build" +		else : +			print line + +	elif stage == "build" : +		if line.startswith('+-') : +			stage = "dependencies" +		elif re.match("^Using tempfile", line) : +			# Ignore response files from MSVS +			skip_nth_line = 2 +		else : +			build_lines.append(line) + +			# Already detect targets that will need 'mt' +			tool, _, flags = parse_tool_command(line) +			if tool == 'mt' : +				target = get_unary_flags("-outputresource:", flags)[0] +				target = target[0:target.index(';')] +				mtflags[target] = flags + +	elif stage == "dependencies" : +		if not re.match('^[\s|]+\+\-', line) : +			# Work around bug in SCons that splits output over multiple lines +			continue + +		level = line.index('+-') / 2 +		filename = line[level*2+2:] +		if filename.startswith('[') : +			filename = filename[1:-1]  + +		# Check if we use the 'fixed' format which escapes filenamenames +		if filename.startswith('\'') and filename.endswith('\'') : +			filename = eval(filename) + +		if level < len(stack) : +			stack = stack[0:level] +		elif level > len(stack) : +			if level != len(stack) + 1 : +				raise Exception("Internal Error" ) +			stack.append(previous_filename) + +		# Skip absolute paths +		if not os.path.isabs(filename) : +			target = stack[-1] +			if target not in dependencies : +				dependencies[target] = [] +			dependencies[target].append(filename) +		previous_filename = filename  if f.wait() != 0 : -  print "Error calling '" + scons_generate_cmd + "'" -  print f.stderr.read() -  exit(-1) +	print "Error calling '" + scons_generate_cmd + "'" +	print f.stderr.read() +	exit(-1)  # Pass 2: Parse build rules  tools = {}  for line in build_lines : -  # Custom python function -  m = re.match('^(\w+)\(\[([^\]]*)\]', line) -  if m : -    out = [x[1:-1] for x in m.group(2).split(',')] -    for x in out : -      # 'Note' = To be more correct, deps should also include $scons_dependencies, -      # but this regenerates a bit too often, so leaving it out for now. -      ninja.build(x, 'scons', None, deps = sorted(get_dependencies(x, ninja.targets))) -    continue -     - -  # TextFile -  m = re.match("^Creating '([^']+)'", line) -  if m : -    out = m.group(1) -    # Note: To be more correct, deps should also include $scons_dependencies, -    # but this regenerates a bit too often, so leaving it out for now. -    ninja.build(out, 'scons', None, deps = sorted(get_dependencies(out, ninja.targets))) -    continue - -  # Install -  m = re.match('^Install file: "(.*)" as "(.*)"', line) -  if m : -    ninja.build(m.group(2), 'install', m.group(1)) -    continue - -  m = re.match('^Install directory: "(.*)" as "(.*)"', line) -  if m : -    for source in rglob('*', m.group(1)) : -      if os.path.isdir(source) : -        continue -      target = os.path.join(m.group(2), os.path.relpath(source, m.group(1))) -      ninja.build(target, 'install', source) -    continue - -  # Tools -  tool, command, flags = parse_tool_command(line) -  tools[tool] = command[0] - -  ############################################################ -  # clang/gcc tools -  ############################################################ - -  if tool == 'cc': -    out, flags = extract_binary_flag("-o", flags) -    files, flags = extract_non_flags(flags) -    ninja.build(out, 'cc', files, order_deps = '_generated_headers', ccflags = flags) - -  elif tool == 'cxx': -    out, flags = extract_binary_flag("-o", flags) -    files, flags = extract_non_flags(flags) -    ninja.build(out, 'cxx', files, order_deps = '_generated_headers', cxxflags = flags) - -  elif tool == 'glink': -    out, flags = extract_binary_flag("-o", flags) -    files, flags = extract_non_flags(flags) -    libs = get_unary_flags('-l', flags) -    libpaths = get_unary_flags("-L", flags) -    deps = get_built_libs(libs, libpaths, ninja.targets) -    ninja.build(out, 'link', files, deps = sorted(deps), linkflags = flags) - -  elif tool == 'ar': -    objects, flags = partition(flags, lambda x: x.endswith('.o')) -    libs, flags = partition(flags, lambda x: x.endswith('.a')) -    out = libs[0] -    ninja.build(out, 'ar', objects, arflags = flags) - -  elif tool == 'ranlib': -    pass - - -  ############################################################ -  # MSVC tools -  ############################################################ -   -  elif tool == 'cl': -    out, flags = extract_unary_flag("/Fo", flags) -    files, flags = extract_non_flags(flags) -    ninja.build(out, 'cl', files, order_deps = '_generated_headers', clflags = flags) - -  elif tool == 'lib': -    out, flags = extract_unary_flag("/out:", flags) -    files, flags = extract_non_flags(flags) -    ninja.build(out, 'lib', files, libflags = flags) - -  elif tool == 'link': -    objects, flags = partition(flags, lambda x: x.endswith('.obj') or x.endswith('.res')) -    out, flags = extract_unary_flag("/out:", flags) -    libs, flags = partition(flags, lambda x: not x.startswith("/") and x.endswith(".lib")) -    libpaths = get_unary_flags("/libpath:", flags) -    deps = get_built_libs(libs, libpaths, ninja.targets) -    if out in mtflags : -      ninja.build(out, 'link_mt', objects, deps = sorted(deps),  -        libs = libs, linkflags = flags, mtflags = mtflags[out]) -    else : -      ninja.build(out, 'link', objects, deps = sorted(deps),  -        libs = libs, linkflags = flags) - -  elif tool == 'rc': -    out, flags = extract_unary_flag("/fo", flags) -    files, flags = extract_non_flags(flags) -    ninja.build(out, 'rc', files[0], order_deps = '_generated_headers', rcflags = flags) - -  elif tool == 'mt': -    # Already handled -    pass - -  ############################################################ -  # Qt tools -  ############################################################ -   -  elif tool == 'moc': -    out, flags = extract_binary_flag("-o", flags) -    files, flags = extract_non_flags(flags) -    ninja.build(out, 'moc', files, mocflags = flags) - -  elif tool == 'uic': -    out, flags = extract_binary_flag("-o", flags) -    files, flags = extract_non_flags(flags) -    ninja.build(out, 'uic', files, uicflags = flags) - -  elif tool == 'lrelease': -    out, flags = extract_binary_flag("-qm", flags) -    files, flags = extract_non_flags(flags) -    ninja.build(out, 'lrelease', files, lreleaseflags = flags) - -  elif tool == 'rcc': -    out, flags = extract_binary_flag("-o", flags) -    name, flags = extract_binary_flag("-name", flags) -    files, flags = extract_non_flags(flags) -    deps = list(set(get_dependencies(out, ninja.targets)) - set(files)) -    ninja.build(out, 'rcc', files, deps = sorted(deps), name = name, rccflags = flags) - -  ############################################################ -  # OS X tools -  ############################################################ - -  elif tool == 'ibtool': -    out, flags = extract_binary_flag("--compile", flags) -    files, flags = extract_non_flags(flags) -    ninja.build(out, 'ibtool', files, ibtoolflags = flags) - -  elif tool == 'dsymutil': -    out, flags = extract_binary_flag("-o", flags) -    files, flags = extract_non_flags(flags) -    ninja.build(out, 'dsymutil', files, dsymutilflags = flags) - -  elif tool == 'sdef' : -    source = flags[0]; -    outdir, flags = extract_binary_flag("-o", flags) -    basename, flags = extract_binary_flag("--basename", flags) -    ninja.build(os.path.join(outdir, basename + ".h"), 'sdef', [source],  -        basename = basename, -        outdir = outdir) - - -  elif not ninja_custom_command(ninja, line)  : -    raise Exception("Unknown tool: '" + line + "'") -     -   +	# Custom python function +	m = re.match('^(\w+)\(\[([^\]]*)\]', line) +	if m : +		out = [x[1:-1] for x in m.group(2).split(',')] +		for x in out : +			# 'Note' = To be more correct, deps should also include $scons_dependencies, +			# but this regenerates a bit too often, so leaving it out for now. +			ninja.build(x, 'scons', None, deps = sorted(get_dependencies(x, ninja.targets))) +		continue + + +	# TextFile +	m = re.match("^Creating '([^']+)'", line) +	if m : +		out = m.group(1) +		# Note: To be more correct, deps should also include $scons_dependencies, +		# but this regenerates a bit too often, so leaving it out for now. +		ninja.build(out, 'scons', None, deps = sorted(get_dependencies(out, ninja.targets))) +		continue + +	# Install +	m = re.match('^Install file: "(.*)" as "(.*)"', line) +	if m : +		ninja.build(m.group(2), 'install', m.group(1)) +		continue + +	m = re.match('^Install directory: "(.*)" as "(.*)"', line) +	if m : +		for source in rglob('*', m.group(1)) : +			if os.path.isdir(source) : +				continue +			target = os.path.join(m.group(2), os.path.relpath(source, m.group(1))) +			ninja.build(target, 'install', source) +		continue + +	# Tools +	tool, command, flags = parse_tool_command(line) +	tools[tool] = command[0] + +	############################################################ +	# clang/gcc tools +	############################################################ + +	if tool == 'cc': +		out, flags = extract_binary_flag("-o", flags) +		files, flags = extract_non_flags(flags) +		ninja.build(out, 'cc', files, order_deps = '_generated_headers', ccflags = flags) + +	elif tool == 'cxx': +		out, flags = extract_binary_flag("-o", flags) +		files, flags = extract_non_flags(flags) +		ninja.build(out, 'cxx', files, order_deps = '_generated_headers', cxxflags = flags) + +	elif tool == 'glink': +		out, flags = extract_binary_flag("-o", flags) +		files, flags = extract_non_flags(flags) +		libs = get_unary_flags('-l', flags) +		libpaths = get_unary_flags("-L", flags) +		deps = get_built_libs(libs, libpaths, ninja.targets) +		ninja.build(out, 'link', files, deps = sorted(deps), linkflags = flags) + +	elif tool == 'ar': +		objects, flags = partition(flags, lambda x: x.endswith('.o')) +		libs, flags = partition(flags, lambda x: x.endswith('.a')) +		out = libs[0] +		ninja.build(out, 'ar', objects, arflags = flags) + +	elif tool == 'ranlib': +		pass + + +	############################################################ +	# MSVC tools +	############################################################ + +	elif tool == 'cl': +		out, flags = extract_unary_flag("/Fo", flags) +		files, flags = extract_non_flags(flags) +		ninja.build(out, 'cl', files, order_deps = '_generated_headers', clflags = flags) + +	elif tool == 'lib': +		out, flags = extract_unary_flag("/out:", flags) +		files, flags = extract_non_flags(flags) +		ninja.build(out, 'lib', files, libflags = flags) + +	elif tool == 'link': +		objects, flags = partition(flags, lambda x: x.endswith('.obj') or x.endswith('.res')) +		out, flags = extract_unary_flag("/out:", flags) +		libs, flags = partition(flags, lambda x: not x.startswith("/") and x.endswith(".lib")) +		libpaths = get_unary_flags("/libpath:", flags) +		deps = get_built_libs(libs, libpaths, ninja.targets) +		if out in mtflags : +			ninja.build(out, 'link_mt', objects, deps = sorted(deps),  +				libs = libs, linkflags = flags, mtflags = mtflags[out]) +		else : +			ninja.build(out, 'link', objects, deps = sorted(deps),  +				libs = libs, linkflags = flags) + +	elif tool == 'rc': +		out, flags = extract_unary_flag("/fo", flags) +		files, flags = extract_non_flags(flags) +		ninja.build(out, 'rc', files[0], order_deps = '_generated_headers', rcflags = flags) + +	elif tool == 'mt': +		# Already handled +		pass + +	############################################################ +	# Qt tools +	############################################################ + +	elif tool == 'moc': +		out, flags = extract_binary_flag("-o", flags) +		files, flags = extract_non_flags(flags) +		ninja.build(out, 'moc', files, mocflags = flags) + +	elif tool == 'uic': +		out, flags = extract_binary_flag("-o", flags) +		files, flags = extract_non_flags(flags) +		ninja.build(out, 'uic', files, uicflags = flags) + +	elif tool == 'lrelease': +		out, flags = extract_binary_flag("-qm", flags) +		files, flags = extract_non_flags(flags) +		ninja.build(out, 'lrelease', files, lreleaseflags = flags) + +	elif tool == 'rcc': +		out, flags = extract_binary_flag("-o", flags) +		name, flags = extract_binary_flag("-name", flags) +		files, flags = extract_non_flags(flags) +		deps = list(set(get_dependencies(out, ninja.targets)) - set(files)) +		ninja.build(out, 'rcc', files, deps = sorted(deps), name = name, rccflags = flags) + +	############################################################ +	# OS X tools +	############################################################ + +	elif tool == 'ibtool': +		out, flags = extract_binary_flag("--compile", flags) +		files, flags = extract_non_flags(flags) +		ninja.build(out, 'ibtool', files, ibtoolflags = flags) + +	elif tool == 'dsymutil': +		out, flags = extract_binary_flag("-o", flags) +		files, flags = extract_non_flags(flags) +		ninja.build(out, 'dsymutil', files, dsymutilflags = flags) + +	elif tool == 'sdef' : +		source = flags[0]; +		outdir, flags = extract_binary_flag("-o", flags) +		basename, flags = extract_binary_flag("--basename", flags) +		ninja.build(os.path.join(outdir, basename + ".h"), 'sdef', [source],  +				basename = basename, +				outdir = outdir) + + +	elif not ninja_custom_command(ninja, line)  : +		raise Exception("Unknown tool: '" + line + "'") + +  # Phony target for all generated headers, used as an order-only depency from all C/C++ sources  ninja.build('_generated_headers', 'phony', ninja.header_targets()) @@ -607,11 +607,11 @@ ninja.header("# This file is generated by " + SCRIPT)  ninja.variable("ninja_required_version", "1.3")  ninja.variable("scons_args", SCONS_ARGS)  for k, v in tools.iteritems() : -  ninja.variable(k, v) +	ninja.variable(k, v)  # Extra customizations  if 'ninja_post' in dir() : -  ninja_post(ninja) +	ninja_post(ninja)  ################################################################################ diff --git a/QA/Checker/SConscript b/QA/Checker/SConscript index b0863da..13dec62 100644 --- a/QA/Checker/SConscript +++ b/QA/Checker/SConscript @@ -3,7 +3,7 @@ Import("env")  if env["TEST"] :  	if env["SCONS_STAGE"] == "flags" :  			env["CHECKER_FLAGS"] = { -          "CPPPATH" : ["#/3rdParty/HippoMocks"], +					"CPPPATH" : ["#/3rdParty/HippoMocks"],  					"LIBS": ["Checker"],  					"LIBPATH": [Dir(".")],  					"LINKFLAGS": env["PLATFORM"] == "win32" and ["/SUBSYSTEM:CONSOLE"] or [] diff --git a/Slimber/Qt/SConscript b/Slimber/Qt/SConscript index 7a18465..0e7bdea 100644 --- a/Slimber/Qt/SConscript +++ b/Slimber/Qt/SConscript @@ -27,10 +27,10 @@ myenv.Tool("nsis", toolpath = ["#/BuildTools/SCons/Tools"])  qt4modules = ['QtCore', 'QtGui']  if myenv["qt5"] : -  qt_version = '5' -  qt4modules += ['QtWidgets'] +	qt_version = '5' +	qt4modules += ['QtWidgets']  else : -  qt_version = '4' +	qt_version = '4'  myenv.EnableQt4Modules(qt4modules, debug = False, version = qt_version)  myenv.Append(CPPPATH = ["."]) diff --git a/Swift/QtUI/SConscript b/Swift/QtUI/SConscript index fb4d853..e7fe93f 100644 --- a/Swift/QtUI/SConscript +++ b/Swift/QtUI/SConscript @@ -2,20 +2,20 @@ import os, datetime, re, time  import Version  def generateDefaultTheme(dir) : -  sourceDir = dir.abspath -  result = "<!-- WARNING: This file is automatically generated. Any changes will be overwritten. -->\n" -  result += "<RCC version =\"1.0\">" -  result += "<qresource prefix=\"/themes/Default\">" -  for (path, dirs, files) in os.walk(sourceDir) : -    for file in files : -      filePath = os.path.join(path,file) -      result += "<file alias=\"%(alias)s\">%(path)s</file>" % {  -          "alias": filePath[len(sourceDir)+1:], -          "path": filePath -        } -  result += "</qresource>" -  result += "</RCC>" -  return result +	sourceDir = dir.abspath +	result = "<!-- WARNING: This file is automatically generated. Any changes will be overwritten. -->\n" +	result += "<RCC version =\"1.0\">" +	result += "<qresource prefix=\"/themes/Default\">" +	for (path, dirs, files) in os.walk(sourceDir) : +		for file in files : +			filePath = os.path.join(path,file) +			result += "<file alias=\"%(alias)s\">%(path)s</file>" % {  +					"alias": filePath[len(sourceDir)+1:], +					"path": filePath +				} +	result += "</qresource>" +	result += "</RCC>" +	return result  Import("env") @@ -29,15 +29,15 @@ if "clang" in env["CC"] :  myenv.UseFlags(env["SWIFT_CONTROLLERS_FLAGS"])  myenv.UseFlags(env["SWIFTOOLS_FLAGS"])  if myenv["HAVE_XSS"] : -  myenv.UseFlags(env["XSS_FLAGS"]) +	myenv.UseFlags(env["XSS_FLAGS"])  if env["PLATFORM"] == "posix" : -  myenv.Append(LIBS = ["X11"]) +	myenv.Append(LIBS = ["X11"])  if myenv["HAVE_SPARKLE"] : -  myenv.UseFlags(env["SPARKLE_FLAGS"]) +	myenv.UseFlags(env["SPARKLE_FLAGS"])  myenv.UseFlags(env["SWIFTEN_FLAGS"])  myenv.UseFlags(env["SWIFTEN_DEP_FLAGS"])  if myenv.get("HAVE_BREAKPAD") : -  myenv.UseFlags(env["BREAKPAD_FLAGS"]) +	myenv.UseFlags(env["BREAKPAD_FLAGS"])  if myenv.get("HAVE_GROWL", False) :  	myenv.UseFlags(myenv["GROWL_FLAGS"])  	myenv.Append(CPPDEFINES = ["HAVE_GROWL"]) @@ -59,12 +59,12 @@ myenv.Tool("wix", toolpath = ["#/BuildTools/SCons/Tools"])  myenv.Tool("textfile", toolpath = ["#/BuildTools/SCons/Tools"])  qt4modules = ['QtCore', 'QtWebKit', 'QtGui']  if myenv["qt5"] : -  qt_version = '5' -  qt4modules += ['QtWidgets', 'QtWebKitWidgets', 'QtMultimedia'] -  if env["PLATFORM"] != "win32" and env["PLATFORM"] != "darwin" : -    qt4modules += ['QtX11Extras'] +	qt_version = '5' +	qt4modules += ['QtWidgets', 'QtWebKitWidgets', 'QtMultimedia'] +	if env["PLATFORM"] != "win32" and env["PLATFORM"] != "darwin" : +		qt4modules += ['QtX11Extras']  else : -  qt_version = '4' +	qt_version = '4'  if env["PLATFORM"] == "posix" :  	qt4modules += ["QtDBus"]  if env["PLATFORM"] != "win32" and env["PLATFORM"] != "darwin" : @@ -75,135 +75,135 @@ myenv.EnableQt4Modules(qt4modules, debug = False, version = qt_version)  myenv.Append(CPPPATH = ["."])  if env["PLATFORM"] == "win32" : -  #myenv.Append(LINKFLAGS = ["/SUBSYSTEM:CONSOLE"]) -  myenv.Append(LINKFLAGS = ["/SUBSYSTEM:WINDOWS"]) -  myenv.Append(LIBS = "qtmain") -  if myenv.get("HAVE_SCHANNEL", 0) : -    myenv.Append(LIBS = "Cryptui") -    myenv.Append(CPPDEFINES = "HAVE_SCHANNEL") -    if env["debug"] and not env["optimize"]: -      myenv.Append(LINKFLAGS = ["/NODEFAULTLIB:msvcrt"]) +	#myenv.Append(LINKFLAGS = ["/SUBSYSTEM:CONSOLE"]) +	myenv.Append(LINKFLAGS = ["/SUBSYSTEM:WINDOWS"]) +	myenv.Append(LIBS = "qtmain") +	if myenv.get("HAVE_SCHANNEL", 0) : +		myenv.Append(LIBS = "Cryptui") +		myenv.Append(CPPDEFINES = "HAVE_SCHANNEL") +		if env["debug"] and not env["optimize"]: +			myenv.Append(LINKFLAGS = ["/NODEFAULTLIB:msvcrt"])  myenv.WriteVal("DefaultTheme.qrc", myenv.Value(generateDefaultTheme(myenv.Dir("#/Swift/resources/themes/Default"))))  sources = [ -    "main.cpp", -    "QtAboutWidget.cpp", -    "QtSpellCheckerWindow.cpp", -    "QtAvatarWidget.cpp", -    "QtUIFactory.cpp", -    "QtChatWindowFactory.cpp", -    "QtClickableLabel.cpp", -    "QtLoginWindow.cpp", -    "QtMainWindow.cpp", -    "QtProfileWindow.cpp", -    "QtBlockListEditorWindow.cpp", -    "QtNameWidget.cpp", -    "QtSettingsProvider.cpp", -    "QtStatusWidget.cpp", -    "QtScaledAvatarCache.cpp", -    "QtSwift.cpp", -    "QtURIHandler.cpp", -    "QtChatWindow.cpp", -    "QtChatView.cpp", -    "QtWebKitChatView.cpp", -    "QtPlainChatView.cpp", -    "QtChatTheme.cpp", -    "QtChatTabs.cpp", -    "QtChatTabsBase.cpp", -    "QtChatTabsShortcutOnlySubstitute.cpp", -    "QtSoundPlayer.cpp", -    "QtSystemTray.cpp", -    "QtCachedImageScaler.cpp", -    "QtTabbable.cpp", -    "QtTabWidget.cpp", -    "QtTextEdit.cpp", -    "QtXMLConsoleWidget.cpp", -    "QtHistoryWindow.cpp", -    "QtFileTransferListWidget.cpp", -    "QtFileTransferListItemModel.cpp", -    "QtAdHocCommandWindow.cpp", -    "QtAdHocCommandWithJIDWindow.cpp", -    "QtUtilities.cpp", -    "QtBookmarkDetailWindow.cpp", -    "QtAddBookmarkWindow.cpp", -    "QtEditBookmarkWindow.cpp", -    "QtEmoticonsGrid.cpp", -    "QtEmoticonCell.cpp", -    "QtContactEditWindow.cpp", -    "QtContactEditWidget.cpp", -    "QtSingleWindow.cpp", -    "QtHighlightEditor.cpp", -    "QtColorToolButton.cpp", -    "QtClosableLineEdit.cpp", -    "ChatSnippet.cpp", -    "MessageSnippet.cpp", -    "SystemMessageSnippet.cpp", -    "QtElidingLabel.cpp", -    "QtFormWidget.cpp", -    "QtFormResultItemModel.cpp", -    "QtLineEdit.cpp", -    "QtJoinMUCWindow.cpp", -    "QtConnectionSettingsWindow.cpp", -    "Roster/RosterModel.cpp", -    "Roster/QtTreeWidget.cpp", -#    "Roster/QtTreeWidgetItem.cpp", -    "Roster/RosterDelegate.cpp", -    "Roster/GroupItemDelegate.cpp", -    "Roster/DelegateCommons.cpp", -    "Roster/QtFilterWidget.cpp", -    "Roster/QtRosterWidget.cpp", -    "Roster/QtOccupantListWidget.cpp", -    "Roster/RosterTooltip.cpp", -    "EventViewer/EventModel.cpp", -    "EventViewer/EventDelegate.cpp", -    "EventViewer/TwoLineDelegate.cpp", -    "EventViewer/QtEventWindow.cpp", -    "EventViewer/QtEvent.cpp", -    "ChatList/QtChatListWindow.cpp", -    "ChatList/ChatListModel.cpp", -    "ChatList/ChatListDelegate.cpp", -    "ChatList/ChatListMUCItem.cpp", -    "ChatList/ChatListRecentItem.cpp", -    "ChatList/ChatListWhiteboardItem.cpp", -    "MUCSearch/QtMUCSearchWindow.cpp", -    "MUCSearch/MUCSearchModel.cpp", -    "MUCSearch/MUCSearchRoomItem.cpp", -    "MUCSearch/MUCSearchEmptyItem.cpp", -    "MUCSearch/MUCSearchDelegate.cpp", -    "UserSearch/ContactListDelegate.cpp", -    "UserSearch/ContactListModel.cpp", -    "UserSearch/QtContactListWidget.cpp", -    "UserSearch/QtSuggestingJIDInput.cpp", -    "UserSearch/QtUserSearchFirstPage.cpp", -    "UserSearch/QtUserSearchFirstMultiJIDPage.cpp", -    "UserSearch/QtUserSearchFieldsPage.cpp", -    "UserSearch/QtUserSearchResultsPage.cpp", -    "UserSearch/QtUserSearchDetailsPage.cpp", -    "UserSearch/QtUserSearchWindow.cpp", -    "UserSearch/UserSearchModel.cpp", -    "UserSearch/UserSearchDelegate.cpp", -    "Whiteboard/FreehandLineItem.cpp", -    "Whiteboard/GView.cpp", -    "Whiteboard/TextDialog.cpp", -    "Whiteboard/QtWhiteboardWindow.cpp", -    "Whiteboard/ColorWidget.cpp", -    "QtSubscriptionRequestWindow.cpp", -    "QtRosterHeader.cpp", -    "QtWebView.cpp", -    "qrc_DefaultTheme.cc", -    "qrc_Swift.cc", -    "QtChatWindowJSBridge.cpp", -    "QtMUCConfigurationWindow.cpp", -    "QtAffiliationEditor.cpp", -    "QtUISettingConstants.cpp", -    "QtURLValidator.cpp", -    "QtResourceHelper.cpp", -    "QtSpellCheckHighlighter.cpp", -    "Trellis/QtDynamicGridLayout.cpp", -    "Trellis/QtDNDTabBar.cpp", -    "Trellis/QtGridSelectionDialog.cpp" -  ] +	"main.cpp", +	"QtAboutWidget.cpp", +	"QtSpellCheckerWindow.cpp", +	"QtAvatarWidget.cpp", +	"QtUIFactory.cpp", +	"QtChatWindowFactory.cpp", +	"QtClickableLabel.cpp", +	"QtLoginWindow.cpp", +	"QtMainWindow.cpp", +	"QtProfileWindow.cpp", +	"QtBlockListEditorWindow.cpp", +	"QtNameWidget.cpp", +	"QtSettingsProvider.cpp", +	"QtStatusWidget.cpp", +	"QtScaledAvatarCache.cpp", +	"QtSwift.cpp", +	"QtURIHandler.cpp", +	"QtChatWindow.cpp", +	"QtChatView.cpp", +	"QtWebKitChatView.cpp", +	"QtPlainChatView.cpp", +	"QtChatTheme.cpp", +	"QtChatTabs.cpp", +	"QtChatTabsBase.cpp", +	"QtChatTabsShortcutOnlySubstitute.cpp", +	"QtSoundPlayer.cpp", +	"QtSystemTray.cpp", +	"QtCachedImageScaler.cpp", +	"QtTabbable.cpp", +	"QtTabWidget.cpp", +	"QtTextEdit.cpp", +	"QtXMLConsoleWidget.cpp", +	"QtHistoryWindow.cpp", +	"QtFileTransferListWidget.cpp", +	"QtFileTransferListItemModel.cpp", +	"QtAdHocCommandWindow.cpp", +	"QtAdHocCommandWithJIDWindow.cpp", +	"QtUtilities.cpp", +	"QtBookmarkDetailWindow.cpp", +	"QtAddBookmarkWindow.cpp", +	"QtEditBookmarkWindow.cpp", +	"QtEmoticonsGrid.cpp", +	"QtEmoticonCell.cpp", +	"QtContactEditWindow.cpp", +	"QtContactEditWidget.cpp", +	"QtSingleWindow.cpp", +	"QtHighlightEditor.cpp", +	"QtColorToolButton.cpp", +	"QtClosableLineEdit.cpp", +	"ChatSnippet.cpp", +	"MessageSnippet.cpp", +	"SystemMessageSnippet.cpp", +	"QtElidingLabel.cpp", +	"QtFormWidget.cpp", +	"QtFormResultItemModel.cpp", +	"QtLineEdit.cpp", +	"QtJoinMUCWindow.cpp", +	"QtConnectionSettingsWindow.cpp", +	"Roster/RosterModel.cpp", +	"Roster/QtTreeWidget.cpp", +#	"Roster/QtTreeWidgetItem.cpp", +	"Roster/RosterDelegate.cpp", +	"Roster/GroupItemDelegate.cpp", +	"Roster/DelegateCommons.cpp", +	"Roster/QtFilterWidget.cpp", +	"Roster/QtRosterWidget.cpp", +	"Roster/QtOccupantListWidget.cpp", +	"Roster/RosterTooltip.cpp", +	"EventViewer/EventModel.cpp", +	"EventViewer/EventDelegate.cpp", +	"EventViewer/TwoLineDelegate.cpp", +	"EventViewer/QtEventWindow.cpp", +	"EventViewer/QtEvent.cpp", +	"ChatList/QtChatListWindow.cpp", +	"ChatList/ChatListModel.cpp", +	"ChatList/ChatListDelegate.cpp", +	"ChatList/ChatListMUCItem.cpp", +	"ChatList/ChatListRecentItem.cpp", +	"ChatList/ChatListWhiteboardItem.cpp", +	"MUCSearch/QtMUCSearchWindow.cpp", +	"MUCSearch/MUCSearchModel.cpp", +	"MUCSearch/MUCSearchRoomItem.cpp", +	"MUCSearch/MUCSearchEmptyItem.cpp", +	"MUCSearch/MUCSearchDelegate.cpp", +	"UserSearch/ContactListDelegate.cpp", +	"UserSearch/ContactListModel.cpp", +	"UserSearch/QtContactListWidget.cpp", +	"UserSearch/QtSuggestingJIDInput.cpp", +	"UserSearch/QtUserSearchFirstPage.cpp", +	"UserSearch/QtUserSearchFirstMultiJIDPage.cpp", +	"UserSearch/QtUserSearchFieldsPage.cpp", +	"UserSearch/QtUserSearchResultsPage.cpp", +	"UserSearch/QtUserSearchDetailsPage.cpp", +	"UserSearch/QtUserSearchWindow.cpp", +	"UserSearch/UserSearchModel.cpp", +	"UserSearch/UserSearchDelegate.cpp", +	"Whiteboard/FreehandLineItem.cpp", +	"Whiteboard/GView.cpp", +	"Whiteboard/TextDialog.cpp", +	"Whiteboard/QtWhiteboardWindow.cpp", +	"Whiteboard/ColorWidget.cpp", +	"QtSubscriptionRequestWindow.cpp", +	"QtRosterHeader.cpp", +	"QtWebView.cpp", +	"qrc_DefaultTheme.cc", +	"qrc_Swift.cc", +	"QtChatWindowJSBridge.cpp", +	"QtMUCConfigurationWindow.cpp", +	"QtAffiliationEditor.cpp", +	"QtUISettingConstants.cpp", +	"QtURLValidator.cpp", +	"QtResourceHelper.cpp", +	"QtSpellCheckHighlighter.cpp", +	"Trellis/QtDynamicGridLayout.cpp", +	"Trellis/QtDNDTabBar.cpp", +	"Trellis/QtGridSelectionDialog.cpp" +]  # QtVCardWidget  sources.extend([ @@ -251,7 +251,7 @@ if env["PLATFORM"] == "win32" :  			("SWIFT_VERSION_PATCH", "${SWIFT_VERSION_PATCH}"),  		])  	res = res_env.RES("#/Swift/resources/Windows/Swift.rc") -  # For some reason, SCons isn't picking up the dependency correctly +	# For some reason, SCons isn't picking up the dependency correctly  	# Adding it explicitly until i figure out why  	myenv.Depends(res, "../Controllers/BuildVersion.h")  	sources += [ @@ -272,11 +272,11 @@ if env["PLATFORM"] == "darwin" :  	sources += ["CocoaUIHelpers.mm"]  if env["PLATFORM"] == "darwin" or env["PLATFORM"] == "win32" : -  swiftProgram = myenv.Program("Swift", sources) +	swiftProgram = myenv.Program("Swift", sources)  else : -  sources += ["QtCertificateViewerDialog.cpp"]; -  myenv.Uic4("QtCertificateViewerDialog.ui"); -  swiftProgram = myenv.Program("swift-im", sources) +	sources += ["QtCertificateViewerDialog.cpp"]; +	myenv.Uic4("QtCertificateViewerDialog.ui"); +	swiftProgram = myenv.Program("swift-im", sources)  if env["PLATFORM"] != "darwin" and env["PLATFORM"] != "win32" :  	openURIProgram = myenv.Program("swift-open-uri", "swift-open-uri.cpp") @@ -353,97 +353,97 @@ if env["PLATFORM"] == "win32" :  ################################################################################  if env["PLATFORM"] == "darwin" : -  frameworks = [] -  if env["HAVE_SPARKLE"] : -    frameworks.append(env["SPARKLE_FRAMEWORK"]) -  if env["HAVE_GROWL"] : -    frameworks.append(env["GROWL_FRAMEWORK"]) -  commonResources[""] = commonResources.get("", []) + ["#/Swift/resources/MacOSX/Swift.icns"] -  app = myenv.AppBundle("Swift", version = myenv["SWIFT_VERSION"], resources = commonResources, frameworks = frameworks, handlesXMPPURIs = True) -  if env["DIST"] : -    myenv.Command(["#/Packages/Swift/Swift-${SWIFT_VERSION}.dmg"], [app], ["Swift/Packaging/MacOSX/package.sh " + app.path + " Swift/Packaging/MacOSX/Swift.dmg.gz $TARGET $QTDIR"]) -    dsym = myenv.Command(["Swift-${SWIFT_VERSION}.dSYM"], ["Swift"], ["dsymutil -o ${TARGET} ${SOURCE}"]) -    myenv.Command(["#/Packages/Swift/Swift-${SWIFT_VERSION}.dSYM.zip"], dsym, ["cd ${SOURCE.dir} && zip -r ${TARGET.abspath} ${SOURCE.name}"]) +	frameworks = [] +	if env["HAVE_SPARKLE"] : +		frameworks.append(env["SPARKLE_FRAMEWORK"]) +	if env["HAVE_GROWL"] : +		frameworks.append(env["GROWL_FRAMEWORK"]) +	commonResources[""] = commonResources.get("", []) + ["#/Swift/resources/MacOSX/Swift.icns"] +	app = myenv.AppBundle("Swift", version = myenv["SWIFT_VERSION"], resources = commonResources, frameworks = frameworks, handlesXMPPURIs = True) +	if env["DIST"] : +		myenv.Command(["#/Packages/Swift/Swift-${SWIFT_VERSION}.dmg"], [app], ["Swift/Packaging/MacOSX/package.sh " + app.path + " Swift/Packaging/MacOSX/Swift.dmg.gz $TARGET $QTDIR"]) +		dsym = myenv.Command(["Swift-${SWIFT_VERSION}.dSYM"], ["Swift"], ["dsymutil -o ${TARGET} ${SOURCE}"]) +		myenv.Command(["#/Packages/Swift/Swift-${SWIFT_VERSION}.dSYM.zip"], dsym, ["cd ${SOURCE.dir} && zip -r ${TARGET.abspath} ${SOURCE.name}"])  if env.get("SWIFT_INSTALLDIR", "") : -  env.Install(os.path.join(env["SWIFT_INSTALLDIR"], "bin"), swiftProgram + openURIProgram) -  env.InstallAs(os.path.join(env["SWIFT_INSTALLDIR"], "share", "pixmaps", "swift.xpm"), "#/Swift/resources/logo/logo-icon-32.xpm") -  icons_path = os.path.join(env["SWIFT_INSTALLDIR"], "share", "icons", "hicolor") -  env.InstallAs(os.path.join(icons_path, "32x32", "apps", "swift.xpm"), "#/Swift/resources/logo/logo-icon-32.xpm") -  env.InstallAs(os.path.join(icons_path, "scalable", "apps", "swift.svg"), "#/Swift/resources/logo/logo-icon.svg") -  for i in ["16", "22", "24", "64", "128"] : -    env.InstallAs(os.path.join(icons_path, i + "x" + i, "apps", "swift.png"), "#/Swift/resources/logo/logo-icon-" + i + ".png") -  env.Install(os.path.join(env["SWIFT_INSTALLDIR"], "share", "applications"), "#/Swift/resources/swift.desktop") -  for dir, resource in commonResources.items() : -    env.Install(os.path.join(env["SWIFT_INSTALLDIR"], "share", "swift", dir), resource) +	env.Install(os.path.join(env["SWIFT_INSTALLDIR"], "bin"), swiftProgram + openURIProgram) +	env.InstallAs(os.path.join(env["SWIFT_INSTALLDIR"], "share", "pixmaps", "swift.xpm"), "#/Swift/resources/logo/logo-icon-32.xpm") +	icons_path = os.path.join(env["SWIFT_INSTALLDIR"], "share", "icons", "hicolor") +	env.InstallAs(os.path.join(icons_path, "32x32", "apps", "swift.xpm"), "#/Swift/resources/logo/logo-icon-32.xpm") +	env.InstallAs(os.path.join(icons_path, "scalable", "apps", "swift.svg"), "#/Swift/resources/logo/logo-icon.svg") +	for i in ["16", "22", "24", "64", "128"] : +		env.InstallAs(os.path.join(icons_path, i + "x" + i, "apps", "swift.png"), "#/Swift/resources/logo/logo-icon-" + i + ".png") +	env.Install(os.path.join(env["SWIFT_INSTALLDIR"], "share", "applications"), "#/Swift/resources/swift.desktop") +	for dir, resource in commonResources.items() : +		env.Install(os.path.join(env["SWIFT_INSTALLDIR"], "share", "swift", dir), resource)  if env["PLATFORM"] == "win32" : -  if env["DIST"] or ARGUMENTS.get("dump_trace") : -    commonResources[""] = commonResources.get("", []) + [ -        #os.path.join(env["OPENSSL_DIR"], "bin", "ssleay32.dll"), -        #os.path.join(env["OPENSSL_DIR"], "bin", "libeay32.dll"), -        "#/Swift/resources/images", -      ] -    if env["SWIFTEN_DLL"] : -      commonResources[""] = commonResources.get("", []) + ["#/Swiften/${SWIFTEN_LIBRARY_FILE}"] -    qtplugins = {} -    qtplugins["imageformats"] = ["gif", "ico", "jpeg", "mng", "svg", "tiff"] -    qtlibs = ["QtCore", "QtGui", "QtNetwork", "QtWebKit", "QtXMLPatterns"] -    if qt_version == '4' : -      qtlibs.append("phonon") -      qtlibs = [lib + '4' for lib in qtlibs] -    else : -      qtlibs += ['QtQuick', 'QtQml', 'QtPositioning', 'QtMultimedia', 'QtSql', 'QtSensors', 'QtWidgets', 'QtWebChannel', 'QtWebKitWidgets', 'QtMultimediaWidgets', 'QtOpenGL', 'QtPrintSupport'] -      qtlibs = [lib.replace('Qt', 'Qt5') for lib in qtlibs] -      qtlibs += ['icuin51', 'icuuc51', 'icudt51', 'libGLESv2', 'libEGL'] -      qtplugins["platforms"] = ['windows'] -      qtplugins["accessible"] = ["taccessiblewidgets"] - -    windowsBundleFiles = myenv.WindowsBundle("Swift", -         resources = commonResources, -         qtplugins = qtplugins, -         qtlibs = qtlibs, -         qtversion = qt_version)   - -  if env["DIST"] : -    #myenv.Append(NSIS_OPTIONS = [ -    #    "/DmsvccRedistributableDir=\"" + env["vcredist"] + "\"",  -    #    "/DbuildVersion=" + myenv["SWIFT_VERSION"] -    #  ]) -    #myenv.Nsis("../Packaging/nsis/swift.nsi") -    if env["SCONS_STAGE"] == "build" and env.get("wix_bindir", None): -      def convertToRTF(env, target, source) : -        infile = open(source[0].abspath, 'r') -        outfile = open(target[0].abspath, 'w') -        outfile.write('{\\rtf1\\ansi{\\fonttbl\\f0\\fswiss Helvetica;}\\fs16\\f0\\pard\n') -        for line in infile: -          for char in line.decode("utf-8") : -            if ord(char) > 127 : -              # FIXME: This is incorrect, because it only works for latin1. -              # The correct way is \u<decimal utf16 point>? , but this is more -              # work -              outfile.write("\\'%X" % ord(char)) -            else : -              outfile.write(char) -          outfile.write('\\par ') -        outfile.write('}') -        outfile.close() -        infile.close() -      copying = env.Command(["Swift/COPYING.rtf"], ["COPYING"], convertToRTF) -      wixvariables = { -        'VCCRTFile': env["vcredist"], -        'Version': str(myenv["SWIFT_VERSION_MAJOR"]) + "." + str(myenv["SWIFT_VERSION_MINOR"]) + "." + str(myenv["SWIFT_VERSION_PATCH"]) -      } -      wixincludecontent = "<Include>" -      for key in wixvariables: -        wixincludecontent += "<?define %s = \"%s\" ?>" % (key, wixvariables[key]) -      wixincludecontent += "</Include>" -      myenv.WriteVal("..\\Packaging\\Wix\\variables.wxs", env.Value(wixincludecontent)) -      myenv["WIX_SOURCE_OBJECT_DIR"] = "Swift\\QtUI\\Swift" -      myenv.WiX_Heat('..\\Packaging\\WiX\\gen_files.wxs', windowsBundleFiles + copying) -      myenv.WiX_Candle('..\\Packaging\\WiX\\Swift.wixobj', '..\\Packaging\\WiX\\Swift.wxs') -      myenv.WiX_Candle('..\\Packaging\\WiX\\gen_files.wixobj', '..\\Packaging\\WiX\\gen_files.wxs') -      myenv.WiX_Light('#/Packages/Swift/Swift-' + myenv["SWIFT_VERSION"] + '.msi', ['..\\Packaging\\WiX\\gen_files.wixobj','..\\Packaging\\WiX\\Swift.wixobj']) - -      if myenv["debug"] : -            myenv.InstallAs('#/Packages/Swift/Swift-' + myenv["SWIFT_VERSION"] + '.pdb', "Swift.pdb") +	if env["DIST"] or ARGUMENTS.get("dump_trace") : +		commonResources[""] = commonResources.get("", []) + [ +				#os.path.join(env["OPENSSL_DIR"], "bin", "ssleay32.dll"), +				#os.path.join(env["OPENSSL_DIR"], "bin", "libeay32.dll"), +				"#/Swift/resources/images", +			] +		if env["SWIFTEN_DLL"] : +			commonResources[""] = commonResources.get("", []) + ["#/Swiften/${SWIFTEN_LIBRARY_FILE}"] +		qtplugins = {} +		qtplugins["imageformats"] = ["gif", "ico", "jpeg", "mng", "svg", "tiff"] +		qtlibs = ["QtCore", "QtGui", "QtNetwork", "QtWebKit", "QtXMLPatterns"] +		if qt_version == '4' : +			qtlibs.append("phonon") +			qtlibs = [lib + '4' for lib in qtlibs] +		else : +			qtlibs += ['QtQuick', 'QtQml', 'QtPositioning', 'QtMultimedia', 'QtSql', 'QtSensors', 'QtWidgets', 'QtWebChannel', 'QtWebKitWidgets', 'QtMultimediaWidgets', 'QtOpenGL', 'QtPrintSupport'] +			qtlibs = [lib.replace('Qt', 'Qt5') for lib in qtlibs] +			qtlibs += ['icuin51', 'icuuc51', 'icudt51', 'libGLESv2', 'libEGL'] +			qtplugins["platforms"] = ['windows'] +			qtplugins["accessible"] = ["taccessiblewidgets"] + +		windowsBundleFiles = myenv.WindowsBundle("Swift", +				 resources = commonResources, +				 qtplugins = qtplugins, +				 qtlibs = qtlibs, +				 qtversion = qt_version)   + +	if env["DIST"] : +		#myenv.Append(NSIS_OPTIONS = [ +		#    "/DmsvccRedistributableDir=\"" + env["vcredist"] + "\"",  +		#    "/DbuildVersion=" + myenv["SWIFT_VERSION"] +		#  ]) +		#myenv.Nsis("../Packaging/nsis/swift.nsi") +		if env["SCONS_STAGE"] == "build" and env.get("wix_bindir", None): +			def convertToRTF(env, target, source) : +				infile = open(source[0].abspath, 'r') +				outfile = open(target[0].abspath, 'w') +				outfile.write('{\\rtf1\\ansi{\\fonttbl\\f0\\fswiss Helvetica;}\\fs16\\f0\\pard\n') +				for line in infile: +					for char in line.decode("utf-8") : +						if ord(char) > 127 : +							# FIXME: This is incorrect, because it only works for latin1. +							# The correct way is \u<decimal utf16 point>? , but this is more +							# work +							outfile.write("\\'%X" % ord(char)) +						else : +							outfile.write(char) +					outfile.write('\\par ') +				outfile.write('}') +				outfile.close() +				infile.close() +			copying = env.Command(["Swift/COPYING.rtf"], ["COPYING"], convertToRTF) +			wixvariables = { +				'VCCRTFile': env["vcredist"], +				'Version': str(myenv["SWIFT_VERSION_MAJOR"]) + "." + str(myenv["SWIFT_VERSION_MINOR"]) + "." + str(myenv["SWIFT_VERSION_PATCH"]) +			} +			wixincludecontent = "<Include>" +			for key in wixvariables: +				wixincludecontent += "<?define %s = \"%s\" ?>" % (key, wixvariables[key]) +			wixincludecontent += "</Include>" +			myenv.WriteVal("..\\Packaging\\Wix\\variables.wxs", env.Value(wixincludecontent)) +			myenv["WIX_SOURCE_OBJECT_DIR"] = "Swift\\QtUI\\Swift" +			myenv.WiX_Heat('..\\Packaging\\WiX\\gen_files.wxs', windowsBundleFiles + copying) +			myenv.WiX_Candle('..\\Packaging\\WiX\\Swift.wixobj', '..\\Packaging\\WiX\\Swift.wxs') +			myenv.WiX_Candle('..\\Packaging\\WiX\\gen_files.wixobj', '..\\Packaging\\WiX\\gen_files.wxs') +			myenv.WiX_Light('#/Packages/Swift/Swift-' + myenv["SWIFT_VERSION"] + '.msi', ['..\\Packaging\\WiX\\gen_files.wixobj','..\\Packaging\\WiX\\Swift.wixobj']) + +			if myenv["debug"] : +				myenv.InstallAs('#/Packages/Swift/Swift-' + myenv["SWIFT_VERSION"] + '.pdb', "Swift.pdb") diff --git a/Swiften/History/SConscript b/Swiften/History/SConscript index ac3cf3b..bd56818 100644 --- a/Swiften/History/SConscript +++ b/Swiften/History/SConscript @@ -2,7 +2,7 @@ Import("swiften_env")  myenv = swiften_env.Clone()  if myenv["target"] == "native": -   myenv.MergeFlags(swiften_env.get("SQLITE_FLAGS", {})) +	myenv.MergeFlags(swiften_env.get("SQLITE_FLAGS", {}))  if myenv["experimental"]:  	objects = myenv.SwiftenObject([ diff --git a/Swiften/Network/SConscript b/Swiften/Network/SConscript index c1f5c19..e9da1bc 100644 --- a/Swiften/Network/SConscript +++ b/Swiften/Network/SConscript @@ -3,8 +3,8 @@ Import("swiften_env")  myenv = swiften_env.Clone()  if myenv.get("unbound", False) : -   myenv.MergeFlags(myenv.get("UNBOUND_FLAGS", {})) -   myenv.MergeFlags(myenv.get("LDNS_FLAGS", {})) +	myenv.MergeFlags(myenv.get("UNBOUND_FLAGS", {})) +	myenv.MergeFlags(myenv.get("LDNS_FLAGS", {}))  sourceList = [  			"ProxiedConnection.cpp",  | 
 Swift