[sdk/kdesrc-build] /: Add "generate-vscode-project-config" option

Andrew Shark null at kde.org
Sat Dec 2 16:16:26 GMT 2023


Git commit 1d9b2355c10db4d8825cefe06c73b07d0b4f4373 by Andrew Shark, on behalf of Kristen McWilliam.
Committed on 02/12/2023 at 17:16.
Pushed by ashark into branch 'master'.

Add "generate-vscode-project-config" option

This change adds `generate-vscode-project-config` option for `kdesrc-buildrc`
and the corresponding command line flag.

When set to `true`, kdesrc-build will create the `.vscode` folder
in the module source directory with configuration that makes VSCode to work
properly with KDE projects, such as setting the correct build
directory & enabling support for C++, CMake, LSP & IntelliSense.

The process specifically checks for an existing `.vscode` folder,
in case the user already has custom settings present - and only
proceeds if it does not exist yet.

Closes #84

M  +2    -0    completions/zsh/_kdesrc-build
M  +4    -0    data/kdesrc-buildrc.in
A  +17   -0    data/vscode/c_cpp_properties.json.in
A  +9    -0    data/vscode/extensions.json.in
A  +22   -0    data/vscode/launch.json.in
A  +15   -0    data/vscode/settings.json.in
M  +35   -0    doc/index.docbook
M  +16   -15   modules/ksb/BuildContext.pm
M  +98   -0    modules/ksb/BuildSystem/KDECMake.pm
M  +1    -0    modules/ksb/FirstRun.pm

https://invent.kde.org/sdk/kdesrc-build/-/commit/1d9b2355c10db4d8825cefe06c73b07d0b4f4373

diff --git a/completions/zsh/_kdesrc-build b/completions/zsh/_kdesrc-build
index f9b3d7ec..ca79d62e 100644
--- a/completions/zsh/_kdesrc-build
+++ b/completions/zsh/_kdesrc-build
@@ -39,5 +39,7 @@ _arguments \
   '--rebuild-failures[Only those modules which failed to build on a previous run.]' \
   '--force-build[Disable skipping the build process.]' \
   '--resume[Resum after a build failure]' \
+  '--generate-vscode-project-config[Generate a vscode project config]' \
+  '(--generate-vscode-project-config --no-generate-vscode-project-config)'{--generate-vscode-project-config,--no-generate-vscode-project-config}'[Generate a vscode project config]' \
   \
   '*:: :_kdesrc-build_modules'
diff --git a/data/kdesrc-buildrc.in b/data/kdesrc-buildrc.in
index d3fb6171..cec49d4f 100644
--- a/data/kdesrc-buildrc.in
+++ b/data/kdesrc-buildrc.in
@@ -58,6 +58,10 @@ global
     # Build with LSP support for everything that supports it
     compile-commands-linking %{compile-commands-linking}
     compile-commands-export %{compile-commands-export}
+
+    # Generate .vscode config files in project directories
+    # Enable this if you want to use Visual Studio Code for development
+    generate-vscode-project-config %{generate-vscode-project-config}
 end global
 
 # With base options set, the remainder of the file is used to define modules to build, in the
