[m-rev.] Sorry, wrong diff format. For review: Shared Mercury libs on Mac OS X

Ian MacLarty maclarty at cs.mu.OZ.AU
Fri Oct 8 21:07:17 AEST 2004


Please ignore the previous posting - I included the diff in the wrong format.

Changes to get shared versions of the Mercury libraries working on Mac OS X.

This diff needs to be applied in 2 stages:  first the handling of the extra
options in the compiler(compiler/options.m, compiler/compile_target_code.m and
compiler/modules.m), then the changes to the configuration scripts and make
files that use these extra options.  I am posting the diffs together so the
changes can be reviewed as a whole.

Also the following issues still need clarification:

	1. The -undefined_suppress linker option doesn't work with two level
		namespaces which is the default on Darwin.  Is the
		--allow-undefined ml option used?  If so should shared libs
		rather use flat namespaces.  Alternatively the ALLOW_UNDEFINED
		configuration variable can be set to "-undefined
		dynamic_lookup", but that'll only work for Mac OS >= 10.3.  I
		didn't get any undefined symbols when compiling the compiler.

	2. Does the shared library built in the analysis directory currently
		get installed anywhere?  If so where?  

Ian.

For review by anyone.

Estimated hours taken: 20
Branches: main

Changes to get shared libraries to work on Mac OS X (Darwin).

Darwin shared libraries have the extension `dylib' instead of `so'.  Also 
objects that link to a shared library on Darwin don't need to be told the 
runtime path in which they should look for the libraries, instead the 
shared libraries themselves remember where they will be eventually installed
(called the install-name) and any object which links in the shared library will
get the install-name from the shared library at link time.  When a shared 
library is built it has to be told where it will be installed which is what
the libtool -install_name option is used for on Darwin.

Added three new compiler options :

--shlib-linker-use-install-name : 
	A boolean flag to tell the compiler to use the -install_name option
	when building shared libraries.  When this flag is set the following
	options have no effect: --linker-rpath-flag, --linker-rpath-separator,
	--shlib-linker-rpath-flag, --shlib-linker-rpath-separator.

--shlib-linker-install-name-flag :
	The flag name to use ("-install_name" for Darwin).

--shlib-linker-install-name-path :
	The path where the shared library will eventually end up, excluding the
	file name.  The file name is appended to the end before the option
	is passed on to the linker.

Mmake.common.in
	Added variables used for install-name on/off switch and flag name.

configure.in
	Make shared libs the default when on Darwin and the compiler is gcc.

boehm_gc/Makefile
boehm_gc/Makefile.direct
	Added rule to make libgc.dylib and set the install-name correctly.

boehm_gc/Mmakefile
	Set variable used in boehm_gc/Makefile to get the final install path
	of the gc shared lib.

browser/Mercury.options
	Added mer_mdbcomp library for target libmer_browser.dylib.

browser/Mmakefile
	Added --shlib-linker-install-name-path option to MC options.
	
compiler/compile_target_code.m
	Updated module qualifiers to `.'.  Passed the install-name options to
	the linker and made RpathsOpts empty if the
	--shlib-linker-use-install-name flag is set.

compiler/modules.m
	Added get_install_name_option/4 predicate to get the option string to
	set the install-name for a shared library.

compiler/options.m
	Added --shlib-linker-install-name-path,
	--shlib-linker-install-name-flag and --shlib-linker-use-install-name
	options.

doc/user_guide.texi
	Documented the --shlib-linker-install-name-path option.  The other
	options will be automatically set by the configure script and 
	should never need to be set by the user, so they're not documented in
	the user guide.

library/Mmakefile
	Added --shlib-linker-install-name-path option to MC flags.

runtime/Mmakefile
	Added rule to make the Darwin shared library.

scripts/Mercury.config.bootstrap.in
	Added default values for --shlib-linker-use-install-name and
	--shlib-linker-install-name-flag.

scripts/Mercury.config.in
	Added default values for --shlib-linker-use-install-name and
	--shlib-linker-install-name-flag.

trace/Mmakefile
	Added rule to make the Darwin shared library.

Index: Mmake.common.in
===================================================================
RCS file: /home/mercury1/repository/mercury/Mmake.common.in,v
retrieving revision 1.78
diff -u -r1.78 Mmake.common.in
--- Mmake.common.in	24 Jun 2004 11:25:49 -0000	1.78
+++ Mmake.common.in	8 Oct 2004 11:03:31 -0000
@@ -105,6 +105,11 @@
 EXE_RPATH_OPT	= @EXE_RPATH_OPT@''
 EXE_RPATH_SEP	= ''@EXE_RPATH_SEP@''
 
+# These variables can be used to set the install-name for the mercury
+# shared libraries.
+SHLIB_USE_INSTALL_NAME = @SHLIB_USE_INSTALL_NAME@
+SHLIB_INSTALL_NAME_FLAG = @SHLIB_INSTALL_NAME_FLAG@''
+
 # Specify any extra libraries that must be linked in when linking shared
 # objects.
 SHARED_LIBS		= @SHARED_LIBS@
Index: configure.in
===================================================================
RCS file: /home/mercury1/repository/mercury/configure.in,v
retrieving revision 1.404
diff -u -r1.404 configure.in
--- configure.in	5 Oct 2004 00:46:26 -0000	1.404
+++ configure.in	8 Oct 2004 11:03:32 -0000
@@ -227,14 +227,17 @@
 			--halt-at-warn $link_static_opt conftest \
 			</dev/null >&AC_FD_CC 2>&1 &&
 		test "`./conftest 2>&1 | tr -d '\015'`" = "Hello, world" &&
-		# Test for the --record-term-sizes-as-words option.
-		# Note that we need to set --grade to an LLDS grade
-		# when doing this test because term size profiling
-		# requires an LLDS grade.
+ 		# Test for the --record-term-sizes-as-words option.
+ 		# Note that we need to set --grade to an LLDS grade
+ 		# when doing this test because term size profiling
+ 		# requires an LLDS grade.
+		# This also tests for the --shlib-linker-intall-name-flag
+		# option.
 		$BOOTSTRAP_MC \
 			--grade none.gc \
 			--record-term-sizes-as-words \
 			--output-grade-string \
+			--shlib-linker-install-name-flag "-dummy_flag" \
 			</dev/null >&AC_FD_CC 2>&1
 	then
 		AC_MSG_RESULT(yes)
@@ -2414,23 +2417,6 @@
 # enable conservative garbage collection by default.
 # We also allow users to override the default grade by setting
 # "DEFAULT_GRADE" in the environment before invoking configure.
-
-AC_ARG_WITH(default-grade,
-    AC_HELP_STRING([--with-default-grade=GRADE],
-                   [Have the built compiler default to using GRADE]),
-    [case "$withval" in
-      # Handle `--with-default-grade' (no `=GRADE') and
-      # `--without-default-grade' flags.
-      yes|no)
-        AC_MSG_ERROR([Must supply a valid grade if using --with-default-grade.])
-        ;;
-      *)
-        # Perhaps do better checking on the supplied value here.
-        DEFAULT_GRADE="$withval"
-        export DEFAULT_GRADE
-        ;;
-     esac], [])
-
 if test "$DEFAULT_GRADE" = ""; then                                             
 	DEFAULT_GRADE=$DEFAULT_BASE_GRADE.gc
 fi
@@ -2964,6 +2950,10 @@
 EXE_RPATH_SEP=" -Wl,-rpath,"
 SHLIB_RPATH_OPT="-Wl,-rpath,"
 SHLIB_RPATH_SEP=" -Wl,-rpath,"
+
+SHLIB_USE_INSTALL_NAME=""
+SHLIB_INSTALL_NAME_FLAG="-install_name "
+
 CFLAGS_FOR_PIC="-fpic -DMR_PIC"
 EXT_FOR_PIC_OBJECTS=pic_o
 # Object files with extension $EXT_FOR_LINK_WITH_PIC_OBJECTS are used
@@ -3194,6 +3184,28 @@
 		EXT_FOR_LINK_WITH_PIC_OBJECTS=o
 		DEFAULT_LINKAGE=static
 		;;
+	*powerpc*apple*darwin*)
+		# If the compiler is gcc then use darwin style dynamic linking.
+		# Otherwise use static linking.
+		if test "$GCC_PROG" != ""; then
+		    SHLIB_USE_INSTALL_NAME="--shlib-linker-use-install-name"
+		    SHLIB_INSTALL_NAME_FLAG="-install_name "
+		    LINK_SHARED_OBJ="$GCC_PROG -dynamiclib -single_module"
+		    LINK_SHARED_OBJ_SH="$GCC_PROG -dynamiclib -single_module"
+		    EXT_FOR_SHARED_LIB=dylib
+		    EXT_FOR_LINK_WITH_PIC_OBJECTS=o
+		    CFLAGS_FOR_PIC="-fPIC -DMR_PIC"
+		    ERROR_UNDEFINED="-undefined error"
+		    ALLOW_UNDEFINED="-undefined suppress"
+		    AC_MSG_RESULT(yes)
+		else
+		    CFLAGS_FOR_PIC=
+		    EXT_FOR_PIC_OBJECTS=o
+		    EXT_FOR_LINK_WITH_PIC_OBJECTS=o
+		    DEFAULT_LINKAGE=static
+		    AC_MSG_RESULT(no)
+		fi
+		;;
 	*)
 		# CFLAGS_FOR_PIC is used by boehm_gc/Makefile when creating
 		# libgc.a.  If the system doesn't support shared libraries,
@@ -3363,6 +3375,8 @@
 AC_SUBST(EXE_RPATH_SEP)
 AC_SUBST(SHLIB_RPATH_OPT)
 AC_SUBST(SHLIB_RPATH_SEP)
+AC_SUBST(SHLIB_USE_INSTALL_NAME)
+AC_SUBST(SHLIB_INSTALL_NAME_FLAG)
 AC_SUBST(CFLAGS_FOR_PIC)
 AC_SUBST(EXT_FOR_PIC_OBJECTS)
 AC_SUBST(EXT_FOR_LINK_WITH_PIC_OBJECTS)
@@ -3887,6 +3901,9 @@
 	# then don't do a `make clean' before running `make'.
 	rm -f runtime/libmer_rt.so library/libmer_std.so bytecode/libmbi.so
 	rm -f trace/libmer_trace.so browser/libmer_browse.so
+	rm -f runtime/libmer_rt.dylib library/libmer_std.dylib 
+	rm -f boehm_gc/libgc.dylib bytecode/libmbi.dylib
+	rm -f trace/libmer_trace.dylib browser/libmer_browser.dylib
 	;;
 esac],
 [reconfiguring=$reconfiguring]
Index: boehm_gc/Makefile
===================================================================
RCS file: /home/mercury1/repository/mercury/boehm_gc/Makefile,v
retrieving revision 1.57
diff -u -r1.57 Makefile
--- boehm_gc/Makefile	28 Oct 2003 08:48:40 -0000	1.57
+++ boehm_gc/Makefile	8 Oct 2004 11:03:32 -0000
@@ -521,6 +521,11 @@
 	./if_not_there on_sparc_sunos5_so \
 	$(LINK_SHARED_OBJ) -o lib$(GC_GRADE).so $(OBJS) dyn_load.o -lc
 
+# Darwin shared library version of the gc.
+lib$(GC_GRADE).dylib: $(OBJS) $(UTILS)
+	$(LINK_SHARED_OBJ) -install_name \
+		$(FINAL_INSTALL_MERC_GC_LIB_DIR)/lib$(GC_GRADE).dylib \
+		-o lib$(GC_GRADE).dylib $(OBJS) dyn_load.o -lc
 
 # SunOS5 shared library version of the collector
 sunos5gc.so: $(OBJS) dyn_load_sunos53.o
@@ -727,13 +732,16 @@
 #-----------------------------------------------------------------------------#
 
 # The Mmakefile invokes `make $(EXT_FOR_SHARED_LIB)',
-# so we need targets `a', `so', and `dll'.
+# so we need targets `a', `so', 'dylib' and `dll'.
 
 .PHONY: a
 a: lib$(GC_GRADE).a
 
 .PHONY: so
 so: lib$(GC_GRADE).so
+
+.PHONY: dylib
+dylib: lib$(GC_GRADE).dylib
 
 #-----------------------------------------------------------------------------#
 # support for DLLs using gnu-win32
Index: boehm_gc/Makefile.direct
===================================================================
RCS file: /home/mercury1/repository/mercury/boehm_gc/Makefile.direct,v
retrieving revision 1.6
diff -u -r1.6 Makefile.direct
--- boehm_gc/Makefile.direct	28 Oct 2003 08:48:40 -0000	1.6
+++ boehm_gc/Makefile.direct	8 Oct 2004 11:03:32 -0000
@@ -521,6 +521,11 @@
 	./if_not_there on_sparc_sunos5_so \
 	$(LINK_SHARED_OBJ) -o lib$(GC_GRADE).so $(OBJS) dyn_load.o -lc
 
+# Darwin shared library version of the gc.
+lib$(GC_GRADE).dylib: $(OBJS) $(UTILS)
+	$(LINK_SHARED_OBJ) -install_name \
+		$(FINAL_INSTALL_MERC_GC_LIB_DIR)/lib$(GC_GRADE).dylib \
+		-o lib$(GC_GRADE).dylib $(OBJS) dyn_load.o -lc
 
 # SunOS5 shared library version of the collector
 sunos5gc.so: $(OBJS) dyn_load_sunos53.o
@@ -734,6 +739,9 @@
 
 .PHONY: so
 so: lib$(GC_GRADE).so
+
+.PHONY: dylib
+dylib: lib$(GC_GRADE).dylib
 
 #-----------------------------------------------------------------------------#
 # support for DLLs using gnu-win32
Index: boehm_gc/Mmakefile
===================================================================
RCS file: /home/mercury1/repository/mercury/boehm_gc/Mmakefile,v
retrieving revision 1.27
diff -u -r1.27 Mmakefile
--- boehm_gc/Mmakefile	11 Dec 2003 03:58:53 -0000	1.27
+++ boehm_gc/Mmakefile	8 Oct 2004 11:03:32 -0000
@@ -15,7 +15,6 @@
 MERCURY_DIR=..
 LINK_BOEHM_GC_ONLY=yes
 include $(MERCURY_DIR)/Mmake.common
