Blame third_party/waf/waflib/extras/eclipse.py

Packit Service fa3ceb
#! /usr/bin/env python
Packit Service fa3ceb
# encoding: utf-8
Packit Service fa3ceb
# Eclipse CDT 5.0 generator for Waf
Packit Service fa3ceb
# Richard Quirk 2009-1011 (New BSD License)
Packit Service fa3ceb
# Thomas Nagy 2011 (ported to Waf 1.6)
Packit Service fa3ceb
Packit Service fa3ceb
"""
Packit Service fa3ceb
Usage:
Packit Service fa3ceb
Packit Service fa3ceb
def options(opt):
Packit Service fa3ceb
	opt.load('eclipse')
Packit Service fa3ceb
Packit Service fa3ceb
$ waf configure eclipse
Packit Service fa3ceb
"""
Packit Service fa3ceb
Packit Service fa3ceb
import sys, os
Packit Service fa3ceb
from waflib import Utils, Logs, Context, Build, TaskGen, Scripting, Errors, Node
Packit Service fa3ceb
from xml.dom.minidom import Document
Packit Service fa3ceb
Packit Service fa3ceb
STANDARD_INCLUDES = [ '/usr/local/include', '/usr/include' ]
Packit Service fa3ceb
Packit Service fa3ceb
oe_cdt = 'org.eclipse.cdt'
Packit Service fa3ceb
cdt_mk = oe_cdt + '.make.core'
Packit Service fa3ceb
cdt_core = oe_cdt + '.core'
Packit Service fa3ceb
cdt_bld = oe_cdt + '.build.core'
Packit Service fa3ceb
extbuilder_dir = '.externalToolBuilders'
Packit Service fa3ceb
extbuilder_name = 'Waf_Builder.launch'
Packit Service fa3ceb
Packit Service fa3ceb
class eclipse(Build.BuildContext):
Packit Service fa3ceb
	cmd = 'eclipse'
Packit Service fa3ceb
	fun = Scripting.default_cmd
Packit Service fa3ceb
Packit Service fa3ceb
	def execute(self):
Packit Service fa3ceb
		"""
Packit Service fa3ceb
		Entry point
Packit Service fa3ceb
		"""
Packit Service fa3ceb
		self.restore()
Packit Service fa3ceb
		if not self.all_envs:
Packit Service fa3ceb
			self.load_envs()
Packit Service fa3ceb
		self.recurse([self.run_dir])
Packit Service fa3ceb
Packit Service fa3ceb
		appname = getattr(Context.g_module, Context.APPNAME, os.path.basename(self.srcnode.abspath()))
Packit Service fa3ceb
		self.create_cproject(appname, pythonpath=self.env['ECLIPSE_PYTHON_PATH'])
Packit Service fa3ceb
Packit Service fa3ceb
	# Helper to dump the XML document content to XML with UTF-8 encoding
Packit Service fa3ceb
	def write_conf_to_xml(self, filename, document):
Packit Service fa3ceb
		self.srcnode.make_node(filename).write(document.toprettyxml(encoding='UTF-8'), flags='wb')
Packit Service fa3ceb
Packit Service fa3ceb
	def create_cproject(self, appname, workspace_includes=[], pythonpath=[]):
Packit Service fa3ceb
		"""
Packit Service fa3ceb
		Create the Eclipse CDT .project and .cproject files
Packit Service fa3ceb
		@param appname The name that will appear in the Project Explorer
Packit Service fa3ceb
		@param build The BuildContext object to extract includes from
Packit Service fa3ceb
		@param workspace_includes Optional project includes to prevent
Packit Service fa3ceb
			  "Unresolved Inclusion" errors in the Eclipse editor
Packit Service fa3ceb
		@param pythonpath Optional project specific python paths
Packit Service fa3ceb
		"""
Packit Service fa3ceb
		hasc = hasjava = haspython = False
Packit Service fa3ceb
		source_dirs = []
Packit Service fa3ceb
		cpppath = self.env['CPPPATH']
Packit Service fa3ceb
		javasrcpath = []
