b9991d77291e480244f7be663bbc38a2b285980c
[ghc.git] / testsuite / config / ghc
1 import re
2
3 # Testsuite configuration setup for GHC
4 #
5 # This file is Python source
6 #
7 config.compiler              = 'ghc'
8 config.compiler_always_flags = ghc_compiler_always_flags.split()
9
10 config.haddock               = 'haddock'
11 config.hp2ps                 = 'hp2ps'
12 config.hpc                   = 'hpc'
13 config.gs                    = 'gs'
14 config.confdir               = '.'
15
16 # By default, the 'normal' and 'hpc' ways are enabled. In addition, certain
17 # ways are enabled automatically if this GHC supports them. Ways that fall in
18 # this group are 'optasm', 'optllvm', 'profasm', 'threaded1', 'threaded2',
19 # 'profthreaded', 'ghci', and whichever of 'static/dyn' is not this GHC's
20 # default mode. Other ways should be set explicitly from .T files.
21 config.compile_ways       = ['normal', 'hpc']
22 config.run_ways           = ['normal', 'hpc']
23
24 # ways that are not enabled by default, but can always be invoked explicitly
25 config.other_ways         = ['prof', 'normal_h',
26                              'prof_hc_hb','prof_hb',
27                              'prof_hd','prof_hy','prof_hr',
28                              'sanity',
29                              'threaded1_ls', 'threaded2_hT', 'debug_numa',
30                              'llvm', 'debugllvm',
31                              'profllvm', 'profoptllvm', 'profthreadedllvm',
32                              'debug',
33                              'ghci-ext', 'ghci-ext-prof',
34                              'ext-interp']
35
36 if (ghc_with_native_codegen == 1):
37     config.compile_ways.append('optasm')
38     config.run_ways.append('optasm')
39
40 if config.have_profiling:
41     config.compile_ways.append('profasm')
42     config.run_ways.append('profasm')
43
44 if config.have_interp:
45     config.run_ways.append('ghci')
46
47 if (ghc_with_threaded_rts == 1):
48     config.run_ways.append('threaded1')
49     if (ghc_with_smp == 1):
50         config.have_smp = True
51         config.run_ways.append('threaded2')
52
53 if (ghc_with_dynamic_rts == 1):
54     config.have_shared_libs = True
55
56 if config.ghc_dynamic_by_default and config.have_vanilla == 1:
57     config.run_ways.append('static')
58 else:
59     if (ghc_with_dynamic_rts == 1):
60         config.run_ways.append('dyn')
61
62 if (config.have_profiling and ghc_with_threaded_rts == 1):
63     config.run_ways.append('profthreaded')
64
65 if (ghc_with_llvm == 1):
66     config.compile_ways.append('optllvm')
67     config.run_ways.append('optllvm')
68
69 config.way_flags = {
70     'normal'       : [],
71     'normal_h'     : [],
72     'g1'           : [],
73     'nursery_chunks' : [],
74     'debug_numa'   : ['-threaded', '-debug'],
75     'optasm'       : ['-O', '-fasm'],
76     'llvm'         : ['-fllvm'],
77     'optllvm'      : ['-O', '-fllvm'],
78     'debugllvm'    : ['-fllvm', '-keep-llvm-files'],
79     'prof'         : ['-prof', '-static', '-fprof-auto', '-fasm'],
80     'prof_no_auto' : ['-prof', '-static', '-fasm'],
81     'profasm'      : ['-O', '-prof', '-static', '-fprof-auto'],
82     'profthreaded' : ['-O', '-prof', '-static', '-fprof-auto', '-threaded'],
83     'ghci'         : ['--interactive', '-v0', '-ignore-dot-ghci', '-fno-ghci-history', '+RTS', '-I0.1', '-RTS'],
84     'sanity'       : ['-debug'],
85     'threaded1'    : ['-threaded', '-debug'],
86     'threaded1_ls' : ['-threaded', '-debug'],
87     'threaded2'    : ['-O', '-threaded', '-eventlog'],
88     'threaded2_hT' : ['-O', '-threaded'],
89     'hpc'          : ['-O', '-fhpc'],
90     'prof_hc_hb'   : ['-O', '-prof', '-static', '-fprof-auto'],
91     'prof_hb'      : ['-O', '-prof', '-static', '-fprof-auto'],
92     'prof_hd'      : ['-O', '-prof', '-static', '-fprof-auto'],
93     'prof_hy'      : ['-O', '-prof', '-static', '-fprof-auto'],
94     'prof_hr'      : ['-O', '-prof', '-static', '-fprof-auto'],
95     'dyn'          : ['-O', '-dynamic'],
96     'static'       : ['-O', '-static'],
97     'debug'        : ['-O', '-g', '-dannot-lint'],
98     # llvm variants...
99     'profllvm'         : ['-prof', '-static', '-fprof-auto', '-fllvm'],
100     'profoptllvm'      : ['-O', '-prof', '-static', '-fprof-auto', '-fllvm'],
101     'profthreadedllvm' : ['-O', '-prof', '-static', '-fprof-auto', '-threaded', '-fllvm'],
102     'ghci-ext'         : ['--interactive', '-v0', '-ignore-dot-ghci', '-fno-ghci-history', '-fexternal-interpreter', '+RTS', '-I0.1', '-RTS'],
103     'ghci-ext-prof'    : ['--interactive', '-v0', '-ignore-dot-ghci', '-fno-ghci-history', '-fexternal-interpreter', '-prof', '+RTS', '-I0.1', '-RTS'],
104     'ext-interp' : ['-fexternal-interpreter'],
105    }
106
107 config.way_rts_flags = {
108     'normal'       : [],
109     'normal_h'     : ['-h'], # works without -prof
110     'g1'           : ['-G1'],
111     'nursery_chunks' : ['-n32k'],
112     'debug_numa'   : ['-N2', '--debug-numa=2'],
113     'optasm'       : [],
114     'llvm'         : [],
115     'optllvm'      : [],
116     'debugllvm'    : [],
117     'prof'         : ['-p'],
118     'prof_no_auto' : ['-p'],
119     'profasm'      : ['-hc', '-p'], # test heap profiling too
120     'profthreaded' : ['-p'],
121     'ghci'         : [],
122     'sanity'       : ['-DS'],
123     'threaded1'    : [],
124     'threaded1_ls' : ['-ls'],
125     'threaded2'    : ['-N2 -ls'],
126     'threaded2_hT' : ['-N2', '-hT'],
127     'hpc'          : [],
128     'prof_hc_hb'   : ['-hc -hbvoid'],
129     'prof_hb'      : ['-hb'],
130     'prof_hd'      : ['-hd'],
131     'prof_hy'      : ['-hy'],
132     'prof_hr'      : ['-hr'],
133     'dyn'          : [],
134     'static'       : [],
135     'debug'        : [],
136     # llvm variants...
137     'profllvm'         : ['-p'],
138     'profoptllvm'      : ['-hc', '-p'],
139     'profthreadedllvm' : ['-p'],
140     'ghci-ext'         : [],
141     'ghci-ext-prof'    : [],
142     'ext-interp'       : [],
143    }
144
145 # Useful classes of ways that can be used with only_ways(), omit_ways() and
146 # expect_broken_for().
147
148 prof_ways     = [x[0] for x in config.way_flags.items()
149                       if '-prof' in x[1]]
150
151 threaded_ways = [x[0] for x in config.way_flags.items()
152                       if '-threaded' in x[1] or 'ghci' == x[0]]
153
154 opt_ways      = [x[0] for x in config.way_flags.items()
155                       if '-O' in x[1]]
156
157 llvm_ways     = [x[0] for x in config.way_flags.items()
158                       if '-fflvm' in x[1]]
159
160 def get_compiler_info():
161     s = getStdout([config.compiler, '--info']).decode('utf8')
162     s = re.sub('[\r\n]', '', s)
163     compilerInfoDict = dict(eval(s))
164     s = getStdout([config.compiler, '+RTS', '--info']).decode('utf8')
165     s = re.sub('[\r\n]', '', s)
166     rtsInfoDict = dict(eval(s))
167
168     # See Note [Replacing backward slashes in config.libdir].
169     config.libdir = compilerInfoDict['LibDir'].replace('\\', '/')
170
171     if re.match(".*_p(_.*|$)", rtsInfoDict["RTS way"]):
172         config.compiler_profiled = True
173     else:
174         config.compiler_profiled = False
175
176     try:
177         config.package_conf_cache_file = compilerInfoDict["Global Package DB"] + '/package.cache'
178     except:
179         config.package_conf_cache_file = ''
180
181     # See Note [WayFlags]
182     if config.ghc_dynamic:
183         config.ghc_th_way_flags = "-dynamic"
184         config.ghci_way_flags   = "-dynamic"
185         config.plugin_way_flags = "-dynamic"
186         config.ghc_th_way       = "dyn"
187         config.ghc_plugin_way   = "dyn"
188     elif config.compiler_profiled:
189         config.ghc_th_way_flags = "-prof"
190         config.ghci_way_flags   = "-prof"
191         config.plugin_way_flags = "-prof"
192         config.ghc_th_way       = "prof"
193         config.ghc_plugin_way   = "prof"
194     else:
195         config.ghc_th_way_flags = "-static"
196         config.ghci_way_flags   = "-static"
197         config.plugin_way_flags = "-static"
198         config.ghc_th_way       = "normal"
199         config.ghc_plugin_way   = "normal"
200
201 # Note [Replacing backward slashes in config.libdir]
202
203 # We *do* need to replace backslashes in config.libdir, for the following
204 # reason:
205 #
206 # * Tests use config.libdir as follows:
207 #
208 #     extra_run_opts('"' + config.libdir + '"')
209 #
210 #   The double quotes are there because config.libdir might contain
211 #   spaces.
212 #
213 # * This string is then written /as is/ to <testname>.genscript in
214 #   testlib.interpreter_run:
215 #
216 #     script.write(':set args ' + opts.extra_run_opts + '\n')
217 #
218 # * But GHCi expects the arguments to ':set args' to be proper Haskell
219 #   strings (when they are quoted), with backslashes escaped. Since
220 #   config.libdir contains single backslash characters, tests such as T5313
221 #   will fail for WAY=ghci with "Pattern match failure in do expression".
222 #
223 # Arguably the above code for writing `:set args` should be smarter. This
224 # is tricky to get right though, because in GHCI `:set args foo\bar` (no
225 # double quotes) works perfectly fine, and is interpreted as the Haskell
226 # string "foo\\bar". Therfore, simply escaping all backward slashes in
227 # opts.extra_run_opts before concatenating it with ':set args' is not right
228 # either.
229 #
230 # Replacing backslashes to forward slashes in config.libdir works around the
231 # problem.