diff --git a/data/vscode/c_cpp_properties.json.in b/data/vscode/c_cpp_properties.json.in
new file mode 100644
index 00000000..92b17fad
--- /dev/null
+++ b/data/vscode/c_cpp_properties.json.in
@@ -0,0 +1,17 @@
+{
+    "configurations": [
+        {
+            "name": "Linux",
+            "includePath": [
+                "${workspaceFolder}/**"
+            ],
+            "defines": [],
+            "compilerPath": "/usr/bin/gcc",
+            "cStandard": "c17",
+            "cppStandard": "c++17",
+            "intelliSenseMode": "${default}",
+            "compileCommands": "${workspaceFolder}/compile_commands.json"
+        }
+    ],
+    "version": 4
+}
\ No newline at end of file
diff --git a/data/vscode/extensions.json.in b/data/vscode/extensions.json.in
new file mode 100644
index 00000000..07ce6504
--- /dev/null
+++ b/data/vscode/extensions.json.in
@@ -0,0 +1,9 @@
+{
+    "recommendations": [
+        "ms-vscode.cpptools-extension-pack", // C/C++ debugging
+        "llvm-vs-code-extensions.vscode-clangd", // C/C++ LSP
+        "tonka3000.qtvsctools", // Qt
+        "bbenoist.QML", // QML
+        "deerawan.vscode-dash", // Docs
+    ]
+}
\ No newline at end of file
diff --git a/data/vscode/launch.json.in b/data/vscode/launch.json.in
new file mode 100644
index 00000000..02ea5709
--- /dev/null
+++ b/data/vscode/launch.json.in
@@ -0,0 +1,22 @@
+{
+    "version": "0.2.0",
+    "configurations": [
+        {
+            "name": "Debug",
+            "type": "cppdbg",
+            "request": "launch",
+            "program": "${command:cmake.launchTargetPath}",
+            "args": [],
+            "stopAtEntry": false,
+            "cwd": "${workspaceFolder}",
+            "MIMode": "gdb",
+            "setupCommands": [
+                {
+                    "description": "Enable pretty-printing for gdb",
+                    "text": "-enable-pretty-printing",
+                    "ignoreFailures": true
+                }
+            ]
+        }
+    ]
+}
\ No newline at end of file
diff --git a/data/vscode/settings.json.in b/data/vscode/settings.json.in
new file mode 100644
index 00000000..743e6243
--- /dev/null
+++ b/data/vscode/settings.json.in
@@ -0,0 +1,15 @@
+{
+    "cmake.buildDirectory": "$buildDir",
+    "cmake.environment": {
+        "CMAKE_PREFIX_PATH": "$installDir:${env:CMAKE_PREFIX_PATH}",
+        "MANPATH": "$installDir/share/man:${env:MANPATH}",
+        "PATH": "$installDir/bin:${env:PATH}",
+        "PKG_CONFIG_PATH": "$installDir/$libDir/pkgconfig:${env:PKG_CONFIG_PATH}",
+        "PYTHONPATH": "$installDir/$libDir/site-packages:${env:PYTHONPATH}",
+        "QML2_IMPORT_PATH": "$installDir/$libDir/qml:${env:QML2_IMPORT_PATH}",
+        "QT_PLUGIN_PATH": "$installDir/$libDir/plugins:${env:QT_PLUGIN_PATH}",
+        "QT_QUICK_CONTROLS_STYLE_PATH": "$installDir/$libDir/qml/QtQuick/Controls.2/:${env:QT_QUICK_CONTROLS_STYLE_PATH}",
+        "XDG_DATA_DIRS": "$installDir/share:${env:XDG_DATA_DIRS}",
+        "XDG_CONFIG_DIRS": "$installDir/etc/xdg:${env:XDG_CONFIG_DIRS}"
+    }
+}
\ No newline at end of file
diff --git a/doc/index.docbook b/doc/index.docbook
index 8fce177a..cd8e9043 100644
--- a/doc/index.docbook
+++ b/doc/index.docbook
@@ -2541,6 +2541,33 @@ due to changes in the project metadata.</para>
 </entry>
 </row>
 
+<row id="conf-generate-vscode-project-config">
+<entry>generate-vscode-project-config</entry>
+
+<entry>
+<simplelist type='horiz' columns='2'>
+<member>Type</member><member>Boolean</member>
+<member>Default value</member><member>False</member>
+</simplelist>       
+
+<para>Module setting overrides global</para>
+
+<para>Set this option to <userinput>true</userinput> to make 
+&kdesrc-build; create VS Code project files (.vscode directory) in the module 
+source directory.</para>
+
+<para>The .vscode folder will be created in the project source directory, only 
+if it does not already exist. The configurations will enable the use of LSP, 
+building, debugging, and running the project from within VS Code.</para>
+
+<para>The configuration also recommends extensions to install that are useful 
+for working on most KDE projects.</para>
+
+<para>You can also use the <link linkend="cmdline-generate-vscode-project-config">
+<option>--generate-vscode-project-config</option></link> command line flag.</para>
+</entry>
+</row>
+
 <row id="conf-include-dependencies">
 <entry>include-dependencies</entry>
 <entry>
