From 898cb090c8812704448ec4cb1c10d50df4b7d664 Mon Sep 17 00:00:00 2001 From: Ian Lynagh Date: Tue, 25 Sep 2012 19:50:09 +0100 Subject: 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/... --- compiler/main/DriverPipeline.hs | 7 ++- compiler/main/DynFlags.hs | 20 ++++-- distrib/configure.ac.in | 2 +- ghc.mk | 58 +++++++++++------ ghc/ghc.mk | 3 + includes/ghc.mk | 5 ++ includes/mkDerivedConstants.c | 8 +++ mk/config.mk.in | 6 ++ mk/validate-settings.mk | 7 ++- rts/ghc.mk | 6 +- rts/package.conf.in | 2 +- rules/build-package.mk | 7 +++ rules/build-prog.mk | 40 ++++++++++-- rules/shell-wrapper.mk | 61 +++++++----------- utils/compare_sizes/ghc.mk | 1 + utils/genapply/ghc.mk | 1 + utils/genprimopcode/ghc.mk | 1 + utils/ghc-cabal/Main.hs | 134 ++++++++++++++++++++++++++-------------- utils/ghc-cabal/ghc.mk | 1 + utils/ghc-pwd/ghc.mk | 2 + utils/ghctags/ghc.mk | 9 +-- utils/hp2ps/ghc.mk | 15 ++--- utils/hpc/ghc.mk | 7 ++- utils/mkUserGuidePart/ghc.mk | 9 +-- utils/runghc/ghc.mk | 1 + 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\@ flags can all be reversed with @-fno-\@ @@ -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)) -- cgit v1.2.1