Beispiel #1
0
    def ruleInnoInstaller( self ):
        log.info( 'Running ruleInnoInstaller' )

        import package_windows_inno_setup_files
        inno_setup = package_windows_inno_setup_files.InnoSetup( log, self.platform, self.VC_VER, self.wb_version_info )
        inno_setup.createInnoInstall()

        r = run( (r'c:\Program Files (x86)\Inno Setup 5\ISCC.exe', '/O+', r'tmp\scm-workbench.iss'), output=True, check=False )
        with open( r'tmp\inno.log', 'w' ) as f:
            f.write( r.stdout.replace( '\r', '' ) )
            if len(r.stderr) > 0:
                f.write( '--- stderrr ---\n' )
                f.write( r.stderr.replace( '\r', '' ) )
            f.write( '--- exit code %d ---\n' % (r.returncode,) )

        if r.returncode != 0:
            log.info( 'StdOut:\n%s' % (r.stdout.replace('\r', '').strip(),) )
            log.error( 'StdErr:\n%s' % (r.stderr.replace('\r', '').strip(),) )
            raise BuildError( 'Inno setup failed %d' % (r.returncode,) )

        setup_exe = r'tmp\SCM-Workbench-%s-setup.exe' % (self.wb_version_info.get('version'),)

        build_utils.copyFile(
            r'tmp\Output\mysetup.exe',
            setup_exe,
            0o600 )
        log.info( r'Created kit %s' % (setup_exe,) )
Beispiel #2
0
    def ruleMlisp(self):
        log.info('Running ruleMlisp')
        build_utils.copyFile('../MLisp/emacsinit.ml',
                             self.BUILD_BEMACS_LIB_DIR, 0o444)
        build_utils.copyFile('../MLisp/emacs_profile.ml',
                             self.BUILD_BEMACS_LIB_DIR, 0o444)

        import create_library

        if self.opt_sqlite:
            dbtools = create_library.BemacsSqliteTools()
            if self.platform == 'win64':
                create_library.createLibrary(
                    ('common', 'windows'),
                    '%s/emacslib' % (self.BUILD_BEMACS_LIB_DIR, ), dbtools)
            else:
                create_library.createLibrary(
                    ('common', 'unix'),
                    '%s/emacslib' % (self.BUILD_BEMACS_LIB_DIR, ), dbtools)
            os.chmod('%s/emacslib.db' % (self.BUILD_BEMACS_LIB_DIR, ), 0o444)

        else:
            dbtools = create_library.BemacsDatabaseTools(
                self.BUILD_BEMACS_BIN_DIR)
            create_library.createLibrary(
                ('common', 'unix'),
                '%s/emacslib' % (self.BUILD_BEMACS_LIB_DIR, ), dbtools)
            os.chmod('%s/emacslib.dat' % (self.BUILD_BEMACS_LIB_DIR, ), 0o444)
            os.chmod('%s/emacslib.pag' % (self.BUILD_BEMACS_LIB_DIR, ), 0o444)
            os.chmod('%s/emacslib.dir' % (self.BUILD_BEMACS_LIB_DIR, ), 0o444)
Beispiel #3
0
    def ruleBemacsCli(self):
        log.info('Running ruleBemacsCli')
        self.make('all')

        build_utils.mkdirAndParents(self.BUILD_BEMACS_BIN_DIR)
        build_utils.copyFile('../Editor/exe-cli-bemacs/bemacs-cli',
                             self.BUILD_BEMACS_BIN_DIR, 0o555)
Beispiel #4
0
    def ruleDocs(self):
        log.info('Running ruleDocs')
        build_utils.copyFile('../Kits/readme.txt', self.BUILD_BEMACS_DOC_DIR,
                             0o444)
        build_utils.copyFile(
            '../Editor/PyQtBEmacs/org.barrys-emacs.editor.png',
            self.BUILD_BEMACS_DOC_DIR, 0o444)

        import build_docs
        if build_docs.main(['build', self.BUILD_BEMACS_DOC_DIR]) != 0:
            raise BuildError('HTML docs build failed')