Packit Service fa3ceb
		javalibpath = []
Packit Service fa3ceb
		includes = STANDARD_INCLUDES
Packit Service fa3ceb
		if sys.platform != 'win32':
Packit Service fa3ceb
			cc = self.env.CC or self.env.CXX
Packit Service fa3ceb
			if cc:
Packit Service fa3ceb
				cmd = cc + ['-xc++', '-E', '-Wp,-v', '-']
Packit Service fa3ceb
				try:
Packit Service fa3ceb
					gccout = self.cmd_and_log(cmd, output=Context.STDERR, quiet=Context.BOTH, input='\n'.encode()).splitlines()
Packit Service fa3ceb
				except Errors.WafError:
Packit Service fa3ceb
					pass
Packit Service fa3ceb
				else:
Packit Service fa3ceb
					includes = []
Packit Service fa3ceb
					for ipath in gccout:
Packit Service fa3ceb
						if ipath.startswith(' /'):
Packit Service fa3ceb
							includes.append(ipath[1:])
Packit Service fa3ceb
			cpppath += includes
Packit Service fa3ceb
		Logs.warn('Generating Eclipse CDT project files')
Packit Service fa3ceb
Packit Service fa3ceb
		for g in self.groups:
Packit Service fa3ceb
			for tg in g:
Packit Service fa3ceb
				if not isinstance(tg, TaskGen.task_gen):
Packit Service fa3ceb
					continue
Packit Service fa3ceb
Packit Service fa3ceb
				tg.post()
Packit Service fa3ceb
Packit Service fa3ceb
				# Add local Python modules paths to configuration so object resolving will work in IDE
Packit Service fa3ceb
				# This may also contain generated files (ie. pyqt5 or protoc) that get picked from build
Packit Service fa3ceb
				if 'py' in tg.features:
Packit Service fa3ceb
					pypath = tg.path.relpath()
Packit Service fa3ceb
					py_installfrom = getattr(tg, 'install_from', None)
Packit Service fa3ceb
					if isinstance(py_installfrom, Node.Node):
Packit Service fa3ceb
						pypath = py_installfrom.path_from(self.root.make_node(self.top_dir))
Packit Service fa3ceb
					if pypath not in pythonpath:
Packit Service fa3ceb
						pythonpath.append(pypath)
Packit Service fa3ceb
					haspython = True
Packit Service fa3ceb
Packit Service fa3ceb
				# Add Java source directories so object resolving works in IDE
Packit Service fa3ceb
				# This may also contain generated files (ie. protoc) that get picked from build
Packit Service fa3ceb
				if 'javac' in tg.features:
Packit Service fa3ceb
					java_src = tg.path.relpath()
Packit Service fa3ceb
					java_srcdir = getattr(tg.javac_task, 'srcdir', None)
Packit Service fa3ceb
					if java_srcdir:
Packit Service fa3ceb
						if isinstance(java_srcdir, Node.Node):
Packit Service fa3ceb
							java_srcdir = [java_srcdir]
Packit Service fa3ceb
						for x in Utils.to_list(java_srcdir):
Packit Service fa3ceb
							x = x.path_from(self.root.make_node(self.top_dir))
Packit Service fa3ceb
							if x not in javasrcpath:
Packit Service fa3ceb
								javasrcpath.append(x)
Packit Service fa3ceb
					else:
Packit Service fa3ceb
						if java_src not in javasrcpath:
Packit Service fa3ceb
							javasrcpath.append(java_src)
Packit Service fa3ceb
					hasjava = True
Packit Service fa3ceb
Packit Service fa3ceb
					# Check if there are external dependencies and add them as external jar so they will be resolved by Eclipse
Packit Service fa3ceb
					usedlibs=getattr(tg, 'use', [])
Packit Service fa3ceb
					for x in Utils.to_list(usedlibs):
Packit Service fa3ceb
						for cl in Utils.to_list(tg.env['CLASSPATH_'+x]):
Packit Service fa3ceb
							if cl not in javalibpath:
Packit Service fa3ceb
								javalibpath.append(cl)
Packit Service fa3ceb
Packit Service fa3ceb
				if not getattr(tg, 'link_task', None):
Packit Service fa3ceb
					continue
Packit Service fa3ceb
Packit Service fa3ceb
				features = Utils.to_list(getattr(tg, 'features', ''))
Packit Service fa3ceb
Packit Service fa3ceb
				is_cc = 'c' in features or 'cxx' in features
Packit Service fa3ceb
Packit Service fa3ceb
				incnodes = tg.to_incnodes(tg.to_list(getattr(tg, 'includes', [])) + tg.env['INCLUDES'])
Packit Service fa3ceb
				for p in incnodes:
Packit Service fa3ceb
					path = p.path_from(self.srcnode)
Packit Service fa3ceb
Packit Service fa3ceb
					if (path.startswith("/")):
Packit Service fa3ceb
						cpppath.append(path)
Packit Service fa3ceb
					else:
Packit Service fa3ceb
						workspace_includes.append(path)
Packit Service fa3ceb
Packit Service fa3ceb
					if is_cc and path not in source_dirs:
Packit Service fa3ceb
						source_dirs.append(path)
Packit Service fa3ceb
Packit Service fa3ceb
					hasc = True
Packit Service fa3ceb
Packit Service fa3ceb
		waf_executable = os.path.abspath(sys.argv[0])
Packit Service fa3ceb
		project = self.impl_create_project(sys.executable, appname, hasc, hasjava, haspython, waf_executable)
Packit Service fa3ceb
		self.write_conf_to_xml('.project', project)
Packit Service fa3ceb
Packit Service fa3ceb
		if hasc:
Packit Service fa3ceb
			project = self.impl_create_cproject(sys.executable, waf_executable, appname, workspace_includes, cpppath, source_dirs)
Packit Service fa3ceb
			self.write_conf_to_xml('.cproject', project)
Packit Service fa3ceb
Packit Service fa3ceb
		if haspython:
Packit Service fa3ceb
			project = self.impl_create_pydevproject(sys.path, pythonpath)
Packit Service fa3ceb
			self.write_conf_to_xml('.pydevproject', project)
Packit Service fa3ceb
Packit Service fa3ceb
		if hasjava:
Packit Service fa3ceb
			project = self.impl_create_javaproject(javasrcpath, javalibpath)
Packit Service fa3ceb
			self.write_conf_to_xml('.classpath', project)
Packit Service fa3ceb
Packit Service fa3ceb
	def impl_create_project(self, executable, appname, hasc, hasjava, haspython, waf_executable):
Packit Service fa3ceb
		doc = Document()
Packit Service fa3ceb
		projectDescription = doc.createElement('projectDescription')
Packit Service fa3ceb
		self.add(doc, projectDescription, 'name', appname)
Packit Service fa3ceb
		self.add(doc, projectDescription, 'comment')
Packit Service fa3ceb
		self.add(doc, projectDescription, 'projects')
Packit Service fa3ceb
		buildSpec = self.add(doc, projectDescription, 'buildSpec')
Packit Service fa3ceb
		buildCommand = self.add(doc, buildSpec, 'buildCommand')
Packit Service fa3ceb
		self.add(doc, buildCommand, 'triggers', 'clean,full,incremental,')
Packit Service fa3ceb
		arguments = self.add(doc, buildCommand, 'arguments')
Packit Service fa3ceb
		dictionaries = {}
Packit Service fa3ceb
Packit Service fa3ceb
		# If CDT is present, instruct this one to call waf as it is more flexible (separate build/clean ...)
Packit Service fa3ceb
		if hasc:
Packit Service fa3ceb
			self.add(doc, buildCommand, 'name', oe_cdt + '.managedbuilder.core.genmakebuilder')
Packit Service fa3ceb
			# the default make-style targets are overwritten by the .cproject values
