Under utils/ext-core, update README to mention that ext-core is now on Hackage
[ghc-hetmet.git] / ghc.mk
diff --git a/ghc.mk b/ghc.mk
index f234f39..7541a87 100644 (file)
--- a/ghc.mk
+++ b/ghc.mk
@@ -34,7 +34,6 @@
 # Tickets we can now close, or fix and close:
 #
 #   * 1693 make distclean
-#   * 3173 make install with DESTDIR
 
 # Possible cleanups:
 #
@@ -125,6 +124,8 @@ $(error Please run ./configure first)
 endif
 endif
 
+include mk/ways.mk
+
 # (Optional) build-specific configuration
 include mk/custom-settings.mk
 
@@ -140,9 +141,6 @@ endif
 include rules/all-target.mk
 include rules/clean-target.mk
 
-# Helper macro
-include rules/mkdep.mk
-
 # -----------------------------------------------------------------------------
 # The inplace tree
 
@@ -167,14 +165,13 @@ NO_INCLUDE_DEPS = YES
 # We want package-data.mk for show
 endif
 
-# We don't haddock base3-compat, as it has the same package name as base
-libraries/base3-compat_dist-install_DO_HADDOCK = NO
-
 # We don't haddock the bootstrapping libraries
 libraries/hpc_dist-boot_DO_HADDOCK = NO
 libraries/Cabal_dist-boot_DO_HADDOCK = NO
 libraries/extensible-exceptions_dist-boot_DO_HADDOCK = NO
 libraries/filepath_dist-boot_DO_HADDOCK = NO
+libraries/binary_dist-boot_DO_HADDOCK = NO
+libraries/bin-package-db_dist-boot_DO_HADDOCK = NO
 
 # -----------------------------------------------------------------------------
 # Ways