Beispiel #5
0
    def buildMock( self ):
        self.buildSrpm()

        log.info( 'Creating RPM' )
        if self.copr_repo is not None:
            run( ('mock',
                        '--root=%s' % (self.MOCK_TARGET_FILENAME,),
                        '--enablerepo=barryascott-%s' % (self.copr_repo,),
                        '--rebuild',
                        self.SRPM_FILENAME) )
        else:
            run( ('mock',
                        '--root=%s' % (self.MOCK_TARGET_FILENAME,),
                        '--rebuild',
                        self.SRPM_FILENAME) )

        all_bin_kitnames = [
            self.KITNAME,
            '%s-cli' % (self.KITNAME,),
            '%s-common' % (self.KITNAME,),
            '%s-cli-debuginfo' % (self.KITNAME,),
            '%s-debugsource' % (self.KITNAME,),
            '%s-debuginfo' % (self.KITNAME,),
            ]

        if self.opt_gui:
            all_bin_kitnames.extend( [
                '%s-gui' % (self.KITNAME,),
                '%s-gui-debuginfo' % (self.KITNAME,),
                ] )

        run( ('mkdir','-p', 'built') )

        for bin_kitname in all_bin_kitnames:
            basename = '%s-%s-%s.%s.%s.rpm' % (bin_kitname, self.version, self.opt_release, self.dist_tag, self.opt_arch)
            src = '%s/RPMS/%s' % (self.MOCK_BUILD_DIR, basename)
            if os.path.exists( src ):
                log.info( 'Copying %s' % (basename,) )
                build_utils.copyFile( src, 'built/%s' % (basename,), 0o600 )

        log.info( 'Results in %s/built:' % (os.getcwd(),) )

        if self.install:
            log.info( 'Installing RPMs' )

            for bin_kitname in all_bin_kitnames:
                cmd = ('rpm', '-q', bin_kitname)
                p = run( cmd, check=False )
                if p.returncode == 0:
                    run( ('sudo', 'dnf', '-y', 'remove', bin_kitname) )

            cmd = ['sudo', 'dnf', '-y', 'install']
            cmd.extend( glob.glob( 'tmp/%s*.%s.rpm' % (self.KITNAME, self.opt_arch) ) )
            run( cmd )
Beispiel #6
0
    def ruleInnoInstaller(self):
        import package_windows_inno_setup_files
        inno_setup = package_windows_inno_setup_files.InnoSetup(
            self.platform, self.VC_VER, self.opt_vcredist)
        inno_setup.createInnoInstall()

        run((r'c:\Program Files (x86)\Inno Setup 6\ISCC.exe',
             r'tmp\bemacs.iss'))
        build_utils.copyFile(
            r'tmp\Output\mysetup.exe', r'tmp\bemacs-%s-setup.exe' %
            (self.bemacs_version_info.get('version'), ), 0o600)
        log.info(r'Created kit tmp\bemacs-%s-setup.exe' %
                 (self.bemacs_version_info.get('version'), ))
Beispiel #7
0
    def makeSrpm( self ):
        log.info( 'creating %s.spec' % (self.KITNAME,) )
        import package_rpm_specfile
        package_rpm_specfile.createRpmSpecFile( self, 'tmp/%s.spec' % (self.KITNAME,) )

        log.info( 'Creating SRPM for %s' % (self.KIT_BASENAME,) )

        run( ('mock',
                '--root=%s' % (self.MOCK_TARGET_FILENAME,),
                '--buildsrpm',
                '--spec', 'tmp/%s.spec' % (self.KITNAME,),
                '--sources', 'tmp/sources') )

        SRPM_BASENAME = '%s-%s.%s' % (self.KIT_BASENAME, self.opt_release, self.dist_tag)
        self.SRPM_FILENAME = 'tmp/%s.src.rpm' % (SRPM_BASENAME,)

        src = '%s/SRPMS/%s.src.rpm' % (self.MOCK_BUILD_DIR, SRPM_BASENAME)
        log.info( 'copy %s %s' % (src, self.SRPM_FILENAME) )
        build_utils.copyFile( src, self.SRPM_FILENAME, 0o600 )
