SF.net SVN: geany:[3847] trunk

eht16 at users.sourceforge.net eht16 at xxxxx
Mon Jun 8 20:00:05 UTC 2009


Revision: 3847
          http://geany.svn.sourceforge.net/geany/?rev=3847&view=rev
Author:   eht16
Date:     2009-06-08 19:59:48 +0000 (Mon, 08 Jun 2009)

Log Message:
-----------
Add support (configure, build and install) for building on Windows and cross-compiling for Windows using the Waf build system.

Modified Paths:
--------------
    trunk/ChangeLog
    trunk/wscript

Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	2009-06-08 19:16:23 UTC (rev 3846)
+++ trunk/ChangeLog	2009-06-08 19:59:48 UTC (rev 3847)
@@ -3,6 +3,9 @@
  * src/callbacks.c:
    Add backslash to the wordchars on Windows when using
    'Open Selected File'.
+ * src/wscript:
+   Add support (configure, build and install) for building on Windows
+   and cross-compiling for Windows using the Waf build system.
 
 
 2009-06-05  Nick Treleaven  <nick(dot)treleaven(at)btinternet(dot)com>

Modified: trunk/wscript
===================================================================
--- trunk/wscript	2009-06-08 19:16:23 UTC (rev 3846)
+++ trunk/wscript	2009-06-08 19:59:48 UTC (rev 3847)
@@ -121,7 +121,8 @@
 		# try SVN
 		elif os.path.exists('.svn'):
 			try:
-				stdout = Utils.cmd_output(cmd='svn info --non-interactive', env={'LANG' : 'C'})
+				_env = None if is_win32 else {'LANG' : 'C'}
+				stdout = Utils.cmd_output(cmd='svn info --non-interactive', silent=True, env=_env)
 				lines = stdout.splitlines(True)
 				for line in lines:
 					if line.startswith('Last Changed Rev'):
@@ -141,7 +142,9 @@
 		elif default_value:
 			conf.define(define_name, default_value, quote)
 
+
 	conf.check_tool('compiler_cc')
+	is_win32 = target_is_win32(conf.env)
 
 	conf.check(header_name='fcntl.h')
 	conf.check(header_name='fnmatch.h')
@@ -173,12 +176,19 @@
 
 	# check for cxx after the header and function checks have been done to ensure they are
 	# checked with cc not cxx
-	conf.check_tool('compiler_cxx intltool misc')
+	conf.check_tool('compiler_cxx misc')
+	if is_win32:
+		conf.check_tool('winres')
+	# we don't require intltool on Windows (it would require Perl) though it works well
+	try:
+		conf.check_tool('intltool')
+	except:
+		pass
 
+
+	# GTK / GIO version check
 	conf.check_cfg(package='gtk+-2.0', atleast_version='2.8.0', uselib_store='GTK',
 		mandatory=True, args='--cflags --libs')
-
-	# GTK version check
 	have_gtk_210 = False
 	gtk_version = conf.check_cfg(modversion='gtk+-2.0', uselib_store='GTK')
 	if gtk_version:
@@ -186,20 +196,46 @@
 			have_gtk_210 = True
 	else:
 		gtk_version = 'Unknown'
-	# GIO check
 	conf.check_cfg(package='gio-2.0', uselib_store='GIO', args='--cflags --libs', mandatory=False)
 
