MAKEFLAGS += --no-builtin-rules .SUFFIXES: include mk/install.mk include mk/config.mk .PHONY: default default: @echo 'Run "make install" to install' @false #----------------------------------------------------------------------- # INSTALL RULES # Hacky function to check equality of two strings # TODO : find if a better function exists eq=$(and $(findstring $(1),$(2)),$(findstring $(2),$(1))) define installscript # $1 = package name # $2 = wrapper path # $3 = bindir # $4 = ghcbindir # $5 = Executable binary path # $6 = Library Directory # $7 = Docs Directory # $8 = Includes Directory # We are installing wrappers to programs by searching corresponding # wrappers. If wrapper is not found, we are attaching the common wrapper # to it. This implementation is a bit hacky and depends on consistency # of program names. For hadrian build this will work as programs have a # consistent naming procedure. if [ -L wrappers/$1 ]; then echo "$1 is a symlink"; fi @if [ -L wrappers/$1 ]; then \ cp -RP wrappers/$1 $2; \ else \ rm -f '$2' && \ $(CREATE_SCRIPT) '$2' && \ echo "#!$(SHELL)" >> '$2' && \ echo "exedir=\"$4\"" >> '$2' && \ echo "exeprog=\"$1\"" >> '$2' && \ echo "executablename=\"$5\"" >> '$2' && \ echo "bindir=\"$3\"" >> '$2' && \ echo "libdir=\"$6\"" >> '$2' && \ echo "docdir=\"$7\"" >> '$2' && \ echo "includedir=\"$8\"" >> '$2' && \ echo "" >> '$2' && \ cat wrappers/$1 >> '$2' && \ $(EXECUTABLE_FILE) '$2' ; \ fi @echo "$1 installed to $2" endef # Hacky function to patch up the 'haddock-interfaces' and 'haddock-html' # fields in the package .conf files define patchpackageconf # # $1 = package name (ex: 'bytestring') # $2 = path to .conf file # $3 = Docs Directory # $4 = (relative) path from $${pkgroot} to docs directory ($3) # # We fix the paths to haddock files by using the relative path from the pkgroot # to the doc files. cat '$2' | sed 's|haddock-interfaces.*|haddock-interfaces: "$${pkgroot}/$4/html/libraries/$1/$1.haddock"|' \ | sed 's|haddock-html.*|haddock-html: "$${pkgroot}/$4/html/libraries/$1"|' \ | sed 's| $${pkgroot}/../../docs/html/.*||' \ > '$2.copy' # The rts package doesn't actually supply haddocks, so we stop advertising them # altogether. ((echo "$1" | grep rts) && (cat '$2.copy' | sed 's|haddock-.*||' > '$2.copy.copy')) || (cat '$2.copy' > '$2.copy.copy') # We finally replace the original file. mv '$2.copy.copy' '$2' endef # QUESTION : should we use shell commands? .PHONY: install ifeq "$(TargetOS_CPP)" "mingw32" install_bin: install_mingw install_bin_direct else install_bin: install_bin_libdir install_wrappers endif install: install_bin install_lib install_includes install: install_docs update_package_db ActualBinsDir=${ghclibdir}/bin ifeq "$(TargetOS_CPP)" "mingw32" ActualLibsDir=${ghclibdir} else ActualLibsDir=${ghclibdir}/lib endif WrapperBinsDir=${bindir} # N.B. this is duplicated from includes/ghc.mk. lib/settings : $(call removeFiles,$@) @echo '[("GCC extra via C opts", "$(GccExtraViaCOpts)")' >> $@ @echo ',("C compiler command", "$(SettingsCCompilerCommand)")' >> $@ @echo ',("C compiler flags", "$(SettingsCCompilerFlags)")' >> $@ @echo ',("C++ compiler flags", "$(SettingsCxxCompilerFlags)")' >> $@ @echo ',("C compiler link flags", "$(SettingsCCompilerLinkFlags)")' >> $@ @echo ',("C compiler supports -no-pie", "$(SettingsCCompilerSupportsNoPie)")' >> $@ @echo ',("Haskell CPP command", "$(SettingsHaskellCPPCommand)")' >> $@ @echo ',("Haskell CPP flags", "$(SettingsHaskellCPPFlags)")' >> $@ @echo ',("ld command", "$(SettingsLdCommand)")' >> $@ @echo ',("ld flags", "$(SettingsLdFlags)")' >> $@ @echo ',("ld supports compact unwind", "$(LdHasNoCompactUnwind)")' >> $@ @echo ',("ld supports build-id", "$(LdHasBuildId)")' >> $@ @echo ',("ld supports filelist", "$(LdHasFilelist)")' >> $@ @echo ',("ld is GNU ld", "$(LdIsGNULd)")' >> $@ @echo ',("Merge objects command", "$(SettingsMergeObjectsCommand)")' >> $@ @echo ',("Merge objects flags", "$(SettingsMergeObjectsFlags)")' >> $@ @echo ',("ar command", "$(SettingsArCommand)")' >> $@ @echo ',("ar flags", "$(ArArgs)")' >> $@ @echo ',("ar supports at file", "$(ArSupportsAtFile)")' >> $@ @echo ',("ranlib command", "$(SettingsRanlibCommand)")' >> $@ @echo ',("otool command", "$(SettingsOtoolCommand)")' >> $@ @echo ',("install_name_tool command", "$(SettingsInstallNameToolCommand)")' >> $@ @echo ',("touch command", "$(SettingsTouchCommand)")' >> $@ @echo ',("dllwrap command", "$(SettingsDllWrapCommand)")' >> $@ @echo ',("windres command", "$(SettingsWindresCommand)")' >> $@ @echo ',("libtool command", "$(SettingsLibtoolCommand)")' >> $@ @echo ',("unlit command", "$$topdir/bin/unlit")' >> $@ @echo ',("cross compiling", "$(CrossCompiling)")' >> $@ @echo ',("target platform string", "$(TARGETPLATFORM)")' >> $@ @echo ',("target os", "$(HaskellTargetOs)")' >> $@ @echo ',("target arch", "$(HaskellTargetArch)")' >> $@ @echo ',("target word size", "$(TargetWordSize)")' >> $@ @echo ',("target word big endian", "$(TargetWordBigEndian)")' >> $@ @echo ',("target has GNU nonexec stack", "$(TargetHasGnuNonexecStack)")' >> $@ @echo ',("target has .ident directive", "$(TargetHasIdentDirective)")' >> $@ @echo ',("target has subsections via symbols", "$(TargetHasSubsectionsViaSymbols)")' >> $@ @echo ',("target has RTS linker", "$(TargetHasRTSLinker)")' >> $@ @echo ',("Unregisterised", "$(GhcUnregisterised)")' >> $@ @echo ',("LLVM target", "$(LLVMTarget_CPP)")' >> $@ @echo ',("LLVM llc command", "$(SettingsLlcCommand)")' >> $@ @echo ',("LLVM opt command", "$(SettingsOptCommand)")' >> $@ @echo ',("LLVM clang command", "$(SettingsClangCommand)")' >> $@ @echo @echo ',("bignum backend", "$(BIGNUM_BACKEND)")' >> $@ @echo ',("Use interpreter", "$(GhcWithInterpreter)")' >> $@ @echo ',("Support SMP", "$(GhcWithSMP)")' >> $@ @echo ',("RTS ways", "$(GhcRTSWays)")' >> $@ @echo ',("Tables next to code", "$(TablesNextToCode)")' >> $@ @echo ',("Leading underscore", "$(LeadingUnderscore)")' >> $@ @echo ',("Use LibFFI", "$(UseLibffiForAdjustors)")' >> $@ # Note that GhcThreaded just reflects the Makefile variable setting. In # particular, the stage1 compiler is never actually compiled with -threaded, but # it will nevertheless have cGhcThreaded = True. The "+RTS --info" output will # show what RTS GHC is really using. @echo ",(\"Use Threads\", \"$(GhcThreaded)\")" >> $@ @echo ",(\"Use Debugging\", \"$(GhcDebugged)\")" >> $@ @echo ",(\"RTS expects libdw\", \"$(GhcRtsWithLibdw)\")" >> $@ @echo "]" >> $@ # We need to install binaries relative to libraries. BINARIES = $(wildcard ./bin/*) install_bin_libdir: @echo "Copying binaries to $(ActualBinsDir)" $(INSTALL_DIR) "$(ActualBinsDir)" for i in $(BINARIES); do \ cp -R $$i "$(ActualBinsDir)"; \ done install_bin_direct: @echo "Copying binaries to $(WrapperBinsDir)" $(INSTALL_DIR) "$(WrapperBinsDir)" cp ./bin/* "$(WrapperBinsDir)/" LIBRARIES = $(wildcard ./lib/*) install_lib: lib/settings @echo "Copying libraries to $(ActualLibsDir)" $(INSTALL_DIR) "$(ActualLibsDir)" for i in $(LIBRARIES); do \ cp -R $$i "$(ActualLibsDir)/"; \ done INCLUDES = $(wildcard ./include/*) install_includes: @echo "Copying include files to $(includedir)" $(INSTALL_DIR) "$(includedir)" for i in $(INCLUDES); do \ cp -R $$i "$(includedir)/"; \ done DOCS = $(wildcard ./docs/*) install_docs: @echo "Copying docs to $(docdir)" $(INSTALL_DIR) "$(docdir)" for i in $(DOCS); do \ cp -R $$i "$(docdir)/"; \ done BINARY_NAMES=$(shell ls ./wrappers/) install_wrappers: install_bin_libdir @echo "Installing wrapper scripts" $(INSTALL_DIR) "$(WrapperBinsDir)" $(foreach p, $(BINARY_NAMES),\ $(call installscript,$p,$(WrapperBinsDir)/$p,$(WrapperBinsDir),$(ActualBinsDir),$(ActualBinsDir)/$p,$(ActualLibsDir),$(docdir),$(includedir))) PKG_CONFS = $(shell find "$(ActualLibsDir)/package.conf.d" -name '*.conf' | sed 's: :xxx:g') update_package_db: install_bin install_lib @echo "$(PKG_CONFS)" @echo "Updating the package DB" $(foreach p, $(PKG_CONFS),\ $(call patchpackageconf,$(shell echo $(notdir $p) | sed 's/-\([0-9]*[0-9]\.\)*conf//g'),$(shell echo "$p" | sed 's:xxx: :g'),$(docdir),$(shell mk/relpath.sh "$(ActualLibsDir)" "$(docdir)"))) '$(WrapperBinsDir)/$(CrossCompilePrefix)ghc-pkg' recache install_mingw: @echo "Installing MingGW" $(INSTALL_DIR) "$(prefix)/mingw" cp -R ./mingw "$(prefix)" # END INSTALL # ----------------------------------------------------------------------