Beispiel #8
0
    def ruleBemacsGui(self):
        log.info('Running ruleBemacsGui')

        self.make('all')

        if self.platform in ('Linux', 'NetBSD', 'MacOSX'):
            build_utils.copyFile('../Editor/exe-pybemacs/_bemacs.so',
                                 self.BUILD_BEMACS_LIB_DIR, 0o555)
            build_utils.copyFile('../Editor/exe-cli-bemacs/bemacs-cli',
                                 self.BUILD_BEMACS_BIN_DIR, 0o555)

        if self.platform == 'MacOSX':
            run(('./build-macosx.sh', '--package'), cwd='../Editor/PyQtBEmacs')

            build_utils.mkdirAndParents(self.BUILD_BEMACS_BIN_DIR)
            build_utils.copyFile('../Editor/exe-cli-bemacs/bemacs-cli',
                                 self.BUILD_BEMACS_BIN_DIR, 0o555)

        elif self.platform == 'win64':
            run(('build-windows.cmd', self.KITFILES,
                 self.bemacs_version_info.get('win_version')),
                cwd=r'..\Editor\PyQtBEmacs')

        else:
            run(('./build-linux.sh', self.BEMACS_ROOT_DIR,
                 self.INSTALL_BEMACS_BIN_DIR, self.INSTALL_BEMACS_LIB_DIR,
                 self.INSTALL_BEMACS_DOC_DIR),
                cwd='../Editor/PyQtBEmacs')
    def buildSrpm(self):
        run(('rm', '-rf', 'tmp'))
        run(('mkdir', 'tmp'))
        run(('mkdir', 'tmp/sources'))

        self.makeTarBall()

        if self.opt_kit_pycxx is not None:
            log.info('Add PyCXX kit to sources from %s' %
                     (self.opt_kit_pycxx, ))
            build_utils.copyFile(self.opt_kit_pycxx, 'tmp/sources', 0o600)

        if self.opt_kit_sqlite is not None:
            log.info('Add sqlite kit to sources from %s' %
                     (self.opt_kit_sqlite, ))
            build_utils.copyFile(self.opt_kit_sqlite, 'tmp/sources', 0o600)

        if self.opt_kit_xml_preferences is not None:
            log.info('Add xml-preferences to sources from %s' %
                     (self.opt_kit_xml_preferences, ))
            build_utils.copyFile(self.opt_kit_xml_preferences, 'tmp/sources',
                                 0o600)

        self.ensureMockSetup()
        self.makeSrpm()
        log.info('SRPM is %s' % (self.SRPM_FILENAME, ))
Beispiel #10
0
 def ruleDocs(self):
     log.info('Running ruleDocs')
     build_utils.copyFile('../Kits/readme.txt', self.BUILD_BEMACS_DOC_DIR,
                          0o444)
     build_utils.copyFile('../Editor/PyQtBEmacs/bemacs.png',
                          self.BUILD_BEMACS_DOC_DIR, 0o444)
     for pattern in ('../HTML/*.html', '../HTML/*.gif', '../HTML/*.css',
                     '../HTML/*.js'):
         for src in glob.glob(pattern):
             build_utils.copyFile(src, self.BUILD_BEMACS_DOC_DIR, 0o444)
Beispiel #11
0
 def ruleUtils(self):
     log.info('Running ruleUtils')
     build_utils.copyFile('../Editor/exe-utils/dbadd',
                          '%s/bemacs-dbadd' % (self.BUILD_BEMACS_BIN_DIR, ),
                          0o555)
     build_utils.copyFile(
         '../Editor/exe-utils/dbcreate',
         '%s/bemacs-dbcreate' % (self.BUILD_BEMACS_BIN_DIR, ), 0o555)
     build_utils.copyFile('../Editor/exe-utils/dbdel',
                          '%s/bemacs-dbdel' % (self.BUILD_BEMACS_BIN_DIR, ),
                          0o555)
     build_utils.copyFile(
         '../Editor/exe-utils/dbprint',
         '%s/bemacs-dbprint' % (self.BUILD_BEMACS_BIN_DIR, ), 0o555)
     build_utils.copyFile(
         '../Editor/exe-utils/dblist',
         '%s/bemacs-dblist' % (self.BUILD_BEMACS_BIN_DIR, ), 0o555)
     build_utils.copyFile(
         '../Editor/exe-utils/mll2db',
         '%s/bemacs-mll2db' % (self.BUILD_BEMACS_BIN_DIR, ), 0o555)
