Build the dynamic way by default on Linux/amd64
authorIan Lynagh <ian@well-typed.com>
Tue, 25 Sep 2012 18:50:09 +0000 (19:50 +0100)
committerIan Lynagh <ian@well-typed.com>
Wed, 3 Oct 2012 11:11:28 +0000 (12:11 +0100)
This required various build system changes to get the build to go
through.

In the inplace shell wrappers, we set LD_LIBRARY_PATH to allow programs
to find their libraries. In the future, we might change the inplace tree
to be the same shape as an installed tree instead. However, this would
mean changing the way we do installation, as currently we use cabal's
installation methods to install the libraries, but that only works if
the libraries are under libraries/foo/dist-install/build/..., rather
than in inplace/lib/...

26 files changed:
compiler/main/DriverPipeline.hs
compiler/main/DynFlags.hs
distrib/configure.ac.in
ghc.mk
ghc/ghc.mk
includes/ghc.mk
includes/mkDerivedConstants.c
mk/config.mk.in
mk/validate-settings.mk
rts/ghc.mk
rts/package.conf.in
rules/build-package.mk
rules/build-prog.mk
rules/shell-wrapper.mk
utils/compare_sizes/ghc.mk
utils/genapply/ghc.mk
utils/genprimopcode/ghc.mk
utils/ghc-cabal/Main.hs
utils/ghc-cabal/ghc.mk
utils/ghc-pwd/ghc.mk
utils/ghctags/ghc.mk
utils/hp2ps/ghc.mk
utils/hpc/ghc.mk
utils/mkUserGuidePart/ghc.mk
utils/runghc/ghc.mk
utils/unlit/ghc.mk

index e0bea39..483e5c8 100644 (file)
@@ -1676,9 +1676,10 @@ linkBinary dflags o_files dep_packages = do
                             then "$ORIGIN" </>
                                  (l `makeRelativeTo` full_output_fn)
                             else l
-              in ["-L" ++ l,
-                  "-Wl,-rpath",      "-Wl," ++ libpath,
-                  "-Wl,-rpath-link", "-Wl," ++ l]
+                  rpath = if dopt Opt_RPath dflags
+                          then ["-Wl,-rpath",      "-Wl," ++ libpath]
+                          else []
+              in ["-L" ++ l, "-Wl,-rpath-link", "-Wl," ++ l] ++ rpath
          | otherwise = ["-L" ++ l]
 
     let lib_paths = libraryPaths dflags
index 97d0675..6e51dcf 100644 (file)
@@ -339,6 +339,7 @@ data DynFlag
    | Opt_SccProfilingOn
    | Opt_Ticky
    | Opt_Static
+   | Opt_RPath
    | Opt_RelativeDynlibPaths
    | Opt_Hpc
 
@@ -1160,7 +1161,7 @@ defaultDynFlags mySettings =
         dirsToClean    = panic "defaultDynFlags: No dirsToClean",
         generatedDumps = panic "defaultDynFlags: No generatedDumps",
         haddockOptions = Nothing,
-        flags = IntSet.fromList (map fromEnum (defaultFlags (sTargetPlatform mySettings))),
+        flags = IntSet.fromList (map fromEnum (defaultFlags mySettings)),
         warningFlags = IntSet.fromList (map fromEnum standardWarnings),
         ghciScripts = [],
         language = Nothing,
@@ -2273,7 +2274,8 @@ fFlags = [
   ( "implicit-import-qualified",        Opt_ImplicitImportQualified, nop ),
   ( "prof-count-entries",               Opt_ProfCountEntries, nop ),
   ( "prof-cafs",                        Opt_AutoSccsOnIndividualCafs, nop ),
-  ( "hpc",                              Opt_Hpc, nop )
+  ( "hpc",                              Opt_Hpc, nop ),
+  ( "use-rpaths",                       Opt_RPath, nop )
   ]
 
 -- | These @-f\<blah\>@ flags can all be reversed with @-fno-\<blah\>@
@@ -2438,10 +2440,9 @@ xFlags = [
   ( "PackageImports",                   Opt_PackageImports, nop )
   ]
 
-defaultFlags :: Platform -> [DynFlag]
-defaultFlags platform
+defaultFlags :: Settings -> [DynFlag]
+defaultFlags settings
   = [ Opt_AutoLinkPackages,
-      Opt_Static,
 
       Opt_SharedImplib,
 
@@ -2453,7 +2454,8 @@ defaultFlags platform
       Opt_GhciSandbox,
       Opt_GhciHistory,
       Opt_HelpfulErrors,
-      Opt_ProfCountEntries
+      Opt_ProfCountEntries,
+      Opt_RPath
     ]
 
     ++ [f | (ns,f) <- optLevelFlags, 0 `elem` ns]
@@ -2466,6 +2468,12 @@ defaultFlags platform
             _                  -> []
         _ -> [])
 
+    ++ (if pc_dYNAMIC_BY_DEFAULT (sPlatformConstants settings)
+        then []
+        else [Opt_Static])
+
+    where platform = sTargetPlatform settings
+
 impliedFlags :: [(ExtensionFlag, TurnOnFlag, ExtensionFlag)]
 impliedFlags
   = [ (Opt_RankNTypes,                turnOn, Opt_ExplicitForAll)
index 280d9e3..b438bf5 100644 (file)
@@ -18,7 +18,7 @@ dnl--------------------------------------------------------------------
 
 FP_GMP
 
-bootstrap_target=`ghc/stage2/build/tmp/ghc-stage2 +RTS --info | grep '^ ,("Target platform"' | sed -e 's/.*, "//' -e 's/")//' | tr -d '\r'`
+bootstrap_target=@TargetPlatform@
 FPTOOLS_SET_PLATFORM_VARS
 
 BuildingCrossCompiler=NO
diff --git a/ghc.mk b/ghc.mk
index 5df8e55..f31f421 100644 (file)
--- a/ghc.mk
+++ b/ghc.mk
@@ -801,30 +801,36 @@ ifeq "$(HADDOCK_DOCS)" "YES"
 install: install_docs
 endif
 
-install_bins: $(INSTALL_BINS)
-       $(call INSTALL_DIR,"$(DESTDIR)$(bindir)")
-       for i in $(INSTALL_BINS); do \
-               $(call INSTALL_PROGRAM,$(INSTALL_BIN_OPTS),$$i,"$(DESTDIR)$(bindir)") ;  \
-       done
-
-install_libs: $(INSTALL_LIBS)
-       $(call INSTALL_DIR,"$(DESTDIR)$(ghclibdir)")
-       for i in $(INSTALL_LIBS); do \
+define installLibsTo
+# $1 = libraries to install
+# $2 = directory to install to
+       $(call INSTALL_DIR,$2)
+       for i in $1; do \
                case $$i in \
                  *.a) \
