text: #!/usr/bin/env python
  # ........................................................................... #
  #
  # IzPack - Copyright 2007, 2010 Julien Ponge, All Rights Reserved.
  #
  # http://izpack.org/
  # http://izpack.codehaus.org/
  #
  # Licensed under the Apache License, Version 2.0 (the "License");
  # you may not use this file except in compliance with the License.
  # You may obtain a copy of the License at
  #     http://www.apache.org/licenses/LICENSE-2.0
  #
  # Unless required by applicable law or agreed to in writing, software
  # distributed under the License is distributed on an "AS IS" BASIS,
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  # See the License for the specific language governing permissions and
  # limitations under the License.
  # ........................................................................... #
  
  import os
  import sys
  import subprocess
  import shutil
  import optparse
  
  def parse_options():
      parser = optparse.OptionParser()
      parser.add_option("--file", action="append", dest="file",
                        help="The installer JAR file / files")
      parser.add_option("--output", action="store", dest="output",
                        default="setup.exe",
                        help="The executable file")
      parser.add_option("--with-jdk", action="store", dest="with_jre", default="",
        help="The bundled JRE to run the exe independently of the system resources. ")  # choosen JDK that may came with the package
      parser.add_option("--with-7z", action="store", dest="p7z",
                        default="7za",
                        help="Path to the 7-Zip executable")
      parser.add_option("--with-upx", action="store", dest="upx",
                        default="upx",
                        help="Path to the UPX executable")
      parser.add_option("--no-upx", action="store_true", dest="no_upx",
                        default=False,
                        help="Do not use UPX to further compress the output")
      parser.add_option("--launch-file", action="store", dest="launch",
                        default="",
                        help="File to launch after extract")
      parser.add_option("--launch-args", action="store", dest="launchargs",
                        default="",
                        help="Arguments for file to launch after extract")
      parser.add_option("--name", action="store", dest="name",
                        default="IzPack",
                        help="Name of package for title bar and prompts")
      parser.add_option("--prompt", action="store_true", dest="prompt",
                        default=False,
                        help="Prompt the user before extraction?")
      (options, args) = parser.parse_args()
      if (options.file is None):
          parser.error("no installer file has been given")
      return options
  
  def create_exe(settings):
      if len(settings.file) > 0:
          filename = os.path.basename(settings.file[0])
      else:
          filename = ''
      
      if len(settings.with_jre) > 0:
          jdk = os.path.basename(settings.with_jre) #inside the jdk/jre that was given, there must be a bin/java.exe file
          jdk = jdk + "\\bin\\javaw.exe"
          print(jdk)
          settings.file.append(settings.with_jre) #jdk/jre is going in the package
      else:
          jdk = 'javaw' #java is added somehow to the PATH
      
      if settings.p7z == '7za':
          p7z = os.path.join(os.path.dirname(sys.argv[0]), '7za')
      else:
          p7z = settings.p7z
      
      use_shell = sys.platform != 'win32'
      
      if (os.access('installer.7z', os.F_OK)):
          os.remove('installer.7z')
      files = '" "'.join(settings.file)
      p7zcmd = '"%s" a -mmt -t7z -mx=9 installer.7z "%s"' % (p7z, files)
      subprocess.call(p7zcmd, shell=use_shell)
      
      config = open('config.txt', 'w')
      config.write(';!@Install@!UTF-8!\n')
      config.write('Title="%s"\n' % settings.name)
      if settings.prompt:
          config.write('BeginPrompt="Install %s?"\n' % settings.name)
      config.write('Progress="yes"\n')
      
      if settings.launch == '':
          config.write('ExecuteFile="' + jdk +'"\n') # who is going to run my installer.jar?
          config.write('ExecuteParameters="-jar \\\"%s\\\"' % filename)
          if settings.launchargs != '':
              config.write(' %s"\n' % settings.launchargs)
          else:
              config.write('"\n') 
      else:
          config.write('ExecuteFile="%s"\n' % settings.launch)
          if settings.launchargs != '':
              config.write('ExecuteParameters="%s"\n' % settings.launchargs)
  
      config.write(';!@InstallEnd@!\n')
      config.close()
      
      sfx = os.path.join(os.path.dirname(p7z), '7zS.sfx')
      files = [sfx, 'config.txt', 'installer.7z']
      
      output = open(settings.output, 'wb')
      for f in files:
          in_file = open(f, 'rb')
          shutil.copyfileobj(in_file, output, 2048)
          in_file.close()
      output.close()
      
      if (not settings.no_upx):
          if settings.upx == 'upx':
              upx = os.path.join(os.path.dirname(sys.argv[0]), 'upx')
          else:
              upx = settings.upx
          upx = '"%s" --ultra-brute "%s"' % (upx, settings.output)
          subprocess.call(upx, shell=use_shell)
      
      os.remove('config.txt')
      os.remove('installer.7z')
  
  def main():
      create_exe(parse_options())
  
  if __name__ == "__main__":
      main()
  