libgmp: remove dependency to libbarrelfish
[barrelfish] / lib / gmp / Hakefile
1 --------------------------------------------------------------------------
2 -- Copyright (c) 2016, ETH Zurich.
3 -- All rights reserved.
4 --
5 -- This file is distributed under the terms in the attached LICENSE file.
6 -- If you do not find this file, copies can be found by writing to:
7 -- ETH Zurich D-INFK, Universitaetsstrasse 6, CH-8092 Zurich. Attn: Systems Group.
8 --
9 -- Hakefile for /lib/gmp
10 --
11 --------------------------------------------------------------------------
12
13 let gmp_url = "https://gmplib.org/download/gmp/gmp-6.1.0.tar.bz2"
14     gmp_archive = "gmp-6.1.0.tar.bz2"
15
16     toDep x = case x of In treeref arch dir -> Dep treeref arch dir
17                         e -> ErrorMsg ("unknown type " ++ (show e))
18
19     extractFlags x = case x of Str s -> (not . Data.List.isPrefixOf "-W") s
20
21     quoteStr [] = []
22     quoteStr (h:t) = if h == '"' then "\\\"" ++ quoteStr t else h : quoteStr t
23
24     extraLink arch =
25         [ In InstallTree arch "/lib/crt0.o",
26           In InstallTree arch "/lib/crtbegin.o",
27           In InstallTree arch "/lib/libposixcompat.a" ]
28
29     -- We need to have absolute directories in here because gmp's make
30     -- descends into sub directories. With relative include path it
31     -- would not find its headers.
32
33     commonLinkFlags arch =
34         [ Str "-nostdlib",  NStr "-L", makeAbs $ NoDep BuildTree arch "/lib/" ] ++
35          [ Str "-Wl,--start-group" ]
36 -- The following line seems to add libbarrelfish as an dependency which
37 --
38 --        ++ (map makeAbs (optLibs (options arch)))
39 --        ++ (map makeAbs (extraLink arch))
40         ++
41         [
42             Str "-Wl,--end-group",
43 -- Enable the following flags for ld debugging
44 --            Str "-Wl,-verbose=2",
45 --            Str "-Wl,-t",
46 --            Str "-Wl,--no-demangle",
47             Str "-Wl,--warn-unresolved-symbols",
48             Str "-Wl,--allow-multiple-definition"
49         ]
50
51     compileCFLAGS arch =
52         Config.defines
53         ++ (filter extractFlags (optFlags (options arch)))
54         ++ concat [ [Str "-I",  makeAbs x ] | x <- optIncludes (options arch) ]
55
56     configureCFLAGS arch =
57         [ NStr "CFLAGS=\"" ]
58         ++ (compileCFLAGS arch)
59         ++ (commonLinkFlags arch)
60         ++ [ Str "\"" ]
61
62     envCFLAGS arch =
63         [ NStr "CFLAGS=\""]
64         ++ (compileCFLAGS arch)
65         ++ [ Str "\"" ]
66
67     envCC arch =
68         [ NStr "CC=\"" ]
69         ++ [Str (RuleDefs.compiler $ options arch)]
70         ++ [ Str "\"" ]
71
72     convertArch arch = case arch of
73         "x86_64"  -> "x86_64-unknown-none"
74         "k1om"    -> "k10-unknown-none"
75         "x86_32"  -> "x86-unknown-none"
76         "armv5"   -> "armv5-unknown-noneeabi"
77         "xscale"  -> "xscale-unknown-noneeabi"
78         "armv7"   -> "armv7-unknown-noneeabi"
79         "armv7-m" -> "armv7-unknown-noneeabi"
80         "armv8"   -> "armv8-unknown-noneeabi"
81         _         -> error "unknown arch " ++ arch
82
83     envLDFLAGS arch =
84         [ NStr "LDFLAGS=\"" ]
85         ++ (commonLinkFlags arch)
86         ++ [Str "\"" ]
87
88 in [ ] ++ (getExternalDependency gmp_url gmp_archive) ++
89     -- wget the file
90     -- outputs to $BUILDDIR/lib/gmp
91     concat [ [
92     -- untar into arch/lib/gmp
93     Rule ( [
94         Str "tar",
95         Str "xf",
96         -- Input argument without depending on it
97         NoDep BuildTree "" gmp_archive,
98         -- Expicitly pre-depend on it.
99         -- tar touches the archive and we don't want to extract it again on
100         -- every make invocation
101         PreDep BuildTree "" gmp_archive,
102         Str "-C",
103         NoDep BuildTree arch "",
104         Str "--strip-components=1",
105         Target arch "configure"
106         ]
107     ),
108
109     -- run configure
110     Rule ( [
111         -- this is tricky as configure produces Makefile in .
112         -- hence cd to the directory and run configure there
113         Target arch "config.h.orig",
114         Target arch "gmp.h",
115         Str "cd",
116         NoDep BuildTree arch "",
117         -- Make sure there is no space between backslash and new line, otherwise
118         -- sh will choke
119         NStr ";\\", NL,
120         Str "./configure",
121         NStr "\\", NL
122 -- It seems we don't need this.
123 --        Str $ envLDFLAGS arch,
124 --        NStr "\\", NL
125         ] ++ (envCC arch)
126         ++ [
127         NStr "\\", NL
128         ] ++ (configureCFLAGS arch) ++ [
129         NStr "\\", NL,
130         Str "--build=x86_64-pc-linux-gnu",
131         NStr "--host=",
132         Str $ convertArch arch,
133         -- Todo: This might depend on the architecture we're compiling for
134         Str "--enable-assembly=no",
135         Str "--disable-shared",
136         Dep BuildTree arch "configure",
137         NL,
138         -- Remove all link groups from Makefiles CFLAGS. Otherwise libtool is
139         -- confused.
140         Str "find",
141         NoDep BuildTree arch "",
142         Str "-name Makefile -type f -print0 | xargs -0",
143         NStr "\\", NL,
144         Str "sed -i.orig \"s/^\\(CFLAGS.*\\)-Wl,--start-group.*-Wl,--end-group\\(.*\\)$$/\\1 \\2/g\"",
145         NL,
146         -- configure thinks that we have OBSTACK, but we don't
147         Str "sed -i.orig s/HAVE_OBSTACK_VPRINTF/HAVE_OBSTACK_VPRINTF_nope/g",
148         Out arch "config.h"
149         ]
150 --      ++
151 --      (map toDep (optLibs (options arch)))
152 --        ++
153 --        (map toDep (extraLink arch))
154     ),
155     -- run make
156     Rule ( [
157         Str "$(MAKE) -e -C",
158         NoDep BuildTree arch "",
159         Target arch ".libs/libgmp.a",
160         Dep BuildTree arch "gmp.h",
161         Dep BuildTree arch "config.h",
162         Dep BuildTree arch "config.h.orig"
163         ]
164     ),
165     -- copy library to Barrelfish's library location
166     Rule ( [
167         Str "cp",
168         In BuildTree arch ".libs/libgmp.a",
169         Out arch $ libraryPath "gmp"
170         ]
171     )
172   ] | arch <- (allArchitectures Data.List.\\ [ "armv5" ]) ]