-
 #-----------------------------------------------------------------------------#
 
 .PHONY: lib$(GC_GRADE)
@@ -38,6 +37,8 @@
 
 lib$(GC_GRADE).dll: submake
 
+lib$(GC_GRADE).dylib: submake
+
 endif
 
 MMAKEFLAGS=
@@ -75,6 +76,7 @@
 	MAKEFLAGS=""; export MAKEFLAGS; \
 	$(MAKE) $(MMAKEFLAGS) -j1 GRADE=$(GRADE) GC_GRADE=$(GC_GRADE) \
 		lib$(GC_GRADE).$A lib$(GC_GRADE).$(EXT_FOR_SHARED_LIB) \
+		FINAL_INSTALL_MERC_GC_LIB_DIR=$(FINAL_INSTALL_MERC_GC_LIB_DIR) \
 		$(EXT_FOR_SHARED_LIB)
 
 clean_local:
Index: browser/Mercury.options
===================================================================
RCS file: /home/mercury1/repository/mercury/browser/Mercury.options,v
retrieving revision 1.3
diff -u -r1.3 Mercury.options
--- browser/Mercury.options	10 Dec 2003 07:04:21 -0000	1.3
+++ browser/Mercury.options	8 Oct 2004 11:03:32 -0000
@@ -10,3 +10,4 @@
 MCFLAGS-mer_mdbcomp = --no-warn-nothing-exported
 
 EXTRA_LIBRARIES-libmer_browser.so = mer_mdbcomp
+EXTRA_LIBRARIES-libmer_browser.dylib = mer_mdbcomp
Index: browser/Mmakefile
===================================================================
RCS file: /home/mercury1/repository/mercury/browser/Mmakefile,v
retrieving revision 1.40
diff -u -r1.40 Mmakefile
--- browser/Mmakefile	2 Aug 2004 08:30:01 -0000	1.40
+++ browser/Mmakefile	8 Oct 2004 11:03:32 -0000
@@ -54,7 +54,8 @@
 MLFLAGS +=	-R$(FINAL_INSTALL_MERC_LIB_DIR)	\
 		-R$(FINAL_INSTALL_MERC_GC_LIB_DIR)
 MCFLAGS +=	-R$(FINAL_INSTALL_MERC_LIB_DIR)	\
-		-R$(FINAL_INSTALL_MERC_GC_LIB_DIR)
+		-R$(FINAL_INSTALL_MERC_GC_LIB_DIR) \
+		--shlib-linker-install-name-path $(FINAL_INSTALL_MERC_LIB_DIR)
 MLLIBS +=	$(SOCKET_LIBRARY) $(NSL_LIBRARY) $(DL_LIBRARY)	\
 		$(READLINE_LIBRARIES)
 
@@ -137,6 +138,7 @@
 	exit $$status
 
 lib$(BROWSER_LIB_NAME).so: lib$(MDBCOMP_LIB_NAME).so
+lib$(BROWSER_LIB_NAME).dylib: lib$(MDBCOMP_LIB_NAME).dylib
 lib$(BROWSER_LIB_NAME): lib$(MDBCOMP_LIB_NAME)
 lib$(BROWSER_LIB_NAME).int3s: lib$(MDBCOMP_LIB_NAME).int3s
 lib$(BROWSER_LIB_NAME).ints: lib$(MDBCOMP_LIB_NAME).ints
@@ -204,8 +206,8 @@
 # with the package name prefixed to the file name with a ".", not a "/".
 # So we copy the Java source files to where the Java compiler expects them to be.
 #
-# XXX This is a hack.  We ought to change the Mercury compiler so that it generates
-# the Java files with the right names in the first place.
+# XXX This is a hack.  We ought to change the Mercury compiler so that it
+# generates the Java files with the right names in the first place.
 #
 
 mdb/%.java: mdb.%.java
Index: compiler/compile_target_code.m
===================================================================
RCS file: /home/mercury1/repository/mercury/compiler/compile_target_code.m,v
retrieving revision 1.62
diff -u -r1.62 compile_target_code.m
--- compiler/compile_target_code.m	28 Sep 2004 01:59:00 -0000	1.62
+++ compiler/compile_target_code.m	8 Oct 2004 11:03:32 -0000
@@ -10,14 +10,14 @@
 %
 %-----------------------------------------------------------------------------%
 
-:- module backend_libs__compile_target_code.
+:- module backend_libs.compile_target_code.
 
 :- interface.
 
-:- import_module parse_tree__prog_data.
-:- import_module parse_tree__prog_io.
-:- import_module parse_tree__modules.
-:- import_module libs__globals.
+:- import_module parse_tree.prog_data.
+:- import_module parse_tree.prog_io.
+:- import_module parse_tree.modules.
+:- import_module libs.globals.
 
 :- import_module bool, list, io, std_util.
 
@@ -31,47 +31,47 @@
 	;	non_pic.
 
 	% compile_c_file(ErrorStream, PIC, CFile, ObjFile, Succeeded).
