ted.mielczarek%gmail.com 74abc48e68 bug 388543 - nsinstall on vista dies due to UAC, embed some manifests
git-svn-id: svn://10.0.0.236/trunk@252335 18797224-902f-48f8-a5cc-f745e15eee43
2008-06-13 21:23:34 +00:00

157 lines
6.2 KiB
Python

# Creates a mozilla-build installer.
#
# This script will taint your registry, cause hives, and otherwise screw up
# the system it's run on. Please do *not* run it on any machine you care about
# (a temporary VM would be perfect!)
#
# When clicking through installer dialogs, don't run any post-install steps.
# You won't need to change any paths.
#
# This script is python instead of shell because running the MSYS installer
# requires that no MSYS shells be currently running.
#
# = How to Build MozillaBuild =
# References:
# http://www.mingw.org/MinGWiki/index.php/MSYSBuildEnvironment
# http://www.mingw.org/MinGWiki/index.php/Build%20MSYS?PHPSESSID=ec53e47bb122b5dbc18063cb441983be
# http://mxr.mozilla.org/mozilla/source/tools/build-environment/win32/packageit.py
# == Visual Studio/Platform SDK ==
# === Installation ===
# (note: my install was done with Visual Studio Express 2005)
# * Install Visual Studio/Visual Studio Express
# * Install the Platform SDK
# ** Microsoft Windows Core SDK
# ** Microsoft Web Workshop (IE) SDk
# ** Microsoft IIS SDK
# === Path Setup ===
# * INCLUDE should be as follows: 'c:\program files\microsoft platform sdk\include;c:\program files\microsoft platform sdk\include\atl'.
# * Open up vsvars32.bat (for Express this is in c:\program files\microsoft visual studio 8\common7\tools).
# * Change the "@set INCLUDE=..." to start with "@set INCLUDE=%INCLUDE%", with the MSVS8 include path after it.
# == MSYS Packages ==
# === Installation ===
# Install these two packages to the same location:
# * [http://downloads.sourceforge.net/mingw/MSYS-1.0.10.exe?modtime=1079444447&big_mirror=1 MSYS Base System 1.0.10]
# * [http://downloads.sourceforge.net/mingw/msysDTK-1.0.1.exe?modtime=1041430674&big_mirror=1 MSYS Developer Toolkit 1.0.1]
#
# Open up an MSYS shell and do the following:
# mkdir /msys
# cd /msys
# tar -zvxf msysDVLPR-1.0.0-alpha-1.tar.gz
# cd /msys/lib/gcc-lib/i686-pc-msys/2.95.3-1
# mv specs specs.orig
# sed 's|/usr|/msys|g' < specs.orig > specs
#
# Download and unzip the [http://downloads.sourceforge.net/mingw/w32api-3.10.tar.gz?modtime=1186139469&big_mirror=1 w32api] package to somewhere outside of your MSYS install. Open up an MSYS shell and copy include/wincon.h to /msys/include.
#
# * Open an MSYS shell and do the following
# cd /msys/lib/gcc-lib/i686-pc-msys/2.95.3-1/include/msys
# Open the file up in vim and go to line 48. It should read:
# #define CTRL(c'h') ((ch)&0x1F)
# Change it to read:
# #define CTRL(ch) ((ch)&0x1F)
#
# === Path Setup ===
# Open up an MSYS shell, edit ~/.profile and add the following line:
# export PATH=".:/msys/bin:/usr/local/bin:/bin:$PATH"
#
# == Other Applications ==
# * [http://www.bastet.com/uddu.zip unix2dos]
# ** Put the exe files in c:\windows
# * [http://www.python.org/ftp/python/2.5.1/python-2.5.1.msi Python 2.5]
# * [http://superb-west.dl.sourceforge.net/sourceforge/nsis/nsis-2.33-setup.exe NSIS]
# * [http://mxr.mozilla.org/mozilla/source/tools/build-environment/win32/unz552xN.exe?raw=1&ctype=application/octet-stream unzip]
# ** Extract to c:\program files\unzip
# * Append ';c:\python25;c:\program files\nsis;c:\program files\unzip' to path.
#
from subprocess import check_call
from os import getcwd, remove, environ, chdir, walk
from os.path import dirname, join, split, abspath, exists
import optparse
from shutil import rmtree
sourcedir = join(split(abspath(__file__))[0])
stagedir = getcwd()
msysdir = "c:\\msys\\1.0"
oparser = optparse.OptionParser()
oparser.add_option("-s", "--source", dest="sourcedir")
oparser.add_option("-o", "--output", dest="stagedir")
oparser.add_option("-m", "--msys", dest="msysdir")
(options, args) = oparser.parse_args()
if len(args) != 0:
raise Exception("Unexpected arguments passed to command line.")
if options.sourcedir:
sourcedir = options.sourcedir
if options.stagedir:
stagedir = options.stagedir
if options.msysdir:
msysdir = options.msysdir
environ["MOZ_STAGEDIR"] = stagedir
environ["MOZ_SRCDIR"] = sourcedir
print("Source file location: " + sourcedir)
print("Output location: " + stagedir)
if exists(join(stagedir, "mozilla-build")):
rmtree(join(stagedir, "mozilla-build"))
check_call([join(sourcedir, "7z442.exe"),
"/D=" + join(stagedir, "mozilla-build", "7zip")])
check_call(["msiexec.exe", "/a",
join(sourcedir, "python-2.5.msi"),
"TARGETDIR=" + join(stagedir, "mozilla-build", "python25")])
check_call([join(sourcedir, "MSYS-1.0.10.exe"),
"/DIR=" + join(stagedir, "mozilla-build", "msys"),
# "/VERYSILENT", "/SUPRESSMSGBOXES",
"/SP-", "/NOICONS"])
check_call([join(sourcedir, "msysDTK-1.0.1.exe"),
"/DIR=" + join(stagedir, "mozilla-build", "msys"),
# "/VERYSILENT", "/SUPRESSMSGBOXES",
"/SP-", "/NOICONS"])
check_call([join(sourcedir, "XEmacs Setup 21.4.19.exe"),
"/DIR=" + join(stagedir, "mozilla-build", "xemacs"),
"/SP-", "/NOICONS"])
check_call([join(sourcedir, "Mercurial-1.0.1.exe"),
"/DIR=" + join(stagedir, "mozilla-build", "hg"),
"/SP-", "/NOICONS"])
# Run an MSYS shell to perform the following tasks:
# * install make-3.81
# * install UPX
# * install blat
# * install SVN
# * build and install libiconv
check_call([join(msysdir, "bin", "sh.exe"), "--login",
join(sourcedir, "packageit.sh")])
environ["MSYSTEM"] = "MSYS"
check_call([join(msysdir, "bin", "sh.exe"), "--login",
join(sourcedir, "packageit-msys.sh")])
del environ["MSYSTEM"]
# Embed some manifests to make Vista happy
def embedmanifest(f, mf):
f = abspath(f)
check_call(["mt.exe", "-manifest", mf,
'-outputresource:%s;#1' % f])
def embed_recursedir(dir, mf):
for rootdir, dirnames, filenames in walk(dir):
for f in filenames:
if f.endswith(".exe"):
embedmanifest(join(rootdir, f), mf)
manifest = join(sourcedir, "noprivs.manifest")
embed_recursedir(join(stagedir, "mozilla-build", "msys"), manifest)
embedmanifest(join(stagedir, "mozilla-build", "moztools", "bin", "nsinstall.exe"), manifest)
embedmanifest(join(stagedir, "mozilla-build", "moztools-180compat", "bin", "nsinstall.exe"), manifest)
# Make an installer
chdir(stagedir)
check_call(["makensis", "/NOCD", "installit.nsi"])