-                   $(call INSTALL_DATA,$(INSTALL_OPTS),$$i,"$(DESTDIR)$(ghclibdir)"); \
+                   $(call INSTALL_DATA,$(INSTALL_OPTS),$$i,$2); \
                    $(RANLIB) $(DESTDIR)$(ghclibdir)/`basename $$i` ;; \
                  *.dll) \
-                   $(call INSTALL_PROGRAM,$(INSTALL_OPTS),$$i,"$(DESTDIR)$(ghclibdir)") ; \
-                   $(STRIP_CMD) "$(DESTDIR)$(ghclibdir)"/$$i ;; \
+                   $(call INSTALL_PROGRAM,$(INSTALL_OPTS),$$i,$2) ; \
+                   $$(STRIP_CMD) $2/$$i ;; \
                  *.so) \
-                   $(call INSTALL_SHLIB,$(INSTALL_OPTS),$$i,"$(DESTDIR)$(ghclibdir)") ;; \
+                   $(call INSTALL_SHLIB,$(INSTALL_OPTS),$$i,$2) ;; \
                  *.dylib) \
-                   $(call INSTALL_SHLIB,$(INSTALL_OPTS),$$i,"$(DESTDIR)$(ghclibdir)");; \
+                   $(call INSTALL_SHLIB,$(INSTALL_OPTS),$$i,$2);; \
                  *) \
-                   $(call INSTALL_DATA,$(INSTALL_OPTS),$$i,"$(DESTDIR)$(ghclibdir)"); \
+                   $(call INSTALL_DATA,$(INSTALL_OPTS),$$i,$2); \
                esac; \
        done
+endef
+
+install_bins: $(INSTALL_BINS)
+       $(call INSTALL_DIR,"$(DESTDIR)$(bindir)")
+       for i in $(INSTALL_BINS); do \
+               $(call INSTALL_PROGRAM,$(INSTALL_BIN_OPTS),$$i,"$(DESTDIR)$(bindir)") ;  \
+       done
+
+install_libs: $(INSTALL_LIBS)
+       $(call installLibsTo, $(INSTALL_LIBS), "$(DESTDIR)$(ghclibdir)")
 
 install_libexecs:  $(INSTALL_LIBEXECS)
 ifeq "$(INSTALL_LIBEXECS)" ""
@@ -904,14 +910,29 @@ install_packages: rts/package.conf.install
        $(call INSTALL_DIR,"$(DESTDIR)$(topdir)")
        $(call removeTrees,"$(INSTALLED_PACKAGE_CONF)")
        $(call INSTALL_DIR,"$(INSTALLED_PACKAGE_CONF)")