Packit Service fa3ceb
			dictionaries = {
Packit Service fa3ceb
					cdt_mk + '.contents': cdt_mk + '.activeConfigSettings',
Packit Service fa3ceb
					cdt_mk + '.enableAutoBuild': 'false',
Packit Service fa3ceb
					cdt_mk + '.enableCleanBuild': 'true',
Packit Service fa3ceb
					cdt_mk + '.enableFullBuild': 'true',
Packit Service fa3ceb
					}
Packit Service fa3ceb
		else:
Packit Service fa3ceb
			# Otherwise for Java/Python an external builder tool is created that will call waf build
Packit Service fa3ceb
			self.add(doc, buildCommand, 'name', 'org.eclipse.ui.externaltools.ExternalToolBuilder')
Packit Service fa3ceb
			dictionaries = {
Packit Service fa3ceb
					'LaunchConfigHandle': '<project>/%s/%s'%(extbuilder_dir, extbuilder_name),
Packit Service fa3ceb
					}
Packit Service fa3ceb
			# The definition is in a separate directory XML file
Packit Service fa3ceb
			try:
Packit Service fa3ceb
				os.mkdir(extbuilder_dir)
Packit Service fa3ceb
			except OSError:
Packit Service fa3ceb
				pass	# Ignore error if already exists
Packit Service fa3ceb
Packit Service fa3ceb
			# Populate here the external builder XML calling waf
Packit Service fa3ceb
			builder = Document()
Packit Service fa3ceb
			launchConfiguration = doc.createElement('launchConfiguration')
Packit Service fa3ceb
			launchConfiguration.setAttribute('type', 'org.eclipse.ui.externaltools.ProgramBuilderLaunchConfigurationType')
Packit Service fa3ceb
			self.add(doc, launchConfiguration, 'booleanAttribute', {'key': 'org.eclipse.debug.ui.ATTR_LAUNCH_IN_BACKGROUND', 'value': 'false'})
Packit Service fa3ceb
			self.add(doc, launchConfiguration, 'booleanAttribute', {'key': 'org.eclipse.ui.externaltools.ATTR_TRIGGERS_CONFIGURED', 'value': 'true'})
Packit Service fa3ceb
			self.add(doc, launchConfiguration, 'stringAttribute', {'key': 'org.eclipse.ui.externaltools.ATTR_LOCATION', 'value': waf_executable})
Packit Service fa3ceb
			self.add(doc, launchConfiguration, 'stringAttribute', {'key': 'org.eclipse.ui.externaltools.ATTR_RUN_BUILD_KINDS', 'value': 'full,incremental,'})
Packit Service fa3ceb
			self.add(doc, launchConfiguration, 'stringAttribute', {'key': 'org.eclipse.ui.externaltools.ATTR_TOOL_ARGUMENTS', 'value': 'build'})
Packit Service fa3ceb
			self.add(doc, launchConfiguration, 'stringAttribute', {'key': 'org.eclipse.ui.externaltools.ATTR_WORKING_DIRECTORY', 'value': '${project_loc}'})
Packit Service fa3ceb
			builder.appendChild(launchConfiguration)
Packit Service fa3ceb
			# And write the XML to the file references before
Packit Service fa3ceb
			self.write_conf_to_xml('%s%s%s'%(extbuilder_dir, os.path.sep, extbuilder_name), builder)
Packit Service fa3ceb
Packit Service fa3ceb
Packit Service fa3ceb
		for k, v in dictionaries.items():
Packit Service fa3ceb
			self.addDictionary(doc, arguments, k, v)
Packit Service fa3ceb
Packit Service fa3ceb
		natures = self.add(doc, projectDescription, 'natures')
Packit Service fa3ceb
Packit Service fa3ceb
		if hasc:
Packit Service fa3ceb
			nature_list = """
Packit Service fa3ceb
				core.ccnature
Packit Service fa3ceb
				managedbuilder.core.ScannerConfigNature
Packit Service fa3ceb
				managedbuilder.core.managedBuildNature
Packit Service fa3ceb
				core.cnature
Packit Service fa3ceb
			""".split()
Packit Service fa3ceb
			for n in nature_list:
Packit Service fa3ceb
				self.add(doc, natures, 'nature', oe_cdt + '.' + n)
