diff --git a/config/config.mk b/config/config.mk index c46b3b123f33..af01015dbdcf 100644 --- a/config/config.mk +++ b/config/config.mk @@ -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 diff --git a/config/makefiles/xpidl.mk b/config/makefiles/xpidl.mk index a5b8f26b59af..ba10306e181a 100644 --- a/config/makefiles/xpidl.mk +++ b/config/makefiles/xpidl.mk @@ -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_ diff --git a/config/nsinstall.py b/config/nsinstall.py index 42f920feb634..ad51c36fe534 100755 --- a/config/nsinstall.py +++ b/config/nsinstall.py @@ -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 - # . Use ctypes instead. + # . 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:])) diff --git a/config/rules.mk b/config/rules.mk index c9e8099cbdc4..33f3cd753a50 100644 --- a/config/rules.mk +++ b/config/rules.mk @@ -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 diff --git a/config/tests/unit-nsinstall.py b/config/tests/unit-nsinstall.py index 3b24eab062eb..2f129e9fe871 100644 --- a/config/tests/unit-nsinstall.py +++ b/config/tests/unit-nsinstall.py @@ -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" diff --git a/js/src/config/config.mk b/js/src/config/config.mk index c46b3b123f33..af01015dbdcf 100644 --- a/js/src/config/config.mk +++ b/js/src/config/config.mk @@ -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 diff --git a/js/src/config/makefiles/xpidl.mk b/js/src/config/makefiles/xpidl.mk index a5b8f26b59af..ba10306e181a 100644 --- a/js/src/config/makefiles/xpidl.mk +++ b/js/src/config/makefiles/xpidl.mk @@ -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_ diff --git a/js/src/config/nsinstall.py b/js/src/config/nsinstall.py index 42f920feb634..ad51c36fe534 100644 --- a/js/src/config/nsinstall.py +++ b/js/src/config/nsinstall.py @@ -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 - # . Use ctypes instead. + # . 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:])) diff --git a/js/src/config/rules.mk b/js/src/config/rules.mk index c9e8099cbdc4..33f3cd753a50 100644 --- a/js/src/config/rules.mk +++ b/js/src/config/rules.mk @@ -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