diff options
-rw-r--r-- | compiler/main/DriverPipeline.hs | 7 | ||||
-rw-r--r-- | compiler/main/DynFlags.hs | 20 | ||||
-rw-r--r-- | distrib/configure.ac.in | 2 | ||||
-rw-r--r-- | ghc.mk | 58 | ||||
-rw-r--r-- | ghc/ghc.mk | 3 | ||||
-rw-r--r-- | includes/ghc.mk | 5 | ||||
-rw-r--r-- | includes/mkDerivedConstants.c | 8 | ||||
-rw-r--r-- | mk/config.mk.in | 6 | ||||
-rw-r--r-- | mk/validate-settings.mk | 7 | ||||
-rw-r--r-- | rts/ghc.mk | 6 | ||||
-rw-r--r-- | rts/package.conf.in | 2 | ||||
-rw-r--r-- | rules/build-package.mk | 7 | ||||
-rw-r--r-- | rules/build-prog.mk | 40 | ||||
-rw-r--r-- | rules/shell-wrapper.mk | 61 | ||||
-rw-r--r-- | utils/compare_sizes/ghc.mk | 1 | ||||
-rw-r--r-- | utils/genapply/ghc.mk | 1 | ||||
-rw-r--r-- | utils/genprimopcode/ghc.mk | 1 | ||||
-rw-r--r-- | utils/ghc-cabal/Main.hs | 134 | ||||
-rw-r--r-- | utils/ghc-cabal/ghc.mk | 1 | ||||
-rw-r--r-- | utils/ghc-pwd/ghc.mk | 2 | ||||
-rw-r--r-- | utils/ghctags/ghc.mk | 9 | ||||
-rw-r--r-- | utils/hp2ps/ghc.mk | 15 | ||||
-rw-r--r-- | utils/hpc/ghc.mk | 7 | ||||
-rw-r--r-- | utils/mkUserGuidePart/ghc.mk | 9 | ||||
-rw-r--r-- | utils/runghc/ghc.mk | 1 | ||||
-rw-r--r-- | utils/unlit/ghc.mk | 1 |
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 @@ -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)) |