@@ -3283,6 +3310,14 @@ Enable colorful output. (This is the default for interactive terminals).
 </para></listitem>
 </varlistentry>
 
+<varlistentry id="cmdline-generate-vscode-project-config">
+<term><parameter>--generate-vscode-project-config</parameter></term>
+<listitem><para>
+Generate a .vscode directory with configurations for building and debugging 
+in Visual Studio Code.
+</para></listitem>
+</varlistentry>
+
 <varlistentry id="cmdline-nice">
 <term><parameter>--nice=<replaceable>value</replaceable></parameter></term>
 <listitem><para>
diff --git a/modules/ksb/BuildContext.pm b/modules/ksb/BuildContext.pm
index f565d17d..c2b8a67c 100644
--- a/modules/ksb/BuildContext.pm
+++ b/modules/ksb/BuildContext.pm
@@ -124,21 +124,22 @@ my %internalGlobalOptions = (
 # ksb::Cmdline to GetOptionsFromArray! This is now checked at runtime so
 # if you forget the test suite should catch you.
 our %defaultGlobalFlags = (
-    "delete-my-patches"          => 0, # Should only be set from cmdline
-    "delete-my-settings"         => 0, # Should only be set from cmdline
-    "disable-agent-check"        => 0, # If true we don't check on ssh-agent
-    "compile-commands-export"    => 1, # 2021-02-06 allow to generate compile_commands.json via cmake, for clangd tooling
-    "compile-commands-linking"   => 0, # 2021-02-06 link generated compile_commands.json back to the source directory
-    "include-dependencies"       => 1,
-    "install-after-build"        => 1,
-    "install-environment-driver" => 1, # Setup ~/.config/kde-env-*.sh for login scripts
-    "install-session-driver"     => 0, # Above, + ~/.xsession
-    "purge-old-logs"             => 1,
-    "run-tests"                  => 0,  # 1 = make test, upload = make Experimental
-    "stop-on-failure"            => 1,
-    "use-clean-install"          => 0,
-    "use-idle-io-priority"       => 0,
-    "use-inactive-modules"       => 0,
+    "delete-my-patches"              => 0, # Should only be set from cmdline
+    "delete-my-settings"             => 0, # Should only be set from cmdline
+    "disable-agent-check"            => 0, # If true we don't check on ssh-agent
+    "compile-commands-export"        => 1, # 2021-02-06 allow to generate compile_commands.json via cmake, for clangd tooling
+    "compile-commands-linking"       => 0, # 2021-02-06 link generated compile_commands.json back to the source directory
+    "generate-vscode-project-config" => 0,
+    "include-dependencies"           => 1,
+    "install-after-build"            => 1,
+    "install-environment-driver"     => 1, # Setup ~/.config/kde-env-*.sh for login scripts
+    "install-session-driver"         => 0, # Above, + ~/.xsession
+    "purge-old-logs"                 => 1,
+    "run-tests"                      => 0,  # 1 = make test, upload = make Experimental
+    "stop-on-failure"                => 1,
+    "use-clean-install"              => 0,
+    "use-idle-io-priority"           => 0,
+    "use-inactive-modules"           => 0,
 );
 
 # Holds other cmdline-accessible options that aren't simply binary flags.
diff --git a/modules/ksb/BuildSystem/KDECMake.pm b/modules/ksb/BuildSystem/KDECMake.pm
index 0603acf6..50faa1b8 100644
--- a/modules/ksb/BuildSystem/KDECMake.pm
+++ b/modules/ksb/BuildSystem/KDECMake.pm
@@ -372,6 +372,12 @@ sub configureInternal
     my $self = assert_isa(shift, 'ksb::BuildSystem::KDECMake');
     my $module = $self->module();
 
+    if ($module->getOption('generate-vscode-project-config')) {
+        generateVSCodeConfig($module);
+    } else {
+        debug ("\tGenerating .vscode directory - disabled for this module");
+    }
+
     # Use cmake to create the build directory (sh script return value
     # semantics).
     if ($self->_safe_run_cmake())
@@ -391,6 +397,98 @@ sub configureInternal
     return 1;
 }
 