+       $(call INSTALL_DIR,"$(DESTDIR)$(topdir)/rts-1.0")
+       $(call installLibsTo, $(RTS_INSTALL_LIBS), "$(DESTDIR)$(topdir)/rts-1.0")
+ifeq "$(DYNAMIC_BY_DEFAULT)" "YES"
+       $(foreach p, $(PKGS_THAT_ARE_INTREE_ONLY), \
+           $(call installLibsTo, $(wildcard libraries/$p/dist-install/build/*.so libraries/$p/dist-install/build/*.dll libraries/$p/dist-install/build/*.dylib), "$(DESTDIR)$(topdir)/$p-$(libraries/$p_dist-install_VERSION)"))
+endif
+       $(foreach p, $(INSTALLED_PKG_DIRS),                           \
+           $(call make-command,                                      \
+                  CROSS_COMPILE="$(CrossCompilePrefix)"              \
+                  "$(GHC_CABAL_INPLACE)" copy                        \
+                                         "$(STRIP_CMD)"              \
+                                         $p $(INSTALL_DISTDIR_$p)    \
+                                         '$(DESTDIR)'                \
+                                         '$(prefix)'                 \
+                                         '$(ghclibdir)'              \
+                                         '$(docdir)/html/libraries'))
        "$(INSTALLED_GHC_PKG_REAL)" --force --global-package-db "$(INSTALLED_PACKAGE_CONF)" update rts/package.conf.install
        $(foreach p, $(INSTALLED_PKG_DIRS),                           \
            $(call make-command,                                      \
-                   CROSS_COMPILE="$(CrossCompilePrefix)"              \
-                  "$(GHC_CABAL_INPLACE)" install                     \
+                  CROSS_COMPILE="$(CrossCompilePrefix)"              \
+                  "$(GHC_CABAL_INPLACE)" register                    \
                                          "$(INSTALLED_GHC_REAL)"     \
                                          "$(INSTALLED_GHC_PKG_REAL)" \
-                                         "$(STRIP_CMD)"              \
                                          "$(DESTDIR)$(topdir)"       \
                                          $p $(INSTALL_DISTDIR_$p)    \
                                          '$(DESTDIR)'                \
@@ -967,6 +988,7 @@ $(eval $(call bindist,.,\
     $(wildcard libraries/*/dist-install/doc/) \
     $(wildcard libraries/*/*/dist-install/doc/) \
     $(filter-out settings,$(INSTALL_LIBS)) \
+    $(RTS_INSTALL_LIBS) \
     $(filter-out %/project.mk mk/config.mk %/mk/install.mk,$(MAKEFILE_LIST)) \
     mk/project.mk \
     mk/install.mk.in \
index e177b92..ac8ce66 100644 (file)
@@ -77,6 +77,9 @@ ghc_stage3_SHELL_WRAPPER = YES
 ghc_stage1_SHELL_WRAPPER_NAME = ghc/ghc.wrapper
 ghc_stage2_SHELL_WRAPPER_NAME = ghc/ghc.wrapper
 ghc_stage3_SHELL_WRAPPER_NAME = ghc/ghc.wrapper
+ghc_stage1_INSTALL_INPLACE = YES
+ghc_stage2_INSTALL_INPLACE = YES
+ghc_stage3_INSTALL_INPLACE = YES
 
 ghc_stage$(INSTALL_GHC_STAGE)_INSTALL = YES
 ghc_stage$(INSTALL_GHC_STAGE)_INSTALL_SHELL_WRAPPER_NAME = ghc-$(ProjectVersion)
index 065dd0a..dd38a6d 100644 (file)
@@ -44,6 +44,10 @@ ifneq "$(GhcWithSMP)" "YES"
 includes_CC_OPTS += -DNOSMP
 endif
 
+ifeq "$(DYNAMIC_BY_DEFAULT)" "YES"
+includes_CC_OPTS += -DDYNAMIC_BY_DEFAULT
+endif
+
 ifneq "$(BINDIST)" "YES"
 
 ifeq "$(PORTING_HOST)" "YES"
@@ -148,6 +152,7 @@ else
 
 includes_dist-derivedconstants_C_SRCS = mkDerivedConstants.c
 includes_dist-derivedconstants_PROG   = mkDerivedConstants$(exeext)
+includes_dist-derivedconstants_INSTALL_INPLACE = YES
 
 $(eval $(call build-prog,includes,dist-derivedconstants,0))
 
index 199e2ed..a58c500 100644 (file)
@@ -776,6 +776,14 @@ main(int argc, char *argv[])
 #endif
                                          );
 
+    constantBool("dYNAMIC_BY_DEFAULT",
+#ifdef DYNAMIC_BY_DEFAULT
+                                       1
+#else
+                                       0
+#endif
+                                         );
+
     constantInt("lDV_SHIFT", LDV_SHIFT);
     constantInteger("iLDV_CREATE_MASK",  LDV_CREATE_MASK);
     constantInteger("iLDV_STATE_CREATE", LDV_STATE_CREATE);
index 0005ab0..c10378d 100644 (file)
@@ -129,6 +129,12 @@ endif
 PlatformSupportsSharedLibs = $(if $(filter $(TARGETPLATFORM),\
        $(SharedLibsPlatformList)),YES,NO)
 
+SharedLibsByDefaultPlatformList =               \
+                         x86_64-unknown-linux
+
+DYNAMIC_BY_DEFAULT = $(if $(filter $(TARGETPLATFORM),\
+       $(SharedLibsByDefaultPlatformList)),YES,NO)
+
 # Build a compiler that will build *unregisterised* libraries and
 # binaries by default.  Unregisterised code is supposed to compile and
 # run without any support for architecture-specific assembly mangling,
index a94d2b6..4baf02a 100644 (file)
@@ -26,8 +26,13 @@ GhcStage2HcOpts += -O -fwarn-tabs -dcore-lint
 # running of the tests, and faster building of the utils to be installed
 
 GhcLibHcOpts    += -O -dcore-lint
+
+# We define DefaultFastGhcLibWays in this style so that the value is
+# correct even if the user alters DYNAMIC_BY_DEFAULT
+DefaultFastGhcLibWays = $(if $(filter $(DYNAMIC_BY_DEFAULT),YES),v dyn,v)
+
 ifeq "$(ValidateSpeed)" "FAST"
-GhcLibWays     := v
+GhcLibWays     = $(DefaultFastGhcLibWays)
 else
 GhcLibWays     := $(filter v dyn,$(GhcLibWays))
 endif
index 9fdf6be..726199e 100644 (file)
@@ -508,9 +508,9 @@ endif
 # -----------------------------------------------------------------------------
 # installing
 
-INSTALL_LIBS += $(ALL_RTS_LIBS)
-INSTALL_LIBS += $(wildcard rts/dist/build/libffi$(soext)*)
-INSTALL_LIBS += $(wildcard rts/dist/build/$(LIBFFI_DLL))
+RTS_INSTALL_LIBS += $(ALL_RTS_LIBS)
+RTS_INSTALL_LIBS += $(wildcard rts/dist/build/libffi$(soext)*)
+RTS_INSTALL_LIBS += $(wildcard rts/dist/build/$(LIBFFI_DLL))
 
 install: install_libffi_headers
 
index 9068549..9fc8721 100644 (file)
@@ -16,7 +16,7 @@ hidden-modules:
 import-dirs:
 
 #ifdef INSTALLING
-library-dirs:          LIB_DIR PAPI_LIB_DIR
+library-dirs:          LIB_DIR"/rts-1.0" PAPI_LIB_DIR
 #else /* !INSTALLING */
 library-dirs:          TOP"/rts/dist/build" PAPI_LIB_DIR
 #endif
index c97f8c4..d21f449 100644 (file)
@@ -115,6 +115,13 @@ $$(foreach way,$$($1_$2_WAYS),$$(eval \
     $$(call build-package-way,$1,$2,$$(way),$3) \
   ))
 
+# Programs will need to depend on either the vanilla lib (if -static
+# is the default) or the dyn lib (if -dynamic is the default). We
+# conservatively make them depend on both, to keep things simple.
+# If dyn libs are not being built then $$($1_$2_dyn_LIB) will just
+# expand to the empty string, and be ignored.
+$1_$2_PROGRAM_DEP_LIB = $$($1_$2_v_LIB) $$($1_$2_dyn_LIB)
+
 # C and S files are possibly built the "dyn" way.
 ifeq "$$(BuildSharedLibs)" "YES"
 $(call c-objs,$1,$2,dyn)
index 462dcf7..6e6d1c1 100644 (file)
@@ -54,6 +54,26 @@ ifeq "$$($1_USES_CABAL)" "YES"
 $1_$2_USES_CABAL = YES
 endif
 
+ifeq "$$(Windows)" "YES"
+$1_$2_WANT_INPLACE_WRAPPER = NO
+else ifneq "$$($1_$2_INSTALL_INPLACE)" "YES"
+$1_$2_WANT_INPLACE_WRAPPER = NO
+else ifeq "$$($1_$2_SHELL_WRAPPER)" "YES"
+$1_$2_WANT_INPLACE_WRAPPER = YES
+else
+$1_$2_WANT_INPLACE_WRAPPER = NO
+endif
+
+ifeq "$$(Windows)" "YES"
+$1_$2_WANT_INSTALLED_WRAPPER = NO
+else ifneq "$$($1_$2_INSTALL)" "YES"
+$1_$2_WANT_INSTALLED_WRAPPER = NO
+else ifeq "$$($1_$2_SHELL_WRAPPER)" "YES"
+$1_$2_WANT_INSTALLED_WRAPPER = YES
+else
+$1_$2_WANT_INSTALLED_WRAPPER = NO
+endif
+
 $(call package-config,$1,$2,$3)
 
 $1_$2_depfile_base = $1/$2/build/.depend
@@ -66,7 +86,7 @@ $1_$2_INPLACE =
 endif
 else
 # Where do we install the inplace version?
-ifeq "$$($1_$2_SHELL_WRAPPER) $$(Windows)" "YES NO"
+ifeq "$$($1_$2_WANT_INPLACE_WRAPPER)" "YES"
 $1_$2_INPLACE = $$(INPLACE_LIB)/bin/$$($1_$2_PROG)
 else
 ifeq "$$($1_$2_TOPDIR)" "YES"
@@ -93,7 +113,7 @@ $(call all-target,$1_$2,$1/$2/build/tmp/$$($1_$2_PROG))
 
 # INPLACE_BIN might be empty if we're distcleaning
 ifeq "$(findstring clean,$(MAKECMDGOALS))" ""
-ifneq "$$($1_$2_INSTALL_INPLACE)" "NO"
+ifeq "$$($1_$2_INSTALL_INPLACE)" "YES"
 $$($1_$2_INPLACE) : $1/$2/build/tmp/$$($1_$2_PROG) | $$$$(dir $$$$@)/.
        "$$(CP)" -p $$< $$@
 endif
@@ -142,17 +162,25 @@ ifeq "$$($1_$2_v_HS_OBJS)" ""
 $1_$2_GHC_LD_OPTS = -no-auto-link-packages -no-hs-main
 endif
 
+ifneq "$3" "0"
+ifeq "$$(DYNAMIC_BY_DEFAULT)" "YES"
+$1_$2_GHC_LD_OPTS = \
+    -fno-use-rpaths \
+    $$(addprefix -optl-Wl$$(comma)-rpath -optl-Wl$$(comma),$$($1_$2_RPATHS))
+endif
+endif
+
 ifneq "$$(BINDIST)" "YES"
 # The quadrupled $'s here are because the _v_LIB variables aren't
 # necessarily set when this part of the makefile is read
 $1/$2/build/tmp/$$($1_$2_PROG) : \
     $$(foreach dep,$$($1_$2_DEP_NAMES),\
         $$(if $$(filter ghc,$$(dep)),\
-            $(if $(filter 0,$3),$$(compiler_stage1_v_LIB),\
-            $(if $(filter 1,$3),$$(compiler_stage2_v_LIB),\
-            $(if $(filter 2,$3),$$(compiler_stage2_v_LIB),\
+            $(if $(filter 0,$3),$$(compiler_stage1_PROGRAM_DEP_LIB),\
+            $(if $(filter 1,$3),$$(compiler_stage2_PROGRAM_DEP_LIB),\
+            $(if $(filter 2,$3),$$(compiler_stage2_PROGRAM_DEP_LIB),\
             $$(error Bad build stage)))),\
-        $$$$(libraries/$$(dep)_dist-$(if $(filter 0,$3),boot,install)_v_LIB)))
+        $$$$(libraries/$$(dep)_dist-$(if $(filter 0,$3),boot,install)_PROGRAM_DEP_LIB)))
 
 ifeq "$$($1_$2_LINK_WITH_GCC)" "NO"
 $1/$2/build/tmp/$$($1_$2_PROG) : $$($1_$2_v_HS_OBJS) $$($1_$2_v_C_OBJS) $$($1_$2_v_S_OBJS) $$($1_$2_OTHER_OBJS) | $$$$(dir $$$$@)/.
index 34b803e..8085ad1 100644 (file)
@@ -16,56 +16,43 @@ $(call profStart, shell-wrapper($1,$2))
 # $1 = dir
 # $2 = distdir
 
-ifeq "$$(Windows)" "YES"
-$1_$2_WANT_INPLACE_WRAPPER = NO
-else ifeq "$$($1_$2_INSTALL_INPLACE)" "NO"
-$1_$2_WANT_INPLACE_WRAPPER = NO
-else ifeq "$$(DYNAMIC_BY_DEFAULT)" "YES"
-# We need to set LD_LIBRARY_PATH for all programs, so always need
-# a shell wrapper
-$1_$2_WANT_INPLACE_WRAPPER = YES
-else ifeq "$$($1_$2_SHELL_WRAPPER)" "YES"
-$1_$2_WANT_INPLACE_WRAPPER = YES
-else
-$1_$2_WANT_INPLACE_WRAPPER = NO
-endif
-
-ifeq "$$(Windows)" "YES"
-$1_$2_WANT_INSTALLED_WRAPPER = NO
-else ifeq "$$($1_$2_INSTALL)" "NO"
-$1_$2_WANT_INSTALLED_WRAPPER = NO
-else ifeq "$$($1_$2_SHELL_WRAPPER)" "YES"
-$1_$2_WANT_INSTALLED_WRAPPER = YES
-else
-$1_$2_WANT_INSTALLED_WRAPPER = NO
+ifeq "$$($1_$2_SHELL_WRAPPER_NAME)" ""
+$1_$2_SHELL_WRAPPER_NAME = $1/$$($1_$2_PROG).wrapper
 endif
 
-
 ifeq "$$($1_$2_WANT_INPLACE_WRAPPER)" "YES"
 
-ifeq "$$($1_$2_SHELL_WRAPPER_NAME)" ""
-$1_$2_SHELL_WRAPPER_NAME = $1/$$($1_$2_PROG).wrapper
+ifeq "$$($1_$2_TOPDIR)" "YES"
+INPLACE_WRAPPER = $$(INPLACE_LIB)/$$($1_$2_PROG)
+else
+INPLACE_WRAPPER = $$(INPLACE_BIN)/$$($1_$2_PROG)
 endif
 
-all_$1_$2 : $$(INPLACE_BIN)/$$($1_$2_PROG)
+all_$1_$2 : $$(INPLACE_WRAPPER)
 
 $$(INPLACE_BIN)/$$($1_$2_PROG): WRAPPER=$$@
-$$(INPLACE_BIN)/$$($1_$2_PROG): $$($1_$2_INPLACE) $$($1_$2_SHELL_WRAPPER_NAME)
-       $$(call removeFiles,                             $$@)
-       echo '#!$$(SHELL)'                             >> $$@
-       echo 'executablename="$$(TOP)/$$<"'            >> $$@
-       echo 'datadir="$$(TOP)/$$(INPLACE_LIB)"'       >> $$@
-       echo 'bindir="$$(TOP)/$$(INPLACE_BIN)"'        >> $$@
-       echo 'topdir="$$(TOP)/$$(INPLACE_TOPDIR)"'     >> $$@
-       echo 'pgmgcc="$$(WhatGccIsCalled)"'            >> $$@
+ifeq "$$($1_$2_SHELL_WRAPPER)" "YES"
+$$(INPLACE_WRAPPER): $$($1_$2_SHELL_WRAPPER_NAME)
+endif
+$$(INPLACE_WRAPPER): $$($1_$2_INPLACE)
+       $$(call removeFiles,                                                  $$@)
+       echo '#!$$(SHELL)'                                                 >> $$@
+       echo 'executablename="$$(TOP)/$$<"'                                >> $$@
+       echo 'datadir="$$(TOP)/$$(INPLACE_LIB)"'                           >> $$@
+       echo 'bindir="$$(TOP)/$$(INPLACE_BIN)"'                            >> $$@
+       echo 'topdir="$$(TOP)/$$(INPLACE_TOPDIR)"'                         >> $$@
+       echo 'pgmgcc="$$(WhatGccIsCalled)"'                                >> $$@
        $$($1_$2_SHELL_WRAPPER_EXTRA)
        $$($1_$2_INPLACE_SHELL_WRAPPER_EXTRA)
+ifeq "$$(DYNAMIC_BY_DEFAULT)" "YES"
+       echo 'export LD_LIBRARY_PATH="$$($1_$2_DEP_LIB_DIRS_SEARCHPATH)"'  >> $$@
+endif
 ifeq "$$($1_$2_SHELL_WRAPPER)" "YES"
-       cat $$($1_$2_SHELL_WRAPPER_NAME)               >> $$@
+       cat $$($1_$2_SHELL_WRAPPER_NAME)                                   >> $$@
 else
-       echo 'exec "$executablename" $$$${1+"$$$$@"}'  >> $$@
+       echo 'exec "$$$$executablename" $$$${1+"$$$$@"}'                   >> $$@
 endif
-       $$(EXECUTABLE_FILE)                               $$@
+       $$(EXECUTABLE_FILE)                                                   $$@
 
 endif
 
index 5e48299..7a7142c 100644 (file)
@@ -3,6 +3,7 @@ utils/compare_sizes_USES_CABAL = YES
 utils/compare_sizes_PACKAGE = compareSizes
 utils/compare_sizes_MODULES = Main
 utils/compare_sizes_dist-install_PROG = compareSizes$(exeext)
+utils/compare_sizes_dist-install_INSTALL_INPLACE = NO
 
 $(eval $(call build-prog,utils/compare_sizes,dist-install,1))
 
index 4f78bc9..805fd6f 100644 (file)
@@ -12,6 +12,7 @@
 
 utils/genapply_dist_MODULES = GenApply
 utils/genapply_dist_PROG    = $(GHC_GENAPPLY_PGM)
+utils/genapply_dist_INSTALL_INPLACE = YES
 
 utils/genapply_HC_OPTS += -package pretty
 
index 5cbf82e..d119d8d 100644 (file)
@@ -13,5 +13,6 @@
 utils/genprimopcode_dist_MODULES = Lexer Main ParserM Parser Syntax
 utils/genprimopcode_dist_PROG    = $(GHC_GENPRIMOP_PGM)
 utils/genprimopcode_dist_HC_OPTS = -package array
+utils/genprimopcode_dist_INSTALL_INPLACE = YES
 
 $(eval $(call build-prog,utils/genprimopcode,dist,0))
index 3e43800..58ab921 100644 (file)
@@ -37,12 +37,18 @@ main = do hSetBuffering stdout LineBuffering
                   runHsColour distDir dir args'
               "check" : dir : [] ->
                   doCheck dir
-              "install" : ghc : ghcpkg : strip : topdir : directory : distDir
-                        : myDestDir : myPrefix : myLibdir : myDocdir
-                        : relocatableBuild : args' ->
-                  doInstall ghc ghcpkg strip topdir directory distDir
-                            myDestDir myPrefix myLibdir myDocdir
-                            relocatableBuild args'
+              "copy" : strip : directory : distDir
+                     : myDestDir : myPrefix : myLibdir : myDocdir
+                     : args' ->
+                  doCopy strip directory distDir
+                         myDestDir myPrefix myLibdir myDocdir
+                         args'
+              "register" : ghc : ghcpkg : topdir : directory : distDir
+                         : myDestDir : myPrefix : myLibdir : myDocdir
+                         : relocatableBuild : args' ->
+                  doRegister ghc ghcpkg topdir directory distDir
+                             myDestDir myPrefix myLibdir myDocdir
+                             relocatableBuild args'
               "configure" : args' -> case break (== "--") args' of
                    (config_args, "--" : distdir : directories) ->
                        mapM_ (generate config_args distdir) directories
@@ -121,37 +127,26 @@ runHsColour distdir directory args
  = withCurrentDirectory directory
  $ defaultMainArgs ("hscolour" : "--builddir" : distdir : args)
 
-doInstall :: FilePath -> FilePath -> FilePath -> FilePath -> FilePath
-          -> FilePath -> FilePath -> FilePath -> FilePath -> FilePath
-          -> String -> [String]
-          -> IO ()
-doInstall ghc ghcpkg strip topdir directory distDir
+doCopy :: FilePath -> FilePath
+       -> FilePath -> FilePath -> FilePath -> FilePath -> FilePath
+       -> [String]
+       -> IO ()
+doCopy strip directory distDir
           myDestDir myPrefix myLibdir myDocdir
-          relocatableBuildStr args
+          args
  = withCurrentDirectory directory $ do
-     relocatableBuild <- case relocatableBuildStr of
-                         "YES" -> return True
-                         "NO"  -> return False
-                         _ -> die ["Bad relocatableBuildStr: " ++
-                                   show relocatableBuildStr]
      let copyArgs = ["copy", "--builddir", distDir]
                  ++ (if null myDestDir
                      then []
                      else ["--destdir", myDestDir])
                  ++ args
-         regArgs = "register" : "--builddir" : distDir : args
          copyHooks = userHooks {
                          copyHook = noGhcPrimHook
                                   $ modHook False
                                   $ copyHook userHooks
                      }
-         regHooks = userHooks {
-                        regHook = modHook relocatableBuild
-                                $ regHook userHooks
-                    }
 
      defaultMainWithHooksArgs copyHooks copyArgs
-     defaultMainWithHooksArgs regHooks  regArgs
     where
       noGhcPrimHook f pd lbi us flags
               = let pd'
@@ -168,23 +163,46 @@ doInstall ghc ghcpkg strip topdir directory distDir
                 in f pd' lbi us flags
       modHook relocatableBuild f pd lbi us flags
        = do let verbosity = normal
-                idts = installDirTemplates lbi
-                idts' = idts {
-                            prefix    = toPathTemplate $
-                                            if relocatableBuild
-                                            then "$topdir"
-                                            else myPrefix,
-                            libdir    = toPathTemplate $
-                                            if relocatableBuild
-                                            then "$topdir"
-                                            else myLibdir,
-                            libsubdir = toPathTemplate "$pkgid",
-                            docdir    = toPathTemplate $
-                                            if relocatableBuild
-                                            then "$topdir/../doc/html/libraries/$pkgid"
-                                            else (myDocdir </> "$pkgid"),
-                            htmldir   = toPathTemplate "$docdir"
-                        }
+                idts = updateInstallDirTemplates relocatableBuild
+                                                 myPrefix myLibdir myDocdir
+                                                 (installDirTemplates lbi)
+                progs = withPrograms lbi
+                stripProgram' = stripProgram {
+                    programFindLocation = \_ -> return (Just strip) }
+
+            progs' <- configureProgram verbosity stripProgram' progs
+            let lbi' = lbi {
+                               withPrograms = progs',
+                               installDirTemplates = idts
+                           }
+            f pd lbi' us flags
+
+doRegister :: FilePath -> FilePath -> FilePath -> FilePath
+           -> FilePath -> FilePath -> FilePath -> FilePath -> FilePath
+           -> String -> [String]
+           -> IO ()
+doRegister ghc ghcpkg topdir directory distDir
+           myDestDir myPrefix myLibdir myDocdir
+           relocatableBuildStr args
+ = withCurrentDirectory directory $ do
+     relocatableBuild <- case relocatableBuildStr of
+                         "YES" -> return True
+                         "NO"  -> return False
+                         _ -> die ["Bad relocatableBuildStr: " ++
+                                   show relocatableBuildStr]
+     let regArgs = "register" : "--builddir" : distDir : args
+         regHooks = userHooks {
+                        regHook = modHook relocatableBuild
+                                $ regHook userHooks
+                    }
+
+     defaultMainWithHooksArgs regHooks  regArgs
+    where
+      modHook relocatableBuild f pd lbi us flags
+       = do let verbosity = normal
+                idts = updateInstallDirTemplates relocatableBuild
+                                                 myPrefix myLibdir myDocdir
+                                                 (installDirTemplates lbi)
                 progs = withPrograms lbi
                 ghcpkgconf = topdir </> "package.conf.d"
                 ghcProgram' = ghcProgram {