-	conf_define_from_opt('LIBDIR', Options.options.libdir, conf.env['PREFIX'] + '/lib')
-	conf_define_from_opt('DOCDIR', Options.options.docdir, conf.env['DATADIR'] + '/doc/geany')
-	conf_define_from_opt('MANDIR', Options.options.mandir, conf.env['DATADIR'] + '/man')
+	# Windows specials
+	if is_win32:
+		prefix = os.path.splitdrive(conf.srcdir)[1]
+		conf.define('PREFIX', os.path.join(prefix, '%s-%s' % (APPNAME, VERSION)), 1)
+		conf.define('DOCDIR', os.path.join(conf.env['PREFIX'], 'doc'), 1)
+		conf.define('LOCALEDIR', os.path.join(conf.env['PREFIX'], 'share\locale'), 1)
+		conf.define('LIBDIR', conf.env['PREFIX'], 1)
+		# DATADIR is defined in objidl.h, so we remove it from config.h but keep it in env
+		conf.undefine('DATADIR')
+		conf.env['DATADIR'] = os.path.join(conf.env['PREFIX'], 'data')
+		# hack: we add the parent directory of the first include directory as this is missing in
+		# list returned from pkg-config
+		conf.env['CPPPATH_GTK'].insert(0, os.path.dirname(conf.env['CPPPATH_GTK'][0]))
+		# we don't need -fPIC when compiling on or for Windows
+		if '-fPIC' in conf.env['shlib_CCFLAGS']:
+			conf.env['shlib_CCFLAGS'].remove('-fPIC')
+		if '-fPIC' in conf.env['CXXFLAGS']:
+			conf.env['CXXFLAGS'].remove('-fPIC')
+		conf.env.append_value('program_LINKFLAGS', '-mwindows')
+		conf.env.append_value('LIB_WIN32', [ 'wsock32', 'uuid', 'ole32', 'iberty' ])
+		conf.env['shlib_PATTERN'] = '%s.dll'
+		conf.env['program_PATTERN'] = '%s.exe'
+	else:
+		conf.env['shlib_PATTERN'] = '%s.so'
+		conf_define_from_opt('DOCDIR', Options.options.docdir,
+			os.path.join(conf.env['DATADIR'], 'doc/geany'))
+		conf_define_from_opt('LIBDIR', Options.options.libdir,
+			os.path.join(conf.env['PREFIX'], 'lib'))
+		conf_define_from_opt('MANDIR', Options.options.mandir,
+			os.path.join(conf.env['DATADIR'], 'man'))
 
 	svn_rev = conf_get_svn_rev()
 	conf.define('ENABLE_NLS', 1)
-	conf.define('GEANY_LOCALEDIR', 'LOCALEDIR', 0)
-	conf.define('GEANY_DATADIR', 'DATADIR', 0)
-	conf.define('GEANY_DOCDIR', 'DOCDIR', 0)
-	conf.define('GEANY_LIBDIR', 'LIBDIR', 0)
-	conf.define('GEANY_PREFIX', conf.env['PREFIX'], 1)
+	conf.define('GEANY_LOCALEDIR', '' if is_win32 else conf.env['LOCALEDIR'], 1)
+	conf.define('GEANY_DATADIR', 'data' if is_win32 else conf.env['DATADIR'], 1)
+	conf.define('GEANY_DOCDIR', conf.env['DOCDIR'], 1)
+	conf.define('GEANY_LIBDIR', '' if is_win32 else conf.env['LIBDIR'], 1)
+	conf.define('GEANY_PREFIX', '' if is_win32 else conf.env['PREFIX'], 1)
 	conf.define('PACKAGE', APPNAME, 1)
 	conf.define('VERSION', VERSION, 1)
 	conf.define('REVISION', svn_rev, 1)
@@ -238,7 +274,7 @@
 			help='compile without plugin support [default: No]', dest='no_plugins')
 		opt.add_option('--disable-socket', action='store_true', default=False,
 			help='compile without support to detect a running instance [[default: No]', dest='no_socket')