@@ -187,7 +184,6 @@ $(foreach way,$(ALL_WAYS),\
 # -----------------------------------------------------------------------------
 # Compilation Flags
 
-include rules/distdir-opts.mk
 include rules/distdir-way-opts.mk
 
 # -----------------------------------------------------------------------------
@@ -321,10 +317,10 @@ $(eval $(call addPackage,extensible-exceptions))
 $(eval $(call addPackage,haskell98))
 $(eval $(call addPackage,hpc))
 $(eval $(call addPackage,pretty))
-$(eval $(call addPackage,syb))
 $(eval $(call addPackage,template-haskell))
-$(eval $(call addPackage,base3-compat))
 $(eval $(call addPackage,Cabal))
+$(eval $(call addPackage,binary))
+$(eval $(call addPackage,bin-package-db))
 $(eval $(call addPackage,mtl))
 $(eval $(call addPackage,utf8-string))
 
@@ -342,7 +338,9 @@ PACKAGES_STAGE2 += \
        dph/dph-par
 endif
 
-BOOT_PKGS = Cabal hpc extensible-exceptions
+# We assume that the stage0 compiler has a suitable bytestring package,
+# so we don't have to include it below.
+BOOT_PKGS = Cabal hpc extensible-exceptions binary bin-package-db
 
 # The actual .a and .so/.dll files: needed for dependencies.
 ALL_STAGE1_LIBS  = $(foreach lib,$(PACKAGES),$(libraries/$(lib)_dist-install_v_LIB))
@@ -495,9 +493,11 @@ BUILD_DIRS += \
    $(GHC_GENAPPLY_DIR)
 endif
 
+ifneq "$(HADDOCK_DOCS)" "NO"
 BUILD_DIRS += \
    utils/haddock \
    utils/haddock/doc
+endif
 
 ifneq "$(CLEANING)" "YES"
 BUILD_DIRS += \
@@ -568,6 +568,14 @@ $(foreach lib,$(PACKAGES) $(PACKAGES_STAGE2),$(eval \
   libraries/$(lib)_dist-install_DISABLE = YES))
 endif
 
+# These packages don't pass the Cabal checks because hs-source-dirs
+# points outside the source directory. This isn't a real problem in
+# these cases, so we just skip checking them.
+CHECKED_libraries/dph/dph-seq = YES
+CHECKED_libraries/dph/dph-par = YES
+# In compiler's case, include-dirs points outside of the source tree
+CHECKED_compiler = YES
+
 include $(patsubst %, %/ghc.mk, $(BUILD_DIRS))
 
 # We need -fno-warn-deprecated-flags to avoid failure with -Werror
@@ -582,20 +590,22 @@ $(foreach pkg,$(PACKAGES) $(PACKAGES_STAGE2),$(eval libraries/$(pkg)_dist-instal
 # XXX Hack; remove this
 $(foreach pkg,$(PACKAGES_STAGE2),$(eval libraries/$(pkg)_dist-install_HC_OPTS += -Wwarn))
 
-# XXX we configure packages with the bootstrapping compiler (for
-# dependency reasons, see the phase ordering), which doesn't
-# necessarily support all the extensions we need, and Cabal filters
-# out the ones it thinks aren't supported.
-libraries/base3-compat_dist-install_HC_OPTS += -XPackageImports
-
 # A useful pseudo-target
 .PHONY: stage1_libs
 stage1_libs : $(ALL_STAGE1_LIBS)
 
+ifeq "$(HADDOCK_DOCS)" "YES"
 libraries/index.html: $(ALL_HADDOCK_FILES)
        cd libraries && sh gen_contents_index --inplace
 $(eval $(call all-target,library_doc_index,libraries/index.html))
 INSTALL_LIBRARY_DOCS += libraries/*.html libraries/*.gif libraries/*.css libraries/*.js
+CLEAN_FILES += libraries/doc-index* libraries/haddock*.css \
+              libraries/haddock*.js libraries/index*.html libraries/*.gif
+endif
+
+ifeq "$(CHECK_PACKAGES)" "YES"
+all: check_packages
+endif
 
 # -----------------------------------------------------------------------------
 # Bootstrapping libraries
@@ -619,6 +629,8 @@ $(eval $(call clean-target,$(BOOTSTRAPPING_CONF),,$(BOOTSTRAPPING_CONF)))
 $(eval $(call build-package,libraries/hpc,dist-boot,0))
 $(eval $(call build-package,libraries/extensible-exceptions,dist-boot,0))
 $(eval $(call build-package,libraries/Cabal,dist-boot,0))
+$(eval $(call build-package,libraries/binary,dist-boot,0))
+$(eval $(call build-package,libraries/bin-package-db,dist-boot,0))
 
 # register the boot packages in strict sequence, because running
 # multiple ghc-pkgs in parallel doesn't work (registrations may get
@@ -629,13 +641,23 @@ $(foreach pkg,$(BOOT_PKGS),$(eval $(call fixed_pkg_dep,$(pkg),dist-boot)))
 compiler/stage1/package-data.mk : \
     libraries/Cabal/dist-boot/package-data.mk \
     libraries/hpc/dist-boot/package-data.mk \
-    libraries/extensible-exceptions/dist-boot/package-data.mk
+    libraries/extensible-exceptions/dist-boot/package-data.mk \
+    libraries/bin-package-db/dist-boot/package-data.mk
 
 # These are necessary because the bootstrapping compiler may not know
 # about cross-package dependencies:
 $(compiler_stage1_depfile) : $(BOOT_LIBS)
 $(ghc_stage1_depfile) : $(compiler_stage1_v_LIB)
 
+# A few careful dependencies between bootstrapping packages.  When we
+# can rely on the stage 0 compiler being able to generate
+# cross-package dependencies with -M (fixed in GHC 6.12.1) we can drop
+# these, and also some of the phases.
+#
+# If you miss any out here, then 'make -j8' will probably tell you.
+#
+libraries/bin-package-db/dist-boot/build/Distribution/InstalledPackageInfo/Binary.$(v_osuf) : libraries/binary/dist-boot/build/Data/Binary.$(v_hisuf) libraries/Cabal/dist-boot/build/Distribution/InstalledPackageInfo.$(v_hisuf)
+
 $(foreach pkg,$(BOOT_PKGS),$(eval libraries/$(pkg)_dist-boot_HC_OPTS += $$(GhcBootLibHcOpts)))
 
 endif
@@ -685,52 +707,65 @@ libraries/ghc-prim/dist-install/build/autogen/GHC/PrimopWrappers.hs: \
 # Installation
 
 install: install_packages install_libs install_libexecs install_headers \
-         install_libexec_scripts install_bins install_docs
+         install_libexec_scripts install_bins install_docs \
+                install_topdirs install_topdir_scripts
 
 install_bins: $(INSTALL_BINS)
        $(INSTALL_DIR) $(DESTDIR)$(bindir)
        for i in $(INSTALL_BINS); do \
                $(INSTALL_PROGRAM) $(INSTALL_BIN_OPTS) $$i $(DESTDIR)$(bindir) ;  \
                 if test "$(darwin_TARGET_OS)" = "1"; then \
-                   sh mk/fix_install_names.sh $(libdir) $(DESTDIR)$(bindir)/$$i ; \
+                   sh mk/fix_install_names.sh $(ghclibdir) $(DESTDIR)$(bindir)/$$i ; \
                 fi ; \
        done
 
 install_libs: $(INSTALL_LIBS)
-       $(INSTALL_DIR) $(DESTDIR)$(libdir)
+       $(INSTALL_DIR) $(DESTDIR)$(ghclibdir)
        for i in $(INSTALL_LIBS); do \
                case $$i in \
                  *.a) \
-                   $(INSTALL_DATA) $(INSTALL_OPTS) $$i $(DESTDIR)$(libdir); \
-                   $(RANLIB) $(DESTDIR)$(libdir)/`basename $$i` ;; \
+                   $(INSTALL_DATA) $(INSTALL_OPTS) $$i $(DESTDIR)$(ghclibdir); \
+                   $(RANLIB) $(DESTDIR)$(ghclibdir)/`basename $$i` ;; \
                  *.dll) \
-                   $(INSTALL_DATA) -s $(INSTALL_OPTS) $$i $(DESTDIR)$(libdir) ;; \
+                   $(INSTALL_DATA) -s $(INSTALL_OPTS) $$i $(DESTDIR)$(ghclibdir) ;; \
                  *.so) \
-                   $(INSTALL_SHLIB) $(INSTALL_OPTS) $$i $(DESTDIR)$(libdir) ;; \
+                   $(INSTALL_SHLIB) $(INSTALL_OPTS) $$i $(DESTDIR)$(ghclibdir) ;; \
                  *.dylib) \
-                   $(INSTALL_SHLIB) $(INSTALL_OPTS) $$i $(DESTDIR)$(libdir); \
-                   install_name_tool -id $(DESTDIR)$(libdir)/`basename $$i` $(DESTDIR)$(libdir)/`basename $$i` ;; \
+                   $(INSTALL_SHLIB) $(INSTALL_OPTS) $$i $(DESTDIR)$(ghclibdir); \
+                   install_name_tool -id $(DESTDIR)$(ghclibdir)/`basename $$i` $(DESTDIR)$(ghclibdir)/`basename $$i` ;; \
                  *) \
-                   $(INSTALL_DATA) $(INSTALL_OPTS) $$i $(DESTDIR)$(libdir); \
+                   $(INSTALL_DATA) $(INSTALL_OPTS) $$i $(DESTDIR)$(ghclibdir); \
                esac; \
        done
 
 install_libexec_scripts: $(INSTALL_LIBEXEC_SCRIPTS)
-       $(INSTALL_DIR) $(DESTDIR)$(libexecdir)
+       $(INSTALL_DIR) $(DESTDIR)$(ghclibexecdir)
        for i in $(INSTALL_LIBEXEC_SCRIPTS); do \
-               $(INSTALL_SCRIPT) $(INSTALL_OPTS) $$i $(DESTDIR)$(libexecdir); \
+               $(INSTALL_SCRIPT) $(INSTALL_OPTS) $$i $(DESTDIR)$(ghclibexecdir); \
        done
 
 install_libexecs:  $(INSTALL_LIBEXECS)
-       $(INSTALL_DIR) $(DESTDIR)$(libexecdir)
+       $(INSTALL_DIR) $(DESTDIR)$(ghclibexecdir)
        for i in $(INSTALL_LIBEXECS); do \
-               $(INSTALL_PROGRAM) $(INSTALL_BIN_OPTS) $$i $(DESTDIR)$(libexecdir); \
+               $(INSTALL_PROGRAM) $(INSTALL_BIN_OPTS) $$i $(DESTDIR)$(ghclibexecdir); \
+       done
+
+install_topdir_scripts: $(INSTALL_TOPDIR_SCRIPTS)
+       $(INSTALL_DIR) $(DESTDIR)$(topdir)
+       for i in $(INSTALL_TOPDIR_SCRIPTS); do \
+               $(INSTALL_SCRIPT) $(INSTALL_OPTS) $$i $(DESTDIR)$(topdir); \
+       done
+
+install_topdirs: $(INSTALL_TOPDIRS)
+       $(INSTALL_DIR) $(DESTDIR)$(topdir)
+       for i in $(INSTALL_TOPDIRS); do \
+               $(INSTALL_PROGRAM) $(INSTALL_BIN_OPTS) $$i $(DESTDIR)$(topdir); \
        done
 
 install_headers: $(INSTALL_HEADERS)
-       $(INSTALL_DIR) $(DESTDIR)$(headerdir)
+       $(INSTALL_DIR) $(DESTDIR)$(ghcheaderdir)
        for i in $(INSTALL_HEADERS); do \
-               $(INSTALL_HEADER) $(INSTALL_OPTS) $$i $(DESTDIR)$(headerdir); \
+               $(INSTALL_HEADER) $(INSTALL_OPTS) $$i $(DESTDIR)$(ghcheaderdir); \
        done
 
 install_docs: $(INSTALL_HEADERS)
@@ -748,39 +783,48 @@ install_docs: $(INSTALL_HEADERS)
                $(INSTALL_DOC) $(INSTALL_OPTS) $$i/* $(DESTDIR)$(docdir)/html/`basename $$i`; \
        done
 
-INSTALLED_PACKAGE_CONF=$(DESTDIR)$(libdir)/package.conf
+INSTALLED_PACKAGE_CONF=$(DESTDIR)$(topdir)/package.conf.d
 
 # Install packages in the right order, so that ghc-pkg doesn't complain.
 # Also, install ghc-pkg first.
 ifeq "$(Windows)" "NO"
-INSTALLED_GHC_PKG_REAL=$(DESTDIR)$(libexecdir)/ghc-pkg
+INSTALLED_GHC_REAL=$(DESTDIR)$(ghclibexecdir)/ghc-stage2
+INSTALLED_GHC_PKG_REAL=$(DESTDIR)$(ghclibexecdir)/ghc-pkg
 else
+INSTALLED_GHC_REAL=$(DESTDIR)$(bindir)/ghc.exe
 INSTALLED_GHC_PKG_REAL=$(DESTDIR)$(bindir)/ghc-pkg.exe
 endif
 
 install_packages: install_libexecs
 install_packages: libffi/package.conf.install rts/package.conf.install
-       $(INSTALL_DIR) $(DESTDIR)$(libdir)
-       "$(RM)" $(RM_OPTS) $(INSTALLED_PACKAGE_CONF)
-       $(CREATE_DATA)     $(INSTALLED_PACKAGE_CONF)
-       echo "[]"       >> $(INSTALLED_PACKAGE_CONF)
+       $(INSTALL_DIR) $(DESTDIR)$(topdir)
+       "$(RM)" -r $(RM_OPTS) $(INSTALLED_PACKAGE_CONF)
+       $(INSTALL_DIR) $(INSTALLED_PACKAGE_CONF)
        "$(INSTALLED_GHC_PKG_REAL)" --force --global-conf $(INSTALLED_PACKAGE_CONF) update libffi/package.conf.install
        "$(INSTALLED_GHC_PKG_REAL)" --force --global-conf $(INSTALLED_PACKAGE_CONF) update rts/package.conf.install
        $(foreach p, $(PACKAGES) $(PACKAGES_STAGE2),\
            "$(GHC_CABAL_INPLACE)" install \
+                $(INSTALLED_GHC_REAL) \
                 $(INSTALLED_GHC_PKG_REAL) \
-                $(INSTALLED_PACKAGE_CONF) \
+                $(DESTDIR)$(topdir) \
                 libraries/$p dist-install \
-                '$(DESTDIR)' '$(prefix)' '$(libdir)' '$(docdir)/html/libraries' &&) true
+                '$(DESTDIR)' '$(prefix)' '$(ghclibdir)' '$(docdir)/html/libraries' \
+                $(RelocatableBuild) &&) true
        "$(GHC_CABAL_INPLACE)" install \
+                $(INSTALLED_GHC_REAL) \
                 $(INSTALLED_GHC_PKG_REAL) \
-                $(INSTALLED_PACKAGE_CONF) \
+                $(DESTDIR)$(topdir) \
                 compiler stage2 \
-                '$(DESTDIR)' '$(prefix)' '$(libdir)' '$(docdir)/html/libraries'
+                '$(DESTDIR)' '$(prefix)' '$(ghclibdir)' '$(docdir)/html/libraries' \
+                $(RelocatableBuild)
 
 # -----------------------------------------------------------------------------
 # Binary distributions
 
+ifneq "$(CLEANING)" "YES"
+# This rule seems to hold some files open on Windows which prevents
+# cleaning, perhaps due to the $(wildcard).
+
 $(eval $(call bindist,.,\
     LICENSE \
     configure config.sub config.guess install-sh \
@@ -794,9 +838,15 @@ $(eval $(call bindist,.,\
        $(BINDIST_LIBS) \
        $(BINDIST_HI) \
        $(BINDIST_EXTRAS) \
+       $(includes_H_CONFIG) \
+       $(includes_H_PLATFORM) \
+       includes/ghcconfig.h \
+       includes/rts/Config.h \
     $(INSTALL_HEADERS) \
     $(INSTALL_LIBEXECS) \
     $(INSTALL_LIBEXEC_SCRIPTS) \
+    $(INSTALL_TOPDIRS) \
+    $(INSTALL_TOPDIR_SCRIPTS) \
     $(INSTALL_BINS) \
     $(INSTALL_DOCS) \
     $(INSTALL_LIBRARY_DOCS) \
@@ -804,12 +854,14 @@ $(eval $(call bindist,.,\
        docs/index.html \
        $(wildcard libraries/*/dist-install/doc/) \
     $(filter-out extra-gcc-opts,$(INSTALL_LIBS)) \
-    $(filter-out %/project.mk,$(filter-out mk/config.mk,$(MAKEFILE_LIST))) \
+    $(filter-out %/project.mk mk/config.mk %/mk/install.mk,$(MAKEFILE_LIST)) \
        mk/fix_install_names.sh \
        mk/project.mk \
+       mk/install.mk.in \
        bindist.mk \
        libraries/dph/LICENSE \
  ))