@@ -194,11 +212,9 @@ doInstall ghc ghcpkg strip topdir directory distDir
                     programPostConf = \_ _ -> return $ ["--global-package-db", ghcpkgconf]
                                                     ++ ["--force" | not (null myDestDir) ],
                     programFindLocation = \_ -> return (Just ghcpkg) }
-                stripProgram' = stripProgram {
-                    programFindLocation = \_ -> return (Just strip) }
                 configurePrograms ps conf = foldM (flip (configureProgram verbosity)) conf ps
 
-            progs' <- configurePrograms [ghcProgram', ghcPkgProgram', stripProgram'] progs
+            progs' <- configurePrograms [ghcProgram', ghcPkgProgram'] progs
             let Just ghcPkgProg = lookupProgram ghcPkgProgram' progs'
             instInfos <- dump verbosity ghcPkgProg GlobalPackageDB
             let installedPkgs' = PackageIndex.fromList instInfos
@@ -215,11 +231,32 @@ doInstall ghc ghcpkg strip topdir directory distDir
                 lbi' = lbi {
                                libraryConfig = mlc',
                                installedPkgs = installedPkgs',
-                               installDirTemplates = idts',
+                               installDirTemplates = idts,
                                withPrograms = progs'
                            }
             f pd lbi' us flags
 
