1# ----------------------------------------------------------------------------- 2# 3# (c) 2009-2012 The University of Glasgow 4# 5# This file is part of the GHC build system. 6# 7# To understand how the build system works and how to modify it, see 8# https://gitlab.haskell.org/ghc/ghc/wikis/building/architecture 9# https://gitlab.haskell.org/ghc/ghc/wikis/building/modifying 10# 11# ----------------------------------------------------------------------------- 12 13define shell-wrapper 14$(call trace, shell-wrapper($1,$2)) 15$(call profStart, shell-wrapper($1,$2)) 16# $1 = dir 17# $2 = distdir 18 19ifeq "$$($1_$2_SHELL_WRAPPER_NAME)" "" 20$1_$2_SHELL_WRAPPER_NAME = $1/$$($1_$2_PROGNAME).wrapper 21endif 22 23 24ifeq "$$($1_$2_WANT_INPLACE_WRAPPER)" "YES" 25 26$1_$2_INPLACE_SHELL_WRAPPER_NAME = $$($1_$2_PROG) 27 28ifeq "$$($1_$2_TOPDIR)" "YES" 29$1_$2_INPLACE_WRAPPER = $$(INPLACE_LIB)/bin/$$($1_$2_INPLACE_SHELL_WRAPPER_NAME) 30else 31$1_$2_INPLACE_WRAPPER = $$(INPLACE_BIN)/$$($1_$2_INPLACE_SHELL_WRAPPER_NAME) 32endif 33 34all_$1_$2 : $$($1_$2_INPLACE_WRAPPER) 35 36$(call clean-target,$1,$2_inplace_wrapper,$$($1_$2_INPLACE_WRAPPER)) 37 38$$($1_$2_INPLACE_WRAPPER): WRAPPER=$$@ 39ifeq "$$($1_$2_SHELL_WRAPPER)" "YES" 40$$($1_$2_INPLACE_WRAPPER): $$($1_$2_SHELL_WRAPPER_NAME) 41endif 42$$($1_$2_INPLACE_WRAPPER): $$($1_$2_INPLACE) 43 $$(call removeFiles, $$@) 44 echo '#!/bin/sh' >> $$@ 45 echo 'executablename="$$(TOP)/$$<"' >> $$@ 46 echo 'datadir="$$(TOP)/$$(INPLACE_LIB)"' >> $$@ 47 echo 'bindir="$$(TOP)/$$(INPLACE_BIN)"' >> $$@ 48 echo 'topdir="$$(TOP)/$$(INPLACE_TOPDIR)"' >> $$@ 49 echo 'pgmgcc="$$(CC)"' >> $$@ 50 $$($1_$2_SHELL_WRAPPER_EXTRA) 51 $$($1_$2_INPLACE_SHELL_WRAPPER_EXTRA) 52ifeq "$$(DYNAMIC_GHC_PROGRAMS)" "YES" 53 echo '$$(call prependLibraryPath,$$($1_$2_DEP_LIB_DIRS_SEARCHPATH))' >> $$@ 54endif 55ifeq "$$($1_$2_SHELL_WRAPPER)" "YES" 56 cat $$($1_$2_SHELL_WRAPPER_NAME) >> $$@ 57else 58 echo 'exec "$$$$executablename" $$$${1+"$$$$@"}' >> $$@ 59endif 60 $$(EXECUTABLE_FILE) $$@ 61 62endif # $1_$2_WANT_INPLACE_WRAPPER 63 64 65ifeq "$$($1_$2_WANT_INSTALLED_WRAPPER)" "YES" 66 67ifeq "$$($1_$2_INSTALL_SHELL_WRAPPER_NAME)" "" 68$1_$2_INSTALL_SHELL_WRAPPER_NAME = $$($1_$2_PROG) 69endif 70 71# Install the binary in $(ghclibexecdir), and install a shell wrapper in $(bindir) 72INSTALL_LIBEXECS += $1/$2/build/tmp/$$($1_$2_PROG) 73BINDIST_WRAPPERS += $$($1_$2_SHELL_WRAPPER_NAME) 74 75install: install_$1_$2_wrapper 76 77.PHONY: install_$1_$2_wrapper 78install_$1_$2_wrapper: WRAPPER=$$(DESTDIR)$$(bindir)/$(CrossCompilePrefix)$$($1_$2_INSTALL_SHELL_WRAPPER_NAME) 79install_$1_$2_wrapper: 80 $$(INSTALL_DIR) "$$(DESTDIR)$$(bindir)" 81 $$(call removeFiles, "$$(WRAPPER)") 82 $$(CREATE_SCRIPT) "$$(WRAPPER)" 83 echo '#!/bin/sh' >> "$$(WRAPPER)" 84 echo 'exedir="$$(ghclibexecdir)/bin"' >> "$$(WRAPPER)" 85 echo 'exeprog="$$($1_$2_PROG)"' >> "$$(WRAPPER)" 86 echo 'executablename="$$$$exedir/$$$$exeprog"' >> "$$(WRAPPER)" 87 echo 'datadir="$$(datadir)"' >> "$$(WRAPPER)" 88 echo 'bindir="$$(bindir)"' >> "$$(WRAPPER)" 89 echo 'topdir="$$(topdir)"' >> "$$(WRAPPER)" 90 $$($1_$2_SHELL_WRAPPER_EXTRA) 91 $$($1_$2_INSTALL_SHELL_WRAPPER_EXTRA) 92 cat $$($1_$2_SHELL_WRAPPER_NAME) >> "$$(WRAPPER)" 93 $$(EXECUTABLE_FILE) "$$(WRAPPER)" 94 95endif # $1_$2_WANT_INSTALLED_WRAPPER 96 97 98ifeq "$$($1_$2_WANT_BINDIST_WRAPPER)" "YES" 99ifneq "$$(TargetOS_CPP)" "mingw32" 100 101$1_$2_BINDIST_WRAPPER = $1/$2/build/tmp/$$($1_$2_PROGNAME)-bindist 102 103all_$1_$2 : $$($1_$2_BINDIST_WRAPPER) 104 105BINDIST_EXTRAS += $$($1_$2_BINDIST_WRAPPER) 106 107$$($1_$2_BINDIST_WRAPPER): $1/$2/build/tmp/$$($1_$2_PROG) 108 $$(call removeFiles, $$@) 109 echo '#!/bin/sh' >> $$@ 110ifeq "$$(DYNAMIC_GHC_PROGRAMS)" "YES" 111 echo '$$(call prependLibraryPath,$$($1_$2_DEP_LIB_REL_DIRS_SEARCHPATH))' >> $$@ 112endif 113 echo 'exec "$$<" $$$${1+"$$$$@"}' >> $$@ 114 $$(EXECUTABLE_FILE) $$@ 115 116endif 117endif # $1_$2_WANT_BINDIST_WRAPPER 118 119$(call profEnd, shell-wrapper($1,$2)) 120endef 121