Packit Service fa3ceb
Packit Service fa3ceb
		if haspython:
Packit Service fa3ceb
			self.add(doc, natures, 'nature', 'org.python.pydev.pythonNature')
Packit Service fa3ceb
		if hasjava:
Packit Service fa3ceb
			self.add(doc, natures, 'nature', 'org.eclipse.jdt.core.javanature')
Packit Service fa3ceb
Packit Service fa3ceb
		doc.appendChild(projectDescription)
Packit Service fa3ceb
		return doc
Packit Service fa3ceb
Packit Service fa3ceb
	def impl_create_cproject(self, executable, waf_executable, appname, workspace_includes, cpppath, source_dirs=[]):
Packit Service fa3ceb
		doc = Document()
Packit Service fa3ceb
		doc.appendChild(doc.createProcessingInstruction('fileVersion', '4.0.0'))
Packit Service fa3ceb
		cconf_id = cdt_core + '.default.config.1'
Packit Service fa3ceb
		cproject = doc.createElement('cproject')
Packit Service fa3ceb
		storageModule = self.add(doc, cproject, 'storageModule',
Packit Service fa3ceb
				{'moduleId': cdt_core + '.settings'})
Packit Service fa3ceb
		cconf = self.add(doc, storageModule, 'cconfiguration', {'id':cconf_id})
Packit Service fa3ceb
Packit Service fa3ceb
		storageModule = self.add(doc, cconf, 'storageModule',
Packit Service fa3ceb
				{'buildSystemId': oe_cdt + '.managedbuilder.core.configurationDataProvider',
Packit Service fa3ceb
				 'id': cconf_id,
Packit Service fa3ceb
				 'moduleId': cdt_core + '.settings',
Packit Service fa3ceb
				 'name': 'Default'})
Packit Service fa3ceb
Packit Service fa3ceb
		self.add(doc, storageModule, 'externalSettings')
Packit Service fa3ceb
Packit Service fa3ceb
		extensions = self.add(doc, storageModule, 'extensions')
Packit Service fa3ceb
		extension_list = """
Packit Service fa3ceb
			VCErrorParser
Packit Service fa3ceb
			MakeErrorParser
Packit Service fa3ceb
			GCCErrorParser
Packit Service fa3ceb
			GASErrorParser
Packit Service fa3ceb
			GLDErrorParser
Packit Service fa3ceb
		""".split()
Packit Service fa3ceb
		self.add(doc, extensions, 'extension', {'id': cdt_core + '.ELF', 'point':cdt_core + '.BinaryParser'})
Packit Service fa3ceb
		for e in extension_list:
Packit Service fa3ceb
			self.add(doc, extensions, 'extension', {'id': cdt_core + '.' + e, 'point':cdt_core + '.ErrorParser'})
Packit Service fa3ceb
Packit Service fa3ceb
		storageModule = self.add(doc, cconf, 'storageModule',
Packit Service fa3ceb
				{'moduleId': 'cdtBuildSystem', 'version': '4.0.0'})
Packit Service fa3ceb
		config = self.add(doc, storageModule, 'configuration',
Packit Service fa3ceb
					{'artifactName': appname,
Packit Service fa3ceb
					 'id': cconf_id,
Packit Service fa3ceb
					 'name': 'Default',
Packit Service fa3ceb
					 'parent': cdt_bld + '.prefbase.cfg'})
Packit Service fa3ceb
		folderInfo = self.add(doc, config, 'folderInfo',
Packit Service fa3ceb
							{'id': cconf_id+'.', 'name': '/', 'resourcePath': ''})
Packit Service fa3ceb
Packit Service fa3ceb
		toolChain = self.add(doc, folderInfo, 'toolChain',
Packit Service fa3ceb
				{'id': cdt_bld + '.prefbase.toolchain.1',
Packit Service fa3ceb
				 'name': 'No ToolChain',
Packit Service fa3ceb
				 'resourceTypeBasedDiscovery': 'false',
Packit Service fa3ceb
				 'superClass': cdt_bld + '.prefbase.toolchain'})