-:- pred compile_c_file(io__output_stream::in, pic::in, string::in, string::in,
+:- pred compile_c_file(io.output_stream::in, pic::in, string::in, string::in,
 	bool::out, io::di, io::uo) is det.
 
 	% compile_c_file(ErrorStream, PIC, ModuleName, Succeeded).
-:- pred compile_c_file(io__output_stream::in, pic::in, module_name::in,
+:- pred compile_c_file(io.output_stream::in, pic::in, module_name::in,
 	bool::out, io::di, io::uo) is det.
 
 	% assemble(ErrorStream, PIC, ModuleName, Succeeded).
-:- pred assemble(io__output_stream::in, pic::in, module_name::in,
+:- pred assemble(io.output_stream::in, pic::in, module_name::in,
 	bool::out, io::di, io::uo) is det.
 
 	% compile_java_file(ErrorStream, JavaFile, Succeeded).
-:- pred compile_java_file(io__output_stream::in, string::in, bool::out,
+:- pred compile_java_file(io.output_stream::in, string::in, bool::out,
 	io::di, io::uo) is det.
 
 	% il_assemble(ErrorStream, ModuleName, HasMain, Succeeded).
-:- pred il_assemble(io__output_stream::in, module_name::in, has_main::in,
+:- pred il_assemble(io.output_stream::in, module_name::in, has_main::in,
 	bool::out, io::di, io::uo) is det.
 
 	% il_assemble(ErrorStream, ILFile, DLLFile, HasMain, Succeeded).
-:- pred il_assemble(io__output_stream::in, file_name::in, file_name::in,
+:- pred il_assemble(io.output_stream::in, file_name::in, file_name::in,
 	has_main::in, bool::out, io::di, io::uo) is det.
 
 	% compile_managed_cplusplus_file(ErrorStream,
 	%		MCPPFile, DLLFile, Succeeded).
-:- pred compile_managed_cplusplus_file(io__output_stream::in,
+:- pred compile_managed_cplusplus_file(io.output_stream::in,
 	file_name::in, file_name::in, bool::out, io::di, io::uo) is det.
 
 	% compile_csharp_file(ErrorStream, C#File, DLLFile, Succeeded).
-:- pred compile_csharp_file(io__output_stream::in, module_imports::in,
+:- pred compile_csharp_file(io.output_stream::in, module_imports::in,
 	file_name::in, file_name::in, bool::out, io::di, io::uo) is det.
 
 	% make_init_file(ErrorStream, MainModuleName, ModuleNames, Succeeded).
 	%
 	% Make the `.init' file for a library containing the given modules.
-:- pred make_init_file(io__output_stream::in, module_name::in,
+:- pred make_init_file(io.output_stream::in, module_name::in,
 	list(module_name)::in, bool::out, io::di, io::uo) is det.
 
 	% make_init_obj_file(ErrorStream, MainModuleName,
 	%		AllModuleNames, MaybeInitObjFileName).
-:- pred make_init_obj_file(io__output_stream::in, module_name::in,
+:- pred make_init_obj_file(io.output_stream::in, module_name::in,
 	list(module_name)::in, maybe(file_name)::out, io::di, io::uo) is det.
 
 :- type linked_target_type
@@ -81,7 +81,7 @@
 	;	java_archive.
 
 	% link(TargetType, MainModuleName, ObjectFileNames, Succeeded).
-:- pred link(io__output_stream::in, linked_target_type::in, module_name::in,
+:- pred link(io.output_stream::in, linked_target_type::in, module_name::in,
 	list(string)::in, bool::out, io::di, io::uo) is det.
 
 	% link_module_list(ModulesToLink, FactTableObjFiles, Succeeded).
@@ -104,7 +104,7 @@
 
 	% split_c_to_obj(ErrorStream, ModuleName, NumChunks, Succeeded).
 	% Compile the `.c' files produced for a module with `--split-c-files'.
-:- pred split_c_to_obj(io__output_stream::in, module_name::in,
+:- pred split_c_to_obj(io.output_stream::in, module_name::in,
 	int::in, bool::out, io::di, io::uo) is det.
 
 	% Write the number of `.c' files written by this
@@ -148,7 +148,7 @@
 :- mode maybe_pic_object_file_extension(in, in, out) is det.
 :- mode maybe_pic_object_file_extension(in, out, in) is semidet.
 
-	% Same as above except the globals are obtained from the io__state.
+	% Same as above except the globals are obtained from the io.state.
 :- pred maybe_pic_object_file_extension(pic::in, string::out, io::di, io::uo)
 	is det.
 
@@ -156,15 +156,15 @@
 
 :- implementation.
 
-:- import_module backend_libs__foreign.
-:- import_module backend_libs__name_mangle.
-:- import_module hlds__passes_aux.
-:- import_module libs__globals.
-:- import_module libs__handle_options.
-:- import_module libs__options.
-:- import_module libs__trace_params.
-:- import_module parse_tree__error_util.
-:- import_module parse_tree__prog_out.
+:- import_module backend_libs.foreign.
+:- import_module backend_libs.name_mangle.
+:- import_module hlds.passes_aux.
+:- import_module libs.globals.
+:- import_module libs.handle_options.
+:- import_module libs.options.
+:- import_module libs.trace_params.
+:- import_module parse_tree.error_util.
+:- import_module parse_tree.prog_out.
 
 :- import_module char, dir, getopt, int, require, string.
 
@@ -188,13 +188,13 @@
 	).
 
 il_assemble(ErrorStream, IL_File, TargetFile, HasMain, Succeeded, !IO) :-
-	globals__io_lookup_bool_option(verbose, Verbose, !IO),
-	globals__io_lookup_bool_option(sign_assembly, SignAssembly, !IO),
+	globals.io_lookup_bool_option(verbose, Verbose, !IO),
+	globals.io_lookup_bool_option(sign_assembly, SignAssembly, !IO),
 	maybe_write_string(Verbose, "% Assembling `", !IO),
 	maybe_write_string(Verbose, IL_File, !IO),
 	maybe_write_string(Verbose, "':\n", !IO),
-	globals__io_lookup_string_option(il_assembler, ILASM, !IO),
-	globals__io_lookup_accumulating_option(ilasm_flags, ILASMFlagsList, !IO),
+	globals.io_lookup_string_option(il_assembler, ILASM, !IO),
+	globals.io_lookup_accumulating_option(ilasm_flags, ILASMFlagsList, !IO),
 	join_string_list(ILASMFlagsList, "", "", " ", ILASMFlags),
 	( SignAssembly = yes ->
 		SignOpt = "/keyf=mercury.sn "
@@ -206,7 +206,7 @@
 	;
 		VerboseOpt = "/quiet "
 	),
-	globals__io_lookup_bool_option(target_debug, Debug, !IO),
+	globals.io_lookup_bool_option(target_debug, Debug, !IO),
 	( Debug = yes ->
 		DebugOpt = "/debug "
 	;
@@ -217,7 +217,7 @@
 	;
 		TargetOpt = "/dll "
 	),
-	string__append_list([ILASM, " ", SignOpt, VerboseOpt, DebugOpt,
+	string.append_list([ILASM, " ", SignOpt, VerboseOpt, DebugOpt,
 		TargetOpt, ILASMFlags, " /out=", TargetFile,
 		" ", IL_File], Command),
 	invoke_system_command(ErrorStream, verbose_commands, Command,
@@ -225,14 +225,14 @@
 
 compile_managed_cplusplus_file(ErrorStream, MCPPFileName, DLLFileName,
 		Succeeded, !IO) :-
-	globals__io_lookup_bool_option(verbose, Verbose, !IO),
+	globals.io_lookup_bool_option(verbose, Verbose, !IO),
 	maybe_write_string(Verbose, "% Compiling `", !IO),
 	maybe_write_string(Verbose, MCPPFileName, !IO),
 	maybe_write_string(Verbose, "':\n", !IO),
-	globals__io_lookup_string_option(mcpp_compiler, MCPP, !IO),
-	globals__io_lookup_accumulating_option(mcpp_flags, MCPPFlagsList, !IO),
+	globals.io_lookup_string_option(mcpp_compiler, MCPP, !IO),
+	globals.io_lookup_accumulating_option(mcpp_flags, MCPPFlagsList, !IO),
 	join_string_list(MCPPFlagsList, "", "", " ", MCPPFlags),
-	globals__io_lookup_bool_option(target_debug, Debug, !IO),
+	globals.io_lookup_bool_option(target_debug, Debug, !IO),
 	(
 		Debug = yes,
 		DebugOpt = "/Zi "
@@ -242,19 +242,19 @@
 	),
 
 	% XXX Should we introduce a `--mcpp-include-directory' option?
-	globals__io_lookup_accumulating_option(c_include_directory,
+	globals.io_lookup_accumulating_option(c_include_directory,
 		C_Incl_Dirs, !IO),
-	InclOpts = string__append_list(list__condense(list__map(
+	InclOpts = string.append_list(list.condense(list.map(
 		(func(C_INCL) = ["-I", C_INCL, " "]), C_Incl_Dirs))),
 
 	% XXX Should we use a separate dll_directories options?
-	globals__io_lookup_accumulating_option(link_library_directories,
+	globals.io_lookup_accumulating_option(link_library_directories,
 		DLLDirs, !IO),
 	DLLDirOpts = "-AIMercury/dlls " ++
-		string__append_list(list__condense(list__map(
+		string.append_list(list.condense(list.map(
 			(func(DLLDir) = ["-AI", DLLDir, " "]), DLLDirs))),
 
-	string__append_list([MCPP, " -CLR ", DebugOpt, InclOpts,
+	string.append_list([MCPP, " -CLR ", DebugOpt, InclOpts,
 		DLLDirOpts, MCPPFlags, " ", MCPPFileName,
 		" -LD -o ", DLLFileName],
 		Command),
@@ -263,20 +263,20 @@
 
 compile_csharp_file(ErrorStream, Imports, CSharpFileName0, DLLFileName,
 		Succeeded, !IO) :-
-	globals__io_lookup_bool_option(verbose, Verbose, !IO),
+	globals.io_lookup_bool_option(verbose, Verbose, !IO),
 	maybe_write_string(Verbose, "% Compiling `", !IO),
 	maybe_write_string(Verbose, CSharpFileName, !IO),
 	maybe_write_string(Verbose, "':\n", !IO),
-	globals__io_lookup_string_option(csharp_compiler, CSC, !IO),
-	globals__io_lookup_accumulating_option(csharp_flags, CSCFlagsList,
+	globals.io_lookup_string_option(csharp_compiler, CSC, !IO),
+	globals.io_lookup_accumulating_option(csharp_flags, CSCFlagsList,
 		!IO),
 	join_string_list(CSCFlagsList, "", "", " ", CSCFlags),
 
 		% XXX This is because the MS C# compiler doesn't understand
 		% / as a directory seperator.
-	CSharpFileName = string__replace_all(CSharpFileName0, "/", "\\\\"),
+	CSharpFileName = string.replace_all(CSharpFileName0, "/", "\\\\"),
 
-	globals__io_lookup_bool_option(target_debug, Debug, !IO),
+	globals.io_lookup_bool_option(target_debug, Debug, !IO),
 	(
 		Debug = yes,
 		% XXX This needs testing before it can be enabled
@@ -290,10 +290,10 @@
 	),
 
 	% XXX Should we use a separate dll_directories options?
-	globals__io_lookup_accumulating_option(link_library_directories,
+	globals.io_lookup_accumulating_option(link_library_directories,
 		DLLDirs, !IO),
 	DLLDirOpts = "/lib:Mercury/dlls " ++
-		string__append_list(list__condense(list__map(
+		string.append_list(list.condense(list.map(
 			(func(DLLDir) = ["/lib:", DLLDir, " "]), DLLDirs))),
 
 	( mercury_std_library_module_name(Imports ^ module_name) ->
@@ -301,22 +301,22 @@
 	;
 		Prefix = "/r:"
 	),
-	ForeignDeps = list__map(
+	ForeignDeps = list.map(
 		(func(M) =
 			foreign_import_module_name(M, Imports ^ module_name)
 		), Imports ^ foreign_import_module_info ),
 	ReferencedDlls = referenced_dlls(Imports ^ module_name,
 		Imports ^ int_deps ++ Imports ^ impl_deps ++ ForeignDeps),
-	list__map_foldl(
+	list.map_foldl(
 		(pred(Mod::in, Result::out, IO0::di, IO::uo) is det :-
 			module_name_to_file_name(Mod, ".dll", no, FileName,
 				IO0, IO),
 			Result = [Prefix, FileName, " "]
 		), ReferencedDlls, ReferencedDllsList, !IO),
-	ReferencedDllsStr = string__append_list(
-		list__condense(ReferencedDllsList)),
+	ReferencedDllsStr = string.append_list(
+		list.condense(ReferencedDllsList)),
 
-	string__append_list([CSC, DebugOpt,
+	string.append_list([CSC, DebugOpt,
 		" /t:library ", DLLDirOpts, CSCFlags, ReferencedDllsStr,
 		" /out:", DLLFileName, " ", CSharpFileName], Command),
 	invoke_system_command(ErrorStream, verbose_commands, Command,
@@ -328,7 +328,7 @@
 	split_c_to_obj(ErrorStream, ModuleName, 0, NumChunks, Succeeded, !IO).
 
 	% compile each of the C files in `<module>.dir'
-:- pred split_c_to_obj(io__output_stream::in, module_name::in,
+:- pred split_c_to_obj(io.output_stream::in, module_name::in,
 	int::in, int::in, bool::out, io::di, io::uo) is det.
 
 split_c_to_obj(ErrorStream, ModuleName, Chunk, NumChunks, Succeeded, !IO) :-
@@ -336,7 +336,7 @@
 		Succeeded = yes
 	;
 		% XXX should this use maybe_pic_object_file_extension?
-		globals__io_lookup_string_option(object_file_extension, Obj,
+		globals.io_lookup_string_option(object_file_extension, Obj,
 			!IO),
 		module_name_to_split_c_file_name(ModuleName, Chunk,
 			".c", C_File, !IO),
@@ -365,18 +365,18 @@
 	compile_c_file(ErrorStream, PIC, C_File, O_File, Succeeded, !IO).
 
 compile_c_file(ErrorStream, PIC, C_File, O_File, Succeeded, !IO) :-
-	globals__io_lookup_bool_option(verbose, Verbose, !IO),
-	globals__io_lookup_string_option(c_flag_to_name_object_file,
+	globals.io_lookup_bool_option(verbose, Verbose, !IO),
+	globals.io_lookup_string_option(c_flag_to_name_object_file,
 		NameObjectFile, !IO),
 	maybe_write_string(Verbose, "% Compiling `", !IO),
 	maybe_write_string(Verbose, C_File, !IO),
 	maybe_write_string(Verbose, "':\n", !IO),
-	globals__io_lookup_string_option(cc, CC, !IO),
-	globals__io_lookup_accumulating_option(cflags, C_Flags_List, !IO),
+	globals.io_lookup_string_option(cc, CC, !IO),
+	globals.io_lookup_accumulating_option(cflags, C_Flags_List, !IO),
 	join_string_list(C_Flags_List, "", "", " ", CFLAGS),
 
-	globals__io_lookup_bool_option(use_subdirs, UseSubdirs, !IO),
-	globals__io_lookup_bool_option(split_c_files, SplitCFiles, !IO),
+	globals.io_lookup_bool_option(use_subdirs, UseSubdirs, !IO),
+	globals.io_lookup_bool_option(split_c_files, SplitCFiles, !IO),
 	( (UseSubdirs = yes ; SplitCFiles = yes) ->
 		% the source file (foo.c) will be compiled in a subdirectory
 		% (either Mercury/cs, foo.dir, or Mercury/dirs/foo.dir,
@@ -387,67 +387,67 @@
 	;
 		SubDirInclOpt = ""
 	),
-	globals__io_lookup_accumulating_option(c_include_directory,
+	globals.io_lookup_accumulating_option(c_include_directory,
 		C_Incl_Dirs, !IO),
-	InclOpt = string__append_list(list__condense(list__map(
+	InclOpt = string.append_list(list.condense(list.map(
 		(func(C_INCL) = ["-I", C_INCL, " "]), C_Incl_Dirs))),
-	globals__io_lookup_bool_option(split_c_files, Split_C_Files, !IO),
+	globals.io_lookup_bool_option(split_c_files, Split_C_Files, !IO),
 	( Split_C_Files = yes ->
 		SplitOpt = "-DMR_SPLIT_C_FILES "
 	;
 		SplitOpt = ""
 	),
-	globals__io_lookup_bool_option(highlevel_code, HighLevelCode, !IO),
+	globals.io_lookup_bool_option(highlevel_code, HighLevelCode, !IO),
 	( HighLevelCode = yes ->
 		HighLevelCodeOpt = "-DMR_HIGHLEVEL_CODE "
 	;
 		HighLevelCodeOpt = ""
 	),
-	globals__io_lookup_bool_option(gcc_nested_functions,
+	globals.io_lookup_bool_option(gcc_nested_functions,
 		GCC_NestedFunctions, !IO),
 	( GCC_NestedFunctions = yes ->
 		NestedFunctionsOpt = "-DMR_USE_GCC_NESTED_FUNCTIONS "
 	;
 		NestedFunctionsOpt = ""
 	),
-	globals__io_lookup_bool_option(highlevel_data, HighLevelData, !IO),
+	globals.io_lookup_bool_option(highlevel_data, HighLevelData, !IO),
 	( HighLevelData = yes ->
 		HighLevelDataOpt = "-DMR_HIGHLEVEL_DATA "
 	;
 		HighLevelDataOpt = ""
 	),
-	globals__io_lookup_bool_option(gcc_global_registers, GCC_Regs, !IO),
+	globals.io_lookup_bool_option(gcc_global_registers, GCC_Regs, !IO),
 	( GCC_Regs = yes ->
-		globals__io_lookup_string_option(cflags_for_regs,
+		globals.io_lookup_string_option(cflags_for_regs,
 			CFLAGS_FOR_REGS, !IO),
 		RegOpt = "-DMR_USE_GCC_GLOBAL_REGISTERS "
 	;
 		CFLAGS_FOR_REGS = "",
 		RegOpt = ""
 	),
-	globals__io_lookup_bool_option(gcc_non_local_gotos, GCC_Gotos, !IO),
+	globals.io_lookup_bool_option(gcc_non_local_gotos, GCC_Gotos, !IO),
 	( GCC_Gotos = yes ->
 		GotoOpt = "-DMR_USE_GCC_NONLOCAL_GOTOS ",
-		globals__io_lookup_string_option(cflags_for_gotos,
+		globals.io_lookup_string_option(cflags_for_gotos,
 			CFLAGS_FOR_GOTOS, !IO)
 	;
 		GotoOpt = "",
 		CFLAGS_FOR_GOTOS = ""
 	),
-	globals__io_lookup_bool_option(asm_labels, ASM_Labels, !IO),
+	globals.io_lookup_bool_option(asm_labels, ASM_Labels, !IO),
 	( ASM_Labels = yes ->
 		AsmOpt = "-DMR_USE_ASM_LABELS "
 	;
 		AsmOpt = ""
 	),
-	globals__io_lookup_bool_option(parallel, Parallel, !IO),
+	globals.io_lookup_bool_option(parallel, Parallel, !IO),
 	( Parallel = yes ->
-		globals__io_lookup_string_option(cflags_for_threads,
+		globals.io_lookup_string_option(cflags_for_threads,
 			CFLAGS_FOR_THREADS, !IO)
 	;
 		CFLAGS_FOR_THREADS = ""
 	),
-	globals__io_get_gc_method(GC_Method, !IO),
+	globals.io_get_gc_method(GC_Method, !IO),
 	(
 		GC_Method = automatic,
 		GC_Opt = ""
@@ -464,33 +464,33 @@
 		GC_Method = accurate,
 		GC_Opt = "-DMR_NATIVE_GC "
 	),
-	globals__io_lookup_bool_option(profile_calls, ProfileCalls, !IO),
+	globals.io_lookup_bool_option(profile_calls, ProfileCalls, !IO),
 	( ProfileCalls = yes ->
 		ProfileCallsOpt = "-DMR_MPROF_PROFILE_CALLS "
 	;
 		ProfileCallsOpt = ""
 	),
-	globals__io_lookup_bool_option(profile_time, ProfileTime, !IO),
+	globals.io_lookup_bool_option(profile_time, ProfileTime, !IO),
 	( ProfileTime = yes ->
 		ProfileTimeOpt = "-DMR_MPROF_PROFILE_TIME "
 	;
 		ProfileTimeOpt = ""
 	),
-	globals__io_lookup_bool_option(profile_memory, ProfileMemory, !IO),
+	globals.io_lookup_bool_option(profile_memory, ProfileMemory, !IO),
 	( ProfileMemory = yes ->
 		ProfileMemoryOpt = "-DMR_MPROF_PROFILE_MEMORY "
 	;
 		ProfileMemoryOpt = ""
 	),
-	globals__io_lookup_bool_option(profile_deep, ProfileDeep, !IO),
+	globals.io_lookup_bool_option(profile_deep, ProfileDeep, !IO),
 	( ProfileDeep = yes ->
 		ProfileDeepOpt = "-DMR_DEEP_PROFILING "
 	;
 		ProfileDeepOpt = ""
 	),
-	globals__io_lookup_bool_option(record_term_sizes_as_words,
+	globals.io_lookup_bool_option(record_term_sizes_as_words,
 		RecordTermSizesAsWords, !IO),
-	globals__io_lookup_bool_option(record_term_sizes_as_cells,
+	globals.io_lookup_bool_option(record_term_sizes_as_cells,
 		RecordTermSizesAsCells, !IO),
 	(
 		RecordTermSizesAsWords = yes,
@@ -513,7 +513,7 @@
 	),
 	(
 		PIC = pic,
-		globals__io_lookup_string_option(cflags_for_pic,
+		globals.io_lookup_string_option(cflags_for_pic,
 			CFLAGS_FOR_PIC, !IO),
 		PIC_Reg = yes
 	;
@@ -523,7 +523,7 @@
 	;
 		PIC = non_pic,
 		CFLAGS_FOR_PIC = "",
-		globals__io_lookup_bool_option(pic_reg, PIC_Reg, !IO)
+		globals.io_lookup_bool_option(pic_reg, PIC_Reg, !IO)
 	),
 	( PIC_Reg = yes ->
 		% This will be ignored for architectures/grades
@@ -534,57 +534,57 @@
 		PIC_Reg_Opt = ""
 	),
 
-	globals__io_get_tags_method(Tags_Method, !IO),
+	globals.io_get_tags_method(Tags_Method, !IO),
 	( Tags_Method = high ->
 		TagsOpt = "-DMR_HIGHTAGS "
 	;
 		TagsOpt = ""
 	),
-	globals__io_lookup_int_option(num_tag_bits, NumTagBits, !IO),
-	string__int_to_string(NumTagBits, NumTagBitsString),
-	string__append_list(
+	globals.io_lookup_int_option(num_tag_bits, NumTagBits, !IO),
+	string.int_to_string(NumTagBits, NumTagBitsString),
+	string.append_list(
 		["-DMR_TAGBITS=", NumTagBitsString, " "], NumTagBitsOpt),
-	globals__io_lookup_bool_option(decl_debug, DeclDebug, !IO),
+	globals.io_lookup_bool_option(decl_debug, DeclDebug, !IO),
 	( DeclDebug = yes ->
 		DeclDebugOpt = "-DMR_DECL_DEBUG "
 	;
 		DeclDebugOpt = ""
 	),
-	globals__io_lookup_bool_option(exec_trace, ExecTrace, !IO),
+	globals.io_lookup_bool_option(exec_trace, ExecTrace, !IO),
 	( ExecTrace = yes ->
 		ExecTraceOpt = "-DMR_EXEC_TRACE "
 	;
 		ExecTraceOpt = ""
 	),
-	globals__io_lookup_bool_option(target_debug, Target_Debug, !IO),
+	globals.io_lookup_bool_option(target_debug, Target_Debug, !IO),
 	( Target_Debug = yes ->
-		globals__io_lookup_string_option(cflags_for_debug,
+		globals.io_lookup_string_option(cflags_for_debug,
 			Target_DebugOpt0, !IO),
-		string__append(Target_DebugOpt0, " ", Target_DebugOpt)
+		string.append(Target_DebugOpt0, " ", Target_DebugOpt)
 	;
 		Target_DebugOpt = ""
 	),
-	globals__io_lookup_bool_option(low_level_debug, LL_Debug, !IO),
+	globals.io_lookup_bool_option(low_level_debug, LL_Debug, !IO),
 	( LL_Debug = yes ->
 		LL_DebugOpt = "-DMR_LOW_LEVEL_DEBUG "
 	;
 		LL_DebugOpt = ""
 	),
-	globals__io_lookup_bool_option(use_trail, UseTrail, !IO),
+	globals.io_lookup_bool_option(use_trail, UseTrail, !IO),
 	( UseTrail = yes ->
 		UseTrailOpt = "-DMR_USE_TRAIL "
 	;
 		UseTrailOpt = ""
 	),
-	globals__io_lookup_bool_option(reserve_tag, ReserveTag, !IO),
+	globals.io_lookup_bool_option(reserve_tag, ReserveTag, !IO),
 	( ReserveTag = yes ->
 		ReserveTagOpt = "-DMR_RESERVE_TAG "
 	;
 		ReserveTagOpt = ""
 	),
-	globals__io_lookup_bool_option(use_minimal_model_stack_copy,
+	globals.io_lookup_bool_option(use_minimal_model_stack_copy,
 		MinimalModelStackCopy, !IO),
-	globals__io_lookup_bool_option(use_minimal_model_own_stacks,
+	globals.io_lookup_bool_option(use_minimal_model_own_stacks,
 		MinimalModelOwnStacks, !IO),
 	(
 		MinimalModelStackCopy = yes,
@@ -604,7 +604,7 @@
 		MinimalModelOwnStacks = no,
 		MinimalModelBaseOpt = ""
 	),
-	globals__io_lookup_bool_option(minimal_model_debug, MinimalModelDebug,
+	globals.io_lookup_bool_option(minimal_model_debug, MinimalModelDebug,
 		!IO),
 	(
 		MinimalModelDebug = yes,
@@ -620,34 +620,34 @@
 		MinimalModelDebug = no,
 		MinimalModelOpt = MinimalModelBaseOpt
 	),
-	globals__io_lookup_bool_option(type_layout, TypeLayoutOption, !IO),
+	globals.io_lookup_bool_option(type_layout, TypeLayoutOption, !IO),
 	( TypeLayoutOption = no ->
 		TypeLayoutOpt = "-DMR_NO_TYPE_LAYOUT "
 	;
 		TypeLayoutOpt = ""
 	),
-	globals__io_lookup_bool_option(c_optimize, C_optimize, !IO),
+	globals.io_lookup_bool_option(c_optimize, C_optimize, !IO),
 	( C_optimize = yes ->
-		globals__io_lookup_string_option(cflags_for_optimization,
+		globals.io_lookup_string_option(cflags_for_optimization,
 			OptimizeOpt, !IO)
 	;
 		OptimizeOpt = ""
 	),
-	globals__io_lookup_bool_option(ansi_c, Ansi, !IO),
+	globals.io_lookup_bool_option(ansi_c, Ansi, !IO),
 	( Ansi = yes ->
-		globals__io_lookup_string_option(cflags_for_ansi, AnsiOpt, !IO)
+		globals.io_lookup_string_option(cflags_for_ansi, AnsiOpt, !IO)
 	;
 		AnsiOpt = ""
 	),
-	globals__io_lookup_bool_option(inline_alloc, InlineAlloc, !IO),
+	globals.io_lookup_bool_option(inline_alloc, InlineAlloc, !IO),
 	( InlineAlloc = yes ->
 		InlineAllocOpt = "-DMR_INLINE_ALLOC -DSILENT "
 	;
 		InlineAllocOpt = ""
 	),
-	globals__io_lookup_bool_option(warn_target_code, Warn, !IO),
+	globals.io_lookup_bool_option(warn_target_code, Warn, !IO),
 	( Warn = yes ->
-		globals__io_lookup_string_option(cflags_for_warnings,
+		globals.io_lookup_string_option(cflags_for_warnings,
 			WarningOpt, !IO)
 	;
 		WarningOpt = ""
@@ -657,7 +657,7 @@
 	% e.g. CFLAGS_FOR_REGS must come after OptimizeOpt so that
 	% it can override -fomit-frame-pointer with -fno-omit-frame-pointer.
 	% Also be careful that each option is separated by spaces.
-	string__append_list([CC, " ", SubDirInclOpt, InclOpt,
+	string.append_list([CC, " ", SubDirInclOpt, InclOpt,
 		SplitOpt, " ", OptimizeOpt, " ",
 		HighLevelCodeOpt, NestedFunctionsOpt, HighLevelDataOpt,
 		RegOpt, GotoOpt, AsmOpt,
@@ -676,15 +676,15 @@
 %-----------------------------------------------------------------------------%
 
 compile_java_file(ErrorStream, JavaFile, Succeeded, !IO) :-
-	globals__io_lookup_bool_option(verbose, Verbose, !IO),
+	globals.io_lookup_bool_option(verbose, Verbose, !IO),
 	maybe_write_string(Verbose, "% Compiling `", !IO),
 	maybe_write_string(Verbose, JavaFile, !IO),
 	maybe_write_string(Verbose, "':\n", !IO),
-	globals__io_lookup_string_option(java_compiler, JavaCompiler, !IO),
-	globals__io_lookup_accumulating_option(java_flags, JavaFlagsList, !IO),
+	globals.io_lookup_string_option(java_compiler, JavaCompiler, !IO),
+	globals.io_lookup_accumulating_option(java_flags, JavaFlagsList, !IO),
 	join_string_list(JavaFlagsList, "", "", " ", JAVAFLAGS),
 
-	globals__io_lookup_accumulating_option(java_classpath,
+	globals.io_lookup_accumulating_option(java_classpath,
 		Java_Incl_Dirs, !IO),
 	% XXX PathSeparator should be ";" on Windows
 	PathSeparator = ":",
@@ -696,21 +696,21 @@
 	( ClassPath = "" ->
 		InclOpt = ""
 	;
-		InclOpt = string__append_list([
+		InclOpt = string.append_list([
 			"-classpath ", quote_arg(ClassPath), " "])
 	),
 
-	globals__io_lookup_bool_option(target_debug, Target_Debug, !IO),
+	globals.io_lookup_bool_option(target_debug, Target_Debug, !IO),
 	( Target_Debug = yes ->
 		Target_DebugOpt = "-g "
 	;
 		Target_DebugOpt = ""
 	),
 
-	globals__io_lookup_bool_option(use_subdirs, UseSubdirs, !IO),
-	globals__io_lookup_bool_option(use_grade_subdirs, UseGradeSubdirs, !IO),
-	globals__io_lookup_string_option(fullarch, FullArch, !IO),
-	globals__io_get_globals(Globals, !IO),
+	globals.io_lookup_bool_option(use_subdirs, UseSubdirs, !IO),
+	globals.io_lookup_bool_option(use_grade_subdirs, UseGradeSubdirs, !IO),
+	globals.io_lookup_string_option(fullarch, FullArch, !IO),
+	globals.io_get_globals(Globals, !IO),
 	( UseSubdirs = yes ->
 		( UseGradeSubdirs = yes ->
 			grade_directory_component(Globals, Grade),
@@ -720,7 +720,7 @@
 		),
 		% javac won't create the destination directory for
 		% class files, so we need to do it.
-		dir__make_directory(DirName, _, !IO),
+		dir.make_directory(DirName, _, !IO),
 		% Set destination directory for class files.
 		DestDir = "-d " ++ DirName ++ " "
 	;
@@ -729,7 +729,7 @@
 
 	% Be careful with the order here!  Some options may override others.
 	% Also be careful that each option is separated by spaces.
-	string__append_list([JavaCompiler, " ", InclOpt, DestDir,
+	string.append_list([JavaCompiler, " ", InclOpt, DestDir,
 		Target_DebugOpt, JAVAFLAGS, " ", JavaFile], Command),
 	invoke_system_command(ErrorStream, verbose_commands, Command,
 		Succeeded, !IO).
@@ -746,7 +746,7 @@
 		PIC = link_with_pic,
 		% `--target asm' doesn't support any grades for
 		% which `.lpic_o' files are needed.
-		error("compile_target_code__assemble: link_with_pic")
+		error("compile_target_code.assemble: link_with_pic")
 	;
 		PIC = non_pic,
 		AsmExt = ".s",
@@ -757,20 +757,20 @@
 	maybe_pic_object_file_extension(PIC, ObjExt, !IO),
 	module_name_to_file_name(ModuleName, ObjExt, yes, ObjFile, !IO),
 
-	globals__io_lookup_bool_option(verbose, Verbose, !IO),
+	globals.io_lookup_bool_option(verbose, Verbose, !IO),
 	maybe_write_string(Verbose, "% Assembling `", !IO),
 	maybe_write_string(Verbose, AsmFile, !IO),
 	maybe_write_string(Verbose, "':\n", !IO),
 	% XXX should we use new asm_* options rather than
 	% reusing cc, cflags, c_flag_to_name_object_file?
-	globals__io_lookup_string_option(cc, CC, !IO),
-	globals__io_lookup_string_option(c_flag_to_name_object_file,
+	globals.io_lookup_string_option(cc, CC, !IO),
+	globals.io_lookup_string_option(c_flag_to_name_object_file,
 		NameObjectFile, !IO),
-	globals__io_lookup_accumulating_option(cflags, C_Flags_List, !IO),
+	globals.io_lookup_accumulating_option(cflags, C_Flags_List, !IO),
 	join_string_list(C_Flags_List, "", "", " ", CFLAGS),
 	% Be careful with the order here.
 	% Also be careful that each option is separated by spaces.
-	string__append_list([CC, " ", CFLAGS, " ", GCCFLAGS_FOR_PIC,
+	string.append_list([CC, " ", CFLAGS, " ", GCCFLAGS_FOR_PIC,
 		GCCFLAGS_FOR_ASM, "-c ", AsmFile, " ",
 		NameObjectFile, ObjFile], Command),
 	invoke_system_command(ErrorStream, verbose_commands, Command,
@@ -781,13 +781,13 @@
 make_init_file(ErrorStream, MainModuleName, AllModules, Succeeded, !IO) :-
 	module_name_to_file_name(MainModuleName, ".init.tmp",
 		yes, TmpInitFileName, !IO),
-	io__open_output(TmpInitFileName, InitFileRes, !IO),
+	io.open_output(TmpInitFileName, InitFileRes, !IO),
 	(
 		InitFileRes = ok(InitFileStream),
-		globals__io_lookup_bool_option(aditi, Aditi, !IO),
-		list__foldl(make_init_file_aditi(InitFileStream, Aditi),
+		globals.io_lookup_bool_option(aditi, Aditi, !IO),
+		list.foldl(make_init_file_aditi(InitFileStream, Aditi),
 			AllModules, !IO),
-		globals__io_lookup_maybe_string_option(extra_init_command,
+		globals.io_lookup_maybe_string_option(extra_init_command,
 			MaybeInitFileCommand, !IO),
 		(
 			MaybeInitFileCommand = yes(InitFileCommand),
@@ -801,38 +801,38 @@
 			Succeeded0 = yes
 		),
 
-		io__close_output(InitFileStream, !IO),
+		io.close_output(InitFileStream, !IO),
 		module_name_to_file_name(MainModuleName, ".init",
 			yes, InitFileName, !IO),
 		update_interface(InitFileName, Succeeded1, !IO),
 		Succeeded = Succeeded0 `and` Succeeded1
 	;
 		InitFileRes = error(Error),
-		io__progname_base("mercury_compile", ProgName, !IO),
-		io__write_string(ErrorStream, ProgName, !IO),
-		io__write_string(ErrorStream, ": can't open `", !IO),
-		io__write_string(ErrorStream, TmpInitFileName, !IO),
-		io__write_string(ErrorStream, "' for output:\n", !IO),
-		io__nl(ErrorStream, !IO),
-		io__write_string(ErrorStream, io__error_message(Error), !IO),
-		io__nl(ErrorStream, !IO),
+		io.progname_base("mercury_compile", ProgName, !IO),
+		io.write_string(ErrorStream, ProgName, !IO),
+		io.write_string(ErrorStream, ": can't open `", !IO),
+		io.write_string(ErrorStream, TmpInitFileName, !IO),
+		io.write_string(ErrorStream, "' for output:\n", !IO),
+		io.nl(ErrorStream, !IO),
+		io.write_string(ErrorStream, io.error_message(Error), !IO),
+		io.nl(ErrorStream, !IO),
 		Succeeded = no
 	).
 
-:- pred make_init_file_aditi(io__output_stream::in, bool::in, module_name::in,
+:- pred make_init_file_aditi(io.output_stream::in, bool::in, module_name::in,
 	io::di, io::uo) is det.
 
 make_init_file_aditi(InitFileStream, Aditi, ModuleName, !IO) :-
 	InitFuncName0 = make_init_name(ModuleName),
 	InitFuncName = InitFuncName0 ++ "init",
-	io__write_string(InitFileStream, "INIT ", !IO),
-	io__write_string(InitFileStream, InitFuncName, !IO),
-	io__nl(InitFileStream, !IO),
+	io.write_string(InitFileStream, "INIT ", !IO),
+	io.write_string(InitFileStream, InitFuncName, !IO),
+	io.nl(InitFileStream, !IO),
 	( Aditi = yes ->
 		RLName = make_rl_data_name(ModuleName),
-		io__write_string(InitFileStream, "ADITI_DATA ", !IO),
-		io__write_string(InitFileStream, RLName, !IO),
-		io__nl(InitFileStream, !IO)
+		io.write_string(InitFileStream, "ADITI_DATA ", !IO),
+		io.write_string(InitFileStream, RLName, !IO),
+		io.nl(InitFileStream, !IO)
 	;
 		true
 	).
@@ -840,7 +840,7 @@
 %-----------------------------------------------------------------------------%
 
 link_module_list(Modules, FactTableObjFiles, Succeeded, !IO) :-
-	globals__io_lookup_string_option(output_file_name, OutputFileName0,
+	globals.io_lookup_string_option(output_file_name, OutputFileName0,
 		!IO),
 	( OutputFileName0 = "" ->
 		( Modules = [Module | _] ->
@@ -854,16 +854,16 @@
 
 	file_name_to_module_name(OutputFileName, MainModuleName),
 
-	globals__io_lookup_bool_option(compile_to_shared_lib,
+	globals.io_lookup_bool_option(compile_to_shared_lib,
 		CompileToSharedLib, !IO),
 	TargetType =
 		(CompileToSharedLib = yes -> shared_library ; executable),
 	get_object_code_type(TargetType, PIC, !IO),
 	maybe_pic_object_file_extension(PIC, Obj, !IO),
 
-	globals__io_get_target(Target, !IO),
-	globals__io_lookup_bool_option(split_c_files, SplitFiles, !IO),
-	io__output_stream(OutputStream, !IO),
+	globals.io_get_target(Target, !IO),
+	globals.io_lookup_bool_option(split_c_files, SplitFiles, !IO),
+	io.output_stream(OutputStream, !IO),
 	( Target = asm ->
 		% for --target asm, we generate everything into
 		% a single object file
@@ -874,11 +874,11 @@
 		),
 		MakeLibCmdOK = yes
 	; SplitFiles = yes ->
-		globals__io_lookup_string_option(library_extension, LibExt,
+		globals.io_lookup_string_option(library_extension, LibExt,
 			!IO),
 		module_name_to_file_name(MainModuleName, LibExt, yes,
 			SplitLibFileName, !IO),
-		string__append(".dir/*", Obj, DirObj),
+		string.append(".dir/*", Obj, DirObj),
 		join_module_list(Modules, DirObj, ObjectList, !IO),
 		create_archive(OutputStream, SplitLibFileName, no,
 			ObjectList, MakeLibCmdOK, !IO),
@@ -891,10 +891,10 @@
 		Succeeded = no
 	;
 		( TargetType = executable ->
-			list__map(
+			list.map(
 				(pred(ModuleStr::in, ModuleName::out) is det :-
 					file_name_to_module_name(
-						dir__basename_det(ModuleStr),
+						dir.basename_det(ModuleStr),
 						ModuleName)
 				), Modules, ModuleNames),
 			MustCompile = yes,
@@ -906,7 +906,7 @@
 		),
 		(
 			InitObjResult = yes(InitObjFileName),
-			globals__io_lookup_accumulating_option(link_objects,
+			globals.io_lookup_accumulating_option(link_objects,
 				ExtraLinkObjectsList, !IO),
 			AllObjects0 = ObjectsList ++ ExtraLinkObjectsList
 				++ FactTableObjFiles,
@@ -925,25 +925,25 @@
 	).
 
 make_init_obj_file(ErrorStream, ModuleName, ModuleNames, Result, !IO) :-
-	globals__io_lookup_bool_option(rebuild, MustCompile, !IO),
+	globals.io_lookup_bool_option(rebuild, MustCompile, !IO),
 	make_init_obj_file(ErrorStream,
 		MustCompile, ModuleName, ModuleNames, Result, !IO).
 
 % WARNING: The code here duplicates the functionality of scripts/c2init.in.
 % Any changes there may also require changes here, and vice versa.
 
-:- pred make_init_obj_file(io__output_stream::in, bool::in,
+:- pred make_init_obj_file(io.output_stream::in, bool::in,
 	module_name::in, list(module_name)::in, maybe(file_name)::out,
 	io::di, io::uo) is det.
 
 make_init_obj_file(ErrorStream, MustCompile, ModuleName, ModuleNames, Result,
 		!IO) :-
-	globals__io_lookup_bool_option(verbose, Verbose, !IO),
-	globals__io_lookup_bool_option(statistics, Stats, !IO),
+	globals.io_lookup_bool_option(verbose, Verbose, !IO),
+	globals.io_lookup_bool_option(statistics, Stats, !IO),
 	maybe_write_string(Verbose, "% Creating initialization file...\n",
 		!IO),
 
-	globals__io_get_globals(Globals, !IO),
+	globals.io_get_globals(Globals, !IO),
 	compute_grade(Globals, Grade),
 
 	get_object_code_type(executable, PIC, !IO),
@@ -955,23 +955,23 @@
 	module_name_to_file_name(ModuleName, InitObj, yes, InitObjFileName,
 		!IO),
 
-	list__map_foldl(
+	list.map_foldl(
 		(pred(ThisModule::in, CFileName::out, IO0::di, IO::uo) is det :-
 			module_name_to_file_name(ThisModule, ".c", no,
 				CFileName, IO0, IO)
 		), ModuleNames, CFileNameList, !IO),
 	join_quoted_string_list(CFileNameList, "", "", " ", CFileNames),
 
-	globals__io_lookup_accumulating_option(init_file_directories,
+	globals.io_lookup_accumulating_option(init_file_directories,
 		InitFileDirsList, !IO),
 	join_quoted_string_list(InitFileDirsList, "-I ", "", " ",
 		InitFileDirs),
 
-	globals__io_lookup_accumulating_option(init_files, InitFileNamesList0,
+	globals.io_lookup_accumulating_option(init_files, InitFileNamesList0,
 		!IO),
-	globals__io_lookup_accumulating_option(trace_init_files,
+	globals.io_lookup_accumulating_option(trace_init_files,
 		TraceInitFileNamesList0, !IO),
-	globals__io_lookup_maybe_string_option(
+	globals.io_lookup_maybe_string_option(
 		mercury_standard_library_directory, MaybeStdLibDir, !IO),
 	(
 		MaybeStdLibDir = yes(StdLibDir),
@@ -988,7 +988,7 @@
 		TraceInitFileNamesList = TraceInitFileNamesList0
 	),
 
-	globals__io_get_trace_level(TraceLevel, !IO),
+	globals.io_get_trace_level(TraceLevel, !IO),
 	( given_trace_level_is_none(TraceLevel) = no ->
 		TraceOpt = "-t",
 		InitFileNamesList =
@@ -999,24 +999,24 @@
 	),
 	join_quoted_string_list(InitFileNamesList, "", "", " ", InitFileNames),
 
-	globals__io_lookup_accumulating_option(runtime_flags, RuntimeFlagsList,
+	globals.io_lookup_accumulating_option(runtime_flags, RuntimeFlagsList,
 		!IO),
 	join_quoted_string_list(RuntimeFlagsList, "-r ", "", " ",
 		RuntimeFlags),
 
-	globals__io_lookup_bool_option(extra_initialization_functions,
+	globals.io_lookup_bool_option(extra_initialization_functions,
 		ExtraInits, !IO),
 	ExtraInitsOpt = ( ExtraInits = yes -> "-x" ; "" ),
 
-	globals__io_lookup_bool_option(main, Main, !IO),
+	globals.io_lookup_bool_option(main, Main, !IO),
 	NoMainOpt = ( Main = no -> "-l" ; "" ),
 
-	globals__io_lookup_bool_option(aditi, Aditi, !IO),
+	globals.io_lookup_bool_option(aditi, Aditi, !IO),
 	AditiOpt = ( Aditi = yes -> "-a" ; "" ),
 
-	globals__io_lookup_string_option(mkinit_command, Mkinit, !IO),
+	globals.io_lookup_string_option(mkinit_command, Mkinit, !IO),
 	TmpInitCFileName = InitCFileName ++ ".tmp",
-	MkInitCmd = string__append_list(
+	MkInitCmd = string.append_list(
 		[Mkinit, " -g ", Grade, " ", TraceOpt, " ", ExtraInitsOpt,
 		" ", NoMainOpt, " ", AditiOpt, " ", RuntimeFlags,
 		" -o ", quote_arg(TmpInitCFileName), " ", InitFileDirs,
@@ -1032,9 +1032,9 @@
 				Compile = yes
 			;
 				MustCompile = no,
-				io__file_modification_time(InitCFileName,
+				io.file_modification_time(InitCFileName,
 					InitCModTimeResult, !IO),
-				io__file_modification_time(InitObjFileName,
+				io.file_modification_time(InitObjFileName,
 					InitObjModTimeResult, !IO),
 				(
 					InitObjModTimeResult =
@@ -1080,14 +1080,14 @@
 % Any changes there may also require changes here, and vice versa.
 
 link(ErrorStream, LinkTargetType, ModuleName, ObjectsList, Succeeded, !IO) :-
-	globals__io_lookup_bool_option(verbose, Verbose, !IO),
-	globals__io_lookup_bool_option(statistics, Stats, !IO),
+	globals.io_lookup_bool_option(verbose, Verbose, !IO),
+	globals.io_lookup_bool_option(statistics, Stats, !IO),
 
 	maybe_write_string(Verbose, "% Linking...\n", !IO),
-	globals__io_lookup_string_option(library_extension, LibExt, !IO),
-	globals__io_lookup_string_option(shared_library_extension,
+	globals.io_lookup_string_option(library_extension, LibExt, !IO),
+	globals.io_lookup_string_option(shared_library_extension,
 		SharedLibExt, !IO),
-	globals__io_lookup_string_option(executable_file_extension, ExeExt,
+	globals.io_lookup_string_option(executable_file_extension, ExeExt,
 		!IO),
 	( LinkTargetType = static_library ->
 		Ext = LibExt,
@@ -1111,14 +1111,14 @@
 			ThreadFlagsOpt = shlib_linker_thread_flags,
 			DebugFlagsOpt = shlib_linker_debug_flags,
 			TraceFlagsOpt = shlib_linker_trace_flags,
-			globals__io_lookup_bool_option(allow_undefined,
+			globals.io_lookup_bool_option(allow_undefined,
 				AllowUndef, !IO),
 			( AllowUndef = yes ->
-				globals__io_lookup_string_option(
+				globals.io_lookup_string_option(
 					linker_allow_undefined_flag, UndefOpt,
 					!IO)
 			;
-				globals__io_lookup_string_option(
+				globals.io_lookup_string_option(
 					linker_error_undefined_flag, UndefOpt,
 					!IO)
 			),
@@ -1127,10 +1127,10 @@
 				Ext, yes, OutputFileName, !IO)
 		;
 			LinkTargetType = static_library,
-			error("compile_target_code__link")
+			error("compile_target_code.link")
 		;
 			LinkTargetType = java_archive,
-			error("compile_target_code__link")
+			error("compile_target_code.link")
 		;
 			LinkTargetType = executable,
 			CommandOpt = link_executable_command,
@@ -1149,17 +1149,17 @@
 		%
 		% Should the executable be stripped?
 		%
-		globals__io_lookup_bool_option(strip, Strip, !IO),
+		globals.io_lookup_bool_option(strip, Strip, !IO),
 		( LinkTargetType = executable, Strip = yes ->
-			globals__io_lookup_string_option(linker_strip_flag,
+			globals.io_lookup_string_option(linker_strip_flag,
 				StripOpt, !IO)
 		;
 			StripOpt = ""
 		),
 
-		globals__io_lookup_bool_option(target_debug, TargetDebug, !IO),
+		globals.io_lookup_bool_option(target_debug, TargetDebug, !IO),
 		( TargetDebug = yes ->
-			globals__io_lookup_string_option(DebugFlagsOpt,
+			globals.io_lookup_string_option(DebugFlagsOpt,
 				DebugOpts, !IO)
 		;
 			DebugOpts = ""
@@ -1168,9 +1168,9 @@
 		%
 		% Should the executable be statically linked?
 		%
-		globals__io_lookup_string_option(linkage, Linkage, !IO),
+		globals.io_lookup_string_option(linkage, Linkage, !IO),
 		( LinkTargetType = executable, Linkage = "static" ->
-			globals__io_lookup_string_option(linker_static_flags,
+			globals.io_lookup_string_option(linker_static_flags,
 				StaticOpts, !IO)
 		;
 			StaticOpts = ""
@@ -1181,7 +1181,7 @@
 		%
 		use_thread_libs(UseThreadLibs, !IO),
 		( UseThreadLibs = yes ->
-			globals__io_lookup_string_option(ThreadFlagsOpt,
+			globals.io_lookup_string_option(ThreadFlagsOpt,
 				ThreadOpts, !IO)
 		;
 			ThreadOpts = ""
@@ -1190,7 +1190,7 @@
 		%
 		% Find the Mercury standard libraries.
 		%
-		globals__io_lookup_maybe_string_option(
+		globals.io_lookup_maybe_string_option(
 			mercury_standard_library_directory, MaybeStdLibDir,
 			!IO),
 		(
@@ -1208,13 +1208,13 @@
 		get_system_libs(LinkTargetType, SystemLibs, !IO),
 
 		join_quoted_string_list(ObjectsList, "", "", " ", Objects),
-		globals__io_lookup_accumulating_option(LDFlagsOpt,
+		globals.io_lookup_accumulating_option(LDFlagsOpt,
 			LDFlagsList, !IO),
 		join_string_list(LDFlagsList, "", "", " ", LDFlags),
-		globals__io_lookup_accumulating_option(
+		globals.io_lookup_accumulating_option(
 			link_library_directories,
 			LinkLibraryDirectoriesList, !IO),
-		globals__io_lookup_string_option(linker_path_flag,
+		globals.io_lookup_string_option(linker_path_flag,
 			LinkerPathFlag, !IO),
 		join_quoted_string_list(LinkLibraryDirectoriesList,
 			LinkerPathFlag, "", " ", LinkLibraryDirectories),
@@ -1222,35 +1222,51 @@
 		%
 		% Set up the runtime library path.
 		%
+		globals.io_lookup_bool_option(shlib_linker_use_install_name,
+			UseInstallName, !IO),
 		(
+			UseInstallName = no,
 			SharedLibExt \= LibExt,
 			( Linkage = "shared"
 			; LinkTargetType = shared_library
 			)
 		->
-			globals__io_lookup_accumulating_option(
+			globals.io_lookup_accumulating_option(
 				runtime_link_library_directories,
 				RpathDirs, !IO),
 			( RpathDirs = [] ->
 				RpathOpts = ""
 			;
-				globals__io_lookup_string_option(RpathSepOpt,
-					RpathSep, !IO),
-				globals__io_lookup_string_option(RpathFlagOpt,
-					RpathFlag, !IO),
-				RpathOpts0 = string__join_list(RpathSep,
-					RpathDirs),
+				globals.io_lookup_string_option(
+					RpathSepOpt, RpathSep, !IO),
+				globals.io_lookup_string_option(
+					RpathFlagOpt, RpathFlag, !IO),
+				RpathOpts0 = string.join_list(
+					RpathSep, RpathDirs),
 				RpathOpts = RpathFlag ++ RpathOpts0
 			)
 		;
 			RpathOpts = ""
 		),
+				
+		%
+		% Set up the installed name for shared libraries.
+		%
+		(
+			UseInstallName = yes,
+			LinkTargetType = shared_library
+		->
+			get_install_name_option(OutputFileName, InstallNameOpt,
+				!IO)
+		;
+			InstallNameOpt = ""
+		),
 
-		globals__io_get_trace_level(TraceLevel, !IO),
+		globals.io_get_trace_level(TraceLevel, !IO),
 		( given_trace_level_is_none(TraceLevel) = yes ->
 			TraceOpts = ""
 		;
-			globals__io_lookup_string_option(TraceFlagsOpt,
+			globals.io_lookup_string_option(TraceFlagsOpt,
 				TraceOpts, !IO)
 		),
 
@@ -1259,21 +1275,21 @@
 		% depending on whether we are linking with static or shared
 		% Mercury libraries.
 		%
-		globals__io_lookup_accumulating_option(
+		globals.io_lookup_accumulating_option(
 			mercury_library_directories, MercuryLibDirs0, !IO),
-		globals__io_lookup_string_option(fullarch, FullArch, !IO),
-		globals__io_get_globals(Globals, !IO),
+		globals.io_lookup_string_option(fullarch, FullArch, !IO),
+		globals.io_get_globals(Globals, !IO),
 		grade_directory_component(Globals, GradeDir),
-		MercuryLibDirs = list__map(
+		MercuryLibDirs = list.map(
 			(func(LibDir) = LibDir/"lib"/GradeDir/FullArch),
 			MercuryLibDirs0),
-		globals__io_lookup_accumulating_option(link_libraries,
+		globals.io_lookup_accumulating_option(link_libraries,
 			LinkLibrariesList0, !IO),
-		list__map_foldl2(process_link_library(MercuryLibDirs),
+		list.map_foldl2(process_link_library(MercuryLibDirs),
 			LinkLibrariesList0, LinkLibrariesList, yes,
 			LibrariesSucceeded, !IO),
 
-		globals__io_lookup_string_option(linker_opt_separator,
+		globals.io_lookup_string_option(linker_opt_separator,
 			LinkOptSep, !IO),
 		(
 			LibrariesSucceeded = yes,
@@ -1282,23 +1298,23 @@
 
 			% Note that LDFlags may contain `-l' options
 			% so it should come after Objects.
-			globals__io_lookup_string_option(CommandOpt, Command,
+			globals.io_lookup_string_option(CommandOpt, Command,
 				!IO),
-			string__append_list(
+			string.append_list(
 				[Command, " ",
 				StaticOpts, " ", StripOpt, " ", UndefOpt, " ",
 				ThreadOpts, " ", TraceOpts, " ",
 				" -o ", OutputFileName, " ", Objects, " ",
 				LinkOptSep, " ", LinkLibraryDirectories, " ",
-				RpathOpts, " ", DebugOpts, " ", LDFlags, " ",
-				LinkLibraries, " ", MercuryStdLibs, " ",
-				SystemLibs],
+				RpathOpts, " ", InstallNameOpt, " ", DebugOpts,
+				" ", LDFlags, " ", LinkLibraries, " ",
+				MercuryStdLibs, " ", SystemLibs],
 				LinkCmd),
 
-			globals__io_lookup_bool_option(demangle, Demangle,
+			globals.io_lookup_bool_option(demangle, Demangle,
 				!IO),
 			( Demangle = yes ->
-				globals__io_lookup_string_option(
+				globals.io_lookup_string_option(
 					demangle_command, DemamngleCmd, !IO),
 				MaybeDemangleCmd = yes(DemamngleCmd)
 			;
@@ -1313,15 +1329,15 @@
 		)
 	),
 	maybe_report_stats(Stats, !IO),
-	globals__io_lookup_bool_option(use_grade_subdirs, UseGradeSubdirs,
+	globals.io_lookup_bool_option(use_grade_subdirs, UseGradeSubdirs,
 		!IO),
 	(
 		LinkSucceeded = yes,
 		UseGradeSubdirs = yes
 	->
 		% Link/copy the executable into the user's directory.
-		globals__io_set_option(use_subdirs, bool(no), !IO),
-		globals__io_set_option(use_grade_subdirs, bool(no), !IO),
+		globals.io_set_option(use_subdirs, bool(no), !IO),
+		globals.io_set_option(use_grade_subdirs, bool(no), !IO),
 		( LinkTargetType = executable ->
 			module_name_to_file_name(ModuleName, Ext,
 				no, UserDirFileName, !IO)
@@ -1329,13 +1345,13 @@
 			module_name_to_lib_file_name("lib", ModuleName, Ext,
 				no, UserDirFileName, !IO)
 		),
-		globals__io_set_option(use_subdirs, bool(yes), !IO),
-		globals__io_set_option(use_grade_subdirs, bool(yes), !IO),
+		globals.io_set_option(use_subdirs, bool(yes), !IO),
+		globals.io_set_option(use_grade_subdirs, bool(yes), !IO),
 
-		io__set_output_stream(ErrorStream, OutputStream, !IO),
+		io.set_output_stream(ErrorStream, OutputStream, !IO),
 		make_symlink_or_copy_file(OutputFileName, UserDirFileName,
 			Succeeded, !IO),
-		io__set_output_stream(OutputStream, _, !IO)
+		io.set_output_stream(OutputStream, _, !IO)
 	;
 		Succeeded = LinkSucceeded
 	).
@@ -1346,10 +1362,10 @@
 	io::di, io::uo) is det.
 
 get_mercury_std_libs(TargetType, StdLibDir, StdLibs, !IO) :-
-	globals__io_lookup_string_option(fullarch, FullArch, !IO),
-	globals__io_get_gc_method(GCMethod, !IO),
-	globals__io_lookup_string_option(library_extension, LibExt, !IO),
-	globals__io_get_globals(Globals, !IO),
+	globals.io_lookup_string_option(fullarch, FullArch, !IO),
+	globals.io_get_gc_method(GCMethod, !IO),
+	globals.io_lookup_string_option(library_extension, LibExt, !IO),
+	globals.io_get_globals(Globals, !IO),
 	grade_directory_component(Globals, GradeDir),
 
 	%
@@ -1365,14 +1381,14 @@
 		SharedGCLibs = ""
 	;
 		GCMethod = boehm,
-		globals__io_lookup_bool_option(profile_time, ProfTime, !IO),
-		globals__io_lookup_bool_option(profile_deep, ProfDeep, !IO),
+		globals.io_lookup_bool_option(profile_time, ProfTime, !IO),
+		globals.io_lookup_bool_option(profile_deep, ProfDeep, !IO),
 		( ( ProfTime = yes ; ProfDeep = yes ) ->
 			GCGrade0 = "gc_prof"
 		;
 			GCGrade0 = "gc"
 		),
-		globals__io_lookup_bool_option(parallel, Parallel, !IO),
+		globals.io_lookup_bool_option(parallel, Parallel, !IO),
 		( Parallel = yes ->
 			GCGrade = "par_" ++ GCGrade0
 		;
@@ -1395,7 +1411,7 @@
 	%
 	% Trace libraries.
 	%
-	globals__io_get_trace_level(TraceLevel, !IO),
+	globals.io_get_trace_level(TraceLevel, !IO),
 	( given_trace_level_is_none(TraceLevel) = yes ->
 		StaticTraceLibs = "",
 		SharedTraceLibs = ""
@@ -1412,13 +1428,13 @@
 		make_link_lib(TargetType, "mer_trace", TraceLib, !IO),
 		make_link_lib(TargetType, "mer_browser", BrowserLib, !IO),
 		make_link_lib(TargetType, "mer_mdbcomp", MdbCompLib, !IO),
-		SharedTraceLibs = string__join_list(" ",
+		SharedTraceLibs = string.join_list(" ",
 			[TraceLib, BrowserLib, MdbCompLib])
 	),
 
-	globals__io_lookup_string_option(mercury_linkage, MercuryLinkage, !IO),
+	globals.io_lookup_string_option(mercury_linkage, MercuryLinkage, !IO),
 	( MercuryLinkage = "static" ->
-		StdLibs = string__join_list(" ",
+		StdLibs = string.join_list(" ",
 			[StaticTraceLibs,
 			quote_arg(StdLibDir/"lib"/GradeDir/FullArch/
 				("libmer_std" ++ LibExt)),
@@ -1428,7 +1444,7 @@
 	; MercuryLinkage = "shared" ->
 		make_link_lib(TargetType, "mer_std", StdLib, !IO),
 		make_link_lib(TargetType, "mer_rt", RuntimeLib, !IO),
-		StdLibs = string__join_list(" ",
+		StdLibs = string.join_list(" ",
 			[SharedTraceLibs, StdLib, RuntimeLib, SharedGCLibs])
 	;
 		error("unknown linkage " ++ MercuryLinkage)
@@ -1453,8 +1469,8 @@
 		TargetType = static_library,
 		error("make_link_lib: static_library")
 	),
-	globals__io_lookup_string_option(LinkLibFlag, LinkLibOpt, !IO),
-	globals__io_lookup_string_option(LinkLibSuffix, Suffix, !IO),
+	globals.io_lookup_string_option(LinkLibFlag, LinkLibOpt, !IO),
+	globals.io_lookup_string_option(LinkLibSuffix, Suffix, !IO),
 	LinkOpt = quote_arg(LinkLibOpt ++ LibName ++ Suffix).
 
 :- pred get_system_libs(linked_target_type::in, string::out, io::di, io::uo)
@@ -1464,15 +1480,15 @@
 	%
 	% System libraries used when tracing.
 	%
-	globals__io_get_trace_level(TraceLevel, !IO),
+	globals.io_get_trace_level(TraceLevel, !IO),
 	( given_trace_level_is_none(TraceLevel) = yes ->
 		SystemTraceLibs = ""
 	;
-		globals__io_lookup_string_option(trace_libs, SystemTraceLibs0,
+		globals.io_lookup_string_option(trace_libs, SystemTraceLibs0,
 			!IO),
-		globals__io_lookup_bool_option(use_readline, UseReadline, !IO),
+		globals.io_lookup_bool_option(use_readline, UseReadline, !IO),
 		( UseReadline = yes ->
-			globals__io_lookup_string_option(readline_libs,
+			globals.io_lookup_string_option(readline_libs,
 				ReadlineLibs, !IO),
 			SystemTraceLibs =
 				SystemTraceLibs0 ++ " " ++ ReadlineLibs
@@ -1486,7 +1502,7 @@
 	%
 	use_thread_libs(UseThreadLibs, !IO),
 	( UseThreadLibs = yes ->
-		globals__io_lookup_string_option(thread_libs, ThreadLibs, !IO)
+		globals.io_lookup_string_option(thread_libs, ThreadLibs, !IO)
 	;
 		ThreadLibs = ""
 	),
@@ -1496,28 +1512,28 @@
 	%
 	(
 		TargetType = shared_library,
-		globals__io_lookup_string_option(shared_libs, OtherSystemLibs,
+		globals.io_lookup_string_option(shared_libs, OtherSystemLibs,
 			!IO)
 	;
 		TargetType = static_library,
-		error("compile_target_code__get_std_libs: static library")
+		error("compile_target_code.get_std_libs: static library")
 	;
 		TargetType = java_archive,
-		error("compile_target_code__get_std_libs: java archive")
+		error("compile_target_code.get_std_libs: java archive")
 	;
 		TargetType = executable,
-		globals__io_lookup_string_option(math_lib, OtherSystemLibs,
+		globals.io_lookup_string_option(math_lib, OtherSystemLibs,
 			!IO)
 	),
 
-	SystemLibs = string__join_list(" ",
+	SystemLibs = string.join_list(" ",
 		[SystemTraceLibs, OtherSystemLibs, ThreadLibs]).
 
 :- pred use_thread_libs(bool::out, io::di, io::uo) is det.
 
 use_thread_libs(UseThreadLibs, !IO) :-
-	globals__io_lookup_bool_option(parallel, Parallel, !IO),
-	globals__io_get_gc_method(GCMethod, !IO),
+	globals.io_lookup_bool_option(parallel, Parallel, !IO),
+	globals.io_get_gc_method(GCMethod, !IO),
 	UseThreadLibs = ( ( Parallel = yes ; GCMethod = mps ) -> yes ; no ).
 
 %-----------------------------------------------------------------------------%
@@ -1526,37 +1542,37 @@
 	bool::in, bool::out, io::di, io::uo) is det.
 
 process_link_library(MercuryLibDirs, LibName, LinkerOpt, !Succeeded, !IO) :-
-	globals__io_lookup_string_option(mercury_linkage, MercuryLinkage, !IO),
-	globals__io_lookup_accumulating_option(mercury_libraries, MercuryLibs,
+	globals.io_lookup_string_option(mercury_linkage, MercuryLinkage, !IO),
+	globals.io_lookup_accumulating_option(mercury_libraries, MercuryLibs,
 		!IO),
 	(
 		MercuryLinkage = "static",
-		list__member(LibName, MercuryLibs)
+		list.member(LibName, MercuryLibs)
 	->
 		% If we are linking statically with Mercury libraries,
 		% pass the absolute pathname of the `.a' file for
 		% the library.
-		globals__io_lookup_bool_option(use_grade_subdirs,
+		globals.io_lookup_bool_option(use_grade_subdirs,
 			UseGradeSubdirs, !IO),
 
 		file_name_to_module_name(LibName, LibModuleName),
-		globals__io_lookup_string_option(library_extension, LibExt,
+		globals.io_lookup_string_option(library_extension, LibExt,
 			!IO),
 
-		globals__io_set_option(use_grade_subdirs, bool(no), !IO),
+		globals.io_set_option(use_grade_subdirs, bool(no), !IO),
 		module_name_to_lib_file_name("lib", LibModuleName, LibExt,
 			no, LibFileName, !IO),
-		globals__io_set_option(use_grade_subdirs,
+		globals.io_set_option(use_grade_subdirs,
 			bool(UseGradeSubdirs), !IO),
 
-		io__input_stream(InputStream, !IO),
+		io.input_stream(InputStream, !IO),
 		search_for_file_returning_dir(MercuryLibDirs, LibFileName,
 			SearchResult, !IO),
 		(
 			SearchResult = ok(DirName),
 			LinkerOpt = DirName/LibFileName,
-			io__set_input_stream(InputStream, LibInputStream, !IO),
-			io__close_input(LibInputStream, !IO)
+			io.set_input_stream(InputStream, LibInputStream, !IO),
+			io.close_input(LibInputStream, !IO)
 		;
 			SearchResult = error(Error),
 			LinkerOpt = "",
@@ -1568,17 +1584,17 @@
 		LinkerOpt = "-l" ++ LibName
 	).
 
-:- pred create_archive(io__output_stream::in, file_name::in, bool::in,
+:- pred create_archive(io.output_stream::in, file_name::in, bool::in,
 	list(file_name)::in, bool::out, io::di, io::uo) is det.
 
 create_archive(ErrorStream, LibFileName, Quote, ObjectList, Succeeded, !IO) :-
-	globals__io_lookup_string_option(create_archive_command, ArCmd, !IO),
-	globals__io_lookup_accumulating_option(
+	globals.io_lookup_string_option(create_archive_command, ArCmd, !IO),
+	globals.io_lookup_accumulating_option(
 		create_archive_command_flags, ArFlagsList, !IO),
 	join_string_list(ArFlagsList, "", "", " ", ArFlags),
-	globals__io_lookup_string_option(
+	globals.io_lookup_string_option(
 		create_archive_command_output_flag, ArOutputFlag, !IO),
-	globals__io_lookup_string_option(ranlib_command, RanLib, !IO),
+	globals.io_lookup_string_option(ranlib_command, RanLib, !IO),
 	(
 		Quote = yes,
 		join_quoted_string_list(ObjectList, "", "", " ", Objects)
@@ -1589,7 +1605,7 @@
 		% Quoting would prevent that.
 		join_string_list(ObjectList, "", "", " ", Objects)
 	),
-	MakeLibCmd = string__append_list([
+	MakeLibCmd = string.append_list([
 		ArCmd, " ", ArFlags, " ", ArOutputFlag, " ",
 		LibFileName, " ", Objects]),
 	invoke_system_command(ErrorStream, verbose_commands,
@@ -1601,12 +1617,12 @@
 	->
 		Succeeded = MakeLibCmdSucceeded
 	;
-		RanLibCmd = string__append_list([RanLib, " ", LibFileName]),
+		RanLibCmd = string.append_list([RanLib, " ", LibFileName]),
 		invoke_system_command(ErrorStream, verbose_commands,
 			RanLibCmd, Succeeded, !IO)
 	).
 
-:- pred create_java_archive(io__output_stream::in, module_name::in,
+:- pred create_java_archive(io.output_stream::in, module_name::in,
 	file_name::in, list(file_name)::in, bool::out, io::di, io::uo) is det.
 
 create_java_archive(ErrorStream, ModuleName, JarFileName, ObjectList,
@@ -1617,7 +1633,7 @@
 
 	join_quoted_string_list(ObjectList, "", "", " ", Objects),
 	list_class_files_for_jar(ModuleName, Objects, ListClassFiles, !IO),
-	Cmd = string__append_list([
+	Cmd = string.append_list([
 		Jar, " ", JarCreateFlags, " ", JarFileName, " ", ListClassFiles
 		]),
 
@@ -1625,16 +1641,16 @@
 		!IO).
 
 get_object_code_type(FileType, ObjectCodeType, !IO) :-
-	globals__io_lookup_string_option(pic_object_file_extension, PicObjExt,
+	globals.io_lookup_string_option(pic_object_file_extension, PicObjExt,
 		!IO),
-	globals__io_lookup_string_option(link_with_pic_object_file_extension,
+	globals.io_lookup_string_option(link_with_pic_object_file_extension,
 		LinkWithPicObjExt, !IO),
-	globals__io_lookup_string_option(object_file_extension, ObjExt, !IO),
-	globals__io_lookup_string_option(mercury_linkage, MercuryLinkage, !IO),
-	globals__io_lookup_bool_option(gcc_global_registers, GCCGlobals, !IO),
-	globals__io_lookup_bool_option(highlevel_code, HighLevelCode, !IO),
-	globals__io_lookup_bool_option(pic, PIC, !IO),
-	globals__io_get_target(Target, !IO),
+	globals.io_lookup_string_option(object_file_extension, ObjExt, !IO),
+	globals.io_lookup_string_option(mercury_linkage, MercuryLinkage, !IO),
+	globals.io_lookup_bool_option(gcc_global_registers, GCCGlobals, !IO),
+	globals.io_lookup_bool_option(highlevel_code, HighLevelCode, !IO),
+	globals.io_lookup_bool_option(pic, PIC, !IO),
+	globals.io_get_target(Target, !IO),
 	(
 		PIC = yes,
 		% We've been explicitly told to use position independent code.
@@ -1688,9 +1704,9 @@
 :- pred standard_library_directory_option(string::out, io::di, io::uo) is det.
 
 standard_library_directory_option(Opt, !IO) :-
-	globals__io_lookup_maybe_string_option(
+	globals.io_lookup_maybe_string_option(
 		mercury_standard_library_directory, MaybeStdLibDir, !IO),
-	globals__io_lookup_maybe_string_option(
+	globals.io_lookup_maybe_string_option(
 		mercury_configuration_directory, MaybeConfDir, !IO),
 	(
 		MaybeStdLibDir = yes(StdLibDir),
@@ -1721,10 +1737,10 @@
 join_string_list([], _Prefix, _Suffix, _Separator, "").
 join_string_list([String | Strings], Prefix, Suffix, Separator, Result) :-
 	( Strings = [] ->
-		string__append_list([Prefix, String, Suffix], Result)
+		string.append_list([Prefix, String, Suffix], Result)
 	;
 		join_string_list(Strings, Prefix, Suffix, Separator, Result0),
-		string__append_list([Prefix, String, Suffix, Separator,
+		string.append_list([Prefix, String, Suffix, Separator,
 			Result0], Result)
 	).
 
@@ -1751,7 +1767,7 @@
 
 join_module_list([], _Extension, [], !IO).
 join_module_list([Module | Modules], Extension, [FileName | Rest], !IO) :-
-	file_name_to_module_name(dir__basename_det(Module), ModuleName),
+	file_name_to_module_name(dir.basename_det(Module), ModuleName),
 	module_name_to_file_name(ModuleName, Extension, no, FileName, !IO),
 	join_module_list(Modules, Extension, Rest, !IO).
 
@@ -1760,34 +1776,34 @@
 write_num_split_c_files(ModuleName, NumChunks, Succeeded, !IO) :-
 	module_name_to_file_name(ModuleName, ".num_split", yes,
 		NumChunksFileName, !IO),
-	io__open_output(NumChunksFileName, Res, !IO),
+	io.open_output(NumChunksFileName, Res, !IO),
 	( Res = ok(OutputStream) ->
-		io__write_int(OutputStream, NumChunks, !IO),
-		io__nl(OutputStream, !IO),
-		io__close_output(OutputStream, !IO),
+		io.write_int(OutputStream, NumChunks, !IO),
+		io.nl(OutputStream, !IO),
+		io.close_output(OutputStream, !IO),
 		Succeeded = yes
 	;
 		Succeeded = no,
-		io__progname_base("mercury_compile", ProgName, !IO),
-		io__write_string(ProgName, !IO),
-		io__write_string(": can't open `", !IO),
-		io__write_string(NumChunksFileName, !IO),
-		io__write_string("' for output\n", !IO)
+		io.progname_base("mercury_compile", ProgName, !IO),
+		io.write_string(ProgName, !IO),
+		io.write_string(": can't open `", !IO),
+		io.write_string(NumChunksFileName, !IO),
+		io.write_string("' for output\n", !IO)
 	).
 
 read_num_split_c_files(ModuleName, MaybeNumChunks, !IO) :-
 	module_name_to_file_name(ModuleName, ".num_split", no,
 		NumChunksFileName, !IO),
-	io__open_input(NumChunksFileName, Res, !IO),
+	io.open_input(NumChunksFileName, Res, !IO),
 	(
 		Res = ok(FileStream),
-		io__read_word(FileStream, MaybeNumChunksString, !IO),
-		io__close_input(FileStream, !IO),
+		io.read_word(FileStream, MaybeNumChunksString, !IO),
+		io.close_input(FileStream, !IO),
 		(
 			MaybeNumChunksString = ok(NumChunksString),
 			(
-				string__to_int(
-					string__from_char_list(NumChunksString),
+				string.to_int(
+					string.from_char_list(NumChunksString),
 					NumChunks)
 			->
 				MaybeNumChunks = ok(NumChunks)
@@ -1812,7 +1828,7 @@
 		)
 	;
 		Res = error(Error),
-		MaybeNumChunks = error(io__error_message(Error))
+		MaybeNumChunks = error(io.error_message(Error))
 	).
 
 remove_split_c_output_files(ModuleName, NumChunks, !IO) :-
@@ -1823,14 +1839,14 @@
 
 remove_split_c_output_files(ModuleName, ThisChunk, NumChunks, !IO) :-
 	( ThisChunk =< NumChunks ->
-		globals__io_lookup_string_option(object_file_extension, Obj,
+		globals.io_lookup_string_option(object_file_extension, Obj,
 			!IO),
 		module_name_to_split_c_file_name(ModuleName, ThisChunk,
 			".c", CFileName, !IO),
 		module_name_to_split_c_file_name(ModuleName, ThisChunk,
 			Obj, ObjFileName, !IO),
-		io__remove_file(CFileName, _, !IO),
-		io__remove_file(ObjFileName, _, !IO),
+		io.remove_file(CFileName, _, !IO),
+		io.remove_file(ObjFileName, _, !IO),
 		remove_split_c_output_files(ModuleName, ThisChunk, NumChunks,
 			!IO)
 	;
@@ -1841,15 +1857,15 @@
 
 make_all_module_command(Command0, MainModule, AllModules, Command, !IO) :-
 	% Pass the main module first.
-	list__map_foldl(
+	list.map_foldl(
 		(pred(Module::in, FileName::out, IO0::di, IO::uo) is det :-
 			module_name_to_file_name(Module, ".m", no, FileName,
 				IO0, IO)
 		),
-		[MainModule | list__delete_all(AllModules, MainModule)],
+		[MainModule | list.delete_all(AllModules, MainModule)],
 		ModuleNameStrings, !IO),
-	Command = string__join_list(" ",
-		list__map(quote_arg, [Command0 | ModuleNameStrings])).
+	Command = string.join_list(" ",
+		list.map(quote_arg, [Command0 | ModuleNameStrings])).
 
 %-----------------------------------------------------------------------------%
 
@@ -1858,15 +1874,15 @@
 maybe_pic_object_file_extension(Globals::in, PIC::in, Ext::out) :-
 	(
 		PIC = non_pic,
-		globals__lookup_string_option(Globals,
+		globals.lookup_string_option(Globals,
 			object_file_extension, Ext)
 	;
 		PIC = pic,
-		globals__lookup_string_option(Globals,
+		globals.lookup_string_option(Globals,
 			pic_object_file_extension, Ext)
 	;
 		PIC = link_with_pic,
-		globals__lookup_string_option(Globals,
+		globals.lookup_string_option(Globals,
 			link_with_pic_object_file_extension, Ext)
 	).
 maybe_pic_object_file_extension(Globals::in, PIC::out, Ext::in) :-
@@ -1874,17 +1890,17 @@
 		% This test must come first -- if the architecture doesn't
 		% need special treatment for PIC, we should always return
 		% `non_pic'.  `mmc --make' depends on this.
-		globals__lookup_string_option(Globals,
+		globals.lookup_string_option(Globals,
 			object_file_extension, Ext)
 	->
 		PIC = non_pic
 	;
-		globals__lookup_string_option(Globals,
+		globals.lookup_string_option(Globals,
 			pic_object_file_extension, Ext)
 	->
 		PIC = pic
 	;
-		globals__lookup_string_option(Globals,
+		globals.lookup_string_option(Globals,
 			link_with_pic_object_file_extension, Ext)
 	->
 		PIC = link_with_pic
@@ -1893,7 +1909,7 @@
 	).
 
 maybe_pic_object_file_extension(PIC, ObjExt, !IO) :-
-	globals__io_get_globals(Globals, !IO),
+	globals.io_get_globals(Globals, !IO),
 	maybe_pic_object_file_extension(Globals, PIC, ObjExt).
 
 %-----------------------------------------------------------------------------%
Index: compiler/modules.m
===================================================================
RCS file: /home/mercury1/repository/mercury/compiler/modules.m,v
retrieving revision 1.306
diff -u -r1.306 modules.m
--- compiler/modules.m	27 Sep 2004 06:43:59 -0000	1.306
+++ compiler/modules.m	8 Oct 2004 11:03:32 -0000
@@ -759,6 +759,15 @@
 
 :- pred get_env_classpath(string::out, io::di, io::uo) is det.
 
+	% get_install_name_option(FileName, Option, !IO):
+	%	Get the option string for setting the install-name of the
+	%	shared library FileName.
+	%	This is only used for systems which support the install-name
+	%	option for shared libraries (such as Darwin).
+	
+:- pred get_install_name_option(string::in, string::out, io::di, io::uo) 
+	is det.
+
 %-----------------------------------------------------------------------------%
 %-----------------------------------------------------------------------------%
 
@@ -956,11 +965,13 @@
 			; Ext = ".a"
 			; Ext = ".$A"
 			; Ext = ".so"
+			; Ext = ".dylib"
 			; Ext = ".$(EXT_FOR_SHARED_LIB)"
 			; Ext = ".jar"
 			; Ext = ".split.a"
 			; Ext = ".split.$A"
 			; Ext = ".split.so"
+			; Ext = ".split.dylib"
 			; Ext = ".split.$(EXT_FOR_SHARED_LIB)"
 			; Ext = ".init"
 					% mercury_update_interface
@@ -4756,12 +4767,25 @@
 	module_name_to_lib_file_name("lib", ModuleName, "", no, LibTargetName),
 	module_name_to_lib_file_name("lib", ModuleName, ".$A", yes,
 		LibFileName),
-	module_name_to_lib_file_name("lib", ModuleName, ".so", yes,
-		SharedLibFileName),
+	module_name_to_lib_file_name("lib", ModuleName, 
+		".$(EXT_FOR_SHARED_LIB)", yes, SharedLibFileName),
 	module_name_to_lib_file_name("lib", ModuleName,
 		".$(EXT_FOR_SHARED_LIB)", no, MaybeSharedLibFileName),
 	module_name_to_file_name(ModuleName, ".jar", no, JarFileName),
 
+	%
+	% Set up the installed name for shared libraries.
+	%
+	globals.io_lookup_bool_option(shlib_linker_use_install_name,
+		UseInstallName),
+	(
+		{ UseInstallName = yes }
+	->
+		get_install_name_option(SharedLibFileName, InstallNameOpt)
+	;
+		{ InstallNameOpt = "" }
+	),
+
 	{ AllInts = [
 		"$(", MakeVarName, ".ints) ",
 		"$(", MakeVarName, ".int3s) ",
@@ -4805,7 +4829,8 @@
 			"$(", MakeVarName, ".pic_os) ",
 			All_MLPicObjsString, " ", All_MLLibsDepString, "\n",
 		"\t$(ML) --make-shared-lib $(ALL_GRADEFLAGS) $(ALL_MLFLAGS) ",
-			"-- $(ALL_LD_LIBFLAGS) -o ", SharedLibFileName, " \\\n",
+			"-- ", InstallNameOpt, " $(ALL_LD_LIBFLAGS) -o ", 
+			SharedLibFileName, " \\\n",
 		"\t\t$(", MakeVarName, ".pic_os) ", All_MLPicObjsString,
 			" $(ALL_MLLIBS)\n\n"
 	]),
@@ -7219,4 +7244,15 @@
 		)
 	).
 
+get_install_name_option(OutputFileName, InstallNameOpt, !IO) :-
+	globals.io_lookup_string_option(
+		shlib_linker_install_name_flag, 
+		InstallNameFlag, !IO),
+	globals.io_lookup_string_option(
+		shlib_linker_install_name_path, 
+		InstallNamePath, !IO),
+		dir.directory_separator(Slash),
+	InstallNameOpt = InstallNameFlag++InstallNamePath++
+		char_to_string(Slash)++OutputFileName.
+		
 %-----------------------------------------------------------------------------%
Index: compiler/options.m
===================================================================
RCS file: /home/mercury1/repository/mercury/compiler/options.m,v
retrieving revision 1.430
diff -u -r1.430 options.m
--- compiler/options.m	16 Aug 2004 08:51:10 -0000	1.430
+++ compiler/options.m	8 Oct 2004 11:03:33 -0000
@@ -648,6 +648,9 @@
 		;	shlib_linker_rpath_separator
 		;	linker_allow_undefined_flag
 		;	linker_error_undefined_flag
+		;	shlib_linker_use_install_name
+		;	shlib_linker_install_name_flag
+		;	shlib_linker_install_name_path
 
 	% Build system options
 		;	make
@@ -1270,7 +1273,10 @@
 	shlib_linker_rpath_flag -	string("-Wl,-rpath"),
 	shlib_linker_rpath_separator -	string(" -Wl,-rpath"),
 	linker_allow_undefined_flag -	string(""),
-	linker_error_undefined_flag -	string("-Wl,-no-undefined")
+	linker_error_undefined_flag -	string("-Wl,-no-undefined"),
+	shlib_linker_use_install_name - bool(no),
+	shlib_linker_install_name_flag - string("-install_name "),
+	shlib_linker_install_name_path - string(".")
 ]).
 option_defaults_2(build_system_option, [
 		% Build System Options
@@ -1939,6 +1945,9 @@
 long_option("shlib-linker-rpath-separator", shlib_linker_rpath_separator).
 long_option("linker-allow-undefined-flag", linker_allow_undefined_flag).
 long_option("linker-error-undefined-flag", linker_error_undefined_flag).
+long_option("shlib-linker-use-install-name", shlib_linker_use_install_name).
+long_option("shlib-linker-install-name-flag", shlib_linker_install_name_flag).
+long_option("shlib-linker-install-name-path", shlib_linker_install_name_path).
 
 % build system options
 long_option("make",			make).
@@ -3932,6 +3941,11 @@
 		"-R <directory>, --runtime-library-directory <directory>",
 		"\tAppend <directory> to the list of directories in which",
 		"\tto search for shared libraries at runtime.",
+		"--shlib-linker-install-name-path <directory>",
+		"\tSpecify the path where a shared library will be installed.",
+		"\tThis option is useful on systems where the runtime search",
+		"\tpath is obtained from the shared library and not via the",
+		"\t-R option above (such as Mac OS X).",
 		"-l <library>, --library <library>",
 		"\tLink with the specified library.",
 		"--link-object <object-file>",
@@ -4014,6 +4028,8 @@
 		% --shlib-linker-rpath-flag, --shlib-linker-rpath-separator,
 		% --linker-allow-undefined-flag and
 		% --linker-error-undefined-flag,
+		% --shlib-linker-install-name-flag,
+		% --shlib-linker-use-install-name,
 		% options are reserved for use by the `Mercury.config' file;
 		% they are deliberately not documented.
 	]).
Index: doc/user_guide.texi
===================================================================
RCS file: /home/mercury1/repository/mercury/doc/user_guide.texi,v
retrieving revision 1.391
diff -u -r1.391 user_guide.texi
--- doc/user_guide.texi	20 Sep 2004 04:50:23 -0000	1.391
+++ doc/user_guide.texi	8 Oct 2004 11:03:34 -0000
@@ -6921,6 +6921,16 @@
 Append @var{directory} to the list of directories in which
 to search for shared libraries at runtime.
 
+ at sp 1
+ at item --shlib-linker-install-name-path @var{directory}
+ at findex --shlib-linker-install-name-path
+ at cindex Mac OS X, Darwin, Install name
+Specify the path where a shared library will be installed.
+This option is useful on systems where the runtime search
+path is obtained from the shared library and not via the
+-R option (such as Mac OS X).
+
+ at sp 1
 @item -l @var{library}
 @itemx --library @var{library}
 @findex -l
Index: library/Mmakefile
===================================================================
RCS file: /home/mercury1/repository/mercury/library/Mmakefile,v
retrieving revision 1.135
diff -u -r1.135 Mmakefile
--- library/Mmakefile	31 May 2004 04:13:00 -0000	1.135
+++ library/Mmakefile	8 Oct 2004 11:03:35 -0000
@@ -106,7 +106,8 @@
 MLFLAGS	+=	-R$(FINAL_INSTALL_MERC_LIB_DIR) \
 		-R$(FINAL_INSTALL_MERC_GC_LIB_DIR)
 MCFLAGS +=	-R$(FINAL_INSTALL_MERC_LIB_DIR) \
-		-R$(FINAL_INSTALL_MERC_GC_LIB_DIR)
+		-R$(FINAL_INSTALL_MERC_GC_LIB_DIR) \
+		--shlib-linker-install-name-path $(FINAL_INSTALL_MERC_LIB_DIR)
 
 MTAGS	=	$(SCRIPTS_DIR)/mtags
 
Index: runtime/Mmakefile
===================================================================
RCS file: /home/mercury1/repository/mercury/runtime/Mmakefile,v
retrieving revision 1.113
diff -u -r1.113 Mmakefile
--- runtime/Mmakefile	20 Jul 2004 04:41:20 -0000	1.113
+++ runtime/Mmakefile	8 Oct 2004 11:03:35 -0000
@@ -331,6 +331,14 @@
 		$(LDFLAGS) $(LDLIBS) $(THREADLIBS)			\
 		$(SHARED_LIBS)
 
+# For Darwin we should pass the -install_name option.
+lib$(RT_LIB_NAME).dylib: $(PIC_OBJS)
+	$(LINK_SHARED_OBJ) $(ERROR_UNDEFINED) 				\
+		-o lib$(RT_LIB_NAME).dylib $(PIC_OBJS)			\
+		-install_name $(FINAL_INSTALL_MERC_LIB_DIR)/lib$(RT_LIB_NAME).dylib \
+		$(LDFLAGS) $(LDLIBS) $(THREADLIBS)			\
+		$(SHARED_LIBS)
+
 endif
 endif
 
Index: scripts/Mercury.config.bootstrap.in
===================================================================
RCS file: /home/mercury1/repository/mercury/scripts/Mercury.config.bootstrap.in,v
retrieving revision 1.4
diff -u -r1.4 Mercury.config.bootstrap.in
--- scripts/Mercury.config.bootstrap.in	12 Feb 2004 02:48:17 -0000	1.4
+++ scripts/Mercury.config.bootstrap.in	8 Oct 2004 11:03:35 -0000
@@ -91,6 +91,8 @@
 		--linker-rpath-separator "@EXE_RPATH_SEP@" \
 		--shlib-linker-rpath-flag "@SHLIB_RPATH_OPT@" \
 		--shlib-linker-rpath-separator "@SHLIB_RPATH_SEP@" \
+		@SHLIB_USE_INSTALL_NAME@ \
+		--shlib-linker-install-name-flag "@SHLIB_INSTALL_NAME_FLAG@" \
 		--linker-allow-undefined-flag "@ALLOW_UNDEFINED@" \
 		--linker-error-undefined-flag "@ERROR_UNDEFINED@" \
 		--fullarch "@FULLARCH@" \
Index: scripts/Mercury.config.in
===================================================================
RCS file: /home/mercury1/repository/mercury/scripts/Mercury.config.in,v
retrieving revision 1.9
diff -u -r1.9 Mercury.config.in
--- scripts/Mercury.config.in	12 Feb 2004 02:48:17 -0000	1.9
+++ scripts/Mercury.config.in	8 Oct 2004 11:03:35 -0000
@@ -94,6 +94,8 @@
 		--linker-rpath-separator "@EXE_RPATH_SEP@" \
 		--shlib-linker-rpath-flag "@SHLIB_RPATH_OPT@" \
 		--shlib-linker-rpath-separator "@SHLIB_RPATH_SEP@" \
+		@SHLIB_USE_INSTALL_NAME@ \
+		--shlib-linker-install-name-flag "@SHLIB_INSTALL_NAME_FLAG@" \
 		--linker-allow-undefined-flag "@ALLOW_UNDEFINED@" \
 		--linker-error-undefined-flag "@ERROR_UNDEFINED@" \
 		--fullarch "@FULLARCH@" \
Index: scripts/mgnuc.in
===================================================================
RCS file: /home/mercury1/repository/mercury/scripts/mgnuc.in,v
retrieving revision 1.105
diff -u -r1.105 mgnuc.in
--- scripts/mgnuc.in	20 Jul 2004 04:41:31 -0000	1.105
+++ scripts/mgnuc.in	8 Oct 2004 11:03:35 -0000
@@ -502,6 +502,11 @@
 			;;
 		esac
 		;;
+	*powerpc*apple*darwin*)
+		# This environment variable needs to be set on Darwin so the
+		# executable knows where to find the mercury shared libraries.
+		DYLD_LIBRARY_PATH=@LIBDIR@
+		;;
 esac
 
 #
Index: trace/Mmakefile
===================================================================
RCS file: /home/mercury1/repository/mercury/trace/Mmakefile,v
retrieving revision 1.39
diff -u -r1.39 Mmakefile
--- trace/Mmakefile	10 Dec 2003 07:04:24 -0000	1.39
+++ trace/Mmakefile	8 Oct 2004 11:03:36 -0000
@@ -149,6 +149,14 @@
 		$(RPATH_1)$(RPATH_2)					\
 		$(LDFLAGS) $(LDLIBS) $(THREADLIBS)			\
 		$(SHARED_LIBS)
+		
+# For Darwin:
+lib$(TRACE_LIB_NAME).dylib: $(PIC_OBJS)
+	$(LINK_SHARED_OBJ) $(ERROR_UNDEFINED)				\
+		-o lib$(TRACE_LIB_NAME).dylib $(PIC_OBJS)		\
+		-install_name $(FINAL_INSTALL_MERC_LIB_DIR)/lib$(TRACE_LIB_NAME).dylib		\
+		$(LDFLAGS) $(LDLIBS) $(THREADLIBS)			\
+		$(SHARED_LIBS)
 
 .PHONY: cs
 cs: $(CFILES)
--------------------------------------------------------------------------
mercury-reviews mailing list
post:  mercury-reviews at cs.mu.oz.au
administrative address: owner-mercury-reviews at cs.mu.oz.au
unsubscribe: Address: mercury-reviews-request at cs.mu.oz.au Message: unsubscribe
subscribe:   Address: mercury-reviews-request at cs.mu.oz.au Message: subscribe
--------------------------------------------------------------------------



More information about the reviews mailing list