+updateInstallDirTemplates :: Bool -> FilePath -> FilePath -> FilePath
+                          -> InstallDirTemplates
+                          -> InstallDirTemplates
+updateInstallDirTemplates relocatableBuild myPrefix myLibdir myDocdir idts
+    = idts {
+          prefix    = toPathTemplate $
+                          if relocatableBuild
+                          then "$topdir"
+                          else myPrefix,
+          libdir    = toPathTemplate $
+                          if relocatableBuild
+                          then "$topdir"
+                          else myLibdir,
+          libsubdir = toPathTemplate "$pkgid",
+          docdir    = toPathTemplate $
+                          if relocatableBuild
+                          then "$topdir/../doc/html/libraries/$pkgid"
+                          else (myDocdir </> "$pkgid"),
+          htmldir   = toPathTemplate "$docdir"
+      }
+
 -- The packages are built with the package ID ending in "-inplace", but
 -- when they're installed they get the package hash appended. We need to
 -- fix up the package deps so that they use the hash package IDs, not
@@ -331,8 +368,12 @@ generate config_args distdir directory
 
           dep_ids = map snd (externalPackageDeps lbi)
 
+      let libraryDirs = forDeps Installed.libraryDirs
       wrappedIncludeDirs <- wrap $ forDeps Installed.includeDirs