Packit Service fa3ceb
Packit Service fa3ceb
		self.add(doc, toolChain, 'targetPlatform', {'binaryParser': 'org.eclipse.cdt.core.ELF', 'id': cdt_bld + '.prefbase.toolchain.1', 'name': ''})
Packit Service fa3ceb
Packit Service fa3ceb
		waf_build = '"%s" %s'%(waf_executable, eclipse.fun)
Packit Service fa3ceb
		waf_clean = '"%s" clean'%(waf_executable)
Packit Service fa3ceb
		self.add(doc, toolChain, 'builder',
Packit Service fa3ceb
					{'autoBuildTarget': waf_build,
Packit Service fa3ceb
					 'command': executable,
Packit Service fa3ceb
					 'enableAutoBuild': 'false',
Packit Service fa3ceb
					 'cleanBuildTarget': waf_clean,
Packit Service fa3ceb
					 'enableIncrementalBuild': 'true',
Packit Service fa3ceb
					 'id': cdt_bld + '.settings.default.builder.1',
Packit Service fa3ceb
					 'incrementalBuildTarget': waf_build,
Packit Service fa3ceb
					 'managedBuildOn': 'false',
Packit Service fa3ceb
					 'name': 'Gnu Make Builder',
Packit Service fa3ceb
					 'superClass': cdt_bld + '.settings.default.builder'})
Packit Service fa3ceb
Packit Service fa3ceb
		tool_index = 1;
Packit Service fa3ceb
		for tool_name in ("Assembly", "GNU C++", "GNU C"):
Packit Service fa3ceb
			tool = self.add(doc, toolChain, 'tool',
Packit Service fa3ceb
					{'id': cdt_bld + '.settings.holder.' + str(tool_index),
Packit Service fa3ceb
					 'name': tool_name,
Packit Service fa3ceb
					 'superClass': cdt_bld + '.settings.holder'})
Packit Service fa3ceb
			if cpppath or workspace_includes:
Packit Service fa3ceb
				incpaths = cdt_bld + '.settings.holder.incpaths'
Packit Service fa3ceb
				option = self.add(doc, tool, 'option',
Packit Service fa3ceb
						{'id': incpaths + '.' +  str(tool_index),
Packit Service fa3ceb
						 'name': 'Include Paths',
Packit Service fa3ceb
						 'superClass': incpaths,
Packit Service fa3ceb
						 'valueType': 'includePath'})
Packit Service fa3ceb
				for i in workspace_includes:
Packit Service fa3ceb
					self.add(doc, option, 'listOptionValue',
Packit Service fa3ceb
								{'builtIn': 'false',
Packit Service fa3ceb
								'value': '"${workspace_loc:/%s/%s}"'%(appname, i)})
Packit Service fa3ceb
				for i in cpppath:
Packit Service fa3ceb
					self.add(doc, option, 'listOptionValue',
Packit Service fa3ceb
								{'builtIn': 'false',
Packit Service fa3ceb
								'value': '"%s"'%(i)})
Packit Service fa3ceb
			if tool_name == "GNU C++" or tool_name == "GNU C":
Packit Service fa3ceb
				self.add(doc,tool,'inputType',{ 'id':'org.eclipse.cdt.build.core.settings.holder.inType.' + str(tool_index), \
Packit Service fa3ceb
					'languageId':'org.eclipse.cdt.core.gcc' if tool_name == "GNU C" else 'org.eclipse.cdt.core.g++','languageName':tool_name, \
Packit Service fa3ceb
					'sourceContentType':'org.eclipse.cdt.core.cSource,org.eclipse.cdt.core.cHeader', \
Packit Service fa3ceb
					'superClass':'org.eclipse.cdt.build.core.settings.holder.inType' })
Packit Service fa3ceb
			tool_index += 1
Packit Service fa3ceb
Packit Service fa3ceb
		if source_dirs:
Packit Service fa3ceb
			sourceEntries = self.add(doc, config, 'sourceEntries')
