#!/bin/sh
die () {
echo "$*" >&2
exit 1
}
cd "$(dirname "$0")"/../.. ||
die "Could not cd to top-level directory"
mkdir -p .vscode ||
die "Could not create .vscode/"
# General settings
cat >.vscode/settings.json.new <<\EOF ||
{
"C_Cpp.intelliSenseEngine": "Default",
"C_Cpp.intelliSenseEngineFallback": "Disabled",
"[git-commit]": {
"editor.wordWrap": "wordWrapColumn",
"editor.wordWrapColumn": 72
},
"[c]": {
"editor.detectIndentation": false,
"editor.insertSpaces": false,
"editor.tabSize": 8,
"editor.wordWrap": "wordWrapColumn",
"editor.wordWrapColumn": 80,
"files.trimTrailingWhitespace": true
},
"files.associations": {
"*.h": "c",
"*.c": "c"
},
"cSpell.ignorePaths": [
],
"cSpell.words": [
"DATAW",
"DBCACHED",
"DFCHECK",
"DTYPE",
"Hamano",
"HCAST",
"HEXSZ",
"HKEY",
"HKLM",
"IFGITLINK",
"IFINVALID",
"ISBROKEN",
"ISGITLINK",
"ISSYMREF",
"Junio",
"LPDWORD",
"LPPROC",
"LPWSTR",
"MSVCRT",
"NOARG",
"NOCOMPLETE",
"NOINHERIT",
"RENORMALIZE",
"STARTF",
"STARTUPINFOEXW",
"Schindelin",
"UCRT",
"YESNO",
"argcp",
"beginthreadex",
"committish",
"contentp",
"cpath",
"cpidx",
"ctim",
"dequote",
"envw",
"ewah",
"fdata",
"fherr",
"fhin",
"fhout",
"fragp",
"fsmonitor",
"hnsec",
"idents",
"includeif",
"interpr",
"iprog",
"isexe",
"iskeychar",
"kompare",
"mksnpath",
"mktag",
"mktree",
"mmblob",
"mmbuffer",
"mmfile",
"noenv",
"nparents",
"ntpath",
"ondisk",
"ooid",
"oplen",
"osdl",
"pnew",
"pold",
"ppinfo",
"pushf",
"pushv",
"rawsz",
"rebasing",
"reencode",
"repo",
"rerere",
"scld",
"sharedrepo",
"spawnv",
"spawnve",
"spawnvpe",
"strdup'ing",
"submodule",
"submodules",
"topath",
"topo",
"tpatch",
"unexecutable",
"unhide",
"unkc",
"unkv",
"unmark",
"unmatch",
"unsets",
"unshown",
"untracked",
"untrackedcache",
"unuse",
"upos",
"uval",
"vreportf",
"wargs",
"wargv",
"wbuffer",
"wcmd",
"wcsnicmp",
"wcstoutfdup",
"wdeltaenv",
"wdir",
"wenv",
"wenvblk",
"wenvcmp",
"wenviron",
"wenvpos",
"wenvsz",
"wfile",
"wfilename",
"wfopen",
"wfreopen",
"wfullpath",
"which'll",
"wlink",
"wmain",
"wmkdir",
"wmktemp",
"wnewpath",
"wotype",
"wpath",
"wpathname",
"wpgmptr",
"wpnew",
"wpointer",
"wpold",
"wpos",
"wputenv",
"wrmdir",
"wship",
"wtarget",
"wtemplate",
"wunlink",
"xcalloc",
"xgetcwd",
"xmallocz",
"xmemdupz",
"xmmap",
"xopts",
"xrealloc",
"xsnprintf",
"xutftowcs",
"xutftowcsn",
"xwcstoutf"
],
"cSpell.ignoreRegExpList": [
"\\\"(DIRC|FSMN|REUC|UNTR)\\\"",
"\\\\u[0-9a-fA-Fx]{4}\\b",
"\\b(filfre|frotz|xyzzy)\\b",
"\\bCMIT_FMT_DEFAULT\\b",
"\\bde-munge\\b",
"\\bGET_OID_DISAMBIGUATORS\\b",
"\\bHASH_RENORMALIZE\\b",
"\\bTREESAMEness\\b",
"\\bUSE_STDEV\\b",
"\\Wchar *\\*\\W*utfs\\W",
"cURL's",
"nedmalloc'ed",
"ntifs\\.h",
],
}
EOF
die "Could not write settings.json"
# Infer some setup-specific locations/names
GCCPATH="$(which gcc)"
GDBPATH="$(which gdb)"
MAKECOMMAND="make -j5 DEVELOPER=1"
OSNAME=
X=
case "$(uname -s)" in
MINGW*)
GCCPATH="$(cygpath -am "$GCCPATH")"
GDBPATH="$(cygpath -am "$GDBPATH")"
MAKE_BASH="$(cygpath -am /git-cmd.exe) --command=usr\\\\bin\\\\bash.exe"
MAKECOMMAND="$MAKE_BASH -lc \\\"$MAKECOMMAND\\\""
OSNAME=Win32
X=.exe
;;
Linux)
OSNAME=Linux
;;
Darwin)
OSNAME=macOS
;;
esac
# Default build task
cat >.vscode/tasks.json.new <<EOF ||
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
{
"label": "make",
"type": "shell",
"command": "$MAKECOMMAND",
"group": {
"kind": "build",
"isDefault": true
}
}
]
}
EOF
die "Could not install default build task"
# Debugger settings
cat >.vscode/launch.json.new <<EOF ||
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit:
// https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) Launch",
"type": "cppdbg",
"request": "launch",
"program": "\${workspaceFolder}/git$X",
"args": [],
"stopAtEntry": false,
"cwd": "\${workspaceFolder}",
"environment": [],
"externalConsole": true,
"MIMode": "gdb",
"miDebuggerPath": "$GDBPATH",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
]
}
]
}
EOF
die "Could not write launch configuration"
# C/C++ extension settings
make -f - OSNAME=$OSNAME GCCPATH="$GCCPATH" vscode-init \
>.vscode/c_cpp_properties.json <<\EOF ||
include Makefile
vscode-init:
@mkdir -p .vscode && \
incs= && defs= && \
for e in $(ALL_CFLAGS) \
'-DGIT_EXEC_PATH="$(gitexecdir_SQ)"' \
'-DGIT_LOCALE_PATH="$(localedir_relative_SQ)"' \
'-DBINDIR="$(bindir_relative_SQ)"' \
'-DFALLBACK_RUNTIME_PREFIX="$(prefix_SQ)"' \
'-DDEFAULT_GIT_TEMPLATE_DIR="$(template_dir_SQ)"' \
'-DETC_GITCONFIG="$(ETC_GITCONFIG_SQ)"' \
'-DETC_GITATTRIBUTES="$(ETC_GITATTRIBUTES_SQ)"' \
'-DGIT_LOCALE_PATH="$(localedir_relative_SQ)"' \
'-DCURL_DISABLE_TYPECHECK', \
'-DGIT_HTML_PATH="$(htmldir_relative_SQ)"' \
'-DGIT_MAN_PATH="$(mandir_relative_SQ)"' \
'-DGIT_INFO_PATH="$(infodir_relative_SQ)"'; do \
case "$$e" in \
-I.) \
incs="$$(printf '% 16s"$${workspaceRoot}",\n%s' \
"" "$$incs")" \
;; \
-I/*) \
incs="$$(printf '% 16s"%s",\n%s' \
"" "$${e#-I}" "$$incs")" \
;; \
-I*) \
incs="$$(printf '% 16s"$${workspaceRoot}/%s",\n%s' \
"" "$${e#-I}" "$$incs")" \
;; \
-D*) \
defs="$$(printf '% 16s"%s",\n%s' \
"" "$$(echo "$${e#-D}" | sed 's/"/\\&/g')" \
"$$defs")" \
;; \
esac; \
done && \
echo '{' && \
echo ' "configurations": [' && \
echo ' {' && \
echo ' "name": "$(OSNAME)",' && \
echo ' "intelliSenseMode": "clang-x64",' && \
echo ' "includePath": [' && \
echo "$$incs" | sort | sed '$$s/,$$//' && \
echo ' ],' && \
echo ' "defines": [' && \
echo "$$defs" | sort | sed '$$s/,$$//' && \
echo ' ],' && \
echo ' "browse": {' && \
echo ' "limitSymbolsToIncludedHeaders": true,' && \
echo ' "databaseFilename": "",' && \
echo ' "path": [' && \
echo ' "$${workspaceRoot}"' && \
echo ' ]' && \
echo ' },' && \
echo ' "cStandard": "c11",' && \
echo ' "cppStandard": "c++17",' && \
echo ' "compilerPath": "$(GCCPATH)"' && \
echo ' }' && \
echo ' ],' && \
echo ' "version": 4' && \
echo '}'
EOF
die "Could not write settings for the C/C++ extension"
for file in .vscode/settings.json .vscode/tasks.json .vscode/launch.json
do
if test -f $file
then
if git diff --no-index --quiet --exit-code $file $file.new
then
rm $file.new
else
printf "The file $file.new has these changes:\n\n"
git --no-pager diff --no-index $file $file.new
printf "\n\nMaybe \`mv $file.new $file\`?\n\n"
fi
else
mv $file.new $file
fi
done