Bug 680636 - Add support for running nsinstall natively under pymake and convert a bunch of cases over. r=ted

This commit is contained in:
Siddharth Agarwal 2012-07-03 12:13:30 +05:30
parent d5b849f4cf
commit f7e4ff2b1a
9 changed files with 89 additions and 53 deletions

View File

@ -634,6 +634,11 @@ PWD := $(CURDIR)
endif
NSINSTALL_PY := $(PYTHON) $(call core_abspath,$(topsrcdir)/config/nsinstall.py)
# For Pymake, wherever we use nsinstall.py we're also going to try to make it
# a native command where possible. Since native commands can't be used outside
# of single-line commands, we continue to provide INSTALL for general use.
# Single-line commands should be switched over to install_cmd.
NSINSTALL_NATIVECMD := %nsinstall nsinstall
ifdef NSINSTALL_BIN
NSINSTALL = $(NSINSTALL_BIN)
@ -651,7 +656,11 @@ endif # NSINSTALL_BIN
ifeq (,$(CROSS_COMPILE)$(filter-out WINNT OS2, $(OS_ARCH)))
INSTALL = $(NSINSTALL) -t
INSTALL = $(NSINSTALL) -t
ifdef .PYMAKE
install_cmd = $(NSINSTALL_NATIVECMD) -t $(1)
endif # .PYMAKE
else
# This isn't laid out as conditional directives so that NSDISTMODE can be
@ -660,11 +669,17 @@ INSTALL = $(if $(filter copy, $(NSDISTMODE)), $(NSINSTALL) -t, $(if $(fi
endif # WINNT/OS2
# The default for install_cmd is simply INSTALL
install_cmd ?= $(INSTALL) $(1)
# Use nsinstall in copy mode to install files on the system
SYSINSTALL = $(NSINSTALL) -t
# This isn't necessarily true, just here
sysinstall_cmd = install_cmd
# Directory nsinstall.
DIR_INSTALL = $(INSTALL)
dir_install_cmd = install_cmd
#
# Localization build automation

View File

@ -46,13 +46,13 @@ xpidl-install-src-preqs=\
$(NULL)
xpidl-install-src: $(xpidl-install-src-preqs)
$(INSTALL) $(IFLAGS1) $(foreach val,$^,$(call mkdir_stem,$(val)))
$(call install_cmd,$(IFLAGS1) $(foreach val,$^,$(call mkdir_stem,$(val))))
xpidl-install-headers-preqs =\
$(patsubst %.idl,$(XPIDL_GEN_DIR)/%.h, $(XPIDLSRCS)) \
$(call mkdir_deps,$(DIST)/include) \
$(NULL)
xpidl-install-headers: $(xpidl-install-headers-preqs)
$(INSTALL) $(IFLAGS1) $(foreach val,$^,$(call mkdir_stem,$(val)))
$(call install_cmd,$(IFLAGS1) $(foreach val,$^,$(call mkdir_stem,$(val))))
endif #} _xpidl-todo_

View File

@ -17,7 +17,7 @@ import sys
import shutil
import stat
def nsinstall(argv):
def _nsinstall_internal(argv):
usage = "usage: %prog [options] arg1 [arg2 ...] target-directory"
p = OptionParser(usage=usage)
@ -52,13 +52,6 @@ def nsinstall(argv):
help="Set group (NOT SUPPORTED)", metavar="group")
(options, args) = p.parse_args(argv)
# Switching to Unicode strings makes python use the wide Windows APIs, which is
# what we want here since the wide APIs normally do a better job at handling long
# paths and such.
if sys.stdin.encoding is None:
args = [unicode(arg) for arg in args]
else:
args = [unicode(arg, sys.stdin.encoding) for arg in args]
if options.m:
# mode is specified
@ -152,9 +145,16 @@ def nsinstall(argv):
copy_all_entries(args, target)
return 0
# nsinstall as a native command is always UTF-8
def nsinstall(argv):
return _nsinstall_internal([unicode(arg, "utf-8") for arg in argv])
if __name__ == '__main__':
# sys.argv corrupts characters outside the system code page on Windows
# <http://bugs.python.org/issue2128>. Use ctypes instead.
# <http://bugs.python.org/issue2128>. Use ctypes instead. This is also
# useful because switching to Unicode strings makes python use the wide
# Windows APIs, which is what we want here since the wide APIs normally do a
# better job at handling long paths and such.
if sys.platform == "win32":
import ctypes
from ctypes import wintypes
@ -168,9 +168,13 @@ if __name__ == '__main__':
argc = ctypes.c_int(0)
argv_arr = CommandLineToArgv(GetCommandLine(), ctypes.byref(argc))
# The first argument will be "python", the second will be the .py file
# The first argv will be "python", the second will be the .py file
argv = argv_arr[1:argc.value]
else:
argv = sys.argv
# For consistency, do it on Unix as well
if sys.stdin.encoding is not None:
argv = [unicode(arg, sys.stdin.encoding) for arg in sys.argv]
else:
argv = [unicode(arg) for arg in sys.argv]
sys.exit(nsinstall(argv[1:]))
sys.exit(_nsinstall_internal(argv[1:]))

View File

@ -1190,14 +1190,14 @@ endif
ifndef NO_DIST_INSTALL
ifneq (,$(EXPORTS))
export:: $(EXPORTS)
$(INSTALL) $(IFLAGS1) $^ $(DIST)/include
$(call install_cmd,$(IFLAGS1) $^ $(DIST)/include)
endif
endif # NO_DIST_INSTALL
define EXPORT_NAMESPACE_RULE
ifndef NO_DIST_INSTALL
export:: $(EXPORTS_$(namespace))
$(INSTALL) $(IFLAGS1) $$^ $(DIST)/include/$(namespace)
$(call install_cmd,$(IFLAGS1) $$^ $(DIST)/include/$(namespace))
endif # NO_DIST_INSTALL
endef
@ -1246,7 +1246,7 @@ $(FINAL_TARGET)/defaults/autoconfig::
ifndef NO_DIST_INSTALL
export:: $(AUTOCFG_JS_EXPORTS) $(FINAL_TARGET)/defaults/autoconfig
$(INSTALL) $(IFLAGS1) $^
$(call install_cmd,$(IFLAGS1) $^)
endif
endif
@ -1312,7 +1312,7 @@ endif # XPIDL_MODULE.xpt != XPIDLSRCS
libs:: $(XPIDL_GEN_DIR)/$(XPIDL_MODULE).xpt
ifndef NO_DIST_INSTALL
$(INSTALL) $(IFLAGS1) $(XPIDL_GEN_DIR)/$(XPIDL_MODULE).xpt $(FINAL_TARGET)/components
$(call install_cmd,$(IFLAGS1) $(XPIDL_GEN_DIR)/$(XPIDL_MODULE).xpt $(FINAL_TARGET)/components)
ifndef NO_INTERFACES_MANIFEST
@$(PYTHON) $(MOZILLA_DIR)/config/buildlist.py $(FINAL_TARGET)/components/interfaces.manifest "interfaces $(XPIDL_MODULE).xpt"
@$(PYTHON) $(MOZILLA_DIR)/config/buildlist.py $(FINAL_TARGET)/chrome.manifest "manifest components/interfaces.manifest"
@ -1340,7 +1340,7 @@ export-idl:: $(SUBMAKEFILES) $(MAKE_DIRS)
ifneq ($(XPIDLSRCS),)
ifndef NO_DIST_INSTALL
export-idl:: $(XPIDLSRCS) $(IDL_DIR)
$(INSTALL) $(IFLAGS1) $^
$(call install_cmd,$(IFLAGS1) $^)
endif
endif
$(LOOP_OVER_PARALLEL_DIRS)
@ -1360,7 +1360,7 @@ endif
ifdef EXTRA_COMPONENTS
libs:: $(EXTRA_COMPONENTS)
ifndef NO_DIST_INSTALL
$(INSTALL) $(IFLAGS1) $^ $(FINAL_TARGET)/components
$(call install_cmd,$(IFLAGS1) $^ $(FINAL_TARGET)/components)
endif
endif
@ -1390,7 +1390,7 @@ endif
ifdef EXTRA_JS_MODULES
libs:: $(EXTRA_JS_MODULES)
ifndef NO_DIST_INSTALL
$(INSTALL) $(IFLAGS1) $^ $(FINAL_TARGET)/modules
$(call install_cmd,$(IFLAGS1) $^ $(FINAL_TARGET)/modules)
endif
endif
@ -1423,7 +1423,7 @@ GENERATED_DIRS += $(testmodulesdir)
libs:: $(TESTING_JS_MODULES)
ifndef NO_DIST_INSTALL
$(INSTALL) $(IFLAGS) $^ $(testmodulesdir)
$(call install_cmd,$(IFLAGS) $^ $(testmodulesdir))
endif
endif
@ -1437,7 +1437,7 @@ $(SDK_LIB_DIR)::
ifndef NO_DIST_INSTALL
libs:: $(SDK_LIBRARY) $(SDK_LIB_DIR)
$(INSTALL) $(IFLAGS2) $^
$(call install_cmd,$(IFLAGS2) $^)
endif
endif # SDK_LIBRARY
@ -1448,7 +1448,7 @@ $(SDK_BIN_DIR)::
ifndef NO_DIST_INSTALL
libs:: $(SDK_BINARY) $(SDK_BIN_DIR)
$(INSTALL) $(IFLAGS2) $^
$(call install_cmd,$(IFLAGS2) $^)
endif
endif # SDK_BINARY

View File

@ -137,8 +137,7 @@ class TestNsinstall(unittest.TestCase):
self.assertEqual(nsinstall(["-d", testfile, destdir]), 0)
self.assert_(os.path.isdir(os.path.join(destdir, "testfile")))
# Disable this temporarily on Windows (will be re-enabled by bug 680636)
if RUN_NON_ASCII_TESTS and sys.platform != "win32":
if RUN_NON_ASCII_TESTS:
def test_nsinstall_non_ascii(self):
"Test that nsinstall handles non-ASCII files"
filename = u"\u2325\u3452\u2415\u5081"
@ -150,7 +149,6 @@ class TestNsinstall(unittest.TestCase):
destfile = os.path.join(testdir, filename)
self.assert_(os.path.isfile(destfile))
if RUN_NON_ASCII_TESTS:
def test_nsinstall_non_ascii_subprocess(self):
"Test that nsinstall as a subprocess handles non-ASCII files"
filename = u"\u2325\u3452\u2415\u5081"

View File

@ -634,6 +634,11 @@ PWD := $(CURDIR)
endif
NSINSTALL_PY := $(PYTHON) $(call core_abspath,$(topsrcdir)/config/nsinstall.py)
# For Pymake, wherever we use nsinstall.py we're also going to try to make it
# a native command where possible. Since native commands can't be used outside
# of single-line commands, we continue to provide INSTALL for general use.
# Single-line commands should be switched over to install_cmd.
NSINSTALL_NATIVECMD := %nsinstall nsinstall
ifdef NSINSTALL_BIN
NSINSTALL = $(NSINSTALL_BIN)
@ -651,7 +656,11 @@ endif # NSINSTALL_BIN
ifeq (,$(CROSS_COMPILE)$(filter-out WINNT OS2, $(OS_ARCH)))
INSTALL = $(NSINSTALL) -t
INSTALL = $(NSINSTALL) -t
ifdef .PYMAKE
install_cmd = $(NSINSTALL_NATIVECMD) -t $(1)
endif # .PYMAKE
else
# This isn't laid out as conditional directives so that NSDISTMODE can be
@ -660,11 +669,17 @@ INSTALL = $(if $(filter copy, $(NSDISTMODE)), $(NSINSTALL) -t, $(if $(fi
endif # WINNT/OS2
# The default for install_cmd is simply INSTALL
install_cmd ?= $(INSTALL) $(1)
# Use nsinstall in copy mode to install files on the system
SYSINSTALL = $(NSINSTALL) -t
# This isn't necessarily true, just here
sysinstall_cmd = install_cmd
# Directory nsinstall.
DIR_INSTALL = $(INSTALL)
dir_install_cmd = install_cmd
#
# Localization build automation

View File

@ -46,13 +46,13 @@ xpidl-install-src-preqs=\
$(NULL)
xpidl-install-src: $(xpidl-install-src-preqs)
$(INSTALL) $(IFLAGS1) $(foreach val,$^,$(call mkdir_stem,$(val)))
$(call install_cmd,$(IFLAGS1) $(foreach val,$^,$(call mkdir_stem,$(val))))
xpidl-install-headers-preqs =\
$(patsubst %.idl,$(XPIDL_GEN_DIR)/%.h, $(XPIDLSRCS)) \
$(call mkdir_deps,$(DIST)/include) \
$(NULL)
xpidl-install-headers: $(xpidl-install-headers-preqs)
$(INSTALL) $(IFLAGS1) $(foreach val,$^,$(call mkdir_stem,$(val)))
$(call install_cmd,$(IFLAGS1) $(foreach val,$^,$(call mkdir_stem,$(val))))
endif #} _xpidl-todo_

View File

@ -17,7 +17,7 @@ import sys
import shutil
import stat
def nsinstall(argv):
def _nsinstall_internal(argv):
usage = "usage: %prog [options] arg1 [arg2 ...] target-directory"
p = OptionParser(usage=usage)
@ -52,13 +52,6 @@ def nsinstall(argv):
help="Set group (NOT SUPPORTED)", metavar="group")
(options, args) = p.parse_args(argv)
# Switching to Unicode strings makes python use the wide Windows APIs, which is
# what we want here since the wide APIs normally do a better job at handling long
# paths and such.
if sys.stdin.encoding is None:
args = [unicode(arg) for arg in args]
else:
args = [unicode(arg, sys.stdin.encoding) for arg in args]
if options.m:
# mode is specified
@ -152,9 +145,16 @@ def nsinstall(argv):
copy_all_entries(args, target)
return 0
# nsinstall as a native command is always UTF-8
def nsinstall(argv):
return _nsinstall_internal([unicode(arg, "utf-8") for arg in argv])
if __name__ == '__main__':
# sys.argv corrupts characters outside the system code page on Windows
# <http://bugs.python.org/issue2128>. Use ctypes instead.
# <http://bugs.python.org/issue2128>. Use ctypes instead. This is also
# useful because switching to Unicode strings makes python use the wide
# Windows APIs, which is what we want here since the wide APIs normally do a
# better job at handling long paths and such.
if sys.platform == "win32":
import ctypes
from ctypes import wintypes
@ -168,9 +168,13 @@ if __name__ == '__main__':
argc = ctypes.c_int(0)
argv_arr = CommandLineToArgv(GetCommandLine(), ctypes.byref(argc))
# The first argument will be "python", the second will be the .py file
# The first argv will be "python", the second will be the .py file
argv = argv_arr[1:argc.value]
else:
argv = sys.argv
# For consistency, do it on Unix as well
if sys.stdin.encoding is not None:
argv = [unicode(arg, sys.stdin.encoding) for arg in sys.argv]
else:
argv = [unicode(arg) for arg in sys.argv]
sys.exit(nsinstall(argv[1:]))
sys.exit(_nsinstall_internal(argv[1:]))

View File

@ -1190,14 +1190,14 @@ endif
ifndef NO_DIST_INSTALL
ifneq (,$(EXPORTS))
export:: $(EXPORTS)
$(INSTALL) $(IFLAGS1) $^ $(DIST)/include
$(call install_cmd,$(IFLAGS1) $^ $(DIST)/include)
endif
endif # NO_DIST_INSTALL
define EXPORT_NAMESPACE_RULE
ifndef NO_DIST_INSTALL
export:: $(EXPORTS_$(namespace))
$(INSTALL) $(IFLAGS1) $$^ $(DIST)/include/$(namespace)
$(call install_cmd,$(IFLAGS1) $$^ $(DIST)/include/$(namespace))
endif # NO_DIST_INSTALL
endef
@ -1246,7 +1246,7 @@ $(FINAL_TARGET)/defaults/autoconfig::
ifndef NO_DIST_INSTALL
export:: $(AUTOCFG_JS_EXPORTS) $(FINAL_TARGET)/defaults/autoconfig
$(INSTALL) $(IFLAGS1) $^
$(call install_cmd,$(IFLAGS1) $^)
endif
endif
@ -1312,7 +1312,7 @@ endif # XPIDL_MODULE.xpt != XPIDLSRCS
libs:: $(XPIDL_GEN_DIR)/$(XPIDL_MODULE).xpt
ifndef NO_DIST_INSTALL
$(INSTALL) $(IFLAGS1) $(XPIDL_GEN_DIR)/$(XPIDL_MODULE).xpt $(FINAL_TARGET)/components
$(call install_cmd,$(IFLAGS1) $(XPIDL_GEN_DIR)/$(XPIDL_MODULE).xpt $(FINAL_TARGET)/components)
ifndef NO_INTERFACES_MANIFEST
@$(PYTHON) $(MOZILLA_DIR)/config/buildlist.py $(FINAL_TARGET)/components/interfaces.manifest "interfaces $(XPIDL_MODULE).xpt"
@$(PYTHON) $(MOZILLA_DIR)/config/buildlist.py $(FINAL_TARGET)/chrome.manifest "manifest components/interfaces.manifest"
@ -1340,7 +1340,7 @@ export-idl:: $(SUBMAKEFILES) $(MAKE_DIRS)
ifneq ($(XPIDLSRCS),)
ifndef NO_DIST_INSTALL
export-idl:: $(XPIDLSRCS) $(IDL_DIR)
$(INSTALL) $(IFLAGS1) $^
$(call install_cmd,$(IFLAGS1) $^)
endif
endif
$(LOOP_OVER_PARALLEL_DIRS)
@ -1360,7 +1360,7 @@ endif
ifdef EXTRA_COMPONENTS
libs:: $(EXTRA_COMPONENTS)
ifndef NO_DIST_INSTALL
$(INSTALL) $(IFLAGS1) $^ $(FINAL_TARGET)/components
$(call install_cmd,$(IFLAGS1) $^ $(FINAL_TARGET)/components)
endif
endif
@ -1390,7 +1390,7 @@ endif
ifdef EXTRA_JS_MODULES
libs:: $(EXTRA_JS_MODULES)
ifndef NO_DIST_INSTALL
$(INSTALL) $(IFLAGS1) $^ $(FINAL_TARGET)/modules
$(call install_cmd,$(IFLAGS1) $^ $(FINAL_TARGET)/modules)
endif
endif
@ -1423,7 +1423,7 @@ GENERATED_DIRS += $(testmodulesdir)
libs:: $(TESTING_JS_MODULES)
ifndef NO_DIST_INSTALL
$(INSTALL) $(IFLAGS) $^ $(testmodulesdir)
$(call install_cmd,$(IFLAGS) $^ $(testmodulesdir))
endif
endif
@ -1437,7 +1437,7 @@ $(SDK_LIB_DIR)::
ifndef NO_DIST_INSTALL
libs:: $(SDK_LIBRARY) $(SDK_LIB_DIR)
$(INSTALL) $(IFLAGS2) $^
$(call install_cmd,$(IFLAGS2) $^)
endif
endif # SDK_LIBRARY
@ -1448,7 +1448,7 @@ $(SDK_BIN_DIR)::
ifndef NO_DIST_INSTALL
libs:: $(SDK_BINARY) $(SDK_BIN_DIR)
$(INSTALL) $(IFLAGS2) $^
$(call install_cmd,$(IFLAGS2) $^)
endif
endif # SDK_BINARY