+endif
 # mk/project.mk gets an absolute path, so we manually include it in
 # the bindist with a relative path
 
@@ -903,7 +955,7 @@ sdist_file = \
     "$(CP)" $(TOP)/$1/$2/build/$4.hs $1/$3/ ; \
     mv $1/$3/$4.$5 $1/$3/$4.$5.source ;\
   else \
-    echo "does not exist: $1/$2//build/$4.hs"; \
+    echo "does not exist: $1/$2/build/$4.hs"; \
     exit 1; \
   fi
 
@@ -912,25 +964,20 @@ sdist-prep :
        "$(RM)" $(RM_OPTS) -r $(SRC_DIST_DIR)
        "$(RM)" $(RM_OPTS) $(SRC_DIST_TARBALL)
        mkdir $(SRC_DIST_DIR)
-       ( cd $(SRC_DIST_DIR) \
-         && for i in $(SRC_DIST_DIRS); do mkdir $$i; (cd $$i && lndir $(TOP)/$$i ); done \
-         && for i in $(SRC_DIST_FILES); do $(LN_S) $(TOP)/$$i .; done \
-         && $(MAKE) distclean \
-         && if test -f $(TOP)/libraries/haskell-src/dist/build/Language/Haskell/Parser.hs; then "$(CP)" $(TOP)/libraries/haskell-src/dist/build/Language/Haskell/Parser.hs libraries/haskell-src/Language/Haskell/ ; mv libraries/haskell-src/Language/Haskell/Parser.ly libraries/haskell-src/Language/Haskell/Parser.ly.source ; fi \
-         && $(call sdist_file,compiler,stage2,cmm,CmmLex,x) \
-         && $(call sdist_file,compiler,stage2,cmm,CmmParse,y) \
-         && $(call sdist_file,compiler,stage2,main,ParsePkgConf,y) \
-         && $(call sdist_file,compiler,stage2,parser,HaddockLex,x) \
-         && $(call sdist_file,compiler,stage2,parser,HaddockParse,y) \
-         && $(call sdist_file,compiler,stage2,parser,Lexer,x) \
-         && $(call sdist_file,compiler,stage2,parser,Parser,y.pp) \
-         && $(call sdist_file,compiler,stage2,parser,ParserCore,y) \
-         && $(call sdist_file,utils/hpc,dist,,HpcParser,y) \
-         && $(call sdist_file,utils/genprimopcode,dist,,Lexer,x) \
-         && $(call sdist_file,utils/genprimopcode,dist,,Parser,y) \
-         && "$(RM)" $(RM_OPTS) -r compiler/stage[123] mk/build.mk \
-         && "$(FIND)" $(SRC_DIST_DIRS) \( -name _darcs -o -name SRC -o -name "autom4te*" -o -name "*~" -o -name ".cvsignore" -o -name "\#*" -o -name ".\#*" -o -name "log" -o -name "*-SAVE" -o -name "*.orig" -o -name "*.rej" -o -name "*-darcs-backup*" \) -print | xargs "$(RM)" $(RM_OPTS) -r \
-       )
+       cd $(SRC_DIST_DIR) && for i in $(SRC_DIST_DIRS); do mkdir $$i; ( cd $$i && lndir $(TOP)/$$i ); done
+       cd $(SRC_DIST_DIR) && for i in $(SRC_DIST_FILES); do $(LN_S) $(TOP)/$$i .; done
+       cd $(SRC_DIST_DIR) && $(MAKE) distclean
+       cd $(SRC_DIST_DIR) && if test -f $(TOP)/libraries/haskell-src/dist/build/Language/Haskell/Parser.hs; then "$(CP)" $(TOP)/libraries/haskell-src/dist/build/Language/Haskell/Parser.hs libraries/haskell-src/Language/Haskell/ ; mv libraries/haskell-src/Language/Haskell/Parser.ly libraries/haskell-src/Language/Haskell/Parser.ly.source ; fi
+       cd $(SRC_DIST_DIR) && $(call sdist_file,compiler,stage2,cmm,CmmLex,x)
+       cd $(SRC_DIST_DIR) && $(call sdist_file,compiler,stage2,cmm,CmmParse,y)
+       cd $(SRC_DIST_DIR) && $(call sdist_file,compiler,stage2,parser,Lexer,x)
+       cd $(SRC_DIST_DIR) && $(call sdist_file,compiler,stage2,parser,Parser,y.pp)
+       cd $(SRC_DIST_DIR) && $(call sdist_file,compiler,stage2,parser,ParserCore,y)
+       cd $(SRC_DIST_DIR) && $(call sdist_file,utils/hpc,dist,,HpcParser,y)
+       cd $(SRC_DIST_DIR) && $(call sdist_file,utils/genprimopcode,dist,,Lexer,x)
+       cd $(SRC_DIST_DIR) && $(call sdist_file,utils/genprimopcode,dist,,Parser,y)
+       cd $(SRC_DIST_DIR) && "$(RM)" $(RM_OPTS) -r compiler/stage[123] mk/build.mk
+       cd $(SRC_DIST_DIR) && "$(FIND)" $(SRC_DIST_DIRS) \( -name _darcs -o -name SRC -o -name "autom4te*" -o -name "*~" -o -name ".cvsignore" -o -name "\#*" -o -name ".\#*" -o -name "log" -o -name "*-SAVE" -o -name "*.orig" -o -name "*.rej" -o -name "*-darcs-backup*" \) -print | xargs "$(RM)" $(RM_OPTS) -r
 
 .PHONY: sdist
 sdist : sdist-prep
