This is a combination of the efforts of multiple people and hours of pain trying to configure VSCode properly. This should give a good baseline for anyone trying to develop Serenity with VSCode. Co-authored-by: Hendiadyoin1 <leon2002.la@gmail.com>
9.9 KiB
Visual Studio Code Project Configuration
Visual Studio Code does not work optimally for Serenity development, and there's a bunch of configuring and fiddling around you'll have to do.
The WSL Remote extension allows you to use VSCode in Windows while using the normal WSL workflow. This works surprisingly well, but for code comprehension speed you should put the Serenity directory on your WSL root partition.
Note on CMake
The CMake Tools plugin for VSCode does not work with projects that don't accept a CMAKE_BUILD_TYPE. See also this CMake Tools issue; an appropriate feature is planned for 1.9.0. For now, it is best to disable all CMake extensions when working on Serenity.
Code comprehension
Both C++ comprehension tools listed below report fake errors.
clangd
The official clangd extension can be used for C++ comprehension. You'll have to use the following .clangd:
CompileFlags:
CompilationDatabase: Build/i686
Run cmake at least once for this to work. clangd has difficulty finding specific methods and types, especially with inheritance trees. Also, include errors are wrong in 90% of cases.
Microsoft C/C++ tools
These extensions can be used as-is, but you need to point them to the custom Serenity compilers. Use the following cpp-preferences to circumvent some errors:
.vscode/c_cpp_propperties.json
{
"name": "Userspace",
"includePath": [
"${workspaceFolder}",
"${workspaceFolder}/Build/i686/",
"${workspaceFolder}/Build/i686/Userland",
"${workspaceFolder}/Build/i686/Userland/Applications",
"${workspaceFolder}/Build/i686/Userland/Libraries",
"${workspaceFolder}/Build/i686/Userland/Services",
"${workspaceFolder}/Build/i686/Root/usr/include/**",
"${workspaceFolder}/Userland",
"${workspaceFolder}/Userland/Libraries",
"${workspaceFolder}/Userland/Libraries/LibC",
"${workspaceFolder}/Userland/Libraries/LibM",
"${workspaceFolder}/Userland/Libraries/LibPthread",
"${workspaceFolder}/Userland/Services",
"${workspaceFolder}/Toolchain/Local/i686/i686-pc-serenity/include/c++/**"
],
"defines": [
"DEBUG",
"__serenity__",
],
"compilerPath": "${workspaceFolder}/Toolchain/Local/i686/bin/i686-pc-serenity-g++",
"cStandard": "c17",
"cppStandard": "c++20",
"intelliSenseMode": "linux-gcc-x86",
"browse": {
"path": [
"${workspaceFolder}",
"${workspaceFolder}/Build/i686/",
"${workspaceFolder}/Build/i686/Userland",
"${workspaceFolder}/Build/i686/Userland/Applications",
"${workspaceFolder}/Build/i686/Userland/Libraries",
"${workspaceFolder}/Build/i686/Userland/Services",
"${workspaceFolder}/Build/i686/Root/usr/include/**",
"${workspaceFolder}/Userland",
"${workspaceFolder}/Userland/Libraries",
"${workspaceFolder}/Userland/Libraries/LibC",
"${workspaceFolder}/Userland/Libraries/LibM",
"${workspaceFolder}/Userland/Libraries/LibPthread",
"${workspaceFolder}/Userland/Services",
"${workspaceFolder}/Toolchain/Local/i686/i686-pc-serenity/include/c++/**"
],
"limitSymbolsToIncludedHeaders": true
},
"compileCommands": "Build/i686/compile_commands.json",
"compilerArgs": [
"-wall",
"-wextra",
"-werror"
]
}
Most nonsentical errors from the extension also involve not finding methods, types etc.
DSL syntax highlighting
There's a syntax highlighter extension for both IPC and GML called "SerenityOS DSL Syntax Highlight", available here or here.
Formatting
clang-format is included with the Microsoft tools (see above). The settings below include a key that makes it use the proper style. Alternatively, you can use the clang-format extension itself, which should work out of the box.
Settings
These belong in the .vscode/settings.json
of Serenity.
// Excluding the generated directories keeps your file view clean and speeds up search.
"files.exclude": {
"**/.git": true,
"Toolchain/Local/**": true,
"Toolchain/Tarballs/**": true,
"Toolchain/Build/**": true,
"Build/**": true,
"build/**": true,
},
"search.exclude": {
"**/.git": true,
"Toolchain/Local/**": true,
"Toolchain/Tarballs/**": true,
"Toolchain/Build/**": true,
"Build/**": true,
"build/**": true,
},
// Force clang-format to respect Serenity's .clang-format style file.
"C_Cpp.clang_format_style": "file",
// Tab settings
"editor.tabSize": 4,
"editor.useTabStops": false,
Customization
Custom Tasks
You can create custom tasks (.vscode/tasks.json
) to quickly compile Serenity. The following are two example tasks, a "just build" task and a "build and run" task for i686 that also give you error highlighting:
{
"tasks": [
{
"label": "build",
"type": "shell",
"problemMatcher": [
{
"base": "$gcc",
"fileLocation": [
"relative",
"${workspaceFolder}/Build/i686"
]
},
{
"source": "gcc",
"fileLocation": [
"relative",
"${workspaceFolder}/Build/i686"
],
"pattern": [
{
"regexp": "^([^\\s]*\\.S):(\\d*): (.*)$",
"file": 1,
"location": 2,
"message": 3
}
]
}
],
"command": [
"bash"
],
"args": [
"-c",
"\"Meta/serenity.sh image\""
],
"presentation": {
"echo": true,
"reveal": "always",
"focus": false,
"group": "build",
"panel": "shared",
"showReuseMessage": true,
"clear": true
}
},
{
"label": "launch",
"type": "shell",
"linux": {
"command": "bash",
"args": [
"-c",
"\"Meta/serenity.sh run\""
],
"options": {
"env": {
// Put your custom run configuration here, e.g. SERENITY_RAM_SIZE
}
}
},
"problemMatcher": [
{
"source": "Assertion Failed",
"fileLocation": [
"relative",
"${workspaceFolder}/Build/i686"
],
"pattern": [
{
"regexp": "ASSERTION FAILED: (.*)$",
"message": 1
},
{
"regexp": "^((?:.*)\\.(h|cpp|c|S)):(\\d*)$",
"file":1,
"location":3
}
]
},
{
"source": "KUBSan",
"owner": "cpp",
"fileLocation": [
"relative",
"${workspaceFolder}"
],
"pattern": [
{
"regexp": "KUBSAN: (.*)",
"message": 0
},
{
"regexp": "KUBSAN: at ../(.*), line (\\d*), column: (\\d*)",
"file": 1,
"line": 2,
"column": 3
}
]
},
{
"base": "$gcc",
"fileLocation": [
"relative",
"${workspaceFolder}/Build/i686"
]
},
{
"source": "gcc",
"fileLocation": [
"relative",
"${workspaceFolder}/Build/i686"
],
"pattern": [
{
"regexp": "^([^\\s]*\\.S):(\\d*): (.*)$",
"file": 1,
"location": 2,
"message": 3
}
]
}
],
"presentation": {
"echo": true,
"reveal": "always",
"group": "run",
"focus": false,
"panel": "shared",
"showReuseMessage": true,
"clear": true
}
},
]
}
This can easily be adopted into x86_64 by appending the architecture to the serenity.sh commands.
License snippet
The following snippet may be useful if you want to quickly generate a license header, put it in .vscode/serenity.code-snippets
:
{
"License": {
"scope": "cpp,c",
"prefix": "license",
"body": [
"/*",
" * Copyright (c) $CURRENT_YEAR, ${1:Your Name} <${2:YourName@Email.com}>.",
" *",
" * SPDX-License-Identifier: BSD-2-Clause",
" */"
],
"description": "Licence header"
}
}