summaryrefslogtreecommitdiff
blob: 1439d722fef435c077ab8b67bb92493688ed0990 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
commit 54895c90440cb81f18657537b91f2aa35bd54173
Author: Sergei Trofimovich <slyfox@gentoo.org>
Date:   Fri Apr 7 10:08:58 2017 +0100

    fix 'make install' for cross-stage2
    
    When cross-built GHC is being installed one of
    latest steps is to register installed libraries
    with 'ghc-pkg'.
    
    GHC uses freshly installed 'ghc-pkg' and 'ghc-stage2'
    for that.
    
    Tested as:
        ./configure --target=aarch64-unknown-linux-gnu
        make install DESTDIR=$(pwd)/__s2 STRIP_CMD=:
    
    Before the change install failed on ghc-pkg execution phase:
    
        ".../ghc-cross/__s2/usr/local/lib/ghc-8.3.20170406/bin/ghc-pkg" \
            --force \
            --global-package-db \
            ".../ghc-cross/__s2/usr/local/lib/ghc-8.3.20170406/package.conf.d" \
            update rts/dist/package.conf.install
        /bin/sh: .../ghc-cross/__s2/usr/local/lib/ghc-8.3.20170406/bin/ghc-pkg: \
            No such file or directory
    
    To avoid breakage we use 'ghc' and 'ghc-pkg' built by stage0.
    
    Signed-off-by: Sergei Trofimovich <slyfox@gentoo.org>
    
    Test Plan: run 'make install' on stage2 crosscompiler
    
    Reviewers: rwbarton, austin, bgamari
    
    Subscribers: thomie, snowleopard
    
    Differential Revision: https://phabricator.haskell.org/D3432

diff --git a/ghc.mk b/ghc.mk
index caa6c38fbb..8971f25981 100644
--- a/ghc.mk
+++ b/ghc.mk
@@ -962,6 +962,12 @@ endif
 
 INSTALLED_PACKAGE_CONF=$(DESTDIR)$(topdir)/package.conf.d
 
+ifeq "$(CrossCompiling)" "YES"
+# when installing ghc-stage2 we can't run target's
+# 'ghc-pkg' and 'ghc-stage2' but those are needed for registration.
+INSTALLED_GHC_REAL=$(TOP)/inplace/bin/ghc-stage1
+INSTALLED_GHC_PKG_REAL=$(TOP)/$(ghc-pkg_DIST_BINARY)
+else # CrossCompiling
 # Install packages in the right order, so that ghc-pkg doesn't complain.
 # Also, install ghc-pkg first.
 ifeq "$(Windows_Host)" "NO"
@@ -971,6 +977,7 @@ else
 INSTALLED_GHC_REAL=$(DESTDIR)$(bindir)/ghc.exe
 INSTALLED_GHC_PKG_REAL=$(DESTDIR)$(bindir)/ghc-pkg.exe
 endif
+endif # CrossCompiling
 
 # Set the INSTALL_DISTDIR_p for each package; compiler is special
 $(foreach p,$(filter-out compiler,$(INSTALL_PACKAGES)),\
diff --git a/utils/ghc-pkg/ghc.mk b/utils/ghc-pkg/ghc.mk
index 002c8122f2..4d5ef4e108 100644
--- a/utils/ghc-pkg/ghc.mk
+++ b/utils/ghc-pkg/ghc.mk
@@ -49,6 +49,12 @@ utils/ghc-pkg_dist_PROGNAME = ghc-pkg
 utils/ghc-pkg_dist_SHELL_WRAPPER = YES
 utils/ghc-pkg_dist_INSTALL_INPLACE = YES
 
+# When cross-built ghc-stage2 is installed 'make install' needs to call
+# native ghc-pkg (not the cross-built one) to register installed packages
+# 'ghc-pkg_DIST_BINARY' variable only refer to native binary.
+ghc-pkg_DIST_BINARY_NAME = ghc-pkg$(exeext0)
+ghc-pkg_DIST_BINARY = utils/ghc-pkg/dist/build/tmp/$(ghc-pkg_DIST_BINARY_NAME)
+
 # See Note [Stage1Only vs stage=1] in mk/config.mk.in.
 ifeq "$(Stage1Only)" "YES"
 # Install the copy of ghc-pkg from the dist directory when running 'make