summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Lynagh <ian@well-typed.com>2012-09-25 19:50:09 +0100
committerIan Lynagh <ian@well-typed.com>2012-10-03 12:11:28 +0100
commit898cb090c8812704448ec4cb1c10d50df4b7d664 (patch)
tree526c5f4b47aee447d91af7ce83a819863f105804
parent58eaacc9967b7c627a66d49047fb447ac065706e (diff)
downloadhaskell-898cb090c8812704448ec4cb1c10d50df4b7d664.tar.gz
Build the dynamic way by default on Linux/amd64
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/...
-rw-r--r--compiler/main/DriverPipeline.hs7
-rw-r--r--compiler/main/DynFlags.hs20
-rw-r--r--distrib/configure.ac.in2
-rw-r--r--ghc.mk58
-rw-r--r--ghc/ghc.mk3
-rw-r--r--includes/ghc.mk5
-rw-r--r--includes/mkDerivedConstants.c8
-rw-r--r--mk/config.mk.in6
-rw-r--r--mk/validate-settings.mk7
-rw-r--r--rts/ghc.mk6
-rw-r--r--rts/package.conf.in2
-rw-r--r--rules/build-package.mk7
-rw-r--r--rules/build-prog.mk40
-rw-r--r--rules/shell-wrapper.mk61
-rw-r--r--utils/compare_sizes/ghc.mk1
-rw-r--r--utils/genapply/ghc.mk1
-rw-r--r--utils/genprimopcode/ghc.mk1
-rw-r--r--utils/ghc-cabal/Main.hs134
-rw-r--r--utils/ghc-cabal/ghc.mk1
-rw-r--r--utils/ghc-pwd/ghc.mk2
-rw-r--r--utils/ghctags/ghc.mk9
-rw-r--r--utils/hp2ps/ghc.mk15
-rw-r--r--utils/hpc/ghc.mk7
-rw-r--r--utils/mkUserGuidePart/ghc.mk9
-rw-r--r--utils/runghc/ghc.mk1
-rw-r--r--utils/unlit/ghc.mk1
26 files changed, 275 insertions, 139 deletions
diff --git a/compiler/main/DriverPipeline.hs b/compiler/main/DriverPipeline.hs
index e0bea39020..483e5c8f59 100644
--- a/compiler/main/DriverPipeline.hs
+++ b/compiler/main/DriverPipeline.hs
@@ -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
diff --git a/compiler/main/DynFlags.hs b/compiler/main/DynFlags.hs
index 97d0675802..6e51dcf4fa 100644
--- a/compiler/main/DynFlags.hs
+++ b/compiler/main/DynFlags.hs
@@ -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)
diff --git a/distrib/configure.ac.in b/distrib/configure.ac.in
index 280d9e3f34..b438bf5cbd 100644
--- a/distrib/configure.ac.in
+++ b/distrib/configure.ac.in
@@ -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 5df8e553c6..f31f421ad0 100644
--- 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 \
diff --git a/ghc/ghc.mk b/ghc/ghc.mk
index e177b9274c..ac8ce66245 100644
--- a/ghc/ghc.mk
+++ b/ghc/ghc.mk
@@ -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)
diff --git a/includes/ghc.mk b/includes/ghc.mk
index 065dd0a60b..dd38a6d6c0 100644
--- a/includes/ghc.mk
+++ b/includes/ghc.mk
@@ -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))
diff --git a/includes/mkDerivedConstants.c b/includes/mkDerivedConstants.c
index 199e2edeb6..a58c500928 100644
--- a/includes/mkDerivedConstants.c
+++ b/includes/mkDerivedConstants.c
@@ -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);
diff --git a/mk/config.mk.in b/mk/config.mk.in
index 0005ab00ef..c10378d97a 100644
--- a/mk/config.mk.in
+++ b/mk/config.mk.in
@@ -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,
diff --git a/mk/validate-settings.mk b/mk/validate-settings.mk
index a94d2b620b..4baf02ab43 100644
--- a/mk/validate-settings.mk
+++ b/mk/validate-settings.mk
@@ -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
diff --git a/rts/ghc.mk b/rts/ghc.mk
index 9fdf6bebb5..726199e455 100644
--- a/rts/ghc.mk
+++ b/rts/ghc.mk
@@ -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
diff --git a/rts/package.conf.in b/rts/package.conf.in
index 9068549e21..9fc87211f5 100644
--- a/rts/package.conf.in
+++ b/rts/package.conf.in
@@ -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
diff --git a/rules/build-package.mk b/rules/build-package.mk
index c97f8c4b2c..d21f449d93 100644
--- a/rules/build-package.mk
+++ b/rules/build-package.mk
@@ -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)
diff --git a/rules/build-prog.mk b/rules/build-prog.mk
index 462dcf7fcb..6e6d1c11f1 100644
--- a/rules/build-prog.mk
+++ b/rules/build-prog.mk
@@ -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 $$$$@)/.
diff --git a/rules/shell-wrapper.mk b/rules/shell-wrapper.mk
index 34b803e063..8085ad150a 100644
--- a/rules/shell-wrapper.mk
+++ b/rules/shell-wrapper.mk
@@ -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
diff --git a/utils/compare_sizes/ghc.mk b/utils/compare_sizes/ghc.mk
index 5e48299646..7a7142c19b 100644
--- a/utils/compare_sizes/ghc.mk
+++ b/utils/compare_sizes/ghc.mk
@@ -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))
diff --git a/utils/genapply/ghc.mk b/utils/genapply/ghc.mk
index 4f78bc9600..805fd6f697 100644
--- a/utils/genapply/ghc.mk
+++ b/utils/genapply/ghc.mk
@@ -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
diff --git a/utils/genprimopcode/ghc.mk b/utils/genprimopcode/ghc.mk
index 5cbf82e831..d119d8dfb3 100644
--- a/utils/genprimopcode/ghc.mk
+++ b/utils/genprimopcode/ghc.mk
@@ -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))
diff --git a/utils/ghc-cabal/Main.hs b/utils/ghc-cabal/Main.hs
index 3e43800a78..58ab921c45 100644
--- a/utils/ghc-cabal/Main.hs
+++ b/utils/ghc-cabal/Main.hs
@@ -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"
diff --git a/utils/ghc-cabal/ghc.mk b/utils/ghc-cabal/ghc.mk
index 0a3e920e7a..ae1a213122 100644
--- a/utils/ghc-cabal/ghc.mk
+++ b/utils/ghc-cabal/ghc.mk
@@ -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))
diff --git a/utils/ghc-pwd/ghc.mk b/utils/ghc-pwd/ghc.mk
index 5efe3b8fdf..f2feef4f52 100644
--- a/utils/ghc-pwd/ghc.mk
+++ b/utils/ghc-pwd/ghc.mk
@@ -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))
diff --git a/utils/ghctags/ghc.mk b/utils/ghctags/ghc.mk
index 73a520157c..b167a3c069 100644
--- a/utils/ghctags/ghc.mk
+++ b/utils/ghctags/ghc.mk
@@ -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))
diff --git a/utils/hp2ps/ghc.mk b/utils/hp2ps/ghc.mk
index 30a9d05658..59791c840d 100644
--- a/utils/hp2ps/ghc.mk
+++ b/utils/hp2ps/ghc.mk
@@ -10,14 +10,15 @@
#
# -----------------------------------------------------------------------------
-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))
diff --git a/utils/hpc/ghc.mk b/utils/hpc/ghc.mk
index 9a8f8ad54e..2485e1639d 100644
--- a/utils/hpc/ghc.mk
+++ b/utils/hpc/ghc.mk
@@ -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))
diff --git a/utils/mkUserGuidePart/ghc.mk b/utils/mkUserGuidePart/ghc.mk
index fa96769249..ff917848a1 100644
--- a/utils/mkUserGuidePart/ghc.mk
+++ b/utils/mkUserGuidePart/ghc.mk
@@ -10,10 +10,11 @@
#
# -----------------------------------------------------------------------------
-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))
diff --git a/utils/runghc/ghc.mk b/utils/runghc/ghc.mk
index 6ff84f0c62..0c045b4e2b 100644
--- a/utils/runghc/ghc.mk
+++ b/utils/runghc/ghc.mk
@@ -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)\""
diff --git a/utils/unlit/ghc.mk b/utils/unlit/ghc.mk
index f46c3b32ad..1bdf4a07b6 100644
--- a/utils/unlit/ghc.mk
+++ b/utils/unlit/ghc.mk
@@ -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))