-      wrappedLibraryDirs <- wrap $ forDeps Installed.libraryDirs
+      wrappedLibraryDirs <- wrap libraryDirs
+      let depDynlibDirName d = display (Installed.sourcePackageId d)
+          rpaths = map (\d -> "'$$ORIGIN/../" ++ depDynlibDirName d ++ "'")
+                       dep_pkgs
 
       let variablePrefix = directory ++ '_':distdir
       let xs = [variablePrefix ++ "_VERSION = " ++ display (pkgVersion (package pd)),
@@ -342,6 +383,7 @@ generate config_args distdir directory
                 variablePrefix ++ "_HS_SRC_DIRS = " ++ unwords (hsSourceDirs bi),
                 variablePrefix ++ "_DEPS = " ++ unwords (map display dep_ids),
                 variablePrefix ++ "_DEP_NAMES = " ++ unwords (map (display . packageName) dep_ids),
+                variablePrefix ++ "_RPATHS = " ++ unwords rpaths,
                 variablePrefix ++ "_INCLUDE_DIRS = " ++ unwords (includeDirs bi),
                 variablePrefix ++ "_INCLUDES = " ++ unwords (includes bi),
                 variablePrefix ++ "_INSTALL_INCLUDES = " ++ unwords (installIncludes bi),
@@ -364,6 +406,7 @@ generate config_args distdir directory
                 variablePrefix ++ "_DEP_INCLUDE_DIRS_SINGLE_QUOTED = " ++ unwords wrappedIncludeDirs,
                 variablePrefix ++ "_DEP_CC_OPTS = "                    ++ unwords (forDeps Installed.ccOptions),
                 variablePrefix ++ "_DEP_LIB_DIRS_SINGLE_QUOTED = "     ++ unwords wrappedLibraryDirs,
+                variablePrefix ++ "_DEP_LIB_DIRS_SEARCHPATH = "        ++ mkSearchPath libraryDirs,
                 variablePrefix ++ "_DEP_EXTRA_LIBS = "                 ++ unwords (forDeps Installed.extraLibraries),
                 variablePrefix ++ "_DEP_LD_OPTS = "                    ++ unwords (forDeps Installed.ldOptions),
                 variablePrefix ++ "_BUILD_GHCI_LIB = "                 ++ boolToYesNo (withGHCiLib lbi),
@@ -388,5 +431,6 @@ generate config_args distdir directory
       | head s == ' ' = die ["Leading space in value to be wrapped:", s]
       | last s == ' ' = die ["Trailing space in value to be wrapped:", s]
       | otherwise     = return ("\'" ++ s ++ "\'")
+     mkSearchPath = intercalate [searchPathSeparator]
      boolToYesNo True = "YES"
      boolToYesNo False = "NO"
index 0a3e920..ae1a213 100644 (file)
@@ -55,6 +55,7 @@ $(GHC_CABAL_DIR)_PACKAGE                      = ghc-cabal
 $(GHC_CABAL_DIR)_dist-install_PROG            = ghc-cabal$(exeext)
 $(GHC_CABAL_DIR)_dist-install_INSTALL_INPLACE = NO
 $(GHC_CABAL_DIR)_dist-install_MODULES         = Main
+$(GHC_CABAL_DIR)_dist-install_MORE_HC_OPTS    = -static
 
 $(eval $(call build-prog,utils/ghc-cabal,dist-install,1))
 
index 5efe3b8..f2feef4 100644 (file)
@@ -1,7 +1,9 @@
 
 utils/ghc-pwd_USES_CABAL = YES
 utils/ghc-pwd_PACKAGE    = ghc-pwd
+utils/ghc-pwd_dist-install_INSTALL_INPLACE = YES
 utils/ghc-pwd_dist-install_PROG  = ghc-pwd$(exeext)
+utils/ghc-pwd_dist-install_MORE_HC_OPTS += -static
 
 $(eval $(call build-prog,utils/ghc-pwd,dist-install,1))
 
index 73a5201..b167a3c 100644 (file)
@@ -10,8 +10,9 @@
 #
 # -----------------------------------------------------------------------------
 
-utils/ghctags_dist-install_MODULES = Main
-utils/ghctags_dist-install_HC_OPTS = -package ghc
-utils/ghctags_dist-install_INSTALL = NO
-utils/ghctags_dist-install_PROG    = ghctags$(exeext)
+utils/ghctags_dist-install_MODULES         = Main
+utils/ghctags_dist-install_HC_OPTS         = -package ghc
+utils/ghctags_dist-install_INSTALL         = NO
+utils/ghctags_dist-install_INSTALL_INPLACE = YES
+utils/ghctags_dist-install_PROG            = ghctags$(exeext)
 $(eval $(call build-prog,utils/ghctags,dist-install,2))
index 30a9d05..59791c8 100644 (file)
 #
 # -----------------------------------------------------------------------------
 
-utils/hp2ps_dist_C_SRCS = AreaBelow.c Curves.c Error.c Main.c \
-                          Reorder.c TopTwenty.c AuxFile.c Deviation.c \
-                          HpFile.c Marks.c Scale.c TraceElement.c \
-                          Axes.c Dimensions.c Key.c PsFile.c Shade.c \
-                          Utilities.c
+utils/hp2ps_dist_C_SRCS          = AreaBelow.c Curves.c Error.c Main.c \
+                                   Reorder.c TopTwenty.c AuxFile.c Deviation.c \
+                                   HpFile.c Marks.c Scale.c TraceElement.c \
+                                   Axes.c Dimensions.c Key.c PsFile.c Shade.c \
+                                   Utilities.c
 utils/hp2ps_dist_EXTRA_LIBRARIES = m
-utils/hp2ps_dist_PROG    = hp2ps$(exeext)
-utils/hp2ps_dist_INSTALL = YES
+utils/hp2ps_dist_PROG            = hp2ps$(exeext)
+utils/hp2ps_dist_INSTALL         = YES
+utils/hp2ps_dist_INSTALL_INPLACE = YES
 
 utils/hp2ps_CC_OPTS += $(addprefix -I,$(GHC_INCLUDE_DIRS))
 
index 9a8f8ad..2485e16 100644 (file)
@@ -13,7 +13,8 @@
 utils/hpc_dist-install_MODULES = Main HpcCombine HpcDraft HpcFlags HpcLexer \
                         HpcMarkup HpcOverlay HpcParser HpcReport \
                         HpcShowTix HpcUtils
-utils/hpc_dist-install_HC_OPTS = -cpp -package hpc
-utils/hpc_dist-install_INSTALL = YES
-utils/hpc_dist-install_PROG    = hpc$(exeext)
+utils/hpc_dist-install_HC_OPTS         = -cpp -package hpc
+utils/hpc_dist-install_INSTALL         = YES
+utils/hpc_dist-install_INSTALL_INPLACE = YES
+utils/hpc_dist-install_PROG            = hpc$(exeext)
 $(eval $(call build-prog,utils/hpc,dist-install,1))
index fa96769..ff91784 100644 (file)
 #
 # -----------------------------------------------------------------------------
 
-utils/mkUserGuidePart_dist_MODULES = Main
-utils/mkUserGuidePart_dist_PROG    = mkUserGuidePart$(exeext)
-utils/mkUserGuidePart_HC_OPTS      = -package ghc
+utils/mkUserGuidePart_dist_MODULES         = Main
+utils/mkUserGuidePart_dist_PROG            = mkUserGuidePart$(exeext)
+utils/mkUserGuidePart_dist_INSTALL_INPLACE = YES
+utils/mkUserGuidePart_HC_OPTS              = -package ghc -static
 
-utils/mkUserGuidePart/dist/build/Main.o: $(ALL_STAGE1_LIBS) $(compiler_stage2_v_LIB)
+utils/mkUserGuidePart/dist/build/Main.o: $(ALL_STAGE1_LIBS) $(compiler_stage2_PROGRAM_DEP_LIB)
 
 $(eval $(call build-prog,utils/mkUserGuidePart,dist,1))
index 6ff84f0..0c045b4 100644 (file)
@@ -15,6 +15,7 @@ utils/runghc_dist-install_USES_CABAL = YES
 utils/runghc_dist-install_PROG    = runghc$(exeext)
 utils/runghc_dist-install_SHELL_WRAPPER = YES
 utils/runghc_dist-install_INSTALL = YES
+utils/runghc_dist-install_INSTALL_INPLACE = YES
 utils/runghc_dist-install_INSTALL_SHELL_WRAPPER_NAME = runghc-$(ProjectVersion)
 utils/runghc_dist-install_EXTRA_HC_OPTS = -cpp -DVERSION="\"$(ProjectVersion)\""
 
index f46c3b3..1bdf4a0 100644 (file)
@@ -14,6 +14,7 @@ utils/unlit_dist_C_SRCS  = unlit.c
 utils/unlit_dist_PROG    = $(GHC_UNLIT_PGM)
 utils/unlit_dist_TOPDIR  = YES
 utils/unlit_dist_INSTALL = YES
+utils/unlit_dist_INSTALL_INPLACE = YES
 
 $(eval $(call build-prog,utils/unlit,dist,0))