2009-12-30 16:34:41 +00:00
|
|
|
# Created By: Virgil Dupras
|
|
|
|
# Created On: 2009-12-30
|
2011-04-12 08:04:01 +00:00
|
|
|
# Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
|
2009-12-30 16:34:41 +00:00
|
|
|
#
|
2010-09-30 10:17:41 +00:00
|
|
|
# This software is licensed under the "BSD" License as described in the "LICENSE" file,
|
2009-12-30 16:34:41 +00:00
|
|
|
# which should be included with this package. The terms are also available at
|
2010-09-30 10:17:41 +00:00
|
|
|
# http://www.hardcoded.net/licenses/bsd_license
|
2009-12-30 16:34:41 +00:00
|
|
|
|
|
|
|
import os
|
|
|
|
import os.path as op
|
2011-01-21 13:39:33 +00:00
|
|
|
from optparse import OptionParser
|
2010-01-01 20:42:52 +00:00
|
|
|
import shutil
|
2011-01-11 15:21:36 +00:00
|
|
|
import json
|
2009-12-30 16:34:41 +00:00
|
|
|
|
2010-01-01 20:42:52 +00:00
|
|
|
from setuptools import setup
|
2010-08-17 07:30:25 +00:00
|
|
|
from distutils.extension import Extension
|
2009-12-30 16:34:41 +00:00
|
|
|
|
2011-01-12 16:30:57 +00:00
|
|
|
from hscommon import sphinxgen
|
2011-07-21 14:11:51 +00:00
|
|
|
from hscommon.build import (add_to_pythonpath, print_and_do, copy_packages, filereplace,
|
2011-11-01 20:01:34 +00:00
|
|
|
get_module_version, build_all_cocoa_locs, move_all)
|
2011-11-01 19:44:18 +00:00
|
|
|
from hscommon import loc
|
2009-12-30 16:34:41 +00:00
|
|
|
|
2011-01-21 13:39:33 +00:00
|
|
|
def parse_args():
|
|
|
|
usage = "usage: %prog [options]"
|
|
|
|
parser = OptionParser(usage=usage)
|
2011-01-22 16:06:04 +00:00
|
|
|
parser.add_option('--clean', action='store_true', dest='clean',
|
|
|
|
help="Clean build folder before building")
|
2011-06-14 17:43:29 +00:00
|
|
|
parser.add_option('--doc', action='store_true', dest='doc',
|
|
|
|
help="Build only the help file")
|
|
|
|
parser.add_option('--loc', action='store_true', dest='loc',
|
|
|
|
help="Build only localization")
|
2011-11-02 19:55:20 +00:00
|
|
|
parser.add_option('--updatepot', action='store_true', dest='updatepot',
|
2011-11-01 19:44:18 +00:00
|
|
|
help="Generate .pot files from source code.")
|
2011-11-02 19:55:20 +00:00
|
|
|
parser.add_option('--mergepot', action='store_true', dest='mergepot',
|
|
|
|
help="Update all .po files based on .pot files.")
|
2011-01-21 13:39:33 +00:00
|
|
|
(options, args) = parser.parse_args()
|
|
|
|
return options
|
|
|
|
|
2011-01-11 16:58:28 +00:00
|
|
|
def build_cocoa(edition, dev):
|
2011-02-22 09:04:54 +00:00
|
|
|
from pluginbuilder import build_plugin
|
2010-08-11 14:39:06 +00:00
|
|
|
print("Building dg_cocoa.plugin")
|
2011-09-21 20:02:13 +00:00
|
|
|
if dev:
|
|
|
|
tocopy = ['cocoa/inter']
|
|
|
|
else:
|
2010-02-09 14:32:52 +00:00
|
|
|
specific_packages = {
|
|
|
|
'se': ['core_se'],
|
2010-07-13 06:08:18 +00:00
|
|
|
'me': ['core_me'],
|
2010-02-09 14:32:52 +00:00
|
|
|
'pe': ['core_pe'],
|
|
|
|
}[edition]
|
2011-09-21 20:02:13 +00:00
|
|
|
tocopy = ['core', 'hscommon', 'cocoa/inter'] + specific_packages
|
|
|
|
copy_packages(tocopy, 'build')
|
2010-02-09 14:32:52 +00:00
|
|
|
cocoa_project_path = 'cocoa/{0}'.format(edition)
|
|
|
|
shutil.copy(op.join(cocoa_project_path, 'dg_cocoa.py'), 'build')
|
|
|
|
os.chdir('build')
|
2011-02-21 10:57:37 +00:00
|
|
|
# We have to exclude PyQt4 specifically because it's conditionally imported in hscommon.trans
|
|
|
|
build_plugin('dg_cocoa.py', excludes=['PyQt4'], alias=dev)
|
2010-02-09 14:32:52 +00:00
|
|
|
os.chdir('..')
|
|
|
|
pluginpath = op.join(cocoa_project_path, 'dg_cocoa.plugin')
|
|
|
|
if op.exists(pluginpath):
|
|
|
|
shutil.rmtree(pluginpath)
|
|
|
|
shutil.move('build/dist/dg_cocoa.plugin', pluginpath)
|
|
|
|
if dev:
|
|
|
|
# In alias mode, the tweakings we do to the pythonpath aren't counted in. We have to
|
|
|
|
# manually put a .pth in the plugin
|
|
|
|
pthpath = op.join(pluginpath, 'Contents/Resources/dev.pth')
|
|
|
|
open(pthpath, 'w').write(op.abspath('.'))
|
|
|
|
os.chdir(cocoa_project_path)
|
2011-01-13 10:29:01 +00:00
|
|
|
print('Generating Info.plist')
|
|
|
|
app_version = get_module_version('core_{}'.format(edition))
|
|
|
|
filereplace('InfoTemplate.plist', 'Info.plist', version=app_version)
|
2010-08-11 14:39:06 +00:00
|
|
|
print("Building the XCode project")
|
2011-09-06 13:28:04 +00:00
|
|
|
args = ['-project dupeguru.xcodeproj']
|
2010-02-09 14:32:52 +00:00
|
|
|
if dev:
|
|
|
|
args.append('-configuration dev')
|
|
|
|
else:
|
|
|
|
args.append('-configuration release')
|
|
|
|
args = ' '.join(args)
|
|
|
|
os.system('xcodebuild {0}'.format(args))
|
2010-10-04 13:42:38 +00:00
|
|
|
os.chdir('../..')
|
|
|
|
print("Creating the run.py file")
|
|
|
|
subfolder = 'dev' if dev else 'release'
|
|
|
|
app_path = {
|
|
|
|
'se': 'cocoa/se/build/{0}/dupeGuru.app',
|
|
|
|
'me': 'cocoa/me/build/{0}/dupeGuru\\ ME.app',
|
|
|
|
'pe': 'cocoa/pe/build/{0}/dupeGuru\\ PE.app',
|
|
|
|
}[edition].format(subfolder)
|
|
|
|
tmpl = open('run_template_cocoa.py', 'rt').read()
|
2010-10-05 07:27:32 +00:00
|
|
|
run_contents = tmpl.replace('{{app_path}}', app_path)
|
2010-10-04 13:42:38 +00:00
|
|
|
open('run.py', 'wt').write(run_contents)
|
2010-02-09 14:32:52 +00:00
|
|
|
|
|
|
|
def build_qt(edition, dev):
|
2010-08-17 07:30:25 +00:00
|
|
|
print("Building Qt stuff")
|
2010-08-11 14:39:06 +00:00
|
|
|
print_and_do("pyrcc4 -py3 {0} > {1}".format(op.join('qt', 'base', 'dg.qrc'), op.join('qt', 'base', 'dg_rc.py')))
|
2010-10-04 13:42:38 +00:00
|
|
|
print("Creating the run.py file")
|
|
|
|
tmpl = open('run_template_qt.py', 'rt').read()
|
2010-10-05 07:27:32 +00:00
|
|
|
run_contents = tmpl.replace('{{edition}}', edition)
|
2010-10-04 13:42:38 +00:00
|
|
|
open('run.py', 'wt').write(run_contents)
|
2010-08-17 07:30:25 +00:00
|
|
|
|
2011-01-21 13:39:33 +00:00
|
|
|
def build_help(edition):
|
2011-01-11 16:58:28 +00:00
|
|
|
print("Generating Help")
|
2011-01-12 16:30:57 +00:00
|
|
|
current_path = op.abspath('.')
|
|
|
|
help_basepath = op.join(current_path, 'help', 'en')
|
|
|
|
help_destpath = op.join(current_path, 'build', 'help'.format(edition))
|
|
|
|
changelog_path = op.join(current_path, 'help', 'changelog_{}'.format(edition))
|
|
|
|
tixurl = "https://hardcoded.lighthouseapp.com/projects/31699-dupeguru/tickets/{0}"
|
|
|
|
appname = {'se': 'dupeGuru', 'me': 'dupeGuru Music Edition', 'pe': 'dupeGuru Picture Edition'}[edition]
|
|
|
|
homepage = 'http://www.hardcoded.net/dupeguru{}/'.format('_' + edition if edition != 'se' else '')
|
|
|
|
confrepl = {'edition': edition, 'appname': appname, 'homepage': homepage}
|
2011-01-22 16:06:04 +00:00
|
|
|
sphinxgen.gen(help_basepath, help_destpath, changelog_path, tixurl, confrepl)
|
2011-01-11 16:58:28 +00:00
|
|
|
|
2011-06-14 17:43:29 +00:00
|
|
|
def build_localizations(ui, edition):
|
|
|
|
print("Building localizations")
|
2011-11-01 20:01:34 +00:00
|
|
|
loc.compile_all_po('locale')
|
|
|
|
loc.compile_all_po(op.join('hscommon', 'locale'))
|
|
|
|
loc.merge_locale_dir(op.join('hscommon', 'locale'), 'locale')
|
2011-11-02 21:31:57 +00:00
|
|
|
if op.exists(op.join('build', 'locale')):
|
|
|
|
shutil.rmtree(op.join('build', 'locale'))
|
|
|
|
shutil.copytree('locale', op.join('build', 'locale'), ignore=shutil.ignore_patterns('*.po', '*.pot'))
|
2011-06-14 17:43:29 +00:00
|
|
|
if ui == 'cocoa':
|
2011-11-02 20:47:56 +00:00
|
|
|
print("Creating lproj folders based on .po files")
|
|
|
|
for lang in loc.get_langs('locale'):
|
|
|
|
if lang == 'en':
|
|
|
|
continue
|
|
|
|
pofile = op.join('locale', lang, 'LC_MESSAGES', 'ui.po')
|
2011-11-28 18:00:36 +00:00
|
|
|
for edition_folder in ['base', 'se', 'me', 'pe']:
|
|
|
|
enlproj = op.join('cocoa', edition_folder, 'en.lproj')
|
|
|
|
dest_lproj = op.join('cocoa', edition_folder, lang + '.lproj')
|
|
|
|
loc.po2allxibstrings(pofile, enlproj, dest_lproj)
|
|
|
|
if edition_folder == 'base':
|
|
|
|
loc.po2strings(pofile, op.join(enlproj, 'Localizable.strings'), op.join(dest_lproj, 'Localizable.strings'))
|
2011-11-04 19:17:14 +00:00
|
|
|
pofile = op.join('cocoalib', 'locale', lang, 'LC_MESSAGES', 'cocoalib.po')
|
|
|
|
loc.po2allxibstrings(pofile, op.join('cocoalib', 'en.lproj'), op.join('cocoalib', lang + '.lproj'))
|
2011-06-14 17:43:29 +00:00
|
|
|
build_all_cocoa_locs('cocoalib')
|
|
|
|
build_all_cocoa_locs(op.join('cocoa', 'base'))
|
|
|
|
build_all_cocoa_locs(op.join('cocoa', edition))
|
|
|
|
elif ui == 'qt':
|
2011-11-01 20:01:34 +00:00
|
|
|
loc.compile_all_po(op.join('qtlib', 'locale'))
|
|
|
|
loc.merge_locale_dir(op.join('qtlib', 'locale'), 'locale')
|
2011-11-01 19:44:18 +00:00
|
|
|
|
2011-11-02 19:55:20 +00:00
|
|
|
def build_updatepot():
|
2011-11-01 19:44:18 +00:00
|
|
|
print("Building .pot files from source files")
|
|
|
|
print("Building core.pot")
|
|
|
|
all_cores = ['core', 'core_se', 'core_me', 'core_pe']
|
|
|
|
loc.generate_pot(all_cores, op.join('locale', 'core.pot'), ['tr'])
|
|
|
|
print("Building columns.pot")
|
|
|
|
loc.generate_pot(all_cores, op.join('locale', 'columns.pot'), ['coltr'])
|
|
|
|
print("Building ui.pot")
|
2011-11-04 15:23:17 +00:00
|
|
|
ui_packages = ['qt', op.join('cocoa', 'inter')]
|
|
|
|
loc.generate_pot(ui_packages, op.join('locale', 'ui.pot'), ['tr'])
|
2011-11-01 19:44:18 +00:00
|
|
|
print("Building hscommon.pot")
|
|
|
|
loc.generate_pot(['hscommon'], op.join('hscommon', 'locale', 'hscommon.pot'), ['tr'])
|
|
|
|
print("Building qtlib.pot")
|
|
|
|
loc.generate_pot(['qtlib'], op.join('qtlib', 'locale', 'qtlib.pot'), ['tr'])
|
2011-11-02 19:55:20 +00:00
|
|
|
print("Enhancing ui.pot with Cocoa's strings files")
|
|
|
|
loc.allstrings2pot(op.join('cocoa', 'base', 'en.lproj'), op.join('locale', 'ui.pot'),
|
|
|
|
excludes={'core', 'message', 'columns'})
|
|
|
|
loc.allstrings2pot(op.join('cocoa', 'se', 'en.lproj'), op.join('locale', 'ui.pot'))
|
|
|
|
loc.allstrings2pot(op.join('cocoa', 'me', 'en.lproj'), op.join('locale', 'ui.pot'))
|
|
|
|
loc.allstrings2pot(op.join('cocoa', 'pe', 'en.lproj'), op.join('locale', 'ui.pot'))
|
|
|
|
|
|
|
|
def build_mergepot():
|
|
|
|
print("Updating .po files using .pot files")
|
|
|
|
loc.merge_pots_into_pos('locale')
|
2011-11-03 15:12:29 +00:00
|
|
|
loc.merge_pots_into_pos(op.join('hscommon', 'locale'))
|
2011-06-14 17:43:29 +00:00
|
|
|
|
2010-08-17 07:30:25 +00:00
|
|
|
def build_pe_modules(ui):
|
|
|
|
print("Building PE Modules")
|
|
|
|
exts = [
|
|
|
|
Extension("_block", [op.join('core_pe', 'modules', 'block.c'), op.join('core_pe', 'modules', 'common.c')]),
|
|
|
|
Extension("_cache", [op.join('core_pe', 'modules', 'cache.c'), op.join('core_pe', 'modules', 'common.c')]),
|
|
|
|
]
|
|
|
|
if ui == 'qt':
|
|
|
|
exts.append(Extension("_block_qt", [op.join('qt', 'pe', 'modules', 'block.c')]))
|
|
|
|
elif ui == 'cocoa':
|
|
|
|
exts.append(Extension(
|
|
|
|
"_block_osx", [op.join('core_pe', 'modules', 'block_osx.m'), op.join('core_pe', 'modules', 'common.c')],
|
|
|
|
extra_link_args=[
|
|
|
|
"-framework", "CoreFoundation",
|
|
|
|
"-framework", "Foundation",
|
|
|
|
"-framework", "ApplicationServices",]
|
|
|
|
))
|
|
|
|
setup(
|
|
|
|
script_args = ['build_ext', '--inplace'],
|
|
|
|
ext_modules = exts,
|
|
|
|
)
|
2011-10-04 13:45:55 +00:00
|
|
|
move_all('_block_qt*', op.join('qt', 'pe'))
|
|
|
|
move_all('_block*', 'core_pe')
|
|
|
|
move_all('_cache*', 'core_pe')
|
2010-02-09 14:32:52 +00:00
|
|
|
|
2011-01-21 13:39:33 +00:00
|
|
|
def build_normal(edition, ui, dev):
|
2010-08-11 14:39:06 +00:00
|
|
|
print("Building dupeGuru {0} with UI {1}".format(edition.upper(), ui))
|
2010-01-01 20:42:52 +00:00
|
|
|
add_to_pythonpath('.')
|
2011-01-22 15:12:18 +00:00
|
|
|
build_help(edition)
|
2011-06-14 17:43:29 +00:00
|
|
|
build_localizations(ui, edition)
|
2010-08-11 14:39:06 +00:00
|
|
|
print("Building dupeGuru")
|
2009-12-30 16:34:41 +00:00
|
|
|
if edition == 'pe':
|
2010-08-17 07:30:25 +00:00
|
|
|
build_pe_modules(ui)
|
2009-12-30 16:34:41 +00:00
|
|
|
if ui == 'cocoa':
|
2011-01-11 16:58:28 +00:00
|
|
|
build_cocoa(edition, dev)
|
2009-12-30 16:34:41 +00:00
|
|
|
elif ui == 'qt':
|
2010-02-09 14:32:52 +00:00
|
|
|
build_qt(edition, dev)
|
2009-12-30 16:34:41 +00:00
|
|
|
|
2011-01-21 13:39:33 +00:00
|
|
|
def main():
|
|
|
|
options = parse_args()
|
|
|
|
conf = json.load(open('conf.json'))
|
|
|
|
edition = conf['edition']
|
|
|
|
ui = conf['ui']
|
|
|
|
dev = conf['dev']
|
|
|
|
if dev:
|
|
|
|
print("Building in Dev mode")
|
2011-01-22 16:06:04 +00:00
|
|
|
if options.clean:
|
|
|
|
if op.exists('build'):
|
|
|
|
shutil.rmtree('build')
|
|
|
|
if not op.exists('build'):
|
|
|
|
os.mkdir('build')
|
2011-06-14 17:43:29 +00:00
|
|
|
if options.doc:
|
2011-01-21 13:39:33 +00:00
|
|
|
build_help(edition)
|
2011-06-14 17:43:29 +00:00
|
|
|
elif options.loc:
|
|
|
|
build_localizations(ui, edition)
|
2011-11-02 19:55:20 +00:00
|
|
|
elif options.updatepot:
|
|
|
|
build_updatepot()
|
|
|
|
elif options.mergepot:
|
|
|
|
build_mergepot()
|
2011-01-21 13:39:33 +00:00
|
|
|
else:
|
|
|
|
build_normal(edition, ui, dev)
|
|
|
|
|
2009-12-30 16:34:41 +00:00
|
|
|
if __name__ == '__main__':
|
|
|
|
main()
|