+# Generate default config files for VSCode.
+#
+# This populates the settings VSCode needs to work with most KDE projects,
+# such as C++ support, correct build directory, and LSP / IntelliSense.
+sub generateVSCodeConfig
+{
+    if (pretending()) {
+        pretend ("\tWould have generated .vscode directory");
+        return;
+    }
+    
+    my $module = shift;
+    my $projectName = $module->name();
+    my $buildDir = $module->fullpath('build');
+    my $srcDir = $module->fullpath('source');
+    my $installDir = $module->installationPath();
+    my $libDir = $module->getOption('libname');
+    my $configDir = "$srcDir/.vscode";
+
+    if (-e $configDir) {
+        if (-d $configDir) {
+            debug ("\tGenerating .vscode directory - skipping as it already exists");
+        } elsif (-f $configDir) {
+            error ("\tGenerating .vscode directory - cannot proceed, file .vscode exists");
+        }  
+        return;
+    } else {
+        debug ("\tGenerating .vscode directory for $projectName: $configDir");
+    }
+
+    mkdir($configDir);
+
+    use FindBin;
+    my $baseDir = $FindBin::RealBin;
+    my $dataDir = "$baseDir/data/vscode";
+
+    # c_cpp_properties.json configures C++, CMake & IntelliSense.
+    my $cCppPropertiesJson = _readFile("$dataDir/c_cpp_properties.json.in");
+
+    # settings.json configures the paths for CMake, QML, Qt, etc.
+    my $settingsJson = _readFile("$dataDir/settings.json.in");
+    $settingsJson =~ s/\$buildDir/$buildDir/g;
+    $settingsJson =~ s/\$installDir/$installDir/g;
+    $settingsJson =~ s/\$libDir/$libDir/g;
+
+    # extensions.json recommends extensions to install/enable.
+    my $extensionsJson = _readFile("$dataDir/extensions.json.in");
+
+    # launch.json configures the run with debugger functionality.
+    my $launchJson = _readFile("$dataDir/launch.json.in");
+
+    _writeToFile("$configDir/c_cpp_properties.json", $cCppPropertiesJson);
+    _writeToFile("$configDir/settings.json", $settingsJson);
+    _writeToFile("$configDir/extensions.json", $extensionsJson);
+    _writeToFile("$configDir/launch.json", $launchJson);
+
+    return 1;
+}
+
+# Reads the contents of a file.
+# 
+# Arguments:
+#  $file_path: The path to the file to read.
+# 
+# Returns: The contents of the file as a string.
+sub _readFile
+{
+    my ($file_path) = @_;
+
+    open my $file, '<', $file_path or warning("\tCouldn't open $file_path: $!");
+    my $content = do { local $/; <$file> };
+    close $file;
+
+    return $content;
+}
+
+# Writes content to a file.
+# 
+# Arguments:
+#  $file_path: The path to the file to write to.
+#  $content: The content to write to the file.
+#
+# Returns: Nothing.
+sub _writeToFile
+{
+    my ($file_path, $content) = @_;
+
+    open my $file, '>', $file_path or warning("\tCouldn't open $file_path: $!");
+    print $file $content or warning("\tCouldn't write to $file_path: $!");
+    close $file or warning("\tError closing $file_path: $!");
+}
+
 # Return value style: hashref to build results object (see ksb::BuildSystem::safe_make)
 sub buildInternal
 {
diff --git a/modules/ksb/FirstRun.pm b/modules/ksb/FirstRun.pm
index e8f4ba49..e9f2ffd6 100644
--- a/modules/ksb/FirstRun.pm
+++ b/modules/ksb/FirstRun.pm
@@ -307,6 +307,7 @@ DONE
     $sampleRc =~ s/%\{stop-on-failure}/$gl->{"stop-on-failure"}/g;
     $sampleRc =~ s/%\{compile-commands-linking}/$gl->{"compile-commands-linking"}/g;
     $sampleRc =~ s/%\{compile-commands-export}/$gl->{"compile-commands-export"}/g;
+    $sampleRc =~ s/%\{generate-vscode-project-config}/$gl->{"generate-vscode-project-config"}/g;
 
     make_path($xdgConfigHome);
 


More information about the kde-doc-english mailing list