Packit Service fa3ceb
			for i in source_dirs:
Packit Service fa3ceb
				 self.add(doc, sourceEntries, 'entry',
Packit Service fa3ceb
							{'excluding': i,
Packit Service fa3ceb
							'flags': 'VALUE_WORKSPACE_PATH|RESOLVED',
Packit Service fa3ceb
							'kind': 'sourcePath',
Packit Service fa3ceb
							'name': ''})
Packit Service fa3ceb
				 self.add(doc, sourceEntries, 'entry',
Packit Service fa3ceb
							{
Packit Service fa3ceb
							'flags': 'VALUE_WORKSPACE_PATH|RESOLVED',
Packit Service fa3ceb
							'kind': 'sourcePath',
Packit Service fa3ceb
							'name': i})
Packit Service fa3ceb
Packit Service fa3ceb
		storageModule = self.add(doc, cconf, 'storageModule',
Packit Service fa3ceb
							{'moduleId': cdt_mk + '.buildtargets'})
Packit Service fa3ceb
		buildTargets = self.add(doc, storageModule, 'buildTargets')
Packit Service fa3ceb
		def addTargetWrap(name, runAll):
Packit Service fa3ceb
			return self.addTarget(doc, buildTargets, executable, name,
Packit Service fa3ceb
								'"%s" %s'%(waf_executable, name), runAll)
Packit Service fa3ceb
		addTargetWrap('configure', True)
Packit Service fa3ceb
		addTargetWrap('dist', False)
Packit Service fa3ceb
		addTargetWrap('install', False)
Packit Service fa3ceb
		addTargetWrap('check', False)
Packit Service fa3ceb
Packit Service fa3ceb
		storageModule = self.add(doc, cproject, 'storageModule',
Packit Service fa3ceb
							{'moduleId': 'cdtBuildSystem',
Packit Service fa3ceb
							 'version': '4.0.0'})
Packit Service fa3ceb
Packit Service fa3ceb
		self.add(doc, storageModule, 'project', {'id': '%s.null.1'%appname, 'name': appname})
Packit Service fa3ceb
Packit Service fa3ceb
		doc.appendChild(cproject)
Packit Service fa3ceb
		return doc
Packit Service fa3ceb
Packit Service fa3ceb
	def impl_create_pydevproject(self, system_path, user_path):
Packit Service fa3ceb
		# create a pydevproject file
Packit Service fa3ceb
		doc = Document()
Packit Service fa3ceb
		doc.appendChild(doc.createProcessingInstruction('eclipse-pydev', 'version="1.0"'))
Packit Service fa3ceb
		pydevproject = doc.createElement('pydev_project')
Packit Service fa3ceb
		prop = self.add(doc, pydevproject,
Packit Service fa3ceb
					   'pydev_property',
Packit Service fa3ceb
					   'python %d.%d'%(sys.version_info[0], sys.version_info[1]))
Packit Service fa3ceb
		prop.setAttribute('name', 'org.python.pydev.PYTHON_PROJECT_VERSION')
Packit Service fa3ceb
		prop = self.add(doc, pydevproject, 'pydev_property', 'Default')
Packit Service fa3ceb
		prop.setAttribute('name', 'org.python.pydev.PYTHON_PROJECT_INTERPRETER')
Packit Service fa3ceb
		# add waf's paths
Packit Service fa3ceb
		wafadmin = [p for p in system_path if p.find('wafadmin') != -1]
Packit Service fa3ceb
		if wafadmin:
Packit Service fa3ceb
			prop = self.add(doc, pydevproject, 'pydev_pathproperty',
Packit Service fa3ceb
					{'name':'org.python.pydev.PROJECT_EXTERNAL_SOURCE_PATH'})
Packit Service fa3ceb
			for i in wafadmin:
Packit Service fa3ceb
				self.add(doc, prop, 'path', i)
Packit Service fa3ceb
		if user_path:
Packit Service fa3ceb
			prop = self.add(doc, pydevproject, 'pydev_pathproperty',
Packit Service fa3ceb
					{'name':'org.python.pydev.PROJECT_SOURCE_PATH'})
