375 lines
		
	
	
	
		
			8.5 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			375 lines
		
	
	
	
		
			8.5 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
#!/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
 |