Raw
1 #!/bin/sh
2
3 die () {
4 echo "$*" >&2
5 exit 1
6 }
7
8 cd "$(dirname "$0")"/../.. ||
9 die "Could not cd to top-level directory"
10
11 mkdir -p .vscode ||
12 die "Could not create .vscode/"
13
14 # General settings
15
16 cat >.vscode/settings.json.new <<\EOF ||
17 {
18 "C_Cpp.intelliSenseEngine": "Default",
19 "C_Cpp.intelliSenseEngineFallback": "Disabled",
20 "[git-commit]": {
21 "editor.wordWrap": "wordWrapColumn",
22 "editor.wordWrapColumn": 72
23 },
24 "[c]": {
25 "editor.detectIndentation": false,
26 "editor.insertSpaces": false,
27 "editor.tabSize": 8,
28 "files.trimTrailingWhitespace": true
29 },
30 "[txt]": {
31 "editor.detectIndentation": false,
32 "editor.insertSpaces": false,
33 "editor.tabSize": 8,
34 "files.trimTrailingWhitespace": true
35 },
36 "files.associations": {
37 "*.h": "c",
38 "*.c": "c"
39 },
40 "cSpell.ignorePaths": [
41 ],
42 "cSpell.words": [
43 "DATAW",
44 "DBCACHED",
45 "DFCHECK",
46 "DTYPE",
47 "Hamano",
48 "HCAST",
49 "HEXSZ",
50 "HKEY",
51 "HKLM",
52 "IFGITLINK",
53 "IFINVALID",
54 "ISBROKEN",
55 "ISGITLINK",
56 "ISSYMREF",
57 "Junio",
58 "LPDWORD",
59 "LPPROC",
60 "LPWSTR",
61 "MSVCRT",
62 "NOARG",
63 "NOCOMPLETE",
64 "NOINHERIT",
65 "RENORMALIZE",
66 "STARTF",
67 "STARTUPINFOEXW",
68 "Schindelin",
69 "UCRT",
70 "YESNO",
71 "argcp",
72 "beginthreadex",
73 "committish",
74 "contentp",
75 "cpath",
76 "cpidx",
77 "ctim",
78 "dequote",
79 "envw",
80 "ewah",
81 "fdata",
82 "fherr",
83 "fhin",
84 "fhout",
85 "fragp",
86 "fsmonitor",
87 "hnsec",
88 "idents",
89 "includeif",
90 "interpr",
91 "iprog",
92 "isexe",
93 "iskeychar",
94 "kompare",
95 "mktag",
96 "mktree",
97 "mmblob",
98 "mmbuffer",
99 "mmfile",
100 "noenv",
101 "nparents",
102 "ntpath",
103 "ondisk",
104 "ooid",
105 "oplen",
106 "osdl",
107 "pnew",
108 "pold",
109 "ppinfo",
110 "pushf",
111 "pushv",
112 "rawsz",
113 "rebasing",
114 "reencode",
115 "repo",
116 "rerere",
117 "scld",
118 "sharedrepo",
119 "spawnv",
120 "spawnve",
121 "spawnvpe",
122 "strdup'ing",
123 "submodule",
124 "submodules",
125 "topath",
126 "topo",
127 "tpatch",
128 "unexecutable",
129 "unhide",
130 "unkc",
131 "unkv",
132 "unmark",
133 "unmatch",
134 "unsets",
135 "unshown",
136 "untracked",
137 "untrackedcache",
138 "unuse",
139 "upos",
140 "uval",
141 "vreportf",
142 "wargs",
143 "wargv",
144 "wbuffer",
145 "wcmd",
146 "wcsnicmp",
147 "wcstoutfdup",
148 "wdeltaenv",
149 "wdir",
150 "wenv",
151 "wenvblk",
152 "wenvcmp",
153 "wenviron",
154 "wenvpos",
155 "wenvsz",
156 "wfile",
157 "wfilename",
158 "wfopen",
159 "wfreopen",
160 "wfullpath",
161 "which'll",
162 "wlink",
163 "wmain",
164 "wmkdir",
165 "wmktemp",
166 "wnewpath",
167 "wotype",
168 "wpath",
169 "wpathname",
170 "wpgmptr",
171 "wpnew",
172 "wpointer",
173 "wpold",
174 "wpos",
175 "wputenv",
176 "wrmdir",
177 "wship",
178 "wtarget",
179 "wtemplate",
180 "wunlink",
181 "xcalloc",
182 "xgetcwd",
183 "xmallocz",
184 "xmemdupz",
185 "xmmap",
186 "xopts",
187 "xrealloc",
188 "xsnprintf",
189 "xutftowcs",
190 "xutftowcsn",
191 "xwcstoutf"
192 ],
193 "cSpell.ignoreRegExpList": [
194 "\\\"(DIRC|FSMN|REUC|UNTR)\\\"",
195 "\\\\u[0-9a-fA-Fx]{4}\\b",
196 "\\b(filfre|frotz|xyzzy)\\b",
197 "\\bCMIT_FMT_DEFAULT\\b",
198 "\\bde-munge\\b",
199 "\\bGET_OID_DISAMBIGUATORS\\b",
200 "\\bHASH_RENORMALIZE\\b",
201 "\\bTREESAMEness\\b",
202 "\\bUSE_STDEV\\b",
203 "\\Wchar *\\*\\W*utfs\\W",
204 "cURL's",
205 "ntifs\\.h",
206 ],
207 }
208 EOF
209 die "Could not write settings.json"
210
211 # Infer some setup-specific locations/names
212
213 GCCPATH="$(which gcc)"
214 GDBPATH="$(which gdb)"
215 MAKECOMMAND="make -j5 DEVELOPER=1"
216 OSNAME=
217 X=
218 case "$(uname -s)" in
219 MINGW*)
220 GCCPATH="$(cygpath -am "$GCCPATH")"
221 GDBPATH="$(cygpath -am "$GDBPATH")"
222 MAKE_BASH="$(cygpath -am /git-cmd.exe) --command=usr\\\\bin\\\\bash.exe"
223 MAKECOMMAND="$MAKE_BASH -lc \\\"$MAKECOMMAND\\\""
224 OSNAME=Win32
225 X=.exe
226 ;;
227 Linux)
228 OSNAME=Linux
229 ;;
230 Darwin)
231 OSNAME=macOS
232 ;;
233 esac
234
235 # Default build task
236
237 cat >.vscode/tasks.json.new <<EOF ||
238 {
239 // See https://go.microsoft.com/fwlink/?LinkId=733558
240 // for the documentation about the tasks.json format
241 "version": "2.0.0",
242 "tasks": [
243 {
244 "label": "make",
245 "type": "shell",
246 "command": "$MAKECOMMAND",
247 "group": {
248 "kind": "build",
249 "isDefault": true
250 }
251 }
252 ]
253 }
254 EOF
255 die "Could not install default build task"
256
257 # Debugger settings
258
259 cat >.vscode/launch.json.new <<EOF ||
260 {
261 // Use IntelliSense to learn about possible attributes.
262 // Hover to view descriptions of existing attributes.
263 // For more information, visit:
264 // https://go.microsoft.com/fwlink/?linkid=830387
265 "version": "0.2.0",
266 "configurations": [
267 {
268 "name": "(gdb) Launch",
269 "type": "cppdbg",
270 "request": "launch",
271 "program": "\${workspaceFolder}/git$X",
272 "args": [],
273 "stopAtEntry": false,
274 "cwd": "\${workspaceFolder}",
275 "environment": [],
276 "MIMode": "gdb",
277 "miDebuggerPath": "$GDBPATH",
278 "setupCommands": [
279 {
280 "description": "Enable pretty-printing for gdb",
281 "text": "-enable-pretty-printing",
282 "ignoreFailures": true
283 }
284 ]
285 }
286 ]
287 }
288 EOF
289 die "Could not write launch configuration"
290
291 # C/C++ extension settings
292
293 make -f - OSNAME=$OSNAME GCCPATH="$GCCPATH" vscode-init \
294 >.vscode/c_cpp_properties.json <<\EOF ||
295 include Makefile
296
297 vscode-init:
298 @mkdir -p .vscode && \
299 incs= && defs= && \
300 for e in $(ALL_CFLAGS) \
301 '-DGIT_EXEC_PATH="$(gitexecdir_SQ)"' \
302 '-DGIT_LOCALE_PATH="$(localedir_relative_SQ)"' \
303 '-DBINDIR="$(bindir_relative_SQ)"' \
304 '-DFALLBACK_RUNTIME_PREFIX="$(prefix_SQ)"' \
305 '-DDEFAULT_GIT_TEMPLATE_DIR="$(template_dir_SQ)"' \
306 '-DETC_GITCONFIG="$(ETC_GITCONFIG_SQ)"' \
307 '-DETC_GITATTRIBUTES="$(ETC_GITATTRIBUTES_SQ)"' \
308 '-DGIT_LOCALE_PATH="$(localedir_relative_SQ)"' \
309 '-DCURL_DISABLE_TYPECHECK', \
310 '-DGIT_HTML_PATH="$(htmldir_relative_SQ)"' \
311 '-DGIT_MAN_PATH="$(mandir_relative_SQ)"' \
312 '-DGIT_INFO_PATH="$(infodir_relative_SQ)"'; do \
313 case "$$e" in \
314 -I.) \
315 incs="$$(printf '% 16s"$${workspaceRoot}",\n%s' \
316 "" "$$incs")" \
317 ;; \
318 -I/*) \
319 incs="$$(printf '% 16s"%s",\n%s' \
320 "" "$${e#-I}" "$$incs")" \
321 ;; \
322 -I*) \
323 incs="$$(printf '% 16s"$${workspaceRoot}/%s",\n%s' \
324 "" "$${e#-I}" "$$incs")" \
325 ;; \
326 -D*) \
327 defs="$$(printf '% 16s"%s",\n%s' \
328 "" "$$(echo "$${e#-D}" | sed 's/"/\\&/g')" \
329 "$$defs")" \
330 ;; \
331 esac; \
332 done && \
333 echo '{' && \
334 echo ' "configurations": [' && \
335 echo ' {' && \
336 echo ' "name": "$(OSNAME)",' && \
337 echo ' "intelliSenseMode": "clang-x64",' && \
338 echo ' "includePath": [' && \
339 echo "$$incs" | sort | sed '$$s/,$$//' && \
340 echo ' ],' && \
341 echo ' "defines": [' && \
342 echo "$$defs" | sort | sed '$$s/,$$//' && \
343 echo ' ],' && \
344 echo ' "browse": {' && \
345 echo ' "limitSymbolsToIncludedHeaders": true,' && \
346 echo ' "databaseFilename": "",' && \
347 echo ' "path": [' && \
348 echo ' "$${workspaceRoot}"' && \
349 echo ' ]' && \
350 echo ' },' && \
351 echo ' "cStandard": "c11",' && \
352 echo ' "cppStandard": "c++17",' && \
353 echo ' "compilerPath": "$(GCCPATH)"' && \
354 echo ' }' && \
355 echo ' ],' && \
356 echo ' "version": 4' && \
357 echo '}'
358 EOF
359 die "Could not write settings for the C/C++ extension"
360
361 for file in .vscode/settings.json .vscode/tasks.json .vscode/launch.json
362 do
363 if test -f $file
364 then
365 if git diff --no-index --quiet --exit-code $file $file.new
366 then
367 rm $file.new
368 else
369 printf "The file $file.new has these changes:\n\n"
370 git --no-pager diff --no-index $file $file.new
371 printf "\n\nMaybe \`mv $file.new $file\`?\n\n"
372 fi
373 else
374 mv $file.new $file
375 fi
376 done