Beispiel #12
0
    def setupInnoItems(self):
        self.log.info('Create info_before.txt')

        version = self.wb_version_info['version']

        f = open(r'tmp\info_before.txt', 'w')
        f.write('''SCM Workbench %(version)s for %(arch)s

    Barry Scott

    %(date)s
''' % {
            'version': version,
            'arch': self.arch,
            'date': self.build_time_str
        })
        f.close()

        self.all_setup_items.extend([
            r'''AppName=%(APP_NAME)s''' % self.wb_version_info,
            r'''AppVerName=SCM Workbench %(major)s.%(minor)s.%(patch)s''' %
            self.wb_version_info,
            r'''AppCopyright=Copyright (C) %(copyright_years)s Barry A. Scott'''
            % self.wb_version_info,
            r'''DefaultDirName={pf}\Barry Scott\%(APP_NAME)s''' %
            self.wb_version_info,
            r'''DefaultGroupName=%(APP_NAME)s''' % self.wb_version_info,
            r'''UninstallDisplayIcon={app}\SCM Workbench.exe''',
            r'''ChangesAssociations=yes''',
            r'''DisableStartupPrompt=yes''',
            r'''InfoBeforeFile=info_before.txt''',
            r'''Compression=bzip/9''',
        ])

        self.all_task_items.extend([
            r'''Name: "option_desktop_icon"; Flags: unchecked; Description: "Place %(APP_NAME)s icon on the Desktop"'''
            % self.wb_version_info,
            r'''Name: "option_start_menu_icon"; Description: "Place %(APP_NAME)s on the Start menu"'''
            % self.wb_version_info,
        ])

        self.all_icon_items.extend([
            r'''Name: "{group}\SCM Workbench"; Filename: "{app}\SCM Workbench.exe"''',
            r'''Name: "{group}\SCM Workbench Web Site"; Filename: "http://www.barrys-emacs.org/scm-workbench/";''',
            #
            #    Add an Emacs icon to the Desktop
            #
            r'''Name: "{commondesktop}\%(APP_NAME)s"; Filename: "{app}\SCM Workbench.exe"; Tasks: "option_desktop_icon"'''
            % self.wb_version_info,

            #
            #    Add an Emacs icon to the Start menu
            #
            r'''Name: "{commonstartmenu}\%(APP_NAME)s"; Filename: "{app}\SCM Workbench"; Tasks: "option_start_menu_icon"'''
            % self.wb_version_info,
        ])

        self.addAllAppFiles()

        #for dll in [dll for dll in os.listdir( 'tmp' ) if dll.lower().endswith( '.dll' )]:
        #    self.all_file_items.append( 'Source: "%s"; DestDir: "{app}"; Flags: ignoreversion' % (dll,) )

        if self.vc_ver == '14.0':
            redist_year = '2015'

        else:
            print('Error: Unsupported VC_VER of %s' % (self.vc_ver, ))
            return 1

        if self.arch == 'win64':
            redist_arch = 'x64'
            code_file = os.path.join(self.BUILDER_TOP_DIR,
                                     r'Builder\win_code.iss')
            self.all_setup_items.append('ArchitecturesAllowed=x64')
            self.all_setup_items.append('ArchitecturesInstallIn64BitMode=x64')

        else:
            print('Error: Unsupported ARCH of %s' % (self.arch, ))
            return 1

        with open(code_file, 'r') as f:
            self.all_code_items.append(f.read() % self.wb_version_info)

        redist_file = 'vcredist_%s_%s.exe' % (redist_arch, redist_year)

        self.log.info(r'Assuming redist files are in K:\subversion')
        build_utils.copyFile(r'k:\subversion\%s' % (redist_file, ), r'tmp\app',
                             0o700)

        self.all_file_items.append(
            'Source: "%s"; DestDir: {tmp}; Flags: deleteafterinstall' %
            (r'app\%s' % (redist_file, )))
        self.all_run_items.append(
            r'Filename: {tmp}\%s; Parameters: "/q"; StatusMsg: Installing VC++ %s %s Redistributables...'
            % (redist_file, redist_year, self.arch))

        self.all_run_items.append(
            r'Filename: "{app}\%(APP_NAME)s.exe"; '
            r'Flags: nowait postinstall skipifsilent; Description: "Start %(APP_NAME)s"'
            % self.wb_version_info)
    def setupInnoItems( self ):
        log.info( 'Create info_before.txt' )

        BUILDER_TOP_DIR = os.environ['BUILDER_TOP_DIR']
        vi = brand_version.VersionInfo( BUILDER_TOP_DIR, print )
        vi.parseVersionInfo( os.path.join( BUILDER_TOP_DIR, 'Builder/version_info.txt' ) )

        version = vi.get('version')

        f = open( r'tmp\info_before.txt', 'w' )
        f.write(
'''Barry's Emacs %(version)s for %(arch)s

After the installation is completed please
see the readme.txt file for changes new in
this kit.

    Barry Scott

    %(date)s
''' %   {'version': version
        ,'arch': self.arch
        ,'date': self.build_time_str} )
        f.close()

        self.all_setup_items.extend( [
                r'''AppName=%(app_name)s''' % self.__dict__,
                r'''AppVerName=Barry's Emacs %s''' % (version,),
                r'''AppCopyright=Copyright (C) 1980-%s Barry A. Scott''' % (self.year,),
                r'''DefaultDirName={pf}\Barry Scott\%(app_name)s''' % self.__dict__,
                r'''DefaultGroupName=%(app_name)s''' % self.__dict__,
                r'''UninstallDisplayIcon={app}\bemacs.exe''',
                r'''ChangesAssociations=yes''',
                r'''DisableStartupPrompt=yes''',
                r'''InfoBeforeFile=info_before.txt''',
                r'''Compression=bzip/9''',
                ] )

        self.all_task_items.extend( [
                r'''Name: "option_register_emacs_open_ml"; Description: "%(app_name)s will open .ML and .MLP files"''' % self.__dict__,
                r'''Name: "option_register_emacs_open_c_dont"; Description: "No association"; GroupDescription: "How should %(app_name)s be associated with Cand C++ Source Files"; Flags: exclusive''' % self.__dict__,
                r'''Name: "option_register_emacs_open_c_one_type"; Description: "Associate using one file type"; GroupDescription: "How should %(app_name)s be associated with Cand C++ Source Files"; Flags: exclusive''' % self.__dict__,
                r'''Name: "option_register_emacs_open_c_many_types"; Description: "Associate using multiple file types"; GroupDescription: "How should %(app_name)s be associated with Cand C++ Source Files"; Flags: exclusive''' % self.__dict__,
                r'''Name: "option_desktop_icon"; Flags: unchecked; Description: "Place %(app_name)s icon on the Desktop"''' % self.__dict__,
                r'''Name: "option_start_menu_icon"; Description: "Place %(app_name)s on the Start menu"''' % self.__dict__,
                r'''Name: "option_edit_with_bemacs"; Description: "Place Edit with %(app_name)s on the Context menu"''' % self.__dict__,
                ] )

        self.all_icon_items.extend( [
                r'''Name: "{group}\Barry's Emacs"; Filename: "{app}\bemacs.exe"''',
                r'''Name: "{group}\Barry's Emacs Server"; Filename: "{app}\BEmacs_Server.exe"''',
                r'''Name: "{group}\Documentation"; Filename: "{app}\Documentation\users-guide.html"''',
                r'''Name: "{group}\FAQ"; Filename: "{app}\documentation\bemacs-faq.html"''',
                r'''Name: "{group}\Readme"; Filename: "{app}\bemacs.exe"; Parameters: """{app}\readme.txt"""''',
                r'''Name: "{group}\Barry's Emacs Web Site"; Filename: "https://barrys-emacs.org";''',
                #
                #    Add an Emacs icon to the Desktop
                #
                r'''Name: "{commondesktop}\%(app_name)s"; Filename: "{app}\bemacs.exe"; Tasks: "option_desktop_icon"''' % self.__dict__,

                #
                #    Add an Emacs icon to the Start menu
                #
                r'''Name: "{commonstartmenu}\%(app_name)s"; Filename: "{app}\bemacs.exe"; Tasks: "option_start_menu_icon"''' % self.__dict__,

                ] )

        self.all_registry_items.extend( [
                r'''Root: HKCR; Subkey: "BarrysEmacs8Command"; ValueType: string; ValueData: "BEmacs Command"; Flags: uninsdeletekey''',
                r'''Root: HKCR; Subkey: "BarrysEmacs8Command\Shell\open\command"; ValueType: string; ValueData: """{app}\bemacs.exe"" /package=""%1"""''',
                r'''Root: HKCR; Subkey: "BarrysEmacs8Command\DefaultIcon"; ValueType: string; ValueData: "{app}\bemacs.exe"''',

                r'''Root: HKCR; Subkey: "BarrysEmacs8MLisp"; ValueType: string; ValueData: "BEmacs MLisp"; Flags: uninsdeletekey''',
                r'''Root: HKCR; Subkey: "BarrysEmacs8MLisp\Shell\open\command"; ValueType: string; ValueData: """{app}\bemacs.exe"" ""%1"""''',
                r'''Root: HKCR; Subkey: "BarrysEmacs8MLisp\DefaultIcon"; ValueType: string; ValueData: "{app}\bemacs.exe"''',

                r'''Root: HKCR; Subkey: "BarrysEmacs8Document"; ValueType: string; ValueData: "BEmacs"; Flags: uninsdeletekey''',
                r'''Root: HKCR; Subkey: "BarrysEmacs8Document\Shell\open\command"; ValueType: string; ValueData: """{app}\bemacs.exe"" ""%1"""''',
                r'''Root: HKCR; Subkey: "BarrysEmacs8Document\DefaultIcon"; ValueType: string; ValueData: "{app}\bemacs.exe"''',

                r'''Root: HKCR; Subkey: "BarrysEmacs8DocumentII"; ValueType: string; ValueData: "BEmacs II"; Flags: uninsdeletekey''',
                r'''Root: HKCR; Subkey: "BarrysEmacs8DocumentII\Shell\open\command"; ValueType: string; ValueData: """{app}\bemacs.exe"" ""%1"""''',
                r'''Root: HKCR; Subkey: "BarrysEmacs8DocumentII\DefaultIcon"; ValueType: string; ValueData: "{app}\bemacs.exe"''',

                r'''Root: HKCR; Subkey: "BarrysEmacs8DocumentIII"; ValueType: string; ValueData: "BEmacs III"; Flags: uninsdeletekey''',
                r'''Root: HKCR; Subkey: "BarrysEmacs8DocumentIII\Shell\open\command"; ValueType: string; ValueData: """{app}\bemacs.exe"" ""%1"""''',
                r'''Root: HKCR; Subkey: "BarrysEmacs8DocumentIII\DefaultIcon"; ValueType: string; ValueData: "{app}\bemacs.exe"''',

                r'''Root: HKCR; Subkey: "BarrysEmacs8DocumentIV"; ValueType: string; ValueData: "BEmacs IV"; Flags: uninsdeletekey''',
                r'''Root: HKCR; Subkey: "BarrysEmacs8DocumentIV\Shell\open\command"; ValueType: string; ValueData: """{app}\bemacs.exe"" ""%1"""''',
                r'''Root: HKCR; Subkey: "BarrysEmacs8DocumentIV\DefaultIcon"; ValueType: string; ValueData: "{app}\bemacs.exe"''',

                r'''Root: HKCR; Subkey: "BarrysEmacs8DocumentV"; ValueType: string; ValueData: "BEmacs V"; Flags: uninsdeletekey''',
                r'''Root: HKCR; Subkey: "BarrysEmacs8DocumentV\Shell\open\command"; ValueType: string; ValueData: """{app}\bemacs.exe"" ""%1"""''',
                r'''Root: HKCR; Subkey: "BarrysEmacs8DocumentV\DefaultIcon"; ValueType: string; ValueData: "{app}\bemacs.exe"''',

                #
                #    Add the Edit with Barry's Emacs to the context menu
                #

                # option_edit_with_bemacs
                r'''Root: HKCR; Subkey: "*\shell\Edit with %(app_name)s"; ValueType: string; ValueData: "Edit with &%(app_name)s"; Flags: uninsdeletekey''' % self.__dict__,
                r'''Root: HKCR; Subkey: "*\shell\Edit with %(app_name)s\command"; ValueType: string; ValueData: """{app}\bemacs.exe"" ""%%1"""''' % self.__dict__,

                r'''Root: HKCR; Subkey: "Drive\shell\%(app_name)s Here"; ValueType: string; ValueData: "%(app_name)s &Here"; Flags: uninsdeletekey''' % self.__dict__,
                r'''Root: HKCR; Subkey: "Drive\shell\%(app_name)s Here\command"; ValueType: string; ValueData: """{app}\bemacs.exe"" /package=cd-here ""%%1\.."""''' % self.__dict__,

                r'''Root: HKCR; Subkey: "Directory\shell\%(app_name)s Here"; ValueType: string; ValueData: "%(app_name)s &Here"; Flags: uninsdeletekey''' % self.__dict__,
                r'''Root: HKCR; Subkey: "Directory\shell\%(app_name)s Here\command"; ValueType: string; ValueData: """{app}\bemacs.exe"" /package=cd-here ""%%1"""''' % self.__dict__,

                r'''Root: HKCR; Subkey: "Directory\Background\shell\%(app_name)s Here"; ValueType: string; ValueData: "%(app_name)s &Here"; Flags: uninsdeletekey''' % self.__dict__,
                r'''Root: HKCR; Subkey: "Directory\Background\shell\%(app_name)s Here\command"; ValueType: string; ValueData: """{app}\bemacs.exe"" /package=cd-here ""%%v"""''' % self.__dict__,

                #
                # have emacs open .ML files and .MLP files
                #
                r'''Root: HKCR; SubKey: ".ml";  ValueType: string; ValueData: "BarrysEmacs8MLisp"; Tasks: "option_register_emacs_open_ml"; Flags: uninsdeletekey''',
                r'''Root: HKCR; SubKey: ".mlp"; ValueType: string; ValueData: "BarrysEmacs8Command"; Tasks: "option_register_emacs_open_ml"; Flags: uninsdeletekey''',

                #
                # register all the C and C++ file types for emacs to open
                # either using one type or multiple
                #
                r'''Root: HKCR; Subkey: ".h";   ValueType: string; ValueData: "BarrysEmacs8Document"; Tasks: "option_register_emacs_open_c_one_type"''',
                r'''Root: HKCR; Subkey: ".hh";  ValueType: string; ValueData: "BarrysEmacs8Document"; Tasks: "option_register_emacs_open_c_one_type"''',
                r'''Root: HKCR; Subkey: ".hpp"; ValueType: string; ValueData: "BarrysEmacs8Document"; Tasks: "option_register_emacs_open_c_one_type"''',
                r'''Root: HKCR; Subkey: ".hxx"; ValueType: string; ValueData: "BarrysEmacs8Document"; Tasks: "option_register_emacs_open_c_one_type"''',
                r'''Root: HKCR; Subkey: ".c";   ValueType: string; ValueData: "BarrysEmacs8Document"; Tasks: "option_register_emacs_open_c_one_type"''',
                r'''Root: HKCR; Subkey: ".cc";  ValueType: string; ValueData: "BarrysEmacs8Document"; Tasks: "option_register_emacs_open_c_one_type"''',
                r'''Root: HKCR; Subkey: ".cpp"; ValueType: string; ValueData: "BarrysEmacs8Document"; Tasks: "option_register_emacs_open_c_one_type"''',
                r'''Root: HKCR; Subkey: ".cxx"; ValueType: string; ValueData: "BarrysEmacs8Document"; Tasks: "option_register_emacs_open_c_one_type"''',

                r'''Root: HKCR; Subkey: ".h";   ValueType: string; ValueData: "BarrysEmacs8DocumentII"; Tasks: "option_register_emacs_open_c_many_types"''',
                r'''Root: HKCR; Subkey: ".hh";  ValueType: string; ValueData: "BarrysEmacs8DocumentII"; Tasks: "option_register_emacs_open_c_many_types"''',
                r'''Root: HKCR; Subkey: ".hpp"; ValueType: string; ValueData: "BarrysEmacs8DocumentII"; Tasks: "option_register_emacs_open_c_many_types"''',
                r'''Root: HKCR; Subkey: ".hxx"; ValueType: string; ValueData: "BarrysEmacs8DocumentII"; Tasks: "option_register_emacs_open_c_many_types"''',

                r'''Root: HKCR; Subkey: ".c";   ValueType: string; ValueData: "BarrysEmacs8DocumentIII"; Tasks: "option_register_emacs_open_c_many_types"''',
                r'''Root: HKCR; Subkey: ".cc";  ValueType: string; ValueData: "BarrysEmacs8DocumentIII"; Tasks: "option_register_emacs_open_c_many_types"''',
                r'''Root: HKCR; Subkey: ".cpp"; ValueType: string; ValueData: "BarrysEmacs8DocumentIII"; Tasks: "option_register_emacs_open_c_many_types"''',
                r'''Root: HKCR; Subkey: ".cxx"; ValueType: string; ValueData: "BarrysEmacs8DocumentIII"; Tasks: "option_register_emacs_open_c_many_types"''',
                ] )

        self.all_file_items.extend( [
                r'''Source: "%s\Kits\Readme.txt"; DestDir: "{app}";''' % (BUILDER_TOP_DIR,),

                r'''Source: "%s\Editor\PyQtBEmacs\org.barrys-emacs.editor.png";  DestDir: "{app}\Documentation";''' % (BUILDER_TOP_DIR,),
                r'''Source: "%s\HTML\*.css";  DestDir: "{app}\Documentation";''' % (BUILDER_TOP_DIR,),
                r'''Source: "%s\HTML\*.html"; DestDir: "{app}\Documentation";''' % (BUILDER_TOP_DIR,),
                r'''Source: "%s\HTML\*.png";  DestDir: "{app}\Documentation";''' % (BUILDER_TOP_DIR,),
                r'''Source: "%s\HTML\*.cbi";  DestDir: "{app}\Documentation";''' % (BUILDER_TOP_DIR,),
                ] )

        self.addAllKitFiles()

        #for dll in [dll for dll in os.listdir( 'tmp' ) if dll.lower().endswith( '.dll' )]:
        #    self.all_file_items.append( 'Source: "%s"; DestDir: "{app}"; Flags: ignoreversion' % (dll,) )

        if self.vc_ver == '14.0':
            redist_year = '2015'

        else:
            print( 'Error: Unsupported VC_VER of %s' % (self.vc_ver,) )
            return 1

        if self.arch == 'win64':
            redist_arch = 'x64'
            code_file = os.path.join( BUILDER_TOP_DIR, 'Kits/Windows/bemacs_win64_code.iss' )
            self.all_setup_items.append( 'ArchitecturesAllowed=x64' )
            self.all_setup_items.append( 'ArchitecturesInstallIn64BitMode=x64' )

        else:
            print( 'Error: Unsupported ARCH of %s' % (self.arch,) )
            return 1

        f = open( code_file, 'r' )
        self.all_code_items.append( f.read() % self.__dict__ )
        f.close()

        redist_file = 'vcredist_%s_%s.exe' % (redist_arch, redist_year)

        build_utils.copyFile( '%s\%s' % (self.vc_redict_folder, redist_file), 'tmp', 0o600 )

        self.all_file_items.append( 'Source: "%s"; DestDir: {tmp}; Flags: deleteafterinstall' %
                                    (redist_file,) )
        self.all_run_items.append( r'Filename: {tmp}\%s; Parameters: "/q"; StatusMsg: Installing VC++ %s %s Redistributables...' %
                                    (redist_file, redist_year, self.arch) )

        # finally show the readme.txt
        self.all_run_items.append( r'Filename: "{app}\bemacs.exe"; Parameters: """{app}\readme.txt"""; '
                                        r'Flags: nowait postinstall skipifsilent; Description: "View README.TXT"' )