xref: /llvm-project/clang/test/Driver/config-file3.c (revision 0cbdad4bd2396b740742d9ae94cba7d7b8a32cb5)
1 // REQUIRES: shell
2 // REQUIRES: x86-registered-target
3 
4 // RUN: unset CLANG_NO_DEFAULT_CONFIG
5 // RUN: rm -rf %t && mkdir %t
6 
7 //--- If config file is specified by relative path (workdir/cfg-s2), it is searched for by that path.
8 
9 // RUN: mkdir -p %t/workdir/subdir
10 // RUN: echo "@subdir/cfg-s2" > %t/workdir/cfg-1
11 // RUN: echo "-Wundefined-var-template" > %t/workdir/subdir/cfg-s2
12 //
13 // RUN: ( cd %t && %clang --config=workdir/cfg-1 -c -### %s 2>&1 | FileCheck %s -check-prefix CHECK-REL )
14 //
15 // CHECK-REL: Configuration file: {{.*}}/workdir/cfg-1
16 // CHECK-REL: -Wundefined-var-template
17 
18 //--- Config files are searched for in binary directory as well.
19 //
20 // RUN: mkdir %t/testbin
21 // RUN: ln -s %clang %t/testbin/clang
22 // RUN: echo "-Werror" > %t/testbin/aaa.cfg
23 // RUN: %t/testbin/clang --config-system-dir= --config-user-dir= --config=aaa.cfg -c -no-canonical-prefixes -### %s 2>&1 | FileCheck %s -check-prefix CHECK-BIN
24 //
25 // CHECK-BIN: Configuration file: {{.*}}/testbin/aaa.cfg
26 // CHECK-BIN: -Werror
27 
28 //--- Invocation x86_64-unknown-linux-gnu-clang-g++ tries x86_64-unknown-linux-gnu-clang++.cfg first.
29 //
30 // RUN: mkdir %t/testdmode
31 // RUN: ln -s %clang %t/testdmode/cheribsd-riscv64-hybrid-clang++
32 // RUN: ln -s %clang %t/testdmode/qqq-clang-g++
33 // RUN: ln -s %clang %t/testdmode/x86_64-clang
34 // RUN: ln -s %clang %t/testdmode/i386-unknown-linux-gnu-clang-g++
35 // RUN: ln -s %clang %t/testdmode/x86_64-unknown-linux-gnu-clang-g++
36 // RUN: ln -s %clang %t/testdmode/x86_64-unknown-linux-gnu-clang
37 // RUN: touch %t/testdmode/cheribsd-riscv64-hybrid-clang++.cfg
38 // RUN: touch %t/testdmode/cheribsd-riscv64-hybrid.cfg
39 // RUN: touch %t/testdmode/qqq-clang-g++.cfg
40 // RUN: touch %t/testdmode/qqq.cfg
41 // RUN: touch %t/testdmode/x86_64-clang.cfg
42 // RUN: touch %t/testdmode/x86_64.cfg
43 // RUN: touch %t/testdmode/x86_64-unknown-linux-gnu-clang++.cfg
44 // RUN: touch %t/testdmode/x86_64-unknown-linux-gnu-clang-g++.cfg
45 // RUN: touch %t/testdmode/x86_64-unknown-linux-gnu-clang.cfg
46 // RUN: touch %t/testdmode/x86_64-unknown-linux-gnu.cfg
47 // RUN: touch %t/testdmode/i386-unknown-linux-gnu-clang++.cfg
48 // RUN: touch %t/testdmode/i386-unknown-linux-gnu-clang-g++.cfg
49 // RUN: touch %t/testdmode/i386-unknown-linux-gnu-clang.cfg
50 // RUN: touch %t/testdmode/i386-unknown-linux-gnu.cfg
51 // RUN: touch %t/testdmode/clang++.cfg
52 // RUN: touch %t/testdmode/clang-g++.cfg
53 // RUN: touch %t/testdmode/clang.cfg
54 // RUN: %t/testdmode/x86_64-unknown-linux-gnu-clang-g++ --config-system-dir= --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix FULL1 --implicit-check-not 'Configuration file:'
55 //
56 // FULL1: Configuration file: {{.*}}/testdmode/x86_64-unknown-linux-gnu-clang++.cfg
57 
58 //--- -m32 overrides triple.
59 //
60 // RUN: %t/testdmode/x86_64-unknown-linux-gnu-clang-g++ -m32 --config-system-dir= --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix FULL1-I386 --implicit-check-not 'Configuration file:'
61 //
62 // FULL1-I386: Configuration file: {{.*}}/testdmode/i386-unknown-linux-gnu-clang++.cfg
63 
64 //--- --target= also works for overriding triple.
65 //
66 // RUN: %t/testdmode/x86_64-unknown-linux-gnu-clang-g++ --target=i386-unknown-linux-gnu --config-system-dir= --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix FULL1-I386 --implicit-check-not 'Configuration file:'
67 
68 //--- With --target= + -m64, -m64 takes precedence.
69 //
70 // RUN: %t/testdmode/x86_64-unknown-linux-gnu-clang-g++ --target=i386-unknown-linux-gnu -m64 --config-system-dir= --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix FULL1 --implicit-check-not 'Configuration file:'
71 
72 //--- i386 prefix also works for 32-bit.
73 //
74 // RUN: %t/testdmode/i386-unknown-linux-gnu-clang-g++ --config-system-dir= --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix FULL1-I386 --implicit-check-not 'Configuration file:'
75 
76 //--- i386 prefix + -m64 also works for 64-bit.
77 //
78 // RUN: %t/testdmode/i386-unknown-linux-gnu-clang-g++ -m64 --config-system-dir= --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix FULL1 --implicit-check-not 'Configuration file:'
79 
80 //--- File specified by --config= is loaded after the one inferred from the executable.
81 //
82 // RUN: %t/testdmode/x86_64-unknown-linux-gnu-clang-g++ --config-system-dir=%S/Inputs/config --config-user-dir= --config=i386-qqq.cfg -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix EXPLICIT --implicit-check-not 'Configuration file:'
83 //
84 // EXPLICIT: Configuration file: {{.*}}/testdmode/x86_64-unknown-linux-gnu-clang++.cfg
85 // EXPLICIT-NEXT: Configuration file: {{.*}}/Inputs/config/i386-qqq.cfg
86 
87 //--- --no-default-config --config= loads only specified file.
88 //
89 // RUN: %t/testdmode/x86_64-unknown-linux-gnu-clang-g++ --config-system-dir=%S/Inputs/config --config-user-dir= --no-default-config --config=i386-qqq.cfg -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix EXPLICIT-ONLY --implicit-check-not 'Configuration file:'
90 //
91 // EXPLICIT-ONLY: Configuration file: {{.*}}/Inputs/config/i386-qqq.cfg
92 
93 //--- --no-default-config disables default filenames.
94 //
95 // RUN: %t/testdmode/x86_64-unknown-linux-gnu-clang-g++ --config-system-dir=%S/Inputs/config --config-user-dir= --no-default-config -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix NO-CONFIG
96 //
97 // NO-CONFIG-NOT: Configuration file:
98 
99 //--- --driver-mode= is respected.
100 //
101 // RUN: %t/testdmode/x86_64-unknown-linux-gnu-clang-g++ --driver-mode=gcc --config-system-dir= --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix FULL1-GCC --implicit-check-not 'Configuration file:'
102 //
103 // FULL1-GCC: Configuration file: {{.*}}/testdmode/x86_64-unknown-linux-gnu-clang.cfg
104 
105 //--- "clang" driver symlink should yield the "*-clang" configuration file.
106 //
107 // RUN: %t/testdmode/x86_64-unknown-linux-gnu-clang --config-system-dir= --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix FULL1-GCC --implicit-check-not 'Configuration file:'
108 
109 //--- "clang" + --driver-mode= should yield "*-clang++".
110 //
111 // RUN: %t/testdmode/x86_64-unknown-linux-gnu-clang --driver-mode=g++ --config-system-dir= --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix FULL1 --implicit-check-not 'Configuration file:'
112 
113 //--- Clang started via name prefix that is not valid is forcing that prefix instead of target triple.
114 //
115 // RUN: %t/testdmode/qqq-clang-g++ --config-system-dir= --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix QQQ --implicit-check-not 'Configuration file:'
116 //
117 // QQQ: Configuration file: {{.*}}/testdmode/qqq-clang-g++.cfg
118 
119 //--- Explicit --target= overrides the triple even with non-standard name prefix.
120 //
121 // RUN: %t/testdmode/qqq-clang-g++ --target=x86_64-unknown-linux-gnu --config-system-dir= --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix FULL1 --implicit-check-not 'Configuration file:'
122 
123 //--- "x86_64" prefix does not form a valid triple either.
124 //
125 // RUN: %t/testdmode/x86_64-clang --config-system-dir= --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix X86_64 --implicit-check-not 'Configuration file:'
126 //
127 // X86_64: Configuration file: {{.*}}/testdmode/x86_64-clang.cfg
128 
129 //--- Try cheribsd prefix using misordered triple components.
130 //
131 // RUN: %t/testdmode/cheribsd-riscv64-hybrid-clang++ --config-system-dir= --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix CHERIBSD --implicit-check-not 'Configuration file:'
132 //
133 // CHERIBSD: Configuration file: {{.*}}/testdmode/cheribsd-riscv64-hybrid-clang++.cfg
134 
135 //--- Test fallback to x86_64-unknown-linux-gnu-clang-g++.cfg.
136 //
137 // RUN: rm %t/testdmode/x86_64-unknown-linux-gnu-clang++.cfg
138 // RUN: rm %t/testdmode/i386-unknown-linux-gnu-clang++.cfg
139 // RUN: %t/testdmode/x86_64-unknown-linux-gnu-clang-g++ --config-system-dir= --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix FULL2 --implicit-check-not 'Configuration file:'
140 //
141 // FULL2: Configuration file: {{.*}}/testdmode/x86_64-unknown-linux-gnu-clang-g++.cfg
142 
143 //--- FULL2 + -m32.
144 //
145 // RUN: %t/testdmode/x86_64-unknown-linux-gnu-clang-g++ -m32 --config-system-dir= --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix FULL2-I386 --implicit-check-not 'Configuration file:'
146 //
147 // FULL2-I386: Configuration file: {{.*}}/testdmode/i386-unknown-linux-gnu-clang-g++.cfg
148 
149 //--- Test fallback to x86_64-unknown-linux-gnu-clang.cfg + clang++.cfg.
150 //
151 // RUN: rm %t/testdmode/cheribsd-riscv64-hybrid-clang++.cfg
152 // RUN: rm %t/testdmode/qqq-clang-g++.cfg
153 // RUN: rm %t/testdmode/x86_64-clang.cfg
154 // RUN: rm %t/testdmode/x86_64-unknown-linux-gnu-clang-g++.cfg
155 // RUN: rm %t/testdmode/i386-unknown-linux-gnu-clang-g++.cfg
156 // RUN: rm %t/testdmode/x86_64-unknown-linux-gnu-clang.cfg
157 // RUN: rm %t/testdmode/i386-unknown-linux-gnu-clang.cfg
158 // RUN: %t/testdmode/x86_64-unknown-linux-gnu-clang-g++ --config-system-dir= --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix FULL3 --implicit-check-not 'Configuration file:'
159 //
160 // FULL3: Configuration file: {{.*}}/testdmode/clang++.cfg
161 // FULL3: Configuration file: {{.*}}/testdmode/x86_64-unknown-linux-gnu.cfg
162 
163 //--- FULL3 + -m32.
164 //
165 // RUN: %t/testdmode/x86_64-unknown-linux-gnu-clang-g++ -m32 --config-system-dir= --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix FULL3-I386 --implicit-check-not 'Configuration file:'
166 //
167 // FULL3-I386: Configuration file: {{.*}}/testdmode/clang++.cfg
168 // FULL3-I386: Configuration file: {{.*}}/testdmode/i386-unknown-linux-gnu.cfg
169 
170 //--- FULL3 + --driver-mode=.
171 //
172 // RUN: %t/testdmode/x86_64-unknown-linux-gnu-clang-g++ --driver-mode=gcc --config-system-dir= --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix FULL3-GCC --implicit-check-not 'Configuration file:'
173 //
174 // FULL3-GCC: Configuration file: {{.*}}/testdmode/clang.cfg
175 // FULL3-GCC: Configuration file: {{.*}}/testdmode/x86_64-unknown-linux-gnu.cfg
176 
177 //--- QQQ fallback.
178 //
179 // RUN: %t/testdmode/qqq-clang-g++ --config-system-dir= --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix QQQ-FALLBACK --implicit-check-not 'Configuration file:'
180 //
181 // QQQ-FALLBACK: Configuration file: {{.*}}/testdmode/clang++.cfg
182 // QQQ-FALLBACK: Configuration file: {{.*}}/testdmode/qqq.cfg
183 
184 //--- "x86_64" falback.
185 //
186 // RUN: %t/testdmode/x86_64-clang --config-system-dir= --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix X86_64-FALLBACK --implicit-check-not 'Configuration file:'
187 //
188 // X86_64-FALLBACK: Configuration file: {{.*}}/testdmode/clang.cfg
189 // X86_64-FALLBACK: Configuration file: {{.*}}/testdmode/x86_64.cfg
190 
191 //--- cheribsd fallback.
192 //
193 // RUN: %t/testdmode/cheribsd-riscv64-hybrid-clang++ --config-system-dir= --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix CHERIBSD-FALLBACK --implicit-check-not 'Configuration file:'
194 //
195 // CHERIBSD-FALLBACK: Configuration file: {{.*}}/testdmode/clang++.cfg
196 // CHERIBSD-FALLBACK: Configuration file: {{.*}}/testdmode/cheribsd-riscv64-hybrid.cfg
197 
198 //--- Test fallback to x86_64-unknown-linux-gnu.cfg + clang-g++.cfg.
199 //
200 // RUN: rm %t/testdmode/clang++.cfg
201 // RUN: %t/testdmode/x86_64-unknown-linux-gnu-clang-g++ --config-system-dir= --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix FULL4 --implicit-check-not 'Configuration file:'
202 //
203 // FULL4: Configuration file: {{.*}}/testdmode/clang-g++.cfg
204 // FULL4: Configuration file: {{.*}}/testdmode/x86_64-unknown-linux-gnu.cfg
205 
206 //--- Test fallback to clang-g++.cfg if x86_64-unknown-linux-gnu-clang.cfg does not exist.
207 //
208 // RUN: rm %t/testdmode/x86_64-unknown-linux-gnu.cfg
209 // RUN: rm %t/testdmode/i386-unknown-linux-gnu.cfg
210 // RUN: %t/testdmode/x86_64-unknown-linux-gnu-clang-g++ --config-system-dir= --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix FULL5 --implicit-check-not 'Configuration file:'
211 //
212 // FULL5: Configuration file: {{.*}}/testdmode/clang-g++.cfg
213 
214 //--- FULL5 + -m32.
215 //
216 // RUN: %t/testdmode/x86_64-unknown-linux-gnu-clang-g++ -m32 --config-system-dir= --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix FULL5-I386 --implicit-check-not 'Configuration file:'
217 //
218 // FULL5-I386: Configuration file: {{.*}}/testdmode/clang-g++.cfg
219 
220 //--- Test that incorrect driver mode config file is not used.
221 //
222 // RUN: rm %t/testdmode/clang-g++.cfg
223 // RUN: %t/testdmode/x86_64-unknown-linux-gnu-clang-g++ --config-system-dir= --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix NO-CONFIG
224 
225 //--- Tilde expansion in user configuration file directory
226 //
227 // RUN: HOME=%S/Inputs/config %clang -### --config-user-dir=~ -v 2>&1 | FileCheck %s --check-prefix=CHECK-TILDE
228 // CHECK-TILDE: User configuration file directory: {{.*}}/Inputs/config
229 
230 //--- Fallback to stripping OS versions
231 //
232 // RUN: touch %t/testdmode/x86_64-apple-darwin23.6.0-clang.cfg
233 // RUN: touch %t/testdmode/x86_64-apple-darwin23-clang.cfg
234 // RUN: touch %t/testdmode/x86_64-apple-darwin-clang.cfg
235 // RUN: %clang -target x86_64-apple-darwin23.6.0 --config-system-dir=%t/testdmode --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix DARWIN --implicit-check-not 'Configuration file:'
236 //
237 // DARWIN: Configuration file: {{.*}}/testdmode/x86_64-apple-darwin23.6.0-clang.cfg
238 
239 //--- DARWIN + no full version
240 //
241 // RUN: rm %t/testdmode/x86_64-apple-darwin23.6.0-clang.cfg
242 // RUN: %clang -target x86_64-apple-darwin23.6.0 --config-system-dir=%t/testdmode --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix DARWIN-MAJOR --implicit-check-not 'Configuration file:'
243 //
244 // DARWIN-MAJOR: Configuration file: {{.*}}/testdmode/x86_64-apple-darwin23-clang.cfg
245 
246 //--- DARWIN + no version
247 //
248 // RUN: rm %t/testdmode/x86_64-apple-darwin23-clang.cfg
249 // RUN: %clang -target x86_64-apple-darwin23.6.0 --config-system-dir=%t/testdmode --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix DARWIN-VERSIONLESS --implicit-check-not 'Configuration file:'
250 //
251 // DARWIN-VERSIONLESS: Configuration file: {{.*}}/testdmode/x86_64-apple-darwin-clang.cfg
252