678cc56bc5dc50c5f0d34f62d14ae89408ffa903
[ghc.git] / testsuite / config / ghc
1 import re
2 import subprocess
3
4 # Testsuite configuration setup for GHC
5 #
6 # This file is Python source
7 #
8 config.compiler              = 'ghc'
9 config.compiler_always_flags = ghc_compiler_always_flags.split()
10
11 config.haddock               = 'haddock'
12 config.hp2ps                 = 'hp2ps'
13 config.hpc                   = 'hpc'
14 config.gs                    = 'gs'
15 config.confdir               = '.'
16
17 # By default, the 'normal' and 'hpc' ways are enabled. In addition, certain
18 # ways are enabled automatically if this GHC supports them. Ways that fall in
19 # this group are 'optasm', 'optllvm', 'profasm', 'threaded1', 'threaded2',
20 # 'profthreaded', 'ghci', and whichever of 'static/dyn' is not this GHC's
21 # default mode. Other ways should be set explicitly from .T files.
22 config.compile_ways       = ['normal', 'hpc']
23 config.run_ways           = ['normal', 'hpc']
24
25 # ways that are not enabled by default, but can always be invoked explicitly
26 config.other_ways         = ['prof', 'normal_h',
27                              'prof_hc_hb','prof_hb',
28                              'prof_hd','prof_hy','prof_hr',
29                              'threaded1_ls', 'threaded2_hT', 'debug_numa',
30                              'llvm', 'debugllvm',
31                              'profllvm', 'profoptllvm', 'profthreadedllvm',
32                              'debug',
33                              'ghci-ext']
34
35 if (ghc_with_native_codegen == 1):
36     config.compile_ways.append('optasm')
37     config.run_ways.append('optasm')
38
39 config.compiler_debugged = ghc_debugged
40
41 if (ghc_with_vanilla == 1):
42     config.have_vanilla = True
43
44 if (ghc_with_dynamic == 1):
45     config.have_dynamic = True
46
47 if (ghc_with_profiling == 1):
48     config.have_profiling = True
49     config.compile_ways.append('profasm')
50     config.run_ways.append('profasm')
51
52 if (ghc_with_interpreter == 1):
53     config.have_interp = True
54     config.run_ways.append('ghci')
55
56 config.unregisterised = (ghc_unregisterised == 1)
57
58 if (ghc_with_threaded_rts == 1):
59     config.run_ways.append('threaded1')
60     if (ghc_with_smp == 1):
61         config.have_smp = True
62         config.run_ways.append('threaded2')
63
64 if (ghc_with_dynamic_rts == 1):
65     config.have_shared_libs = True
66
67 config.ghc_dynamic_by_default = ghc_dynamic_by_default
68 if ghc_dynamic_by_default and ghc_with_vanilla == 1:
69     config.run_ways.append('static')
70 else:
71     if (ghc_with_dynamic_rts == 1):
72         config.run_ways.append('dyn')
73
74 config.ghc_dynamic = ghc_dynamic
75
76 if (ghc_with_profiling == 1 and ghc_with_threaded_rts == 1):
77     config.run_ways.append('profthreaded')
78
79 if (ghc_with_llvm == 1):
80     config.compile_ways.append('optllvm')
81     config.run_ways.append('optllvm')
82
83 config.in_tree_compiler = in_tree_compiler
84 config.cleanup          = cleanup
85
86 config.way_flags = lambda name : {
87     'normal'       : [],
88     'normal_h'     : [],
89     'g1'           : [],
90     'nursery_chunks' : [],
91     'debug_numa'   : ['-threaded', '-debug'],
92     'optasm'       : ['-O', '-fasm'],
93     'llvm'         : ['-fllvm'],
94     'optllvm'      : ['-O', '-fllvm'],
95     'debugllvm'    : ['-fllvm', '-keep-llvm-files'],
96     'prof'         : ['-prof', '-static', '-fprof-auto', '-fasm'],
97     'profasm'      : ['-O', '-prof', '-static', '-fprof-auto'],
98     'profthreaded' : ['-O', '-prof', '-static', '-fprof-auto', '-threaded'],
99     'ghci'         : ['--interactive', '-v0', '-ignore-dot-ghci', '+RTS', '-I0.1', '-RTS'],
100     'threaded1'    : ['-threaded', '-debug'],
101     'threaded1_ls' : ['-threaded', '-debug'],
102     'threaded2'    : ['-O', '-threaded', '-eventlog'],
103     'threaded2_hT' : ['-O', '-threaded'],
104     'hpc'          : ['-O', '-fhpc', '-hpcdir', '.hpc.' + name ],
105     'prof_hc_hb'   : ['-O', '-prof', '-static', '-fprof-auto'],
106     'prof_hb'      : ['-O', '-prof', '-static', '-fprof-auto'],
107     'prof_hd'      : ['-O', '-prof', '-static', '-fprof-auto'],
108     'prof_hy'      : ['-O', '-prof', '-static', '-fprof-auto'],
109     'prof_hr'      : ['-O', '-prof', '-static', '-fprof-auto'],
110     'dyn'          : ['-O', '-dynamic'],
111     'static'       : ['-O', '-static'],
112     'debug'        : ['-O', '-g', '-dannot-lint'],
113     # llvm variants...
114     'profllvm'         : ['-prof', '-static', '-fprof-auto', '-fllvm'],
115     'profoptllvm'      : ['-O', '-prof', '-static', '-fprof-auto', '-fllvm'],
116     'profthreadedllvm' : ['-O', '-prof', '-static', '-fprof-auto', '-threaded', '-fllvm'],
117     'ghci-ext'         : ['--interactive', '-v0', '-ignore-dot-ghci', '-fexternal-interpreter', '+RTS', '-I0.1', '-RTS'],
118    }
119
120 config.way_rts_flags = {
121     'normal'       : [],
122     'normal_h'     : ['-h'], # works without -prof
123     'g1'           : ['-G1'],
124     'nursery_chunks' : ['-n32k'],
125     'debug_numa'   : ['-N2', '--debug-numa=2'],
126     'optasm'       : [],
127     'llvm'         : [],
128     'optllvm'      : [],
129     'debugllvm'    : [],
130     'prof'         : ['-p'],
131     'profasm'      : ['-hc', '-p'], # test heap profiling too
132     'profthreaded' : ['-p'],
133     'ghci'         : [],
134     'threaded1'    : [],
135     'threaded1_ls' : ['-ls'],
136     'threaded2'    : ['-N2 -ls'],
137     'threaded2_hT' : ['-N2', '-hT'],
138     'hpc'          : [],
139     'prof_hc_hb'   : ['-hc -hbvoid'],
140     'prof_hb'      : ['-hb'],
141     'prof_hd'      : ['-hd'],
142     'prof_hy'      : ['-hy'],
143     'prof_hr'      : ['-hr'],
144     'dyn'          : [],
145     'static'       : [],
146     'debug'        : [],
147     # llvm variants...
148     'profllvm'         : ['-p'],
149     'profoptllvm'      : ['-hc', '-p'],
150     'profthreadedllvm' : ['-p'],
151     'ghci-ext'         : [],
152    }
153
154 # Useful classes of ways that can be used with only_ways(), omit_ways() and
155 # expect_broken_for().
156
157 prof_ways     = [x[0] for x in config.way_flags('dummy_name').items()
158                       if '-prof' in x[1]]
159
160 threaded_ways = [x[0] for x in config.way_flags('dummy_name').items()
161                       if '-threaded' in x[1] or 'ghci' == x[0]]
162
163 opt_ways      = [x[0] for x in config.way_flags('dummy_name').items()
164                       if '-O' in x[1]]
165
166 llvm_ways     = [x[0] for x in config.way_flags('dummy_name').items()
167                       if '-fflvm' in x[1]]
168
169 def get_compiler_info():
170     s = getStdout([config.compiler, '--info']).decode('utf8')
171     s = re.sub('[\r\n]', '', s)
172     compilerInfoDict = dict(eval(s))
173     s = getStdout([config.compiler, '+RTS', '--info']).decode('utf8')
174     s = re.sub('[\r\n]', '', s)
175     rtsInfoDict = dict(eval(s))
176
177     config.libdir = compilerInfoDict['LibDir']
178
179     v = compilerInfoDict["Project version"]
180     config.compiler_version = v
181     config.compiler_maj_version = re.sub('^([0-9]+\.[0-9]+).*',r'\1', v)
182
183     # -fno-ghci-history was added in 7.3
184     if version_ge(config.compiler_version, '7.3'):
185        config.compiler_always_flags = \
186           config.compiler_always_flags + ['-fno-ghci-history']
187
188     if re.match(".*_p(_.*|$)", rtsInfoDict["RTS way"]):
189         config.compiler_profiled = True
190     else:
191         config.compiler_profiled = False
192
193     try:
194         config.package_conf_cache_file = compilerInfoDict["Global Package DB"] + '/package.cache'
195     except:
196         config.package_conf_cache_file = ''
197
198     try:
199         if compilerInfoDict["GHC Dynamic"] == "YES":
200             ghcDynamic = True
201         elif compilerInfoDict["GHC Dynamic"] == "NO":
202             ghcDynamic = False
203         else:
204             raise 'Bad value for "GHC Dynamic"'
205     except KeyError:
206         # GHC < 7.7 doesn't have a "GHC Dynamic" field
207         ghcDynamic = False
208
209     # See Note [WayFlags]
210     if ghcDynamic:
211         config.ghc_th_way_flags = "-dynamic"
212         config.ghci_way_flags   = "-dynamic"
213         config.plugin_way_flags = "-dynamic"
214         config.ghc_th_way       = "dyn"
215         config.ghc_plugin_way   = "dyn"
216     elif config.compiler_profiled:
217         config.ghc_th_way_flags = "-prof"
218         config.ghci_way_flags   = "-prof"
219         config.plugin_way_flags = "-prof"
220         config.ghc_th_way       = "prof"
221         config.ghc_plugin_way   = "prof"
222     else:
223         config.ghc_th_way_flags = "-static"
224         config.ghci_way_flags   = "-static"
225         config.plugin_way_flags = "-static"
226         config.ghc_th_way       = "normal"
227         config.ghc_plugin_way   = "normal"