@@ -947,7 +994,7 @@ publish-sdist :
        $(call nTimes,10,$(PublishCp) $(SRC_DIST_TARBALL) $(PublishLocation)/dist)
 endif
 
-ifeq "$(GhcUnregisterised)" "YES"
+ifeq "$(BootingFromHc)" "YES"
 SRC_CC_OPTS += -DNO_REGS -DUSE_MINIINTERPRETER -D__GLASGOW_HASKELL__=$(ProjectVersionInt)
 endif
 
@@ -961,20 +1008,25 @@ CLEAN_FILES += utils/ghc-pwd/ghc-pwd.exe
 CLEAN_FILES += utils/ghc-pwd/ghc-pwd.hi
 CLEAN_FILES += utils/ghc-pwd/ghc-pwd.o
 CLEAN_FILES += libraries/bootstrapping.conf
-CLEAN_FILES += libraries/integer-gmp/gmp/gmp.h
-CLEAN_FILES += libraries/integer-gmp/gmp/libgmp.a
 CLEAN_FILES += libraries/integer-gmp/cbits/GmpDerivedConstants.h
 CLEAN_FILES += libraries/integer-gmp/cbits/mkGmpDerivedConstants
 
-clean : clean_files clean_libraries clean_gmp
+clean : clean_files clean_libraries
 
 .PHONY: clean_files
 clean_files :
        "$(RM)" $(RM_OPTS) $(CLEAN_FILES)
 
+ifneq "$(NO_CLEAN_GMP)" "YES"
+CLEAN_FILES += libraries/integer-gmp/gmp/gmp.h
+CLEAN_FILES += libraries/integer-gmp/gmp/libgmp.a
+
+clean : clean_gmp
+.PHONY: clean_gmp
 clean_gmp:
        "$(RM)" $(RM_OPTS) -r libraries/integer-gmp/gmp/objs
        "$(RM)" $(RM_OPTS) -r libraries/integer-gmp/gmp/gmpbuild
+endif
 
 .PHONY: clean_libraries
 clean_libraries: $(patsubst %,clean_libraries/%_dist-install,$(PACKAGES) $(PACKAGES_STAGE2))