Packit Service fa3ceb
			for i in user_path:
Packit Service fa3ceb
				self.add(doc, prop, 'path', '/${PROJECT_DIR_NAME}/'+i)
Packit Service fa3ceb
Packit Service fa3ceb
		doc.appendChild(pydevproject)
Packit Service fa3ceb
		return doc
Packit Service fa3ceb
Packit Service fa3ceb
	def impl_create_javaproject(self, javasrcpath, javalibpath):
Packit Service fa3ceb
		# create a .classpath file for java usage
Packit Service fa3ceb
		doc = Document()
Packit Service fa3ceb
		javaproject = doc.createElement('classpath')
Packit Service fa3ceb
		if javasrcpath:
Packit Service fa3ceb
			for i in javasrcpath:
Packit Service fa3ceb
				self.add(doc, javaproject, 'classpathentry',
Packit Service fa3ceb
					{'kind': 'src', 'path': i})
Packit Service fa3ceb
Packit Service fa3ceb
		if javalibpath:
Packit Service fa3ceb
			for i in javalibpath:
Packit Service fa3ceb
				self.add(doc, javaproject, 'classpathentry',
Packit Service fa3ceb
					{'kind': 'lib', 'path': i})
Packit Service fa3ceb
Packit Service fa3ceb
		self.add(doc, javaproject, 'classpathentry', {'kind': 'con', 'path': 'org.eclipse.jdt.launching.JRE_CONTAINER'})
Packit Service fa3ceb
		self.add(doc, javaproject, 'classpathentry', {'kind': 'output', 'path': self.bldnode.name })
Packit Service fa3ceb
		doc.appendChild(javaproject)
Packit Service fa3ceb
		return doc
Packit Service fa3ceb
Packit Service fa3ceb
	def addDictionary(self, doc, parent, k, v):
Packit Service fa3ceb
		dictionary = self.add(doc, parent, 'dictionary')
Packit Service fa3ceb
		self.add(doc, dictionary, 'key', k)
Packit Service fa3ceb
		self.add(doc, dictionary, 'value', v)
Packit Service fa3ceb
		return dictionary
Packit Service fa3ceb
Packit Service fa3ceb
	def addTarget(self, doc, buildTargets, executable, name, buildTarget, runAllBuilders=True):
Packit Service fa3ceb
		target = self.add(doc, buildTargets, 'target',
Packit Service fa3ceb
						{'name': name,
Packit Service fa3ceb
						 'path': '',
Packit Service fa3ceb
						 'targetID': oe_cdt + '.build.MakeTargetBuilder'})
Packit Service fa3ceb
		self.add(doc, target, 'buildCommand', executable)
Packit Service fa3ceb
		self.add(doc, target, 'buildArguments', None)
Packit Service fa3ceb
		self.add(doc, target, 'buildTarget', buildTarget)
Packit Service fa3ceb
		self.add(doc, target, 'stopOnError', 'true')
Packit Service fa3ceb
		self.add(doc, target, 'useDefaultCommand', 'false')
Packit Service fa3ceb
		self.add(doc, target, 'runAllBuilders', str(runAllBuilders).lower())
Packit Service fa3ceb
Packit Service fa3ceb
	def add(self, doc, parent, tag, value = None):
Packit Service fa3ceb
		el = doc.createElement(tag)
Packit Service fa3ceb
		if (value):
Packit Service fa3ceb
			if type(value) == type(str()):
Packit Service fa3ceb
				el.appendChild(doc.createTextNode(value))
Packit Service fa3ceb
			elif type(value) == type(dict()):
Packit Service fa3ceb
				self.setAttributes(el, value)
Packit Service fa3ceb
		parent.appendChild(el)
Packit Service fa3ceb
		return el
Packit Service fa3ceb
Packit Service fa3ceb
	def setAttributes(self, node, attrs):
Packit Service fa3ceb
		for k, v in attrs.items():
Packit Service fa3ceb
			node.setAttribute(k, v)
Packit Service fa3ceb