-		opt.add_option('--disable-vte', action='store_true', default=False,
+		opt.add_option('--disable-vte', action='store_true', default=target_is_win32(os.environ),
 			help='compile without support for an embedded virtual terminal [[default: No]', dest='no_vte')
 		opt.add_option('--enable-gnu-regex', action='store_true', default=False,
 			help='compile with included GNU regex library [default: No]', dest='gnu_regex')
@@ -259,21 +295,22 @@
 
 
 def build(bld):
+	is_win32 = target_is_win32(bld.env)
+
 	def build_plugin(plugin_name, install = True):
 		if install:
-			instpath = '${LIBDIR}/geany/'
+			instpath = '${PREFIX}/lib' if is_win32 else '${LIBDIR}/geany/'
 		else:
 			instpath = None
 
 		bld.new_task_gen(
-			features				='cc cshlib',
+			features				= 'cc cshlib',
 			source					= 'plugins/' + plugin_name + '.c',
 			includes				= '. plugins/ src/ scintilla/include tagmanager/include',
 			target					= plugin_name,
 			uselib					= 'GTK',
-			install_path			= instpath,
+			install_path			= instpath
 		)
-		bld.env['shlib_PATTERN']	= '%s.so'
 
 
 	# Tagmanager
@@ -303,16 +340,18 @@
 	# Geany
 	if bld.env['HAVE_VTE'] == 1:
 		geany_sources.append('src/vte.c')
-	if sys.platform == "win32":
+	if is_win32:
 		geany_sources.append('src/win32.c')
+
 	bld.new_task_gen(
 		features		= 'cc cxx cprogram',
 		name			= 'geany',
 		target			= 'geany',
 		source			= geany_sources,
 		includes		= '. src/ scintilla/include/ tagmanager/include/',
-		uselib			= 'GTK GIO',
-		uselib_local	= 'scintilla tagmanager'
+		uselib			= 'GTK GIO WIN32',
+		uselib_local	= 'scintilla tagmanager',
+		add_objects		= 'geany-rc' if is_win32 else None
 	)
 
 	# geanyfunctions.h
@@ -332,114 +371,139 @@
 		build_plugin('filebrowser')
 		build_plugin('htmlchars')
 		build_plugin('saveactions')
-		build_plugin('splitwindow')
+		build_plugin('splitwindow', not is_win32)
 
 	# Translations
-	bld.new_task_gen(
-		features		= 'intltool_po',
-		podir			= 'po',
-		appname			= 'geany'
-	)
+	if bld.env['INTLTOOL']:
+		bld.new_task_gen(
+			features		= 'intltool_po',
+			podir			= 'po',
+			install_path	= '${LOCALEDIR}',
+			appname			= 'geany'
+		)
 
-	bld.new_task_gen(
-		features		= 'intltool_in',
-		source			= 'geany.desktop.in',
-		flags			= '-d',
-		install_path	= '${DATADIR}/applications'
-	)
+	if not is_win32:
+		# geany.desktop
+		if bld.env['INTLTOOL']:
+			bld.new_task_gen(
+				features		= 'intltool_in',
+				source			= 'geany.desktop.in',
+				flags			= [ '-d', '-q', '-u', '-c' ],
+				install_path	= '${DATADIR}/applications'
+			)
 
-	# geany.pc
-	bld.new_task_gen(
-		features		= 'subst',
-		source			= 'geany.pc.in',
-		target			= 'geany.pc',
-		dict			= { 'VERSION' : VERSION,
-							'prefix': bld.env['PREFIX'],
-							'exec_prefix': '${prefix}',
-							'libdir': '${exec_prefix}/lib',
-							'includedir': '${prefix}/include',
-							'datarootdir': '${prefix}/share',
-							'datadir': '${datarootdir}',
-							'localedir': '${datarootdir}/locale' },
-		install_path	= '${LIBDIR}/pkgconfig'
-	)
+		# geany.pc
+		bld.new_task_gen(
+			features		= 'subst',
+			source			= 'geany.pc.in',
+			target			= 'geany.pc',
+			dict			= { 'VERSION' : VERSION,
+								'prefix': bld.env['PREFIX'],
+								'exec_prefix': '${prefix}',
+								'libdir': '${exec_prefix}/lib',
+								'includedir': '${prefix}/include',
+								'datarootdir': '${prefix}/share',
+								'datadir': '${datarootdir}',
+								'localedir': '${datarootdir}/locale' },
+			install_path	= '${LIBDIR}/pkgconfig'
+		)
 
-	# geany.1
-	bld.new_task_gen(
-		features		= 'subst',
-		source			= 'doc/geany.1.in',
-		target			= 'geany.1',
-		dict			= { 'VERSION' : VERSION,
-							'GEANY_DATA_DIR': bld.env['DATADIR'] + '/geany' },
-		install_path	= '${MANDIR}/man1'
-	)
+		# geany.1
+		bld.new_task_gen(
+			features		= 'subst',
+			source			= 'doc/geany.1.in',
+			target			= 'geany.1',
+			dict			= { 'VERSION' : VERSION,
+								'GEANY_DATA_DIR': bld.env['DATADIR'] + '/geany' },
+			install_path	= '${MANDIR}/man1'
+		)
 
-	# geany.spec
-	bld.new_task_gen(
-		features		= 'subst',
-		source			= 'geany.spec.in',
-		target			= 'geany.spec',
-		install_path	= None,
-		dict			= { 'VERSION' : VERSION }
-	)
+		# geany.spec
+		bld.new_task_gen(
+			features		= 'subst',
+			source			= 'geany.spec.in',
+			target			= 'geany.spec',
+			install_path	= None,
+			dict			= { 'VERSION' : VERSION }
+		)
 
-	# Doxyfile
-	bld.new_task_gen(
-		features		= 'subst',
-		source			= 'doc/Doxyfile.in',
-		target			= 'doc/Doxyfile',
-		install_path	= None,
-		dict			= { 'VERSION' : VERSION }
-	)
+		# Doxyfile
+		bld.new_task_gen(
+			features		= 'subst',
+			source			= 'doc/Doxyfile.in',
+			target			= 'doc/Doxyfile',
+			install_path	= None,
+			dict			= { 'VERSION' : VERSION }
+		)
+	else:
+		bld.new_task_gen(
+			features		= 'cc',
+			name			= 'geany-rc',
+			source			= 'geany_private.rc'
+		)
 
 	###
 	# Install files
 	###
-	# Headers
-	bld.install_files('${PREFIX}/include/geany', '''
-		src/dialogs.h src/document.h src/editor.h src/encodings.h src/filetypes.h src/geany.h
-		src/highlighting.h src/keybindings.h src/main.h src/msgwindow.h src/plugindata.h src/plugins.h
-		src/prefs.h src/project.h src/sciwrappers.h src/search.h src/support.h src/templates.h
-		src/toolbar.h src/ui_utils.h src/utils.h
-		plugins/pluginmacros.h plugins/geanyfunctions.h ''')
-	bld.install_files('${PREFIX}/include/geany/scintilla', '''
-		scintilla/include/SciLexer.h scintilla/include/Scintilla.h scintilla/include/Scintilla.iface
-		scintilla/include/ScintillaWidget.h ''')
-	bld.install_files('${PREFIX}/include/geany/tagmanager', '''
-		tagmanager/include/tm_file_entry.h tagmanager/include/tm_project.h tagmanager/include/tm_source_file.h
-		tagmanager/include/tm_symbol.h tagmanager/include/tm_tag.h tagmanager/include/tm_tagmanager.h
-		tagmanager/include/tm_work_object.h tagmanager/include/tm_workspace.h ''')
+	if not is_win32:
+		# Headers
+		bld.install_files('${PREFIX}/include/geany', '''
+			src/dialogs.h src/document.h src/editor.h src/encodings.h src/filetypes.h src/geany.h
+			src/highlighting.h src/keybindings.h src/main.h src/msgwindow.h src/plugindata.h
+			src/plugins.h src/prefs.h src/project.h src/sciwrappers.h src/search.h src/support.h
+			src/templates.h src/toolbar.h src/ui_utils.h src/utils.h plugins/pluginmacros.h
+			plugins/geanyfunctions.h ''')
+		bld.install_files('${PREFIX}/include/geany/scintilla', '''
+			scintilla/include/SciLexer.h scintilla/include/Scintilla.h
+			scintilla/include/Scintilla.iface scintilla/include/ScintillaWidget.h ''')
+		bld.install_files('${PREFIX}/include/geany/tagmanager', '''
+			tagmanager/include/tm_file_entry.h tagmanager/include/tm_project.h
+			tagmanager/include/tm_source_file.h
+			tagmanager/include/tm_symbol.h tagmanager/include/tm_tag.h
+			tagmanager/include/tm_tagmanager.h tagmanager/include/tm_work_object.h
+			tagmanager/include/tm_workspace.h ''')
 	# Docs
-	bld.install_files('${DOCDIR}', 'AUTHORS ChangeLog COPYING README NEWS THANKS TODO')
-	bld.install_files('${DOCDIR}/html/images', 'doc/images/*.png')
-	bld.install_as('${DOCDIR}/manual.txt', 'doc/geany.txt')
-	bld.install_as('${DOCDIR}/html/index.html', 'doc/geany.html')
+	base_dir = '${PREFIX}' if is_win32 else '${DOCDIR}'
+	ext = '.txt' if is_win32 else ''
+	html_dir = '' if is_win32 else 'html/'
+	html_name = 'Manual.html' if is_win32 else 'index.html'
+	for f in 'AUTHORS ChangeLog COPYING README NEWS THANKS TODO'.split():
+		bld.install_as("%s/%s%s" % (base_dir, ucFirst(f, is_win32), ext), f)
+	bld.install_files('${DOCDIR}/%simages' % html_dir, 'doc/images/*.png')
+	bld.install_as('${DOCDIR}/%s' % ucFirst('manual.txt', is_win32), 'doc/geany.txt')
+	bld.install_as('${DOCDIR}/%s%s' % (html_dir, html_name), 'doc/geany.html')
 	bld.install_as('${DOCDIR}/ScintillaLicense.txt', 'scintilla/License.txt')
+	if is_win32:
+		bld.install_as('${DOCDIR}/ReadMe.I18n.txt', 'README.I18N')
+		bld.install_as('${DOCDIR}/Hacking.txt', 'HACKING')
 	# Data
-	bld.install_files('${DATADIR}/geany', 'data/filetype*')
-	bld.install_files('${DATADIR}/geany', 'data/*.tags')
-	bld.install_files('${DATADIR}/geany', 'data/snippets.conf')
-	bld.install_files('${DATADIR}/geany', 'data/ui_toolbar.xml')
-	bld.install_as('${DATADIR}/geany/GPL-2', 'COPYING')
+	dir = '' if is_win32 else 'geany'
+	bld.install_files('${DATADIR}/%s' % dir, 'data/filetype*')
+	bld.install_files('${DATADIR}/%s' % dir, 'data/*.tags')
+	bld.install_files('${DATADIR}/%s' % dir, 'data/snippets.conf')
+	bld.install_files('${DATADIR}/%s' % dir, 'data/ui_toolbar.xml')
+	bld.install_as('${DATADIR}/%s/GPL-2' % dir, 'COPYING')
 	# Icons
-	bld.install_files('${DATADIR}/icons/hicolor/16x16/apps', 'icons/16x16/*.png')
-	bld.install_files('${DATADIR}/icons/hicolor/48x48/apps', 'icons/48x48/*.png')
-	bld.install_files('${DATADIR}/icons/hicolor/scalable/apps', 'icons/scalable/*.svg')
+	bld.install_files('${PREFIX}/share/icons'
+		if is_win32	else '${DATADIR}/icons/hicolor/16x16/apps', 'icons/16x16/*.png')
+	if not is_win32:
+		bld.install_files('${DATADIR}/icons/hicolor/48x48/apps', 'icons/48x48/*.png')
+		bld.install_files('${DATADIR}/icons/hicolor/scalable/apps', 'icons/scalable/*.svg')
 
 
 def shutdown():
+	is_win32 = target_is_win32(Build.bld.env)
 	# the following code was taken from midori's WAF script, thanks
-	if Options.commands['install'] or Options.commands['uninstall']:
+	if not is_win32 and not Options.options.destdir and (Options.commands['install'] or Options.commands['uninstall']):
 		dir = Build.bld.get_install_path('${DATADIR}/icons/hicolor')
 		icon_cache_updated = False
-		if not Options.options.destdir:
-			try:
-				Utils.exec_command('gtk-update-icon-cache -q -f -t %s' % dir)
-				Utils.pprint('GREEN', 'GTK icon cache updated.')
-				icon_cache_updated = True
-			except:
-				Utils.pprint('YELLOW', 'Failed to update icon cache for ' + dir + '.')
-		if not icon_cache_updated and not Options.options.destdir:
+		try:
+			Utils.exec_command('gtk-update-icon-cache -q -f -t %s' % dir)
+			Utils.pprint('GREEN', 'GTK icon cache updated.')
+			icon_cache_updated = True
+		except:
+			Utils.pprint('YELLOW', 'Failed to update icon cache for %s.' % dir)
+		if not icon_cache_updated:
 			print 'Icon cache not updated. After install, run this:'
 			print 'gtk-update-icon-cache -q -f -t %s' % dir
 
@@ -510,3 +574,19 @@
 	conf.check_message_1(msg)
 	conf.check_message_2(result, color)
 
+
+def ucFirst(s, is_win32):
+	if is_win32:
+		return s.title()
+	return s
+
+
+def target_is_win32(env):
+	if sys.platform == 'win32':
+		return True
+	if env and 'CC' in env:
+		cc = env['CC']
+		if not isinstance(cc, str):
+			cc = ''.join(cc)
+		return cc.find('mingw') != -1
+	return False


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.



More information about the Commits mailing list