MAKEFLAGS += --no-builtin-rules .SUFFIXES: 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))) # the following is the work around suggested by @carter in #17418 during install # time. This should help us with code signing issues by removing extended # attributes from all files. ifeq "$(Darwin_Host)" "YES" XATTR ?= /usr/bin/xattr endif 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? show: @echo '$(VALUE)="$($(VALUE))"' .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: install_docs update_package_db ActualBinsDir=${ghclibdir}/bin ifeq "$(RelocatableBuild)" "YES" 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 command", "$(SettingsCxxCompilerCommand)")' >> $@ @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 ',("ar supports -L", "$(ArSupportsDashL)")' >> $@ @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 ',("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 ',("target has libm", "$(TargetHasLibm)")' >> $@ @echo ',("Unregisterised", "$(GhcUnregisterised)")' >> $@ @echo ',("LLVM target", "$(LLVMTarget_CPP)")' >> $@ @echo ',("LLVM llc command", "$(SettingsLlcCommand)")' >> $@ @echo ',("LLVM opt command", "$(SettingsOptCommand)")' >> $@ @echo ',("LLVM clang command", "$(SettingsClangCommand)")' >> $@ @echo ',("Use inplace MinGW toolchain", "$(SettingsUseDistroMINGW)")' >> $@ @echo @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)")' >> $@ @echo ',("RTS expects libdw", "$(GhcRtsWithLibdw)")' >> $@ @echo "]" >> $@ # We need to install binaries relative to libraries. BINARIES = $(wildcard ./bin/*) install_bin_libdir: @echo "Copying binaries to $(DESTDIR)$(ActualBinsDir)" $(INSTALL_DIR) "$(DESTDIR)$(ActualBinsDir)" for i in $(BINARIES); do \ cp -R $$i "$(DESTDIR)$(ActualBinsDir)"; \ done # Work around #17418 on Darwin if [ -e "${XATTR}" ]; then "${XATTR}" -c -r "$(DESTDIR)$(ActualBinsDir)"; fi install_bin_direct: @echo "Copying binaries to $(DESTDIR)$(WrapperBinsDir)" $(INSTALL_DIR) "$(DESTDIR)$(WrapperBinsDir)" cp ./bin/* "$(DESTDIR)$(WrapperBinsDir)/" LIBRARIES = $(wildcard ./lib/*) install_lib: lib/settings @echo "Copying libraries to $(DESTDIR)$(ActualLibsDir)" $(INSTALL_DIR) "$(DESTDIR)$(ActualLibsDir)" for i in $(LIBRARIES); do \ cp -R $$i "$(DESTDIR)$(ActualLibsDir)/"; \ done DOCS = $(wildcard ./docs/*) install_docs: @echo "Copying docs to $(DESTDIR)$(docdir)" $(INSTALL_DIR) "$(DESTDIR)$(docdir)" for i in $(DOCS); do \ cp -R $$i "$(DESTDIR)$(docdir)/"; \ done if [ -d docs-utils ]; then \ $(INSTALL_DATA) docs-utils/prologue.txt "$(DESTDIR)$(docdir)/html/libraries/"; \ $(INSTALL_SCRIPT) docs-utils/gen_contents_index "$(DESTDIR)$(docdir)/html/libraries/"; \ fi BINARY_NAMES=$(shell ls ./wrappers/) install_wrappers: install_bin_libdir @echo "Installing wrapper scripts" $(INSTALL_DIR) "$(DESTDIR)$(WrapperBinsDir)" $(foreach p, $(BINARY_NAMES),\ $(call installscript,$p,$(DESTDIR)$(WrapperBinsDir)/$p,$(WrapperBinsDir),$(ActualBinsDir),$(ActualBinsDir)/$p,$(ActualLibsDir),$(docdir),$(includedir))) PKG_CONFS = $(shell find "$(DESTDIR)$(ActualLibsDir)/package.conf.d" -name '*.conf' | sed "s: :\0xxx\0:g") update_package_db: install_bin install_lib @echo "Installing C++ standard library virtual package" cp mk/system-cxx-std-lib-1.0.conf "$(DESTDIR)$(ActualLibsDir)/" @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:\0xxx\0: :g'),$(docdir),$(shell mk/relpath.sh "$(ActualLibsDir)" "$(docdir)"))) '$(DESTDIR)$(ActualBinsDir)/$(CrossCompilePrefix)ghc-pkg' --global-package-db "$(DESTDIR)$(ActualLibsDir)/package.conf.d" recache install_mingw: @echo "Installing MingGW" $(INSTALL_DIR) "$(DESTDIR)$(prefix)/mingw" cp -R ./mingw "$(DESTDIR)$(prefix)" # END INSTALL # ----------------------------------------------------------------------